如何用两个类别制作条形图?

Posted

技术标签:

【中文标题】如何用两个类别制作条形图?【英文标题】:How to make bar plot in plotly with two categories? 【发布时间】:2021-09-01 10:16:17 【问题描述】:

我有这样的数据

import pandas as pd
df = pd.DataFrame(
dict(
    week=[1, 1, 2, 2, 3, 3] * 2,
    layout=["classic", "classic", "modern", "modern"] * 3,
    response=["conversion", "exit"] * 6,
    cnt=[26, 23, 45, 34, 55, 44, 53, 27, 28, 25, 30, 34],))

我需要像在 excel 中那样使用 plotly 获得这样的条形图:

我不能使用两个类别的主要问题。我的代码:

px.bar(
    data_frame=df,
    x='week',
    y='cnt',
    template='plotly_dark',
    color = 'layout'
)

结果:

但我无法像在 excel 示例中那样显示有关“响应”的信息

【问题讨论】:

我的建议对你有什么效果? 【参考方案1】:

在我看来,最灵活的方法是使用 go.Figure() 然后

fig.add_traces(go.Bar(x=dfp['week'], y = dfp['cnt'], name = v))

对于v 中的每个值,['conversion - classic', 'conversion - modern', 'exit - classic', 'exit - modern'] 如下所示:

fig = go.Figure()
for v in df['value'].unique():
    dfp = df[df['value']==v]
    fig.add_traces(go.Bar(x=dfp['week'], y = dfp['cnt'], name = v))
fig.update_layout(barmode='stack', template='plotly_dark')
fig.show()

剧情:

据我所知,这应该非常类似于您的 Excel 输出。

完整代码:

import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

df = pd.DataFrame(
dict(
    week=[1, 1, 2, 2, 3, 3] * 2,
    layout=["classic", "classic", "modern", "modern"] * 3,
    response=["conversion", "exit"] * 6,
    cnt=[26, 23, 45, 34, 55, 44, 53, 27, 28, 25, 30, 34],))

df['value'] = df['response'] + ' - ' + df['layout']
df = df.sort_values('value')
# df2 = df.groupby(['value', 'week']).sum().reset_index().sort_values('value')

fig = go.Figure()
for v in df['value'].unique():
    dfp = df[df['value']==v]
    fig.add_traces(go.Bar(x=dfp['week'], y = dfp['cnt'], name = v))
fig.update_layout(barmode='stack', template='plotly_dark')
fig.show()

【讨论】:

以上是关于如何用两个类别制作条形图?的主要内容,如果未能解决你的问题,请参考以下文章

spss如何删除堆积条形图中的某块数据

spss如何删除堆积条形图中的某块数据

如何用 folium 绘制地图并在 python 中的地图旁边放置条形图?

【tableau数据分析可视化-专题(4)】-Tableau制作条形图

为多个变量制作堆积条形图 - R 中的 ggplot2

如何创建按 2 个类别分组的堆积条形图