首页 文章

ggplot2:绘制同一图中不同的密度

提问于
浏览
2

我还有一个关于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 - 绘制第2个绘图(子集(a.df,group1 =='NONE'))以及第1个绘图的4个面中的每个面 . 为第3和第4做同样的事情 .

3 - 如果可能的话,最好的方法是将2个结果图(4个刻面中的第1个刻度,4个刻面中的第3个刻度)合二为一,但我在这里看到的问题是刻面取决于2个分组变量......会不可能?

总而言之,我觉得输入data.frame需要一些重塑,但我不知道如何...非常感谢!!

2 回答

  • 2

    post here之后,为每个方面添加单个密度曲线非常简单 . 我想这就是你想要做的,但我可能是错的 . 请注意 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")
    

    我不得不使用更多的"brute-force"方法来使用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")
    

    Edit to add legends with two lines, two colors

    这是添加图例并控制 linetypecolor 的一种方法 . 您也可以控制图例的名称和标签,以使其更好 .

    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") )
    
  • 1

    这是一种避免分面的方法,只需将每个单独的绘图保存在列表中,然后调用 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)))
    

    enter image description here

    你应该能够调整这个并对其他感兴趣的图表做同样的事情 .

相关问题