【问题标题】:extracting one facet from a ggplot从ggplot中提取一个方面
【发布时间】:2014-09-29 16:24:33
【问题描述】:

我有 2 个图,每个图显示不同类型的数据(疫苗和疾病),我想提取这些图的片段以生成每个受试者的图,其中包含疫苗和疾病,根据原图着色

vac
  subject age  vaccine
1     E11 1.0 DTaP-IPV
2     E11 3.0 DTaP-IPV
3     E22 1.0 DTaP-IPV
4     E22 2.0     Rota
5     E22 3.0 DTaP-IPV
6     E22 3.3     Rota

ill
  subject age       illness
1     E11 0.5 ear infection
2     E11 2.0 ear infection
3     E22 0.8         fever
4     E22 1.2         fever
5     E22 3.0 ear infection

ggplot(vac,aes(x=age,y=subject,color=vaccine))+geom_point(size=5) +
  scale_color_brewer(palette="Set1",drop = FALSE)+facet_grid(subject~.)

ggplot(ill,aes(x=age,y=subject,color=illness))+geom_point(size=5) +
  scale_color_brewer(palette="Set3",drop = FALSE)+facet_grid(subject~.)

现在,我想要 E11 的一个图,其中有一排疫苗(以 Set1 颜色着色)和一排疾病(以 Set3 颜色着色),对于 E22 也是如此。

我有很多数据类型,大约 40 个主题,所以当然,我希望自动完成,而不是通过 illustrator 等。

我认为 gtable 是要走的路,但不确定如何提取一个方面。

非常感谢!

【问题讨论】:

  • 你想要一个传奇吗?因为如果你这样做,那将是另一个问题。
  • 我可以不用传奇。谢谢!
  • @MoranY 您的问题得到了几个有用的答案。由于您是 Stack Overflow 的新手,我想提请您注意以下帮助页面:What should I do when someone answers my question?

标签: r ggplot2 gtable


【解决方案1】:

这是一个快速解决方案,可能会帮助您朝着正确的方向前进。试一试。

require(reshape2)
require(plyr)
dat <- melt(join(vac, ill, type="full"), id.vars = c("subject", "age"), na.rm=TRUE)

ggplot(dat, aes(x=age,y=variable, color=value))+geom_point(size=5) +
  scale_color_brewer(palette="Set1",drop = FALSE)+facet_grid(subject~.)

【讨论】:

  • 感谢 Leandro,但这里的问题是我只能为所有点提供一种配色方案。如果我单独生成图,我可以为每个变量提供不同的配色方案。谢谢!
  • 除了使用您的个人配色方案来形成“主”配色方案,然后将其应用于整个地块之外,我不确定是否愿意处理这个问题。但为了做到这一点,您需要了解每种数据类型有多少个因素。如果您需要这方面的帮助,我可以提供一个示例。
【解决方案2】:

在您在问题中创建的构面中,未在构面中的主题有空行。拥有大约 40 个主题,这将创建一个填充行和 39 个空行的构面,这可能不是您想要的。

另一种解决方案:

# merging the dataframes together
dat <- merge(vac, ill, by=c("subject","age"), all=TRUE, sort=TRUE)

# creating the plot
ggplot() +
  geom_point(data=dat[!is.na(dat$vaccine),], aes(x=age, y=subject, fill=vaccine), size=10, shape=22) +
  geom_point(data=dat[!is.na(dat$illness),], aes(x=age, y=subject, color=illness), size=7, shape=17) +
  scale_fill_brewer(palette="Set1") +
  scale_color_brewer(palette="Set2") +
  theme_bw()

给出:

【讨论】:

    【解决方案3】:

    下面的代码将vacill 组合在一个数据框中(添加一个新变量type 以区分疫苗和疾病),这将允许我们在一次调用@ 中绘制疾病和疫苗987654325@。代码有点笨拙,但我希望它能让你更接近你正在寻找的东西。

    library(RColorBrewer)
    library(gridExtra)
    
    # Combine data frames vac and ill by adding a new column 
    # called "type" and changing name of the third column to "condition"
    vac$type = "Vaccine"
    names(vac)[3] = "condition"
    
    ill$type = "Illness"
    names(ill)[3] = "condition"
    
    dat = rbind(vac, ill)
    
    # Convert condition to a factor to get the levels ordered properly
    dat$condition = factor(dat$condition, 
                           levels=c(unique(dat$condition[dat$type=="Vaccine"]), 
                                    unique(dat$condition[dat$type=="Illness"])))
    
    dat
       subject age     condition    type
    1      E11 0.5 ear infection Illness
    2      E11 2.0 ear infection Illness
    3      E22 3.0 ear infection Illness
    4      E22 0.8         fever Illness
    5      E22 1.2         fever Illness
    6      E11 1.0      DTaP-IPV Vaccine
    7      E11 3.0      DTaP-IPV Vaccine
    8      E22 1.0      DTaP-IPV Vaccine
    9      E22 3.0      DTaP-IPV Vaccine
    10     E22 2.0          Rota Vaccine
    11     E22 3.3          Rota Vaccine
    

    现在我们为每个主题生成一个图表,将每个图表放在一个列表中,然后将所有图表保存在一个 PDF 文件中。 ggplot 代码的工作原理如下:

    • subject 分面,以便我们获得带有主题 ID 的条带。
    • type 分面,以便我们获得疾病和疫苗的单独图表。
    • 使用下面创建的调色板来获得我们想要的颜色

    pal1 = c(brewer.pal(n=3, name="Set1")[1:2], brewer.pal(n=3, name="Set3")[1:2])

    p = list() 
    for (i in unique(dat$subject)) { 
      p[[i]] = ggplot(dat[dat$subject==i,], 
                      aes(x=age, y=condition, colour=condition)) +
        geom_point(size=5) + 
        scale_color_manual(values=pal1, drop=FALSE) + 
        facet_grid(type ~ subject, scale="free") + ylab("") + 
       guides(colour=FALSE) 
    }
    
    pdf("plots.pdf", 9,5)
    do.call("grid.arrange", p)  
    dev.off()
    

    这是图表:

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多