(这个问题可能会更好地迁移到 stats.SE,因为问题不在于调用什么函数,而在于理解这些东西背后 的想法。)
正如@Carl Witthoft 所指出的,这里的基本策略是在绘图之前缩放您的数据集。以下是它的工作原理(要了解所使用的任何功能,?<function name>
请在 R 控制台的提示符处输入):
# here I generate some example data, set.seed makes it reproducible
set.seed(33)
x <- 1:20; y0 <- 20; y1 <- 25; y2 <- 300
for(i in 2:20){
y0 <- c(y0, y0[i-1]+rnorm(1, mean=0.25, sd=1.5))
y1 <- c(y1, y1[i-1]+rnorm(1, mean=0, sd=1))
y2 <- c(y2, y2[i-1]+rnorm(1, mean=-10, sd=5))
}
max(y0, y1)
# [1] 35.3668
min(y0, y1)
# [1] 17.77653
# from 0 to 50 seems like a reasonable Y range for the plotting area
windows()
plot (x, y0, pch=6, cex=.5, col="blue", type="b",
xlab="Mb", ylab="Pi", ylim=c(0, 50))
lines(x, y1, pch=18, cex=.5, col="red", type="b")
# We need to create a new variable that will fit within this plotting area
y2new <- scale(y2) # this makes y2 have mean 0 & sd 1
y2new <- y2new*sd(y0) # now its sd will equal that of y0
y2new <- y2new+mean(y0) # now its mean will also equal that of y0
lines(x, y2new, pch=24, cex=.5, col="green", type="b")
# now y2 fits within the window, but we need an axis which must map the
# plotted points to the original values
summary(y0)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 17.78 20.64 24.34 25.62 30.25 35.37
summary(y2)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 125.1 178.2 222.2 220.0 266.3 300.0
sd(y0)
# [1] 5.627629
sd(y2)
#[1] 54.76167
# thus, we need an axis w/ 25.62 showing 220 instead, & where 5.63 higher
# shows 54.76 higher instead
increments <- (mean(y0)-seq(from=0, to=50, by=10))/sd(y0)
increments
# [1] 4.5521432 2.7751960 0.9982488 -0.7786983 -2.5556455
# [6] -4.3325927
newTicks <- mean(y2) - increments*sd(y2)
newTicks
# [1] -29.24281 68.06579 165.37438 262.68298 359.99158
# [6] 457.30017
# the bottom of the y axis in the plot is 4.55 sd's below y0's mean,
# thus the bottom of the new axis should be about -30, and the top of
# the new axis should be about 460
axis(side=4, at=seq(0, 50, 10), labels=round(newTicks), col="green")
legend("bottomleft", c("y0 (left axis)", "y1 (left axis)",
"y2 (right axis)"), pch=c(6, 18, 24), lty=1,
col=c("blue", "red", "green"))
这一切都有些痛苦。从@Carl Wittholf 的回答中,我收集到该功能plotyy()
会自动为您执行此操作(我从未使用过它),但您必须先安装(并随后加载)pracma包。