如何在R语言帕累托图中基于次Y轴80%值添加截线
R语言帕累托图添加80%红线解决方案
需求说明
已完成帕累托图主体绘制,需添加两条红色虚线:
- 在右侧次Y轴80%位置绘制水平红线,与累积频率曲线相交
- 从交点向下绘制垂直线至X轴
修改后的完整代码
defect <- c(80, 27, 66, 94, 33, 354, 32, 77, 567) names(defect) <- c("Jafar", "Ali", "Mamal", "Mosi", "Hamed", "Haney", "Munny", "Funny", "Foony") d <- data.frame(defect) # 修正:将行名转为category列,避免绘图报错 d <- d %>% mutate(category = rownames(.)) %>% arrange(desc(defect)) %>% mutate( cumsum = cumsum(defect), freq = round(defect / sum(defect), 3), cum_freq = cumsum(freq) ) ## 保存默认绘图参数 def_par <- par() # 设置新边距 par(mar=c(5,5,4,5)) ## 绘制条形图,pc存储条形的x坐标 pc <- barplot(d$freq, width = 1, space = 0.2, border = NA, axes = F, ylim = c(0, 1.05 * max(d$freq, na.rm = T)), ylab = "相对频率" , cex.names = 0.7, names.arg = d$category, main = "帕累托图") ## 标注左侧Y轴 axis(side = 2, at = c(0, d$freq), las = 1, col.axis = "grey62", col = "grey62", tick = T, cex.axis = 0.8) ## 添加图框 box(col = "grey62") ## 绘制累积频率曲线 max_freq <- max(d$freq, na.rm = T) px <- d$cum_freq * max_freq lines(pc, px, type = "b", cex = 0.7, pch = 19, col="cyan4") ## 添加右侧Y轴 axis(side = 4, at = seq(0, max_freq, length.out = 5), labels = paste(seq(0, 100, 25), "%", sep=""), las = 1, col.axis = "cyan4", col = "cyan4", cex.axis = 0.8) ## 绘制80%红线 # 计算80%对应的左侧Y轴数值 y_80 <- 0.8 * max_freq # 找到第一个累积频率≥80%的条形位置 idx <- which(d$cum_freq >= 0.8)[1] x_pos <- pc[idx] # 水平红色虚线 abline(h = y_80, col = "red", lty = 2) # 垂直红色虚线 abline(v = x_pos, col = "red", lty = 2) ## 恢复默认绘图参数 par(def_par)
关键修改说明
- 修正标签列:原代码中
names.arg = d$category会报错,这里将行名转为category列,确保条形图标签正常显示。 - 优化右侧Y轴:改为生成均匀刻度(0%、25%、50%、75%、100%),视觉更规范。
- 红线绘制逻辑:
- 映射80%累积频率到左侧Y轴刻度:
y_80 = 0.8 * max(d$freq) - 定位第一个达到80%累积频率的条形X坐标
- 用
abline()绘制水平/垂直红色虚线(lty=2代表虚线样式)
- 映射80%累积频率到左侧Y轴刻度:
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

