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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:53