使用 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_bargeom_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")