如何用ggplot2复现R基础绘图绘制的帕累托图?
使用ggplot2复刻基础R帕累托图
没问题,我帮你把基础R写的帕累托图用ggplot2完美复刻出来了,细节和你原来的图表完全一致,代码如下:
第一步:数据预处理
先和你原来的步骤一样,把数据按缺陷数降序排列,计算累计计数、频率和累计频率:
library(tidyverse) d <- tribble( ~ category, ~defect, "price", 80, "schedule", 27, "supplier", 66, "contact", 94, "item", 33 ) %>% arrange(desc(defect)) %>% mutate( cumsum = cumsum(defect), freq = round(defect / sum(defect), 3), cum_freq = cumsum(freq) )
第二步:ggplot2绘图代码
这部分完全对应你基础R图的所有细节——双Y轴、柱状图样式、累计线颜色、刻度标签、标题和边框:
ggplot(d, aes(x = fct_inorder(category))) + # 绘制柱状图,匹配原图的宽度、无边框样式 geom_bar(aes(y = defect), width = 0.8, fill = "grey", border = NA, stat = "identity") + # 绘制累计折线和实心点,颜色用原图的cyan4 geom_line(aes(y = cumsum, group = 1), color = "cyan4", linewidth = 1) + geom_point(aes(y = cumsum), color = "cyan4", size = 2, shape = 19) + # 设置主Y轴(累计计数)和副Y轴(累计频率百分比) scale_y_continuous( name = "Cumulative Counts", breaks = c(0, d$cumsum), limits = c(0, 1.05 * max(d$cumsum)), sec.axis = sec_axis( # 把累计计数转换为0-1的频率比例,对应副轴刻度 trans = ~ . / max(d$cumsum), name = "Cumulative Frequency", breaks = c(0, d$cumsum) / max(d$cumsum), labels = paste(c(0, round(d$cum_freq * 100)), "%", sep = "") ) ) + # X轴不显示名称,保持和原图一致 scale_x_discrete(name = "") + # 设置图表标题 ggtitle("Pareto Chart (version 1)") + # 调整主题细节,匹配原图的边框、字体颜色和大小 theme_classic() + theme( plot.title = element_text(hjust = 0.5), # 标题居中 axis.text.y = element_text(color = "grey62", size = 8), # 主Y轴文字颜色和大小 axis.text.y.right = element_text(color = "cyan4", size = 8), # 副Y轴文字颜色和大小 axis.title.y = element_text(color = "grey62"), # 主Y轴标题颜色 axis.title.y.right = element_text(color = "cyan4"), # 副Y轴标题颜色 axis.text.x = element_text(size = 7), # X轴分类文字大小 panel.border = element_rect(colour = "grey62", fill = NA) # 添加灰色边框 )
关键细节说明:
- 用
fct_inorder(category)锁定分类的排序,避免ggplot自动重新排序离散型X轴 - 副Y轴通过
sec_axis做了刻度转换,确保累计频率的百分比和累计计数的刻度完全对应 - 主题部分的颜色、字体大小都和你基础R的图对齐,边框样式也保持一致
内容的提问来源于stack exchange,提问作者stackinator
相关产品推荐
相关产品推荐

