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

ggplot双Y轴绘图:图例与轴标题的美学配置问题

解决ggplot双Y轴的美学、图例与轴标题配置问题

我来帮你搞定这个双Y轴的ggplot配置问题,顺便把美学、图例和轴标题的细节给你捋清楚!首先先整理你给出的不完整代码片段,再一步步完善:

你的原始代码片段:

# plots for uk debt wealth inequality 
p1<-ggplot(uk, aes(x = year))+ 
scale_y_continuous(expand = c(0, 0), limits = c(20,250))+ 
scale_x_continuous(expand = c(0, 0), breaks= c(1950, seq(1950,2010,10)))+ 
geom_line(aes(y = debt_sm, colour="Debt"), size=1.2, na.rm = TRUE)+ 
labs( y="Public Debt [% GDP]...

接下来我们逐步修改优化:

1. 实现双Y轴核心配置

要添加第二个Y轴,需要在scale_y_continuous()中用sec_axis()参数,同时要注意两个变量的数值缩放(避免其中一条线被压缩到角落)。假设第二个变量是wealth_inequality,我们可以这样配置:

# 先计算缩放比例(根据你的实际数据调整,确保两个变量曲线合理展示)
scale_factor <- max(uk$debt_sm, na.rm = TRUE) / max(uk$wealth_inequality, na.rm = TRUE)

p1 <- ggplot(uk, aes(x = year)) +
  # 第一条线:公共债务(对应主Y轴)
  geom_line(aes(y = debt_sm, colour = "Public Debt"), size = 1.2, na.rm = TRUE) +
  # 第二条线:财富不平等(缩放后匹配主Y轴范围)
  geom_line(aes(y = wealth_inequality * scale_factor, colour = "Wealth Inequality"), size = 1.2, na.rm = TRUE) +
  # 配置主、次Y轴
  scale_y_continuous(
    expand = c(0, 0),
    limits = c(20, 250),
    name = "Public Debt [% GDP]", # 主Y轴标题
    # 次Y轴:反向缩放回原始数值,设置标题
    sec.axis = sec_axis(~ . / scale_factor, name = "Wealth Inequality Index")
  ) +
  scale_x_continuous(
    expand = c(0, 0),
    breaks = c(1950, seq(1950, 2010, 10))
  )

2. 优化图例展示

默认的颜色映射可能混乱,我们手动指定颜色和图例样式,让它更清晰:

p1 <- p1 +
  scale_colour_manual(
    name = "Metrics", # 图例标题
    values = c("Public Debt" = "#2E86AB", "Wealth Inequality" = "#F24C4C") # 自定义对比色
  ) +
  theme(
    legend.position = "top", # 图例位置:可选top/right/bottom等
    legend.title = element_text(face = "bold"), # 图例标题加粗
    legend.text = element_text(size = 10) # 图例文字大小
  )

3. 整体美学细节优化

调整主题元素,让图表更整洁专业:

p1 <- p1 +
  theme_minimal() + # 使用简洁的极简主题
  theme(
    axis.title.x = element_text(size = 12, face = "bold", margin = margin(t = 10)), # X轴标题样式
    axis.title.y = element_text(size = 12, face = "bold", margin = margin(r = 10)), # 主Y轴标题样式
    axis.title.y.right = element_text(size = 12, face = "bold", margin = margin(l = 10)), # 次Y轴标题样式
    axis.text = element_text(size = 10), # 轴刻度文字大小
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5, margin = margin(b = 15)), # 图表标题居中加粗
    panel.grid.minor = element_blank() # 隐藏次要网格线,减少视觉干扰
  ) +
  labs(
    title = "UK Public Debt vs Wealth Inequality (1950-2010)", # 图表标题
    x = "Year" # X轴标题
  )

关键提醒

  • 双Y轴的缩放比例一定要根据你的实际数据调整,别直接照搬示例里的数值
  • 尽量避免用双Y轴(容易让读者误解数据关系),如果必须用,一定要清晰标注两个轴的含义和缩放逻辑
  • 颜色选择对比明显的色系,提升图表可读性

直接运行完整代码,就能得到一个美学整洁、图例清晰、轴标题明确的双Y轴图表啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:00:42