plotnine/ggplot (Python) - 堆叠条形图 + 宽度操作
plotnine/ggplot (Python) - stacked bars + width manipulation
我有这个数据框:
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'
我也尝试了另一种方法:先绘制宽度,然后我想不出绘制其他两个变量的方法。最难的部分是:四个条形必须覆盖所有图形(它们之间没有空格)。有什么想法吗?
您从熔化数据框 (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"
)
)
产生:
我有这个数据框:
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'
我也尝试了另一种方法:先绘制宽度,然后我想不出绘制其他两个变量的方法。最难的部分是:四个条形必须覆盖所有图形(它们之间没有空格)。有什么想法吗?
您从熔化数据框 (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"
)
)
产生: