我正在尝试在plotly中实现一个分组条形图(或)堆叠条形图
我已经使用plotly实现了它(这非常简单),下面是它的代码。数据帧“Rank”、“NOC”、“Gold”、“Silver”、“Bronze”、“Total”共有六列
`
trace1=go.Bar(x=olympics_data['NOC'],y=olympics_data['Gold'],marker=dict(color='green',opacity=0.5),name="Gold")
trace2=go.Bar(x=olympics_data['NOC'],y=olympics_data['Silver'],marker=dict(color='red',opacity=0.5),name="Silver")
trace3=go.Bar(x=olympics_data['NOC'],y=olympics_data['Bronze'],marker=dict(color='blue',opacity=0.5),name="Bronze")
data=[trace1,trace2,trace3]
layout = go.Layout(title="number of medals in each category for various countries",xaxis=dict(title="countries"),yaxis=dict(title="number of medals"),
barmode="stack")
fig = go.Figure(data,layout)
fig.show()`输出:

我期待着使用plotly-express得到类似的输出。
发布于 2020-06-23 09:54:04
您可以使用此link中的px.bar()来排列您的数据。
或者,您可以考虑在barmode()中使用relative。
条形模式(字符串(默认‘相对’))- 'group','overlay‘或'relative’之一在‘相对’模式下,条形堆叠在大于零的正值和小于零的负值。在“叠加”模式下,条形图被绘制在另一个的顶部。在“组”模式下,条形图被放在一个接一个的位置。
使用overlay
import plotly.express as px
iris = px.data.iris()
display(iris)
fig = px.histogram(iris, x='sepal_length', color='species',
nbins=19, range_x=[4,8], width=600, height=350,
opacity=0.4, marginal='box')
fig.update_layout(barmode='overlay')
fig.update_yaxes(range=[0,20],row=1, col=1)
fig.show()

使用relative
fig.update_layout(barmode='relative')
fig.update_yaxes(range=[0,20],row=1, col=1)
fig.show()

使用group
fig.update_layout(barmode='group')
fig.show()

发布于 2019-11-09 21:04:44
是的,Plotly Express通过px.bar()支持堆叠和分组的条形图。包含示例的完整文档在此处https://plot.ly/python/bar-charts/
发布于 2020-04-06 21:16:44
下面是一个可重用的函数来实现这一点。
def px_stacked_bar(df, color_name='category', y_name='y', **pxargs):
'''Row-wise stacked bar using plot-express.
Equivalent of `df.T.plot(kind='bar', stacked=True)`
`df` must be single-indexed'''
idx_col = df.index.name
m = pd.melt(df.reset_index(), id_vars=idx_col, var_name=color_name, value_name=y_name)
return px.bar(m, x=idx_col, y=y_name, color=color_name, **pxargs)示例用法
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
px_stacked_bar(df.set_index('A'))

https://stackoverflow.com/questions/58766305
复制相似问题