График: скорость теплового режима и соотношение сторон - PullRequest
3 голосов
/ 06 марта 2019

У меня одноканальное изображение, где каждое значение целого пикселя отображается в строку.Например 5 -> «человек».Я пытаюсь создать интерактивное изображение, в котором при наведении курсора на пиксель отображается соответствующая строка.

Я подумал, что для этого можно использовать графические тепловые карты.У меня проблемы:

  • Это действительно медленно.Если я сделаю свой массив равных размеров (100 100), загрузка займет несколько минут.Я думаю, что это может быть потому, что мой код неэффективен?
  • Я не могу понять, как сохранить соотношение сторон.Поэтому, если мое изображение является массивом размером (100 100), я бы хотел, чтобы график также был (100 100) пикселей.
  • использование пустых значений для z_text кажется плохим решением, но установка annotation_text=None не похоже на работу.

Может кто-нибудь помочь мне здесь?Вот что у меня получилось:

import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import plotly.figure_factory as ff

z = np.random.randint(0,6, size=(10, 10))
z_text = np.full(z.shape, '', dtype=str)

d = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e', 5:'f'}
class_mat = np.vectorize(d.get)(z)

fig = ff.create_annotated_heatmap(z, annotation_text=z_text, text=class_mat, hoverinfo='text', colorscale='Viridis', )
fig.layout.title = 'Semantic Segmentation'

iplot(fig, filename='annotated_heatmap_text')

А вот как это выглядит в настоящее время:

enter image description here

Также, если построена тепловая картаэто не лучший способ сделать это, я бы хотел услышать любые альтернативы!

Примечание: в настоящее время я показываю внутри jupyterlab.

1 Ответ

1 голос
/ 19 марта 2019

Я не уверен, правильно ли я понял каждую деталь здесь, но код из фрагмента ниже создаст этот график в блокноте Jupyter:

Сюжет:

enter image description here

Код 1 - Мои изменения к вашему образцу:

fig.data[0]['hoverinfo'] = 'all'
fig['layout']['yaxis']['scaleanchor']='x'
fig['layout']['xaxis']['gridcolor'] = 'rgba(0, 0, 0, 0)'
fig['layout']['yaxis']['gridcolor'] = 'rgba(0, 0, 0, 0)'
fig['layout']['yaxis']['color'] = 'rgba(0, 0, 0, 0)'

Код 2 - Theвсе для легкого копирования и вставки:

import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import plotly.figure_factory as ff

#%qtconsole

z = np.random.randint(0,6, size=(10, 10))
z_text = np.full(z.shape, '', dtype=str)

d = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e', 5:'f'}
class_mat = np.vectorize(d.get)(z)

fig = ff.create_annotated_heatmap(z, annotation_text=z_text, text=class_mat, hoverinfo='text', colorscale='Viridis', )
fig.layout.title = 'Semantic Segmentation'

# My suggestions:
fig.data[0]['hoverinfo'] = 'all'
fig['layout']['yaxis']['scaleanchor']='x'
fig['layout']['xaxis']['gridcolor'] = 'rgba(0, 0, 0, 0)'
fig['layout']['yaxis']['gridcolor'] = 'rgba(0, 0, 0, 0)'
fig['layout']['yaxis']['color'] = 'rgba(0, 0, 0, 0)'

iplot(fig)

Скорость:

Даже эта небольшая фигура занимает некоторое время для построения, но пока у меня нетлюбые предложения о том, как ускорить процесс.

...