Генерирование тепловой карты 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, который уже имеет правильный формат,

  1. данные как значения ('z' в обозначении Plotly),
  2. значения x как столбцы
  3. 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-сериализуемы.

Другие вопросы по тегам