创建两个具有相同X轴的Y轴

问题描述 投票:0回答:1

我正在尝试为连续牙本质采样的稳定同位素数据创建一个图,该图提供 deltaN15 和 deltaC13 数据以及年龄分配。我希望 x 轴为样本的年龄(即 8 岁 - 17 岁),而一个 y 轴显示 dN15,另一个显示 dC13 值。每个同位素将有两条单独的线,我知道这是可以做到的(我在论文中看到过)。我知道在许多情况下,拥有多个 y 轴并不是首选,但在处理连续牙本质数据时,这是健康和饥荒的重要指标。

我已经尝试了上一个问题中的以下代码,但它不起作用:

par(mar = c(5, 4, 4, 4) + 0.3)  # Leave space for z axis
plot(df.OBF031$age, df.OBF031$δ..N) # first plot

par(new = TRUE)
plot(df.OBF031$age, df.OBF031$δ..C, type = "l", 
     axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(df.OBF031$δ..C)))
mtext("z", side=4, line=3)

我附上了我的主管在 Excel 中制作的我希望创建的图片。

连续牙本质图示例

这是来自其中一个人的数据(每个人都会得到自己的图)

r plot
1个回答
0
投票

这个问题之前已经在这个网站上得到了回答,但我找不到与基础R相关的答案。

主要问题是重新缩放辅助 y 轴,使其适合主 y 轴形成的绘图区域。这是使用变换函数 y2' = a + b*y2 实现的,其中 a = (y1_max - y1_min) / (y2_max - y2_min) 且 b = y1_max - a * y2。

您没有提供任何可用的数据,因此我创建了一些与您类似的玩具数据。

set.seed(747)
df.OBF031 <- data.frame(age =  c(8:19, 22), 
                        pN  =  10+cumsum(runif(n=13, -1, 1.5)),
                        pC  = -21+cumsum(runif(n=13, -1, 1)))

   age        pN        pC
1    8  9.469060 -21.56656
2    9 10.647606 -22.16869
3   10 11.464212 -21.71222
4   11 12.595730 -22.40238
5   12 12.874744 -21.50029
6   13 11.654143 -22.60722
7   14 11.171937 -23.37192
8   15 11.281971 -24.05789
9   16 10.258565 -25.29918
10  17  8.947673 -24.92300
11  18  9.511145 -25.50945
12  19 10.643776 -25.49314
13  22 11.980805 -25.29048

该数据属于一个人。首先绘制第一个系列,即主(左)y 轴的系列,它看起来像

δ..N
,正如您已经完成的那样。另外,根据数据定义轴限制(也可以自己手动定义)。

ylim <- c(min(df.OBF031$pN), max(df.OBF031$pN))
xlim <- c(min(df.OBF031$age), max(df.OBF031$age))

opar <- par(mar = c(3, 3, 1, 3.5) + 0.3,  # Leave space for z axis
    mgp=c(1.5,0.5,0), tck=-0.02)    # Adjust labels and axes ticks

with(df.OBF031,
     plot(pN~age, las=1, col="darkblue", pch=2, 
          ylab="", xlab="Age (years)",  
          ylim=ylim, xlim=xlim,
          xaxt="n", cex.axis=0.8)) # first plot
axis(side=1, at=8:22, labels=c(8:20, NA, "bone"), cex.axis=0.8)
grid(nx=NA, ny=NULL)

mtext(bquote(paste(delta,phantom()^15*N,' (%) (AIR)')),,
      side=2, adj=0, col="darkblue",
      at=par("usr")[3], line=1.5, las=3)

为了完整起见,我将像使用 Excel 一样添加平滑样条线。自由度为 12(比观测数少 1)。

library(splines)
spline_C <- lm(pN ~ ns(age, df = 12), data=df.OBF031)
lines(seq(8,22,0.1), 
      predict(spline_C, newdata=data.frame(age=seq(8,22,0.1))), 
      col="darkblue", lwd = 2)

现在是辅助 y 轴的变换。

a <- (ylim[2] - ylim[1])/(max(df.OBF031$pC) - min(df.OBF031$pC))
b <- ylim[2] - a * max(df.OBF031$pC)
df.OBF031$pC_ <- a * df.OBF031$pC + b

然后添加辅助系列。

at
函数的
labels
axis
参数不同。

points(df.OBF031$age, df.OBF031$pC_, pch=5, col="red")
axis(side=4, las=1, cex.axis=0.8,
     at = a * pretty(range(df.OBF031$pC)) + b, 
     labels=pretty(range(df.OBF031$pC)))
mtext(bquote(paste(delta,phantom()^13*C,' (%) (VPDB)')), 
      side=4, adj=1, col="red",
      at=par("usr")[4], line=2.5, las=3)

spline_N <- lm(pC_ ~ ns(age, df = 11), data=df.OBF031)
lines(seq(8,22,0.1), 
      predict(spline_N, newdata=data.frame(age=seq(8,22,0.1))), 
      col = "red", lwd = 2)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.