如何垂直堆叠两个具有相同 x 比例但 R 中不同 y 比例的图?

机器算法验证 r 时间序列 数据可视化
2022-03-15 12:38:21

问候,

目前我正在 R 中执行以下操作:

require(zoo)
data <- read.csv(file="summary.csv",sep=",",head=TRUE)
cum  = zoo(data$dcomp, as.Date(data$date))
data = zoo(data$compressed, as.Date(data$date))
data <- aggregate(data, identity, tail, 1)
cum  <- aggregate(cum, identity, sum, 1)
days = seq(start(data), end(data), "day")
data2 = na.locf(merge(data, zoo(,days)))

plot(data2,xlab='',ylab='compressed bytes',col=rgb(0.18,0.34,0.55))
lines(cum,type="h",col=rgb(0,0.5,0))

summary.csv 的片段:

date,revision,file,lines,nclass,nattr,nrel,bytes,compressed,diff,dcomp
2007-07-25,16,model.xml,96,11,22,5,4035,991,0,0
2007-07-27,17,model.xml,115,16,26,6,4740,1056,53,777
2007-08-09,18,model.xml,106,16,26,7,4966,1136,47,761
2007-08-10,19,model.xml,106,16,26,7,4968,1150,4,202
2007-09-06,81,model.xml,111,16,26,7,5110,1167,13,258
...

最后两行绘制了我需要的信息,结果类似于以下内容: 替代文字 蓝线是我感兴趣的工件的熵(以字节为单位)。绿线代表变化的熵。

现在,在此图中,它运行良好,因为比例尺没有太大差异。但是我还有其他图表,其中绿线变得如此之小以至于看不到。

我正在寻找的解决方案涉及两件事:

  1. 要将绿色垂直线移动到第二个图形,就在第一个图形的下方,有自己的 y 轴,但共享 x 轴。
  2. 提供对数刻度,因为我对“幅度”比对特定值更感兴趣。

提前致谢!

PS如果有人还可以告诉我,我如何将“小勾号”放在 x 刻度中,指的是月份,我很感激 :-) 如果这些问题对于单个帖子来说太多了,我可以进一步划分它们。

2个回答

您可以使用par(new=TRUE)两个不同的 y 轴绘制到同一个图表中!这也应该可以解决您的问题。

接下来,您将找到一个简单的示例,该示例绘制了两个随机正态变量,一个在均值 0 上,另一个在均值 100 上(均sd s = 1)在同一个图中。第一个在左侧 y 轴上为红色,第二个在右侧 y 轴上为蓝色。然后,添加轴标签。

干得好:

x <- 1:10
y1 <- rnorm(10)
y2 <- rnorm(10)+100

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2))
par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,105))

axis(side=2)
axis(side=4)

然后看起来像这样(记住左轴为红色,右轴为蓝色):替代文字

更新:
根据评论,我制作了图表的更新版本。现在我更深入地研究基本图功能,使用par(mar=c(a,b,c,d))在图周围创建更大的边距(右轴标签需要),mtext以显示轴标签和axis函数的高级使用:

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

替代文字

如您所见,它非常简单。您可以在函数中定义数据的位置ylimplot然后ataxis函数中使用来选择您想要查看的轴刻度。labels此外,您甚至可以通过函数(在axis右轴上完成)提供轴刻度的标签(对于标称 x 轴非常有用)。要添加轴标签,请使用mtextwithat进行垂直定位(line用于水平定位)。

请务必检查?plot?par?axis?mtext以获取更多信息。
很棒的网络资源是:Quick-R for Graphs:123

我认为您可以使用ggplot2. 使用下面的代码,我可以生成:

替代文字

显然,线条颜色之类的东西可以更改为您想要的任何东西。在 x 轴上,我指定了年的主要行和月的次要行。

require(ggplot2)
t = as.Date(0:1000, origin="2008-01-01")  
y1 = rexp(1001)
y2 = cumsum(y1)
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=1001))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  scale_x_date(major="years", minor="months") +
  ylab("Log values")
g