【问题标题】:GGplot second y axis without the transformation of y axisGGplot第二个y轴没有y轴的变换
【发布时间】:2024-01-02 21:07:01
【问题描述】:

有谁知道你是怎么应用这个的

set.seed(101)
x <- 1:10
y <- rnorm(10)
## second data set on a very different scale
z <- runif(10, min=1000, max=10000) 
par(mar = c(5, 4, 4, 4) + 0.3)  # Leave space for z axis
plot(x, y) # first plot
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)

但使用 ggplot。

在 ggplot 中,您只能使用 y 轴的变换来创建 sec.axis() 或 dup.axis()。一个全新的独立 y 轴将只应用于 z 变量,而简单的 y 轴将应用于 y 变量。

【问题讨论】:

  • 您的axis(.) 与确定yz 之间关系的额外步骤有何不同?我不同意有时这可能是一件苦差事,但是......有很多方法可以错误地做到这一点,程序员选择将全部责任推给用户。

标签: r ggplot2 yaxis


【解决方案1】:

ggplot2::sec_axis 只提供了一种机制来提供第二个轴,并且需要大量的说服力才能将其纳入代码库。您有责任提出转换。这种变换在某种程度上必须是线性的,所以如果任一轴需要是非线性的(例如,指数、对数等),那么您的专业数学技能将受到考验。

如果你可以使用scales,那么这个过程就变得琐碎

dat <- data.frame(x, y, z)
ggplot(dat, aes(x, y)) +
  geom_point() +
  geom_line(
    aes(y = zmod),
    data = ~ transform(., zmod = scales::rescale(z, range(y), range(z)))
  ) +
  scale_y_continuous(
    sec.axis = sec_axis(~ scales::rescale(., range(dat$z), range(dat$y)),
                        breaks = c(2000,4000,6000,8000))
  )

除非我错过了什么(我刚刚检查了ggplot2-3.3.5 的 NEWS.md 文件),否则这没有改变。

【讨论】:

    【解决方案2】:

    由于zy 之间没有完美的相关性,因此您不能使用辅助轴,但可以对其进行归一化并绘制两个几何图形:

    library(tidyverse)
    
    set.seed(101)
    x <- 1:10
    y <- rnorm(10)
    ## second data set on a very different scale
    z <- runif(10, min=1000, max=10000) 
    par(mar = c(5, 4, 4, 4) + 0.3)  # Leave space for z axis
    plot(x, y) # first plot
    par(new = TRUE)
    plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
    axis(side=4, at = pretty(range(z)))
    mtext("z", side=4, line=3)
    

    
    data <- tibble(
      x = x,
      y = y,
      z = z
    )
    
    data %>%
      mutate(y = scale(y), z = scale(z)) %>%
      ggplot(aes(x = x)) +
        geom_line(aes(y = z)) +
        geom_point(aes(y = y))
    

    reprex package (v2.0.1) 于 2021-09-20 创建

    【讨论】:

    • 谢谢你的回答,但我真的需要第二个 y 轴,我不知道怎么做