【问题标题】:plotnine/ggplot (Python) - stacked bars + width manipulationplotnine/ggplot (Python) - 堆积条形图 + 宽度操作
【发布时间】:2020-06-28 16:25:10
【问题描述】:

我有这个数据框:

df = pd.DataFrame({'Segment': {0: 'A', 1: 'B', 2: 'C', 3: 'D'},
 '%Value_S=0': {0: 0.489, 1: 0.429, 2: 0.467, 3: 0.461},
 '%Value_S=1': {0: 0.511, 1: 0.571, 2: 0.533, 3: 0.539},
 '%Total': {0: 0.148, 1: 0.076, 2: 0.3, 3: 0.477}})
df
    Segment  %Value_S=0  %Value_S=1  %Total
0   A        0.489       0.511       0.148
1   B        0.429       0.571       0.076
2   C        0.467       0.533       0.300
3   D        0.461       0.539       0.477

我正在尝试做一个像这样的堆叠条:

但我需要条形的宽度来自%Total。所以,为了绘制上面的图表,我使用了这个:

z = df.melt(id_vars="Segment", value_vars=["%Value_S=0", "%Value_S=1"])
(ggplot(z, aes(x="Segment", y="value")) + 
  geom_bar(aes(fill="variable"), stat="identity", position="fill"))

如果我添加 width 参数:

geom_bar(aes(fill="variable", width= df["%Total"]), stat="identity", position="fill"))

它给了我这个错误:

PlotnineError: 'Aesthetics must either be length one, or the same length as the data'

我也尝试了另一种方法:首先绘制宽度,然后我想不出一种方法来绘制其他两个变量。最难的部分是:四个条形必须覆盖所有图表(它们之间没有空格)。有什么想法吗?

【问题讨论】:

    标签: python pandas ggplot2 plotnine


    【解决方案1】:

    您从融化的数据框 (z) 传递了数据,但尝试通过原始数据框 (df) 的一列调整条形宽度。您需要在融化的 df 中包含 %Total 列:

    z = df.melt(
        id_vars=["Segment", "%Total"],
        value_vars=["%Value_S=0", "%Value_S=1"]
    )
    

    然后简单地映射到%Total列的宽度:

    from plotnine import geom_bar, ggplot, aes
    (
        ggplot(z, aes(x="Segment", y="value"))
        + geom_bar(
            aes(fill="variable", width="%Total"),
            stat="identity", position="fill"
        )
    )
    

    产生:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2021-01-17
      相关资源
      最近更新 更多