R中多个图形类型的对齐(最好是ggplot2或格子)

时间:2012-02-24 03:59:36

标签: r graph ggplot2 lattice

我想创建以下类型的图表,其中包含带有这样的数据集的line,bar和heatmap:

pos <- 1:40 # X axis 
barvar <- rnorm (40, 5, 2) # y axis for barplot 
linevar <- rnorm (40, 0, 0.5) # yvar for line plot 
heatmapvar <- rep(1:5, 8) # yvar plot for heatmap (color coded) plot 
myd <- data.frame (pos, barvar, linevar, heatmapvar) 

# labeling positions 
label <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
position <- c(1, 5, 10, 15, 20, 25, 30, 35, 40)

enter image description here

3 个答案:

答案 0 :(得分:3)

使用这种组合图,在尝试将它们连接在一起之前,通常更容易将它们全部分开:

library(ggplot2)

# line plot
p.line <- ggplot(myd,aes(x=pos)) + 
          geom_line(aes(y=linevar)) + # plot the line using linevar
          # draw the scales. NOTE: position[1] should be 0 not 1.
          scale_x_continuous(breaks=position,labels=label)
# bar plot
p.bar <- ggplot(myd,aes(x=pos)) + 
         geom_bar(aes(y=barvar),stat='identity') +  # plot the bar chart
         scale_y_reverse()                          # reverse y scale

# heat plot
p.heat <- ggplot(myd,aes(x=pos)) + 
          geom_tile(aes(y=-.5,fill=heatmapvar,height=.5)) +  # draw heatmap
          scale_fill_gradient(low="yellow",high="red")       # colour scale

您可以使用print(p.xxx)查看它们的外观。

现在,我们可以使用grid.arrange中的gridExtra将它们组合在一起:

library(gridExtra)
grid.arrange(p.line,p.heat,p.bar)

看起来像这样:

enter image description here

(注意 - 我的条形图发出了警告,因为我有一个负面的barvar - 我认为你实际要使用的数据不会出现这个问题。

现在,热图看起来有点难看,看起来你想要将绘制到线图上,所以我们可以将它添加到线图上:

我不希望热图在上划线,所以我自己设置它的位置和高度:

hght <- .25 # just looked nice - you'll have to adjust based on your data
ypos <- min(myd$linevar)-hght
p.line2 <- p.line + 
           geom_tile(aes(x=pos-.5,y=ypos, fill=heatmapvar, height=hght)) +
           scale_fill_gradient(low="yellow",high="red") +               
           opts(legend.position="none")  # <-- turn off the heatmap legend.
# print(p.line2)

注意 - 我添加了x=pos-.5,因为否则geom_tile将磁贴居中于x值不对齐(尝试不使用x=pos-.5来查看我的意思)。

标记位置

标签&lt; - c(“A”,“B”,“C”,“D”,“E”,“F”,“G”,“H”,“I”) 位置&lt; - c(1,5,10,15,20,25,30,35,40)

现在我安排这些:

grid.arrange(p.line2,p.bar)

看起来像:

enter image description here

关于调整颜色,添加标题等 - 你可以做到这一点。 我建议调整各个图表以获得他们喜欢的方式,然后只在最后将它们组合起来。

ggplot2 documentation很有帮助(虽然我发现'ggplot2 heatmap'(例如)的一般Google搜索在获取示例方面更有帮助。)

答案 1 :(得分:3)

使用格子,设置scales=list(relation="free") - 这会给你levelplot()的警告,但对齐仍然可以正常工作。如果您希望它超对齐,请在space="top"中设置levelplot(),以便将图例从热图的右侧移到顶部。

更新:我按OP请求重置了一些填充和删除标签。

library(lattice)
library(gridExtra)
#within `scales` you can manipulate different parameters of x and y axis
a = xyplot(linevar ~ pos,type="l",col=1,xlab="",ylab="",
           scales=list(relation="free",x=list(draw=F)))
#layout.heights/layout.width can tweak padding for margins
b = barchart(barvar ~ pos,col=1,horizontal=F,xlab="",ylab="",
             scales=list(relation="free",x=list(cex=0.5)),
             par.settings=list(layout.heights=list(bottom.padding = 0)))
#change region colors according to your taste and use `colorkey` to remove legend
col=gray(seq(0.3,0.8,length=6))
c = levelplot(as.matrix(heatmapvar),col.regions=col,colorkey=F,xlab="",ylab="",
              scales=list(relation="free"),
              par.settings=list(layout.heights = list(top.padding =-25)))
grid.arrange(b,a,c)

enter image description here

答案 2 :(得分:0)

您认为我们可以将所有三个图组合成一个吗?

基于数学咖啡的答案,我尝试用技巧来做到这一点 - 但并不完全成功,但我认为专家会帮助我规避这些不足。

pos <- 1:40 # X axis
barvar <-  c(-1 * rnorm (40, 5, 2)) # y axis for barplot
linevar <- rnorm (40, 0, 0.5) # yvar for line plot
heatmapvar <- rep(1:5, 8) # yvar plot for heatmap (color coded) plot
myd <- data.frame (pos, barvar, linevar, heatmapvar)

# labeling positions
label <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
position <- c(1, 5, 10, 15, 20, 25, 30, 35, 40)

hght <- .25 # just looked nice - you'll have to adjust based on your data
ypos <- min(myd$linevar)-hght

require(ggplot2)
p.line <- ggplot(myd,aes(x=pos)) +
          geom_line(aes(y=linevar)) + # plot the line using linevar
          # draw the scales. NOTE: position[1] should be 0 not 1.
          scale_x_continuous(breaks=position,labels=label)
# bar plot
p.bar <- ggplot(myd,aes(x=pos)) +
         geom_bar(aes(y=barvar),stat='identity') +  # plot the bar chart
         scale_y_reverse()

p.line2 <- p.line +
           geom_tile(aes(x= pos-.5,y=ypos, fill=heatmapvar, height=hght)) +
           scale_fill_gradient(low="yellow",high="red") +
           opts(legend.position="none")  # <-- turn off the heatmap legend.

#
 print(p.line2)
p.line3 <- p.line2 + geom_bar(aes(y=barvar, ymax= -1),stat='identity')

print(p.line3)

enter image description here

主要存在两个 - 三个缺陷 -

(1)In无法使 - 2

的条形起点

(2)我想压制 - 负数(我只是使用技巧将条形转换为负数)