Как я могу воссоздать свою цветовую карту, созданную с помощью matplotlib, из матрицы смежности в боке - PullRequest
0 голосов
/ 10 мая 2019

Для проекта у меня есть очень большой файл данных (более 1000 человек) о том, как люди думают друг о друге.Это квадратная матрица со всеми именами людей по осям x и y.Если вы посмотрите на значение, когда оно содержит одного и того же человека по осям x и y, значение равно 1. Для всех остальных людей это лицо будет отображать значение в диапазоне от 0 до 1 или 0. Я уже создал это в matplotlib, ноЯ не доволен результатом (слишком маленький и не интерактивный), поэтому я пытаюсь переключиться на боке.Однако я недостаточно знаком с bokeh, чтобы воссоздать его самостоятельно.

Для кода, созданного для расширения bokeh, я попытался взглянуть на пример, представленный в галерее bokeh: http://bokeh.pydata.org/en/latest/docs/gallery/les_mis.html.

Вот как я хотел бы получить его, но я просто не понимаю его.

Итак, текущий код для отображения карты цветов с помощью matplotlib:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt 

# Read in csv
df = pandas.read_csv('file1.csv', sep=';', index_col=0)

plt.imshow(df.T, aspect='auto', cmap='bwr')

#add the values
for(i, j), value in np.ndenumerate(matrix):
    plt.text(i, j, "%.3f"%value, va='center', ha='center')

plt.axis('off')
plt.show()


print(df)

На данный момент это результат.Я не могу показывать изображения, потому что это мой первый пост, и я здесь новенький.https://imgur.com/Y4RDxMx. Если эта ссылка работает, не стесняйтесь взглянуть.Как видите, он действительно маленький и почти бесполезный.Я надеюсь, что боке с функцией масштабирования может обеспечить лучший результат.

Извините, если я спрошу что-нибудь глупое.Я не очень знаком с программированием в целом и пытаюсь научиться этому сам.

1 Ответ

0 голосов
/ 12 мая 2019

Вы определенно не хотите эмулировать ссылку, которую вы разместили, для случая 1000x1000. Отправка всех координат и рендеринг миллиона отдельных ректов - это больше, чем может справиться Bokeh или ваш браузер. Вам нужно раскрасить изображение , что гораздо эффективнее. Но тогда получение полезных топоров потребует больше работы. Вы можете использовать SingleIntervalTicker для генерации тиков только в определенных местах, например если установить границу изображения на (- 0,5, 999,5) , то

p.yaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0)
p.yaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0)

будет генерировать галочку в центре каждой "ячейки" изображения. Затем для печати имен вместо цифр вы можете использовать переопределение меток:

p.xaxis.major_label_overrides = p.xaxis.major_label_overrides = {
    0: "some name",
    1: "other name",
    ...
}

Возможно, вы захотите сгенерировать этот дикт программно. Но даже со всем этим, я бы сказал, у этого подхода есть некоторые фундаментальные проблемы. Если вы позволите пользователю полностью уменьшить масштаб, метки галочек будут сталкиваться и перекрывать друг друга. Вы можете установить bounds и max_interval в диапазонах графика, что может уменьшить это.

В целом, я бы фактически предложил попытаться найти другие подходы к визуализации в целом, так как я не думаю, что этот подход очень подходит для случая 1000x1000 в любой библиотеке или инструменте.

...