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

如何在Julia中创建百分比堆叠条形图(Percentage stacked barplot)

在Julia中实现百分比堆叠条形图

用户希望在Julia中创建类似R语言的百分比堆叠条形图,以下是R语言的实现代码:

set.seed(7)
data <- matrix(sample(1:30,6), nrow=3)
colnames(data) <- c("A","B")
rownames(data) <- c("V1","V2","V3")
library(RColorBrewer)
cols <- brewer.pal(3, "Pastel1") 
df_percentage <- apply(data, 2, function(x){x*100/sum(x,na.rm=T)})
barplot(df_percentage, col=cols, border="white", xlab="group")

用户已尝试在Julia中实现,但仅完成了百分比坐标轴设置,未实现每个条形按百分比占比堆叠的效果,尝试代码如下:

using StatsPlots

measles = [38556, 24472]
mumps = [20178, 23536]
chickenPox = [37140, 32169]
ticklabel = ["A", "B"]
foo = @. measles + mumps + chickenPox
my_range = LinRange(0, maximum(foo), 11)

groupedbar(
  [measles mumps chickenPox],
  bar_position = :stack,
  bar_width=0.7,
  xticks=(1:2, ticklabel),
  yticks=(my_range, 0:10:100),
  label=["measles" "mumps" "chickenPox"]
)

需要调整代码以实现和R一致的百分比堆叠条形图效果。


解决方案

核心思路是先将每个类别的数值转换为对应组的百分比(和R代码逻辑对齐),再绘制堆叠条形图:

using StatsPlots

# 原始数据
measles = [38556, 24472]
mumps = [20178, 23536]
chickenPox = [37140, 32169]
ticklabel = ["A", "B"]

# 计算每个组的总数值
group_totals = measles .+ mumps .+ chickenPox

# 将每个类别转换为对应组的百分比
measles_pct = measles ./ group_totals .* 100
mumps_pct = mumps ./ group_totals .* 100
chickenPox_pct = chickenPox ./ group_totals .* 100

# 绘制百分比堆叠条形图
groupedbar(
    [measles_pct mumps_pct chickenPox_pct],
    bar_position = :stack,
    bar_width = 0.7,
    xticks = (1:2, ticklabel),
    yticks = 0:10:100,
    ylabel = "百分比",
    xlabel = "组别",
    label = ["measles" "mumps" "chickenPox"],
    bordercolor = :white,  # 移除条形边框,匹配R效果
    palette = :Pastel1     # 使用Pastel1配色,匹配R的ColorBrewer效果
)

关键调整说明:

  • 数据转换:先计算每个组的总和,再将每个类别数值转换为该组的百分比,确保每个堆叠条形总高度为100%
  • 配色与边框:通过palette = :Pastel1和bordercolor = :white匹配R代码的视觉效果
  • 坐标轴设置:直接使用百分比刻度(0:10:100),无需映射原始数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:50:15