我有一个时间序列的多个变量,它们的比例不同。我想在单页中随时间绘制每个变量,每个绘图都有自己的y轴。 似乎很容易,但我有一个对称问题,因为y轴值较高的图表与y轴值较小的图表相比向右平展。当我决定将x轴仅保留在两个图中时,出现了面板尺寸的另一个问题。这些面板变得比其他面板更扁平。
我对格子比较陌生,我搜索了很多但没有成功。首先,我尝试使用grid.arrange
来安排绘图,但我无法使用此功能修改特定面板。因此,我尝试使用print
排列图表,然后使用panel.widths
和panel.heights
。但它并没有为所有面板提供完全相同的尺寸。
考虑到不同的y轴和x轴存在/不存在的任何建议,以获得相同尺寸的多个面板?示例如下:
#Data
a<-c(1058.2557,821.2002,1004.5201,296.8243,374.3730,746.0718,954.6511,264.7352)
b<-c(100,60,40,36,42,32,42,32)
c<-c(116.610418,164.462337,47.862511,12.613479,4.253702,39.868584,21.591731,6.037917)
d<-c(4,10,3,2,1,5,11,13)
e<-c(20,30,10,50,21,60,20,70)
est1<-c("16:00","19:00","22:00","01:00","04:00","07:00","10:00","13:00")
newest1<-factor(est1,levels=unique(est1))
mysettings<-list(layout.heights=list(top.padding=-1,bottom.padding=-1),
layout.widths=list(right.padding=-2))
plo1<-barchart(a~newest1,scales=list(x=list(alternating=0)),par.settings=mysettings)
plo2<-barchart(b~newest1,scales=list(x=list(alternating=0)),par.settings=mysettings)
plo3<-barchart(c~newest1,scales=list(x=list(alternating=0)),par.settings=mysettings)
plo4<-barchart(d~newest1,scales=list(x=list(rot=45)),par.settings=mysettings)
plo5<-barchart(e~newest1,scales=list(x=list(rot=45)),par.settings=mysettings)
trellis.device(windows, height=6, width=7)
print(plo1, split=c(1,1,2,3),more=T)
print(plo2, split=c(2,1,2,3),more=T)
print(plo3, split=c(1,2,2,3),more=T)
print(plo4, split=c(2,2,2,3),more=T)
print(plo5, split=c(1,3,2,3),more=F)
答案 0 :(得分:4)
通常,您不会在格子中布置相关的绘图。您通常会使用分组变量。为此,您需要在一个data.frame
中包含所有数据dd <- data.frame(make.groups(a=a,b=b,c=c,d=d,e=e), newest1=newest1)
为了让事情看起来更好,我将定义自定义轴功能
axis.yout<- function(side, ...) {
if(side %in% c("left", "right")) {
if (panel.number() %% 2 == which(c("right","left")==side)-1) {
panel.axis(side = side, outside =TRUE)
}
} else {
axis.default(side = side, ...)
}
}
现在我用
绘图barchart(data~newest1 | which, dd, layout=c(2,3),
scales=list(alternating=T, y=list(relation="free")),
par.settings=list(layout.widths=list(right.padding=5, axis.panel = c(1, 0))),
axis=axis.yout
)
导致
它们共享一个共同的x轴,同时允许自由和独立标记的y轴。间距/传递都是一致的,因为我们只使用了一次格子调用。通常你不会打扰这样的自定义轴函数,但当尺度关系是“自由”时,格子会对交替标签有点脾气暴躁。
答案 1 :(得分:1)
我相信有人会发布一个不错的lattice
解决方案。同时,您可以考虑使用ggplot
替代方案。
library(reshape2)
library(ggplot2)
首先,在数据框中收集矢量,并将数据从宽格式转换为长格式:
df <- data.frame(newest1, a, b, c, d, e)
df2 <- melt(df, id.var = "newest1")
将数据绘制在单独的facets
中,每个原始向量的一个方面(melt
ed数据(“df2”)中的数据显示为“变量”变量的不同级别)。我们在每个方面允许独立的(“free
”)y轴scales
:
ggplot(data = df2, aes(x = newest1, y = value)) +
geom_bar(stat = "identity") +
facet_wrap(~ variable, scales = "free_y") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))