R将ggplot与dlply结合使用

时间:2013-07-18 08:22:58

标签: r ggplot2 plyr

我有以下数据框

structure(list(G1 = c(68, 68.6, 66.6, 73.1, 51.6, 50.1, 64.1, 
73, 63.7, 43.2, 62.3, 59.2, 67.5, 68.2, 54.6, 67.9, 56.5, 54.2, 
67.3, 68, 68.4, 67.9, 73.3, 51.7, 50.3, 63.9, 73.9, 64, 42.9, 
62.5, 59.3, 66.7, 68.4, 54, 68.2, 56.8, 54.5, 67, 53.2, 41.4, 
53, 52.3, 41, 37.4, 56.9, 65.3, 36.2, 35.3, 36.1, 32.5, 56.5, 
47.7, 39.4, 59.6, 38.1, 24.2, 30.2, 68.5, 68.9, 70.7, 74.9, 53.4, 
51.6, 65.9, 75.7, 64.7, 42.8, 61.4, 60.8, 69.5, 68.7, 55.9, 70.7, 
59.5, 51.1, 69.5), G2 = c(79.8, 72.2, 73.5, 74.4, 50.4, 54.8, 
63.1, 70.4, 63.6, 45.1, 65.3, 49.4, 65.3, 76.2, 51, 63.9, 58.7, 
57.8, 67, 79.6, 72.1, 73.9, 74.7, 50.5, 55.1, 62.8, 70.5, 63.3, 
44.6, 65.5, 48.9, 64.9, 76.3, 50.6, 64.8, 58.6, 58.3, 67.4, 51.2, 
37.7, 49.1, 53.7, 44.6, 37.3, 54.9, 64.1, 33.8, 31.9, 34.2, 30.3, 
56.2, 44.6, 38.2, 63.2, 35.8, 26.5, 27.6, 80.6, 71.6, 75.4, 77.1, 
52.4, 56.3, 66, 72.3, 64.5, 38.2, 64.3, 49.2, 66.9, 77.1, 52.4, 
67.5, 59.6, 55.6, 69.9), S1 = c(75.1, 65.9, 72.7, 68.8, 49, 57.5, 
66.5, 74.1, 60.9, 51.8, 58, 64.3, 71.1, 71.4, 58.9, 62.2, 58, 
57.7, 58.6, 75.2, 66, 73.2, 69.7, 48.9, 57.7, 66.5, 74.7, 60.8, 
51.4, 58.9, 65.5, 70.5, 71.4, 58.9, 65.1, 60.8, 57.7, 58.4, 54.3, 
40.2, 52.6, 60.5, 42.6, 34.1, 55, 64.7, 36.3, 32.5, 39, 38.8, 
58.1, 48, 40.5, 61, 40, 26.4, 28.8, 76.4, 66.5, 73.9, 72, 50.7, 
59.2, 69.9, 76.3, 62.4, 50, 58.5, 66.6, 73.7, 72.3, 62.6, 69.6, 
62.7, 57.9, 61.1), S2 = c(76.6, 71.6, 71.2, 72.7, 51.6, 56.7, 
65.9, 73.5, 63.6, 55.2, 62.6, 62.2, 69.1, 71.1, 56.8, 61, 61.7, 
60, 55.7, 76.9, 71.6, 72.3, 73.2, 51.7, 56.8, 64.5, 74.9, 63.6, 
51.3, 63, 62.8, 68.7, 71.3, 56.8, 64.2, 62.8, 60.4, 55.8, 53.6, 
42.5, 50, 54.4, 42.2, 36.4, 57.7, 64.1, 35.1, 30.8, 39.1, 37.4, 
58.7, 47.8, 42, 58.8, 39.4, 24.2, 28.2, 78.2, 73.3, 72.3, 75.6, 
53.4, 57.8, 68.3, 76.6, 63.7, 51.7, 63.4, 63.3, 71.5, 72.3, 60.2, 
67.1, 65.5, 58.2, 59.1), Method = structure(c(4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Simple_2_ROI", "Single_ROI", 
"WIG_drawn_bg", "WIG_Method"), class = "factor")), .Names = c("G1", 
"G2", "S1", "S2", "Method"), class = "data.frame", row.names = c(NA, 
-76L))

我想要做的是根据变量Method为此数据集生成相关热图(仅限下三角)。

我可以使用以下代码获取所有数据所需的图表

