【问题标题】:Adding extra legend information using ggplot2使用 ggplot2 添加额外的图例信息
【发布时间】:2019-05-04 08:43:30
【问题描述】:

我正在尝试向此堆叠条形图中的图例添加额外信息,但信息来自不同的数据框。我想要做的是添加一个具有实心点的图例线(在其他线下方),文本是“记录的污染物值”。我尝试了各种各样的东西,但没有任何效果。这是我到目前为止的代码:

library(ggplot2)

columns <- unlist(lapply(1:4, function(x) rep(x,32)))
labels <- c("SuperDeduper", "AdapterTrimmer", "QWindowTrim", "Reads Remaining")
diffs <- c(35666631, 36774314, 36193131, 36140701, 41584694, 33888805, 
41314700, 36430192, 36164379, 37684733, 36156080, 33443533, 28441368, 
33025395, 31980771, 29354621, 29042522, 33575127, 34144001, 35359005, 
34037116, 34030228, 30695581, 27310435, 33448959, 39547820, 37183407, 
40013726, 35679976, 33506154, 31546743, 33917856, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49237692, 
50180374, 47276553, 48635427, 54147578, 39709279, 47969795, 44230737, 
52976902, 55651916, 55788100, 54082912, 50965229, 48481376, 54821029, 
55814879, 50763305, 54242897, 57001053, 54111642, 50922042, 55563781, 
48964424, 46377355, 46074343, 57514467, 51998501, 58061503, 55020584, 
54041618, 48210015, 55463206)

samps <- c("CHOR1", "CHOR10", "CHOR2", "CHOR3", "CHOR4", "CHOR5", "CHOR6", 
"CHOR7", "CHOR8", "CHOR9", "CPC1", "CPC10", "CPC11", "CPC2", 
"CPC3", "CPC4", "CPC5", "CPC6", "CPC7", "CPC8", "CPC9", "CPP1", 
"CPP2", "CPP3", "CPP4", "CPP5", "CPP6", "NB1", "NB2", "NB3", 
"NB4", "NB5", "CHOR1", "CHOR10", "CHOR2", "CHOR3", "CHOR4", "CHOR5", 
"CHOR6", "CHOR7", "CHOR8", "CHOR9", "CPC1", "CPC10", "CPC11", 
"CPC2", "CPC3", "CPC4", "CPC5", "CPC6", "CPC7", "CPC8", "CPC9", 
"CPP1", "CPP2", "CPP3", "CPP4", "CPP5", "CPP6", "NB1", "NB2", 
"NB3", "NB4", "NB5", "CHOR1", "CHOR10", "CHOR2", "CHOR3", "CHOR4", 
"CHOR5", "CHOR6", "CHOR7", "CHOR8", "CHOR9", "CPC1", "CPC10", 
"CPC11", "CPC2", "CPC3", "CPC4", "CPC5", "CPC6", "CPC7", "CPC8", 
"CPC9", "CPP1", "CPP2", "CPP3", "CPP4", "CPP5", "CPP6", "NB1", 
"NB2", "NB3", "NB4", "NB5", "CHOR1", "CHOR10", "CHOR2", "CHOR3", 
"CHOR4", "CHOR5", "CHOR6", "CHOR7", "CHOR8", "CHOR9", "CPC1", 
"CPC10", "CPC11", "CPC2", "CPC3", "CPC4", "CPC5", "CPC6", "CPC7", 
"CPC8", "CPC9", "CPP1", "CPP2", "CPP3", "CPP4", "CPP5", "CPP6", 
"NB1", "NB2", "NB3", "NB4", "NB5")

dffs <- structure(list(x = structure(1:32, .Label = c("CHOR1", "CHOR10", 
"CHOR2", "CHOR3", "CHOR4", "CHOR5", "CHOR6", "CHOR7", "CHOR8", 
"CHOR9", "CPC1", "CPC10", "CPC11", "CPC2", "CPC3", "CPC4", "CPC5", 
"CPC6", "CPC7", "CPC8", "CPC9", "CPP1", "CPP2", "CPP3", "CPP4", 
"CPP5", "CPP6", "NB1", "NB2", "NB3", "NB4", "NB5"), class = "factor"), 
    y = c(0.0544709955463634, 0.0596702158255113, 0.0586614896014222, 
    0.0624578654972305, 0.0627572173362813, 0.0652714546210198, 
    0.0720983861755616, 0.0721253780749289, 0.0663543751407387, 
    0.0550210025217426, 0.058055876946208, 0.0600278464411527, 
    0.0614602587742175, 0.0647506573410938, 0.044467464960404, 
    0.0463054497208508, 0.0540317062311753, 0.0623795178994235, 
    0.0609709990407159, 0.0660813707986263, 0.0564277955767876, 
    0.0657846664725093, 0.0702825464296669, 0.056445470816807, 
    0.0676118554533865, 0.06639558163306, 0.0850892537531267, 
    0.0593398767389062, 0.0896267454136998, 0.047540684416275, 
    0.101005522315739, 0.0840679762789124)), .Names = c("x", 
"y"), row.names = c(NA, -32L), class = "data.frame")


ggplot() + 
      geom_bar(data=data, aes(fill=columns, y=diffs, x=samps), stat="identity", position="fill") + 
      scale_fill_discrete(name="Preprocessing Steps\n(Dots are recorded\ncontaminant values)",labels=labels) +
      theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
      xlab("Samples") + ylab("Fractions of all reads") +
      geom_point(data=dffs, aes(x=x,y=y))

【问题讨论】:

  • off-topic: rep 有 each 参数,您可以使用它来创建 columns: rep(1:4, each = 32)

标签: r ggplot2


【解决方案1】:

我不太确定添加图例行是什么意思。您的意思是说您想要一个与预处理步骤的键共存的点的图例中的键吗?

如果是这种情况,我建议将 geom_point() 颜色映射到一个变量,该变量可以存在于任何 data.frame 之外:

ggplot() + 
  geom_bar(aes(fill=columns, y=diffs, x=samps), stat="identity", position="fill") + 
  scale_fill_discrete(name="Preprocessing Steps",labels=labels,
                      # Order set to 1 to appear before dot
                      guide = guide_legend(order = 1)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  xlab("Samples") + ylab("Fractions of all reads") +
  # Add a colour mapping
  geom_point(data=dffs, aes(x=x,y=y, colour = "Recorded\nContaminant\nValues")) +
  # You can colour the dot how you like
  scale_colour_manual(values = "red", name = "")

这给了我以下情节:

这接近你想要的吗?

【讨论】:

  • 是的,这正是我想要的......但现在你伤了我的大脑,因为我以为我有点了解美学,但显然我不明白。你介意更详细地解释一下它是如何工作的吗?我似乎无法理解它。
  • aes() 函数是一个准引用函数(参见adv-r.hadley.nz/quasiquotation.html)。本质上,如果传递了不带引号的名称,则首先尝试将该层的data 参数上下文中的输入解释(评估)为列名称。如果未找到,则会搜索制作绘图的环境以查找具有该名称的匹配项。当它是文字字符串时,它被解释为应用于该层的data 参数中的所有行的因素。
  • 哦,我明白了......这就像在数据框中添加另一列具有所有相同的值......有点。哇,要学的东西太多了。无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多