【问题标题】:Plotly : How to make group and stack bar subplots in one figure?Plotly:如何在一个图中制作组和堆栈条子图?
【发布时间】:2021-07-22 17:17:09
【问题描述】:

以下是填充 3 个子图的工作示例代码。我试图将第一个子图显示为“组”(行 = 1,列 = 1),其余两个子图显示为“堆栈”。我还为每个子图选择了“barmode”。但我的最终数字包含所有“堆栈”子图。我已经推荐了几个论坛,他们建议对每个子图使用“偏移”,但即使该参数也不起作用。请建议。 注意:在实时情况下,所有子图都基于不同的数据帧,但我在这篇文章中只使用了一个数据帧。

import pandas as pd
import numpy as np
from plotly.subplots import make_subplots
import plotly.graph_objects as go


#creating my dataframe
s = 200
df = pd.DataFrame({"Country": np.random.choice(["USA America", "JPY one two", "MEX", "IND", 
  "AUS"], s),
   "economy_cat": np.random.choice(["developing","develop"], s),
   "gdp": np.random.randint(5, 75, s),
   })
#filter dataframe for one country
df = df[df.Country=='USA America']
df_pivot = df.pivot_table(index='Country',columns='economy_cat',values='gdp',aggfunc='sum')
df_pivot.reset_index(inplace=True)
print(df_pivot)

fig = make_subplots(rows=2, cols=4)
# creation of subplots 1
fig.add_trace(
    go.Bar(
       x=df_pivot["Country"],
       y=df_pivot["develop"],
       marker_color = '#1f77b4', 
       name='develop'
    ),
    row=1,
    col=1,
 )
fig.add_trace(
    go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["developing"],
    marker_color = "rgba(255, 0, 0, 0.6)",
    name='developing'
   ),
    row=1,
    col=1,
)
 fig.update_layout(barmode = 'group')
# creation of subplots 2
 fig.add_trace(
    go.Bar(
        x=df_pivot["Country"],
       y=df_pivot["develop"],
       marker_color = '#1f77b4', 
        name='develop'
    ),
     row=1,
     col=2,
 )
fig.add_trace(
go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["developing"],
    marker_color = "rgba(255, 0, 0, 0.6)",
    name='developing'
),
row=1,
col=2,
  )
fig.update_layout(barmode = 'stack')
# creation of subplots 3
fig.add_trace(
go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["develop"],
    marker_color = '#1f77b4', 
    name='develop'
  ),
  row=2,
  col=1,
 )
   fig.add_trace(
   go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["developing"],
    marker_color = "rgba(255, 0, 0, 0.6)",
    name='developing'
     ),
     row=2,
     col=1,
     )
fig.update_layout(barmode = 'stack')

fig.update_layout(
    font_family="Droid Sans")

【问题讨论】:

  • 大家有什么建议吗?

标签: pandas plotly


【解决方案1】:

fig.update_layout(barmode = 'stack')fig.update_layout(barmode = 'group') 之间交替对您没有帮助,因为此参数会修改整个图形,包括每个子图,这就是它们的行为方式相同的原因。

根据 Frederik Bengtsson 的this helpful article,您可以使用offsetgroup 参数。

当您将两个条形图添加为单独的轨迹时,要将它们组合在一起,您可以为第一个轨迹设置offsetgroup=0,为第二个轨迹设置offsetgroup=1

要在子图中将两个条形堆叠,您可以为两条轨迹设置 offsetgroup=0,但将第二条轨迹的 base 参数设置为第一条踪迹。

我稍微修改了您的代码以包含多个国家/地区来说明堆叠和分组的条形:

import pandas as pd
import numpy as np
from plotly.subplots import make_subplots
import plotly.graph_objects as go


#creating my dataframe
s = 200
df = pd.DataFrame({"Country": np.random.choice(["USA America", "JPY one two", "MEX", "IND", 
  "AUS"], s),
   "economy_cat": np.random.choice(["developing","develop"], s),
   "gdp": np.random.randint(5, 75, s),
   })
#filter dataframe for one country
# df = df[df.Country=='USA America']
df_pivot = df.pivot_table(index='Country',columns='economy_cat',values='gdp',aggfunc='sum')
df_pivot.reset_index(inplace=True)
print(df_pivot)

fig = make_subplots(rows=2, cols=2)
# creation of subplots 1 - grouped
fig.add_trace(
    go.Bar(
       x=df_pivot["Country"],
       y=df_pivot["develop"],
       offsetgroup=0,
       marker_color = '#1f77b4', 
       name='develop'
    ),
    row=1,
    col=1,
)
fig.add_trace(
    go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["developing"],
    offsetgroup=1,
    marker_color = "rgba(255, 0, 0, 0.6)",
    name='developing'
   ),
    row=1,
    col=1,
)
# fig.update_layout(barmode = 'group')
# creation of subplots 2 - stacked
fig.add_trace(
    go.Bar(
        x=df_pivot["Country"],
        y=df_pivot["develop"],
        offsetgroup=0,
        marker_color = '#1f77b4', 
        name='develop'
    ),
    row=1,
    col=2,
)
fig.add_trace(
    go.Bar(
        x=df_pivot["Country"],
        y=df_pivot["developing"],
        offsetgroup=0,
        base=df_pivot["develop"],
        marker_color = "rgba(255, 0, 0, 0.6)",
        name='developing'
    ),
    row=1,
    col=2,
)
# fig.update_layout(barmode = 'stack')
# creation of subplots 3 - stacked
fig.add_trace(
    go.Bar(
        x=df_pivot["Country"],
        y=df_pivot["develop"],
        offsetgroup=0,
        marker_color = '#1f77b4', 
        name='develop'
      ),
    row=2,
    col=1,
)
fig.add_trace(
    go.Bar(
    x=df_pivot["Country"],
    y=df_pivot["developing"],
    offsetgroup=0,
    base=df_pivot["develop"],
    marker_color = "rgba(255, 0, 0, 0.6)",
    name='developing'
    ),
    row=2,
    col=1,
)
# fig.update_layout(barmode = 'stack')
fig.update_layout(font_family="Droid Sans")
fig.show()

【讨论】:

  • 感谢您的回复。实际上,我的每个子图都基于不同的数据框。那么,这个逻辑对不同的数据帧有效吗?因为在这里,我们基于相同的数据帧设置基本参数。请提出建议。
  • 是的,只要您在同一个子图中使用相同的 DataFrame 值,此方法就可以工作。
猜你喜欢
  • 2021-07-13
  • 2019-08-09
  • 2018-11-14
  • 2022-01-15
  • 2021-01-17
  • 1970-01-01
  • 2020-01-12
  • 2021-02-12
  • 2018-04-08
相关资源
最近更新 更多