[英]ggplot2: Plot two different Densities in the same Plot of the same Variable before and after a Cutoff
[英]ggplot2: plot diverse densities in same plot
我还有一个关于ggplot2的问题...但是这次我什至不确定我想做什么...让我们从一个简单的例子开始; 这是我到目前为止所拥有的:
library(reshape2)
library(ggplot2)
a.df <- data.frame(
id=c('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y'),
var1=c(25,35,46,19,35,68,78,23,65,78,98,32,65,74,24,56,78,12,34,76,87,12,54,87,34),
group1=c(1,2,'NONE','NONE',1,2,2,1,3,4,3,'NONE','NONE',4,4,3,1,1,2,3,4,'NONE','NONE',2,3),
group2=c(1,'NONE',1,1,2,2,'NONE',2,'NONE',2,3,4,3,4,1,'NONE',1,3,4,'NONE',4,4,3,'NONE',2)
)
ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1)) +
geom_density() +
facet_grid(. ~ group1)
ggplot(data=subset(a.df,group1=='NONE'), aes(x=var1)) +
geom_density()
ggplot(data=subset(a.df,group2!='NONE'), aes(x=var1)) +
geom_density() +
facet_grid(. ~ group2)
ggplot(data=subset(a.df,group2=='NONE'), aes(x=var1)) +
geom_density()
所以我想在这里做以下事情:
1-首先,仅将切面分割为2x2,而不是4x1(我尝试使用ncol = 2,但没有用)
2-绘制第二个图(子集(a.df,group1 =='NONE'))以及第一个图的4个面。 对第三和第四做同样的事情。
3-如果可能的话,最好将两个结果绘图(4个方面的1st + 2nd,以及4个方面的3rd + 4th)合而为一,但是我在这里看到的问题是,这些方面取决于2个分组变量...可能吗?
所以总的来说,我觉得输入的data.frame需要一些重塑,但是我不知道该怎么做。非常感谢!
在此发布本文之后,向每个构面添加一条密度曲线非常简单。 我想这就是您想要做的,但是我可能是错的。 请注意, facet_wrap
允许您选择列数,而不是facet_grid
。
ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1)) +
geom_density() +
facet_wrap( ~ group1, ncol = 2) +
geom_density(data=subset(a.df,group1=='NONE', var1), aes(var1, color = "NONE")) +
scale_color_manual(name = "Baseline", values = "blue")
在将数据集融为长格式之后,对两个组执行相同的操作似乎很简单,但是它仅适用于facet_grid
,因此无法控制列数。
require(reshape2)
dat2 = melt(a.df, measure.vars = c("group1", "group2"), variable.name = "group")
ggplot(data=subset(dat2, value != "NONE"), aes(x=var1)) +
geom_density() + facet_grid(group ~ value) +
geom_density(data=subset(dat2,value=='NONE', c(var1, group)), aes(var1), color = "blue")
我不得不使用更多的“蛮力”方法来使它与facet_wrap一起使用。 本质上,我必须创建一种虚拟数据集,其NONE
类别中的var1
的值在每个组的1-4级中重复。 请参阅datnone
的输出以获得更好的解释。 希望其他人有更好的方法可以解决此问题,因为这可能会完成工作,但肯定不是很漂亮。
datnone = cbind(dat2[dat2$value == "NONE", 2:3],
value = rep(1:4, each = nrow(dat2[dat2$value == "NONE",])) )
ggplot(data=subset(dat2, value != "NONE"), aes(x=var1)) +
geom_density() + facet_wrap(group ~ value, ncol = 2) +
geom_density(data = datnone, aes(var1), color = "blue")
编辑以添加带有两行两种颜色的图例
这是添加图例并控制linetype
和color
一种方法。 您也可以控制图例的名称和标签,以使其更加美观。
ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1, color = "GROUP", linetype = "GROUP")) +
geom_density() +
facet_wrap( ~ group1, ncol = 2) +
geom_density(data=subset(a.df,group1=='NONE', var1),
aes(var1, color = "NONE", linetype = "NONE")) +
scale_linetype_manual(values = c("solid", "dotted") ) +
scale_color_manual(values = c("black", "red") )
这是一种避免刻面的方法,只是将每个单独的图保存在列表中,然后调用grid.arrange
获得所需的结果。
拥有同一个情节的多个副本并不会轻易导致facet_grid
。 另外, facet_grid
并不是真正为2x2图设计的,因为其中只有一个构面变量。
### no. levels of factor group1 not equal to 'NONE' = 4
sum(!levels(a.df$group1)=="NONE")
### define list to store results
list1 <- vector("list", 8)
### subset to remove "none"
df1 <- a.df[!a.df$group1=="NONE", ]
for (i in 1:4){
### subset per level
df2 <- df1[df1$group1==unique(df1$group1)[i], ]
### plot and title
g1 <- ggplot(df2, aes(x=var1)) +
geom_density() +
ggtitle(unique(df1$group1)[i])
list1[[2*i-1]] <- g1
}
### plots of NONE
df1 <- a.df[a.df$group1=="NONE", ]
g2 <- ggplot(df1, aes(x=var1)) +
geom_density() +
ggtitle("NONE")
list1[[2]] <- list1[[4]] <- list1[[6]] <- list1[[8]] <- g2
###
library(gridExtra)
do.call(grid.arrange, c(list1, list(nrow=2, ncol=4)))
给
您应该能够对此进行调整,并对其他感兴趣的地块执行相同的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.