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

R语言ggplot使用scale_y_log10后如何将点图设为次Y轴?

解决方案

核心逻辑

ggplot2的次坐标轴本质为刻度标注层,不支持独立的数据映射,你不需要额外调用scale_y_continuous,直接在现有scale_y_log10中配置sec.axis参数即可解决冲突报错,实现逻辑如下:

  1. 先将百分比数据转换到主Y轴(对数浓度)的数值区间,让点可以落在主轴的画布范围内
  2. 在scale_y_log10中添加次轴配置,用逆转换公式把主轴的数值还原为真实百分比标注

可直接运行的修正代码

library(ggplot2)
library(scales)

# 预处理:把Species转成有序因子避免多次reorder;替换0值避免log10计算报错
df$Species <- reorder(df$Species, df$Species_order)
df$Secondary_conc[df$Secondary_conc == 0] <- 1e-7 # 替换为极小值适配对数刻度

# 定义百分比和主Y轴的转换/逆转换函数
# 主Y范围设为1e-7 ~ 500,对应百分比0~100,边界可根据实际需求调整
y_trans <- function(x) {
  10^((log10(500) - log10(1e-7)) * x/100 + log10(1e-7))
}
y_inv_trans <- function(x) {
  (log10(x) - log10(1e-7)) / (log10(500) - log10(1e-7)) * 100
}

# 绘图代码
ggplot(df) + 
  geom_bar(aes(x=Species, y=Secondary_conc),
           stat = 'identity',fill="cadetblue2") +
  # 主Y轴保持log10配置,同时添加次轴参数
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                labels = trans_format("log10", math_format(10^.x)),
                sec.axis = sec_axis(trans = y_inv_trans, 
                                    name = "占比(%)",
                                    breaks = c(0,20,40,60,80,100))) + 
  # 点的y值用转换后的值,映射到主Y显示范围
  geom_point(aes(x=Species, y=y_trans(Secondary_perc)), color="red") + 
  theme(axis.title.y = element_text (face="bold", size=8),
        axis.text.x = element_text(face = "bold",size = 8, angle = -45, hjust = 0),
        # 单独配置次轴样式和主轴区分
        axis.title.y.right = element_text(face="bold", size=8, color="red"),
        axis.text.y.right = element_text(color="red"),
        legend.position = "none") + 
  labs(x=NULL,y=expression(bold(ng/m^{3})))

关键说明

你之前报错的原因是不能给同一个Y轴同时设置两套缩放规则(scale_y_log10和scale_y_continuous),上述方案完全不需要调用scale_y_continuous,次轴直接配置在scale_y_log10的参数中即可。转换函数的边界值(1e-7、500)可以根据你的实际数据范围调整,只要保证百分比映射后落在主Y的显示区间内即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:06:03