library(reshape2)
library(ggplot2)
c = cor(df[sapply(df,is.numeric)])
cordf.m = melt(cor(df[sapply(df,is.numeric)]))
df.lower = subset(cordf.m[lower.tri(c),],Var1 != Var2)
df.ids <- subset(cordf.m, Var1 == Var2)
ggplot(data=df.lower, aes(x=Var1,y=Var2,fill=value)) + geom_tile() + theme_bw() + geom_text(aes(label = sprintf("%1.2f",value)), vjust = 1) + geom_text(data=df.ids,aes(label=Var1)) + scale_fill_gradient2(midpoint=0.8,low='white',high='steelblue') + xlab(NULL) + ylab(NULL) + theme(axis.text.x=element_blank(),axis.text.y=element_blank(), axis.ticks=element_blank(),panel.border=element_blank(),legend.position='none')+ggtitle("All Data")

给出了下图 enter image description here

我可以使用dlply

获得每种方法的基本相关热图
dlply(df, .(Method), function (x1) {
ggplot(melt(cor(x1[sapply(x1,is.numeric)])),
aes(x=Var1,y=Var2,fill=value)) + geom_tile(aes(fill = value),colour = "white") + geom_text(aes(label = sprintf("%1.2f",value)), vjust = 1) + theme_bw() + 
scale_fill_gradient2(midpoint=0.8,low = "white", high = "steelblue")})

但是,我遇到了一些问题

(i)我如何为每种方法显示上述等效图 - 即仅下三角形 (ii)如何使ggtitle等于方法名称,例如每个图形的Simple_2_ROI,..

(iii)我也想用星星突出显示每个相关的重要性here。如何使用我的数据集执行此操作(我尝试p <- cor.pval(iris..但收到错误消息cor.pval is not found


以下内容让我更接近我想要的内容

plots <- dlply(df, .(Method), function (x1) {
    ggplot(subset(melt(cor(x1[sapply(x1,is.numeric)]))[lower.tri(c),],Var1 != Var2),
           aes(x=Var1,y=Var2,fill=value)) + geom_tile(aes(fill = value),colour = "white") +
        geom_text(aes(label = sprintf("%1.2f",value)), vjust = 1) + 
        theme_bw() +
        scale_fill_gradient2(midpoint=0.7,low = "white", high = "steelblue") + xlab(NULL)+ylab(NULL) + theme(axis.text.x=element_blank(),axis.text.y=element_blank(), axis.ticks=element_blank(),panel.border=element_blank(),legend.position='none') + ggtitle(x1$Method) + theme(plot.title = element_text(lineheight=1,face="bold")) + geom_text(data = subset(melt(cor(x1[sapply(x1,is.numeric)])),Var1==Var2),aes(label=Var1) ) })

但是,我无法在情节中获得相关的明星

任何指针?

1 个答案:

答案 0 :(得分:2)

我已经实现了以下解决方案(虽然我无法达到明星的意义)

plots <- dlply(df, .(Method), function (x1) {
    ggplot(subset(melt(cor(x1[sapply(x1,is.numeric)]))[lower.tri(c),],Var1 != Var2),
           aes(x=Var1,y=Var2,fill=value)) + geom_tile(aes(fill = value),colour = "white") +
        geom_text(aes(label = sprintf("%1.2f",value)), vjust = 1) + 
        theme_bw() +
        scale_fill_gradient2(name="R^2",midpoint=0.7,low = "white", high = "red") + xlab(NULL)+ylab(NULL) + theme(axis.text.x=element_blank(),axis.text.y=element_blank(), axis.ticks=element_blank(),panel.border=element_blank()) + ggtitle(x1$Method) + theme(plot.title = element_text(lineheight=1,face="bold")) + geom_text(data = subset(melt(cor(x1[sapply(x1,is.numeric)])),Var1==Var2),aes(label=Var1),vjust=3 ) })

#Function to grab legend
g_legend<-function(a.gplot){
    tmp <- ggplot_gtable(ggplot_build(a.gplot))
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
    legend <- tmp$grobs[[leg]]
    legend
}

legend <- g_legend(plots$WIG_Method)


grid.arrange(legend,plots$Single_ROI+theme(legend.position='none'), plots$Simple_2_ROI+theme(legend.position='none'),plots$WIG_Method+theme(legend.position='none'), plots$WIG_drawn_bg+theme(legend.position='none'), ncol=5, nrow=1, widths=c(1/17,4/17,4/17,4/17,4/17))

这实现了以下情节

enter image description here

相关问题