如何在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 ) )
代码说明
- 数据预处理:按年份分组,计算每个分段的下方累加和,进而得到标签的中心y坐标。
- 标签绑定:绘制时将标签的y轴位置设置为计算好的
label_y,确保标签落在分段中心。 - 格式优化:合并了重复的x轴设置,调整坐标轴标签为中文,提升可读性。
内容的提问来源于stack exchange,提问作者Tann
相关产品推荐
相关产品推荐

