R base plot() 函数:我可以控制 R base 中这 3 个绘图中每一个的 y 轴范围和 y 轴刻度数方向吗?

问题描述

我可以控制 3 个 y 轴标签,但我也想控制 3 个 y 轴范围中的每一个。这可能吗?我试过“ylim”,但它似乎只接受一个范围。

另外,如果可能的话,我想将 y 轴刻度数字水平旋转,这样它们就不会相互重叠。

感谢您的任何意见!

library(zoo)
set.seed(42)
dat <- data.frame(date=seq.Date(as.Date("2020-12-01"),as.Date("2020-12-31"),"day"),x=runif(31,5000),y=runif(31,100),z=runif(31,20))
rownames(dat) <- dat[,1]
dat <- dat[,-1]

plot(as.zoo(dat),ylab=c("label1","label2","label3"))
plot(as.zoo(dat),"label3"),ylim=c(c(0,6000),c(0,150),50)))

click here to see example

解决方法

这里有几个问题:

  • 请注意,这是从通用 plot.zoo 分派 plot
  • as.zoo 应该是 read.zoo 并且动物园对象中的索引不是行名称。有关动物园对象的更多信息,请参阅 ?zoo 和动物园 vignette(package = "zoo") 附带的小插图,或在 zoo CRAN page 上找到它们的链接。请参阅 ?read.zoovignette("zoo-read",package = "zoo") 以了解有关 read.zoo 的更多信息。
  • 通常,如果不覆盖变量,处理代码会更容易。下面我们使用 z 来表示动物园对象,而不是破坏原始数据。
  • 要获得多个 ylim 集合,它们必须作为对列表传递。问题中的代码传递了一个包含 6 个值的简单向量。有关详细信息,请参阅 ?plot.zoo
  • 添加las=1。有关详细信息,请参阅 ?par

更正,我们有

library(zoo)

set.seed(42)
dat <- data.frame(date = seq.Date(as.Date("2020-12-01"),as.Date("2020-12-31"),"day"),x = runif(31,5000),y = runif(31,100),z = runif(31,20))   
z <- read.zoo(dat)

ylab <- c("label1","label2","label3")
ylim <- list(c(0,6000),c(0,150),50))
plot(z,ylab = ylab,ylim = ylim,las = 1)

给予:

screenshot

,

您可能想分别绘制三个数据,然后使用 patchwork 包来组合它们:

plot1 <- plot(...)
plot2 <- plot(...)
plot3 <- plot(...)
plot1 + plot2 + plot3 + patchwork::plot_layout(nrow = ...,ncol = ...)

因此,您可以为每个地块安排 ylim :

plot1 <- plot(...,ylim = c(0,6000))
plot2 <- plot(...,150))
plot3 <- plot(...,50))