有什么方法可以以绘图方式实现堆积或分组条形图

时间:2019-11-08 12:07:54

标签: python plotly plotly-express

我正在尝试以绘图方式实现分组条形图(或)堆叠条形图

我已经使用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()`

输出:

enter image description here

我期望使用plotly-express得到类似的输出。

3 个答案:

答案 0 :(得分:2)

您可以像本link一样安排数据以使用px.bar()

或者您可以考虑在barmode()中使用relative

barmode(str(默认值:“ relative”))–“ group”,“ overlay”或“ 'relative'在'relative'模式下,条在0上方堆叠 正值,小于零则为负值。在“覆盖”模式下, 条形图相互绘制。在“分组”模式下,放置条 彼此相邻。

使用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()

enter image description here

使用relative

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

enter image description here

使用group

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

enter image description here

答案 1 :(得分:0)

是的,Plotly Express支持使用px.bar()进行堆叠和分组的钢筋。带有示例的完整文档位于https://plot.ly/python/bar-charts/

答案 2 :(得分:0)

这是可重复使用的功能。

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'))

enter image description here