如何使用Python中的Plotly绘制自定义大小的饼图子图

17

我一直在尝试使用Jupyter笔记本(离线版)中的Plotly(version 1.12.9)制作自定义大小的子图网格。Plotly网站上有很好的示例,但它们都是散点图。我修改了其中一个,使其看起来像我想要的样子,并且它适用于散点图:

import plotly
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]

trace0 = go.Scatter(x=[1, 2], y=[1, 2])
trace1 = go.Scatter(x=[1, 2], y=[1, 2])
trace2 = go.Scatter(x=[1, 2], y=[1, 2])
trace3 = go.Scatter(x=[1, 2], y=[1, 2])
trace4 = go.Scatter(x=[1, 2], y=[1, 2])
trace5 = go.Scatter(x=[1, 2], y=[1, 2])


fig = plotly.tools.make_subplots(
    rows=3,
    cols=3,
    specs=[[{}, {}, {}], [{}, {'colspan': 2, 'rowspan': 2}, None], [{} , None, None]],
    subplot_titles=('First Subplot','Second Subplot', 'Third Subplot')
)

fig.append_trace(trace0, 3, 1)
fig.append_trace(trace1, 2, 1)
fig.append_trace(trace2, 1, 1)
fig.append_trace(trace3, 1, 2)
fig.append_trace(trace4, 1, 3)
fig.append_trace(trace5, 2, 2)

py.iplot(fig)

并且正常工作: 自定义大小的散点图

但是像这样更改饼图的跟踪:

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]
trace0 = go.Pie(labels=labels,values=values)
trace1 = go.Pie(labels=labels,values=values)
trace2 = go.Pie(labels=labels,values=values)
trace3 = go.Pie(labels=labels,values=values)
trace4 = go.Pie(labels=labels,values=values)
trace5 = go.Pie(labels=labels,values=values)

仅仅抛出这个错误:

PlotlyDictKeyError: 'xaxis' is not allowed in 'pie'

Path To Error: ['xaxis']

Valid attributes for 'pie' at path [] under parents []:

    ['pullsrc', 'textfont', 'hoverinfo', 'domain', 'label0', 'legendgroup',
    'showlegend', 'scalegroup', 'textpositionsrc', 'pull', 'visible',
    'sort', 'name', 'outsidetextfont', 'dlabel', 'stream', 'hole',
    'textinfo', 'marker', 'labels', 'labelssrc', 'rotation', 'opacity',
    'values', 'insidetextfont', 'direction', 'textsrc', 'textposition',
    'type', 'valuessrc', 'text', 'uid']

Run `<pie-object>.help('attribute')` on any of the above.
'<pie-object>' is the object at []

只能用散点图来做这个吗?我在 plotly 的文档里没有找到相关的内容。

1个回答

16

我最近也遇到了同样的问题,但找不到关于是否可以使用plotly.tools.make_subplotsplotly.graph_objs.Pie的任何信息。据我理解,这是不可能的,因为这些图表没有x和y轴。在Pie原始教程中,他们通过提供一个domain字典来进行子图绘制,例如{'x': [0.0, 0.5], 'y': [0.0, 0.5]}定义了总绘图空间底部左侧象限的一个区域。顺便说一句,这个教程对甜甜圈图表的注释定位问题也有所保留,可以通过提供xanchor = 'center'yanchor = 'middle'参数来解决。我发现另外一个教程给出了一个非常好的例子。这里我将它展示在你的示例中:

import plotly
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]
domains = [
    {'x': [0.0, 0.33], 'y': [0.0, 0.33]},
    {'x': [0.0, 0.33], 'y': [0.33, 0.66]},
    {'x': [0.0, 0.33], 'y': [0.66, 1.0]},
    {'x': [0.33, 0.66], 'y': [0.0, 0.33]},
    {'x': [0.66, 1.0], 'y': [0.0, 0.33]},
    {'x': [0.33, 1.0], 'y': [0.33, 1.0]}
]
traces = []

for domain in domains:
    trace = go.Pie(labels = labels,
                   values = values,
                   domain = domain,
                   hoverinfo = 'label+percent+name')
    traces.append(trace)

layout = go.Layout(height = 600,
                   width = 600,
                   autosize = False,
                   title = 'Main title')
fig = go.Figure(data = traces, layout = layout)
py.iplot(fig, show_link = False)

Plotly 饼图子图示例

附言:对不起,我后来意识到纵坐标从底部开始,所以我垂直镜像了您的布局。此外,您可能需要在相邻的子图之间添加间隔(只需在布局中给出略小/略大的数字,例如右侧的0.31而非0.33,在左侧角落处将0.35改为0.33)。

最后,请在使用饼图之前考虑是否真正需要它们,并考虑评论如这篇文章这篇文章的批评。


这是对你引用的文章代码的很好的补充。我正在尝试类似的事情,但需要同时绘制多个列,增加了一些复杂性。我的数据帧有一个双层索引和12列(即跨类别的月度数据)。扩展你的代码来处理这种情况有多直接呢? - avg
不难,每个子图的数据都以列表形式提供,因此您可以完全自由地从数据框中编译它。 - deeenes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接