You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Julia的堆叠条形图中添加居中数值标签

堆叠条形图:将数值标签置于条形段中心的解决方案

问题说明

我有如下DataFrame数据集,需要绘制堆叠条形图,并将每个条形分段的数值标签精准放在段的中心位置。

数据集

20×3 DataFrame
 Row │ size             year   mean_turnover 
     │ String           Int64  Float64       
─────┼───────────────────────────────────────
   1 │ Quy mô vừa        2017          187.1
   2 │ Quy mô vừa        2018          186.1
   3 │ Quy mô vừa        2019          115.7
   4 │ Quy mô vừa        2020          103.5
   5 │ Quy mô vừa        2021          133.3
   6 │ Quy mô siêu nhỏ   2017           83.7
   7 │ Quy mô siêu nhỏ   2018           78.0
   8 │ Quy mô siêu nhỏ   2019           82.7
   9 │ Quy mô siêu nhỏ   2020           81.0
  10 │ Quy mô siêu nhỏ   2021           92.6
  11 │ Quy mô nhỏ        2017          176.4
  12 │ Quy mô nhỏ        2018          171.9
  13 │ Quy mô nhỏ        2019           98.0
  14 │ Quy mô nhỏ        2020           91.5
  15 │ Quy mô nhỏ        2021          102.0
  16 │ Quy mô lớn        2017          165.5
  17 │ Quy mô lớn        2018          170.6
  18 │ Quy mô lớn        2019          156.6
  19 │ Quy mô lớn        2020          137.6
  20 │ Quy mô lớn        2021          122.0

当前代码

using DataFrames, Gadfly 

turnover_size_df = DataFrame(size = ["Quy mô vừa", "Quy mô vừa", "Quy mô vừa", "Quy mô vừa", "Quy mô vừa", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô lớn", "Quy mô lớn", "Quy mô lớn", "Quy mô lớn", "Quy mô lớn"],
               year = [2017, 2018, 2019, 2020, 2021, 2017, 2018, 2019, 2020, 2021, 2017, 2018, 2019, 2020, 2021, 2017, 2018, 2019, 2020, 2021],
               mean_turnover = [187.1, 186.1, 115.7, 103.5, 133.3, 83.7, 78.0, 82.7, 81.0, 92.6, 176.4, 171.9, 98.0, 91.5, 102.0, 165.5, 170.6, 156.6, 137.6, 122.0])

p_turnover_s = plot(turnover_size_df,
                x = "year",
                y = "mean_turnover",
                color = "size",
                Geom.bar(position=:stack),
                Guide.xlabel("Year"),
                Guide.ylabel("Turnover Rate"),
                label = "mean_turnover_string",
                Geom.label(position=:above),
                Scale.x_continuous(format = :plain),
                Scale.x_continuous(minvalue=2017, maxvalue=2021),
                Theme(
                background_color = "white",
                bar_spacing = 2mm 
    )        
)

当前输出

所有数值标签都显示在堆叠条形的顶部,而非每个分段的中心位置。

期望输出

每个条形分段的中心位置都显示对应的数值标签,标签精准落在分段内部。


解决方案

要实现标签居中,需要先计算每个分段的中心y坐标(即下方所有分段的累加和加上当前分段值的一半),再将标签绑定到该坐标位置。

修改后的代码

using DataFrames, Gadfly

# 构造原始数据集
turnover_size_df = DataFrame(
    size = ["Quy mô vừa", "Quy mô vừa", "Quy mô vừa", "Quy mô vừa", "Quy mô vừa", 
            "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", "Quy mô siêu nhỏ", 
            "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", "Quy mô nhỏ", 
            "Quy mô lớn", "Quy mô lớn", "Quy mô lớn", "Quy mô lớn", "Quy mô lớn"],
    year = [2017, 2018, 2019, 2020, 2021, 2017, 2018, 2019, 2020, 2021, 
            2017, 2018, 2019, 2020, 2021, 2017, 2018, 2019, 2020, 2021],
    mean_turnover = [187.1, 186.1, 115.7, 103.5, 133.3, 83.7, 78.0, 82.7, 81.0, 92.6, 
                     176.4, 171.9, 98.0, 91.5, 102.0, 165.5, 170.6, 156.6, 137.6, 122.0]
)

# 计算每个分段的中心y坐标
sort!(turnover_size_df, [:year, :size])
turnover_size_df = combine(groupby(turnover_size_df, :year)) do group_df
    # 计算当前分段下方所有分段的累加和
    cumulative_sum = cumsum(group_df.mean_turnover) .- group_df.mean_turnover
    # 中心位置 = 下方累加和 + 当前分段值的一半
    group_df.label_y = cumulative_sum .+ group_df.mean_turnover ./ 2
    # 转换数值为字符串标签
    group_df.label = string.(group_df.mean_turnover)
    return group_df
end

# 绘制堆叠条形图并放置中心标签
p_turnover_s = plot(turnover_size_df,
    # 绘制堆叠条形
    x = :year,
    y = :mean_turnover,
    color = :size,
    Geom.bar(position=:stack),
    # 设置坐标轴标签
    Guide.xlabel("年份"),
    Guide.ylabel("周转率"),
    # 放置中心标签
    x = :year,
    y = :label_y,
    label = :label,
    Geom.label,
    # 设置x轴范围和格式
    Scale.x_continuous(format=:plain, minvalue=2017, maxvalue=2021),
    # 主题设置
    Theme(
        background_color="white",
        bar_spacing=2mm
    )
)

代码说明

  1. 数据预处理:按年份分组,计算每个分段的下方累加和,进而得到标签的中心y坐标。
  2. 标签绑定:绘制时将标签的y轴位置设置为计算好的label_y,确保标签落在分段中心。
  3. 格式优化:合并了重复的x轴设置,调整坐标轴标签为中文,提升可读性。

内容的提问来源于stack exchange,提问作者Tann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:17:31