Генерирование тепловой карты Plotly из сводной таблицы панд
Я искал эту тему в течение пары часов и до сих пор не могу заставить мой код работать. Я пытаюсь сгенерировать тепловую карту из сводной таблицы, которую я создал, используя панд. Я очень плохо знаком с программированием и, вероятно, не использую правильную терминологию, но постараюсь.
Моя таблица выглядит так:
введите описание изображения здесь
У этого есть еще много рядов также. Я пытаюсь сгенерировать графическую тепловую карту со странами на оси y, 4 типами собственности на x и числовыми значениями, используемыми в качестве значений z. Я получаю много ошибок, но думаю, что я приближаюсь, потому что доходит до моей последней строки и говорит: "TypeError: Объект типа 'DataFrame' не сериализуем в формате JSON". Я искал эту ошибку, но не могу найти ничего, что я могу понять. Я настроил таблицу следующим образом, и у меня возникли проблемы с вводами z, x и y:
data = [go.Heatmap(z=[Country_Ownership_df[['Company Owned', 'Franchise', 'Joint Venture', 'Licensed']]],
y=[Country_Ownership_df['Country']],
x=['Company Owned', 'Franchise', 'Joint Venture', 'Licensed'],
colorscale=[[0.0, 'white'], [0.000001, 'rgb(191, 0, 0)'], [.001, 'rgb(209, 95, 2)'], [.005, 'rgb(244, 131, 67)'], [.015, 'rgb(253,174,97)'], [.03, 'rgb(249, 214, 137)'], [.05, 'rgb(224,243,248)'], [0.1, 'rgb(116,173,209)'], [0.3, 'rgb(69,117,180)'], [1, 'rgb(49,54,149)']])]
layout = go.Layout(
margin = dict(t=30,r=260,b=30,l=260),
title='Ownership',
xaxis = dict(ticks=''),
yaxis = dict(ticks='', nticks=0 )
)
fig = go.Figure(data=data, layout=layout)
#iplot(fig)
plotly.offline.plot(fig, filename= 'tempfig3.html')
Вероятно, это довольно простая задача, я просто не многому научился с кодированием и ценю любую помощь, которую вы можете предложить.
1 ответ
Plotly принимает аргументы данных в виде списков и не поддерживает Pandas DataFrames. Чтобы получить DataFrame, который уже имеет правильный формат,
- данные как значения ('z' в обозначении Plotly),
- значения x как столбцы
- y-значения как индекс
Работает следующая функция:
def df_to_plotly(df):
return {'z': df.values.tolist(),
'x': df.columns.tolist(),
'y': df.index.tolist()}
Поскольку он возвращает dict
, вы можете напрямую передать его как аргумент в go.HeatMap
:
import plotly.graph_objects as go
fig = go.Figure(data=go.Heatmap(df_to_plotly(df)))
fig.show()
Очевидно, Plotly напрямую не поддерживает DataFrames. Но вы можете превратить ваши DataFrames в словари списков следующим образом:
Country_Ownership_df[['foo', 'bar']].to_dict()
Тогда не Pandas-инструменты, такие как Plotly, должны работать, потому что по умолчанию диктовки и списки JSON-сериализуемы.