从pandas数据透视表生成Plotly热图

时间:2018-04-14 01:48:20

标签: python pandas dictionary plotly heat

我一直在搜索这个主题几个小时,仍然无法让我的代码工作。我试图从我用pandas创建的数据透视表生成热图。我对编码很新,可能没有使用正确的术语,但我会尽我所能。

我的表格如下:

enter image description here

它还有更多行。我试图生成y轴上的国家,x上的4种所有权类型以及用作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')

这可能是一项相当简单的任务,我对编码没有太多了解,并感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:6)

Plotly将数据参数作为列表,并且不支持Pandas DataFrames。要获取已经采用正确格式的DataFrame,

  1. 数据作为值(在Plotly表示法中为“ z”)
  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()

答案 1 :(得分:1)

显然,Plotly并不直接支持DataFrame。但是你可以把你的DataFrames变成这样的列表字典:

Country_Ownership_df[['foo', 'bar']].to_dict()

然后像Plotly这样的非Pandas工具应该可以工作,因为默认情况下,dicts和list是JSON可序列化的。