Обычная тепловая карта работает, но фигурная тепловая карта не работает в Plotly - PullRequest
3 голосов
/ 14 апреля 2020

Данные

fin_list

[[None, 9.1, 8.8, 8.7, 8.8, 9.1, 9.2, 9.2, 9.0, 9.6],
 [None, 8.8, 8.5, 8.8, 8.8, 8.8, 9.1, 8.9, 8.8, 9.7],
 [None, 8.8, 8.6, 8.9, 9.6, 9.0, 8.8, 8.7, 9.0, 9.9],
 [None, 9.1, 9.7, 8.9, 8.8, 8.7, 9.7, 9.1, 9.7, 9.6],
 [None, 8.5, 8.5, 8.5, 8.7, 8.6, 8.0, 9.0, 9.9, 9.5],
 [None, 8.5, 9.4, 8.7, 9.1, 9.7, 8.4, 8.6, 8.4, 9.9],
 [None, 8.6, 8.9, 9.2, 9.8, 8.8, 9.1, 9.4, None, None],
 [None, 7.6, 7.9, 7.5, 5.5, 6.0, 4.1, None, None, None]]

отсортировано (серия ['эпизоды'])

[1, 2, 3, 4, 5, 6, 7, 8]

y_episodes

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Код для тепловой карты с использованием объектов Graph_objects

import plotly.graph_objects as go

fig = go.Figure(data=go.Heatmap(
                   x=y_episodes,
                   y=sorted(series['episodes']),
                   z=fin_list,
                   colorscale = 'OrRd',
                   hoverongaps = False))

Выход

enter image description here

Код для тепловой карты с использованием plotly.figure_factory

import plotly.figure_factory as ff

fig = ff.create_annotated_heatmap( 
                   x=sorted(series['episodes']),
                   y=y_episodes,
                   z=fin_list,
                   colorscale = 'OrRd')

Ошибка: PlotlyError: упс, предоставленный вами список x не соответствуйте ширине вашей z-матрицы

Но моя ось явно правильна, как они работали на рисунке выше.

print(len(sorted(series['episodes']))) #x_axis = 8
print(len(y_episodes)) #y_axis = 11
print(len(fin_list)) #z_axis = 8

Моя конечная цель состоит в том, чтобы комментировать тепловую карту, если есть это обходной путь для добавления аннотации в коде, который использует graph_objects (а не фабрику цифр), дайте мне знать.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вместо этого используйте numpy.nan типа float. Вы можете заменить значения в вашем fin_list, используя понимание вложенного списка:

list_nans=[[np.nan if y is None else y for y in x] for x in fin_list]

Сюжет:

enter image description here

Код:

import plotly.figure_factory as ff
import numpy as np

fin_list = [[None, 9.1, 8.8, 8.7, 8.8, 9.1, 9.2, 9.2, 9.0, 9.6],
             [None, 8.8, 8.5, 8.8, 8.8, 8.8, 9.1, 8.9, 8.8, 9.7],
             [None, 8.8, 8.6, 8.9, 9.6, 9.0, 8.8, 8.7, 9.0, 9.9],
             [None, 9.1, 9.7, 8.9, 8.8, 8.7, 9.7, 9.1, 9.7, 9.6],
             [None, 8.5, 8.5, 8.5, 8.7, 8.6, 8.0, 9.0, 9.9, 9.5],
             [None, 8.5, 9.4, 8.7, 9.1, 9.7, 8.4, 8.6, 8.4, 9.9],
             [None, 8.6, 8.9, 9.2, 9.8, 8.8, 9.1, 9.4, None, None],
             [None, 7.6, 7.9, 7.5, 5.5, 6.0, 4.1, None, None, None]]

y_sorted=[1, 2, 3, 4, 5, 6, 7, 8]

y_episodes=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list_nans=[[np.nan if y is None else y for y in x] for x in fin_list]


fig = ff.create_annotated_heatmap( 
                   #x=y_episodes,
                   #y=y_sorted,
                   z=list_nans,
                   #colorscale = 'OrRd'
)
fig.show()

Возможности для улучшения

Обратите внимание, что я закомментировал аргументы x и y. Как вы настроили его, он не работал должным образом. Причиной может быть то, что аргументы x и y различаются для двух фрагментов:

# go.Heatmap()
x=y_episodes,
y=sorted(series['episodes'])

# ff.create_annotated_heatmap()
x=sorted(series['episodes']),
y=y_episodes,

Я оставлю это вам, чтобы выяснить эту конкретную часть. Но, к счастью, ff.create_annotated_heatmap () не требует этих аргументов, как вы можете видеть из моего предложения.

Кроме того, вы можете улучшить саму фигуру, маскируя или удаляя nan значения в визуализации. Но предоставленное предложение по крайней мере заботится о TypeError: '<' not supported between instances of 'float' and 'NoneType', поэтому я надеюсь, что это то, что вам нужно, чтобы продвинуться на шаг вперед.

1 голос
/ 14 апреля 2020

Как писал Вестланд, вам нужно использовать np.nan вместо None. Другая проблема заключается в том, что ваши диапазоны не соответствуют измерениям вашего списка / тепловой карты. Чтобы исправить это, вы можете использовать np.linspace с числом шагов, равным длине измерений вашего списка.

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

import numpy as np
import plotly.figure_factory as ff

fin_list = [[np.nan, 9.1, 8.8, 8.7, 8.8, 9.1, 9.2, 9.2, 9.0, 9.6],
[np.nan, 8.8, 8.5, 8.8, 8.8, 8.8, 9.1, 8.9, 8.8, 9.7],
[np.nan, 8.8, 8.6, 8.9, 9.6, 9.0, 8.8, 8.7, 9.0, 9.9],
[np.nan, 9.1, 9.7, 8.9, 8.8, 8.7, 9.7, 9.1, 9.7, 9.6],
[np.nan, 8.5, 8.5, 8.5, 8.7, 8.6, 8.0, 9.0, 9.9, 9.5],
[np.nan, 8.5, 9.4, 8.7, 9.1, 9.7, 8.4, 8.6, 8.4, 9.9],
[np.nan, 8.6, 8.9, 9.2, 9.8, 8.8, 9.1, 9.4, np.nan, np.nan],
[np.nan, 7.6, 7.9, 7.5, 5.5, 6.0, 4.1, np.nan, np.nan, np.nan]]

x_episodes = np.linspace(0, 10, len(fin_list[0])).tolist()
y_episodes = np.linspace(0, 10, len(fin_list)).tolist()

fig = ff.create_annotated_heatmap( 
    x=x_episodes,
    y=y_episodes,
    z=fin_list,
    colorscale = 'OrRd')
fig['layout']['yaxis']['autorange'] = "reversed"
fig.show()

enter image description here

...