繁体   English   中英

如何从数据框中绘制带有 plotly 的堆叠条形图

[英]How to plot a stacked bar with plotly, from a dataframe

我有一个 df 作为

name | week |      %
mike   Week 1     .45
mike   Week 2      0
mike   Week 3     .40
mike   Week 4     .15
cindy  Week 1     .25
cindy  Week 2     .25
cindy  Week 3     .25
cindy  Week 4     .25

采样 df,其中我的实际 df 有更多名称

我正在尝试绘制每周每个名称的所有值,

我的情节代码如下:

    import plotly.graph_objects as go
    names= df['name'].unique()
    
    fig = go.Figure(data=[
        go.Bar(name='Week 1', x=names, y=[.15, .29, .19, .07]),
        go.Bar(name='Week 2', x=names, y=[.24, .15, .15, .15]),
        go.Bar(name='Week 3', x=names, y=[.20, .19, .17, .11]),
        go.Bar(name='Week 4', x=names, y=[.41, .37, .49, .67]),
    
    
    ])
    # Change the bar mode
    fig.update_layout(barmode='stack', title = 'title',xaxis_title='Month',
                      yaxis=dict(
            tickformat="%",
        ))

fig.show()

但是我不想手动输入第 1 周然后是第 2 周然后是第 3 周等等的每个值。 我如何创建一个参考,其中绘图代码中每周的 y 将引用第 1 周的所有值,这样我就不必输入了? 谢谢

import plotly.express as px
import pandas as pd

# sample dataframe
data = {'name': ['mike', 'mike', 'mike', 'mike', 'cindy', 'cindy', 'cindy', 'cindy'],
        'week': ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 1', 'Week 2', 'Week 3', 'Week 4'],
        '%': [0.45, 0.0, 0.4, 0.15, 0.25, 0.25, 0.25, 0.25]}
df = pd.DataFrame(data)

# display(df)
    name    week     %
0   mike  Week 1  0.45
1   mike  Week 2  0.00
2   mike  Week 3  0.40
3   mike  Week 4  0.15
4  cindy  Week 1  0.25
5  cindy  Week 2  0.25
6  cindy  Week 3  0.25
7  cindy  Week 4  0.25

# plot the long (tidy) dataframe
fig = px.bar(df, x="name", y="%", color="week", title="Title", barmode='stack')
fig.update_layout(xaxis_title='Name', yaxis=dict(tickformat="%",))
fig.show()
  • plotly.graph_objects需要一个plotly.graph_obj来构建堆积条形图的每一层
  • 使用列表df.groupby式,可以将df.groupby对象解包为必要的形式,以供go.Figure
import plotly.graph_objects as go

# using df from above, use groupby and a list comprehension to create data
data = [go.Bar(name=group, x=dfg['name'], y=dfg['%']) for group, dfg in df.groupby(by='week')]

# plot the figure
x = go.Figure(data)
x.update_layout(barmode='stack', title='Title', xaxis_title='Name', yaxis=dict(tickformat="%",))
x.show()
  • 两种实现都会产生以下图

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM