我想创建以下类型的图表,其中包含带有这样的数据集的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)
答案 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)
看起来像这样:
(注意 - 我的条形图发出了警告,因为我有一个负面的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)
看起来像:
关于调整颜色,添加标题等 - 你可以做到这一点。 我建议调整各个图表以获得他们喜欢的方式,然后只在最后将它们组合起来。
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)
答案 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)
主要存在两个 - 三个缺陷 -
(1)In无法使 - 2
的条形起点(2)我想压制 - 负数(我只是使用技巧将条形转换为负数)