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


9

问候,

目前,我正在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刻度中加上“小刻度”,我会很感激:-)如果这些问题对于单个帖子来说太多,我可以将其进一步划分。

Answers:


15

您可以使用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函数中使用选择要查看的轴刻度。此外,你甚至可以通过提供轴蜱(标称x轴非常有用)标签labelsaxis功能(在这里完成在右轴)。要添加轴标签,请使用mtextwith at进行垂直定位(line用于水平定位)。

请务必检查?plot?par?axis,并?mtext为进一步的信息。
大的网络资源是:快速-R为图表:12,和3


这很有趣,但是我们如何告诉读者哪个刻度对应于哪条线呢?
雨果·塞雷诺·费雷拉

看看这张图:imgur.com/K8BCr.png在那里,我们仅在将y轴标签和刻度应用于数据的位置(即,在图表顶部的左轴,作为相应的数据,以及图表底部的右轴(作为相应的数据)。此外,我们使用了不同的颜色(如上例)和线型,并在标题中进行了说明。您还可以在左侧使用折线图,在右侧轴上使用条形图,以使区别更加清晰。
亨里克

您提供的示例非常好...您如何设法垂直偏移每个轴?
雨果·塞雷诺·费雷拉

2
确实是很好的例子。图的唯一问题是两个Y变量名称都重叠。在这种情况下,您可能想要一个在左侧,另一个在右侧(甚至在垂直位置)。若要从“真的很好”到“完美”升级例如,您可能想用来自R多行文字功能做变量名
戴夫·科伦

@Hugo @Dave:有关两个注释的合并,请参见我的更新。
Henrik 2010年

12

我认为您可以使用想要的东西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

嗯,我尝试设置df = data.frame(t = days,values = c(data2,cum),type = rep(c(“ Bytes”,“ Changes”),each = 1001)),但它给出了一个rbind.zoo(...)错误:索引重叠
Hugo Sereno Ferreira 2010年

这是因为data2和cum是动物园对象。使用as.vector(data2)获取原始值。另外,我使用1001是因为我有1001个观测值。您将需要不同的东西。
csgillespie 2010年

Noob R用户在这里:data.frame(t =天,值= c(as.vector(data2),as.vector(cum)),错误):参数表示行数不同:1063、1300、2
Hugo Sereno费雷拉

输入“ days”,“ data2”和“ cum”以查看您的数据。然后查看“长度(天)”,等等。您需要将时间点与值匹配。
csgillespie 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.