如何用ggplot2复现Base R绘制的双柱状图
用ggplot2复现Base R绘制的双柱状图
我已经用Base R画出了下面的双柱状图,现在想改用ggplot2复现一模一样的效果,具体该怎么操作?
以下是我用Base R绘图的代码:
data <- structure(list( A= c(53, 39), B = c(30, 36), C = c(12, 19), D = c(5, 6)), .Names = c("Poor", "Fair", "Good", "Excellent"), class = "data.frame", row.names = c(NA, -2L)) attach(data) print(data) colors <- c("dodgerblue3","red3") barplot(as.matrix(data), main="", beside = T, ylab = "", ylim = range(0,65), col=colors, border=F) legend(5,60, legend=c("Fox News", "CNN"), fill=colors, horiz = T, bty='n') text(1.5, 55, "53%") text(2.5, 41, "39%") text(4.5, 32, "30%") text(5.5, 38, "36%") text(7.5, 14, "12%") text(8.5, 21, "19%") text(10.5, 7, "5%") text(11.5, 8, "6%")
对应的图表效果:横轴是评价等级(Poor、Fair、Good、Excellent),纵轴范围0-65;每个等级下有两个并列柱子,深蓝色代表Fox News,红色代表CNN;每个柱子上方都标有对应的百分比;顶部有个无外框的水平图例。
实现方法
ggplot2依赖长格式数据,所以先把当前的宽格式数据转成长格式,再绘图:
1. 转换数据格式
用tidyr和dplyr包把数据转成长格式,同时添加媒体来源的分组列:
# 加载需要的包 library(ggplot2) library(tidyr) library(dplyr) # 原数据 data <- structure(list( A= c(53, 39), B = c(30, 36), C = c(12, 19), D = c(5, 6)), .Names = c("Poor", "Fair", "Good", "Excellent"), class = "data.frame", row.names = c(NA, -2L)) # 添加分组列并转成长格式 data_long <- data %>% mutate(Source = c("Fox News", "CNN")) %>% pivot_longer(cols = -Source, names_to = "Rating", values_to = "Percentage")
2. 绘制匹配的双柱状图
用ggplot2构建图表,调整所有参数和原图表对齐:
ggplot(data_long, aes(x = Rating, y = Percentage, fill = Source)) + # 画并列柱子,去掉边框 geom_col(position = position_dodge(width = 0.9), color = NA) + # 设置和原图表一致的颜色 scale_fill_manual(values = c("Fox News" = "dodgerblue3", "CNN" = "red3")) + # 设置纵轴范围,去掉纵轴标签 scale_y_continuous(limits = c(0, 65), name = "") + # 添加柱子上方的百分比标签 geom_text(aes(label = paste0(Percentage, "%")), position = position_dodge(width = 0.9), vjust = -0.5, size = 3.5) + # 调整图例和主题,匹配原图表风格 theme(legend.position = c(0.7, 0.95), legend.direction = "horizontal", legend.background = element_blank(), plot.title = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.ticks.x = element_blank())
关键参数说明
position_dodge(width = 0.9):控制并列柱子的间距,和Base R的beside=T效果一致geom_text的vjust=-0.5:让标签在柱子上方,避免和柱子重叠theme里的设置:去掉网格线、背景,调整图例位置和样式,完全还原原图表的简洁感
内容的提问来源于stack exchange,提问作者Data and AI Nerd
相关产品推荐
相关产品推荐

