使用 ggplot/plotnine 在条形图中显示摘要统计信息
Display summary statistics in barplot using ggplot/plotnine
在下面的简化示例中,我希望显示每个堆叠条形图的总和(A 为 3,B 为 7),但我的代码显示了所有值,而不是汇总统计信息。我究竟做错了什么?提前谢谢你。
import io
import pandas as pd
import plotnine as p9
data_string = """V1,V2,value
A,a,1
A,b,2
B,a,3
B,b,4"""
data = io.StringIO(data_string)
df = pd.read_csv(data, sep=",")
p9.ggplot(df, p9.aes(x='V1', y='value', fill = 'V2')) + \
p9.geom_bar(stat = 'sum') + \
p9.stat_summary(p9.aes(label ='stat(y)'), fun_y = sum, geom = "text")
问题出在您的数据分组上。由于您具有全局 fill
美学,因此您的数据会按 V2
的类别分组。因此 stat_summary
计算每组 V2
的总和。要解决此问题,请将 fill
设为 geom_bar
或 geom_col
.
的本地美学
import io
import pandas as pd
import plotnine as p9
data_string = """V1,V2,value
A,a,1
A,b,2
B,a,3
B,b,4"""
data = io.StringIO(data_string)
df = pd.read_csv(data, sep=",")
p9.ggplot(df, p9.aes(x='V1', y='value')) + \
p9.geom_col(p9.aes(fill = 'V2')) + \
p9.stat_summary(p9.aes(label ='stat(y)'), fun_y = sum, geom = "text")
另一种选择是通过在 stat_summary
中设置 group=1
来覆盖全局分组:
p9.stat_summary(p9.aes(label ='stat(y)', group = 1), fun_y = sum, geom = "text")
在下面的简化示例中,我希望显示每个堆叠条形图的总和(A 为 3,B 为 7),但我的代码显示了所有值,而不是汇总统计信息。我究竟做错了什么?提前谢谢你。
import io
import pandas as pd
import plotnine as p9
data_string = """V1,V2,value
A,a,1
A,b,2
B,a,3
B,b,4"""
data = io.StringIO(data_string)
df = pd.read_csv(data, sep=",")
p9.ggplot(df, p9.aes(x='V1', y='value', fill = 'V2')) + \
p9.geom_bar(stat = 'sum') + \
p9.stat_summary(p9.aes(label ='stat(y)'), fun_y = sum, geom = "text")
问题出在您的数据分组上。由于您具有全局 fill
美学,因此您的数据会按 V2
的类别分组。因此 stat_summary
计算每组 V2
的总和。要解决此问题,请将 fill
设为 geom_bar
或 geom_col
.
import io
import pandas as pd
import plotnine as p9
data_string = """V1,V2,value
A,a,1
A,b,2
B,a,3
B,b,4"""
data = io.StringIO(data_string)
df = pd.read_csv(data, sep=",")
p9.ggplot(df, p9.aes(x='V1', y='value')) + \
p9.geom_col(p9.aes(fill = 'V2')) + \
p9.stat_summary(p9.aes(label ='stat(y)'), fun_y = sum, geom = "text")
另一种选择是通过在 stat_summary
中设置 group=1
来覆盖全局分组:
p9.stat_summary(p9.aes(label ='stat(y)', group = 1), fun_y = sum, geom = "text")