ggplot中的图例线型

时间:2019-01-17 22:40:12

标签: r ggplot2 legend

我在R环境中非常陌生,如果我要提出明显的要求,请原谅。我需要绘图中的图例以反映图形中的颜色和线型,但是我无法弄清楚需要如何更改代码。 非常感谢您的帮助。

    tibble::tribble(
      ~variable,           ~value,  ~bin,              ~ci,
  "Advanced HS", 302.097396142857, "FFD", 21.2978862705524,
  "Beginner HS", 394.264259996296, "FFD", 28.8027249069651,
     "Children", 379.642674397368, "FFD", 18.1482664147856,
       "Adults", 217.875580083333, "FFD", 2.38006646944708,
  "Advanced HS", 305.244904223809, "SFD", 15.5487255740993,
  "Beginner HS", 350.108404085185, "SFD", 28.6379128865829,
     "Children", 358.329722218421, "SFD", 12.6900032541364,
       "Adults", 228.522062813542, "SFD", 2.73230976574123,
  "Advanced HS", 484.181295019048,  "GD", 33.9933197272878,
  "Beginner HS", 960.745730144444,  "GD", 55.8118108393556,
     "Children", 676.158669963158,  "GD",  44.238558449867,
       "Adults", 259.127882341667,  "GD", 4.30648424130776,
  "Advanced HS", 702.136573061905,  "TT", 47.0883793662974,
  "Beginner HS", 1541.69112013704,  "TT", 84.3091269009313,
     "Children",  976.54035988421,  "TT", 60.0584639291095,
       "Adults",  318.08245218125,  "TT", 7.99092674935576
  )



mytheme <- theme_bw() + theme(axis.title = element_text(size = rel(2)),
                          strip.text = element_text(size = rel(2)),
                          legend.position = "bottom",
                          legend.key = element_blank(),
                          text = element_text(size = 28),
                          legend.text = element_text(size = 28), 
                          plot.margin = margin(20, 20, 20, 20),
                          axis.text.x = element_text(hjust = 0.5, vjust = 0.5, size = 35),
                          axis.text.y = element_text(hjust = 0.5, vjust = 0.5, size = 35),
                          strip.background = element_rect(fill = 'gray96'))


tiff("r.tiff", units="in", width=10, height=7, res=300)
                         ggplot(data = Figure_1) + 
                         mytheme  + scale_y_continuous(breaks = seq(0,2000, 500))+ 
                         aes(x = bin, y = value, group = variable, color = variable) + scale_x_discrete(limits = c ("FFD","SFD", "GD", "TT")) +
                         geom_errorbar(aes(ymin=value-ci, ymax=value+ci), width=.1) + 
                         geom_line(aes(group=variable, linetype = variable), size =2) + scale_linetype_manual(values=c("solid", "longdash", "dotdash", "dotted")) + 
                         theme(legend.title = element_blank()) +
                         guides(col = guide_legend(reverse = FALSE, override.aes = list(size=6))) +
                         xlab("") + 
                         ylab("Duration (ms)")
                         dev.off()

1 个答案:

答案 0 :(得分:0)

图例中未显示的线型是以下几种组合

  1. geom_errorbar层使用的是linetype ='solid',它覆盖或覆盖了geom_line层的线型(我不确定是哪个)
  2. 图例中的行的大小太大,以至于无法看到线型

要修复(1),请在show.legend=FALSE中使用geom_errobar

geom_errorbar(aes(ymin=value-ci, ymax=value+ci), width=.1, show.legend=FALSE)

这时,由于第二个问题(2),这将不会对所得图像产生明显的影响:图例中的线条太大/显示图案的空间很小,即使图形中的一个点也是如此。紫色虚线会占用分配给它的全部空间(没有空间可以显示第二个点)。

要解决此问题,您必须根据美观情况决定几个选项:

  • 如果您也将guides行改为size=1而不是size=6,则图例中将至少看到点划线模式,但仍然看不到点划线和实线类型之间的差异,因为再次显示线的空间不足以显示图案。 (再加上图形中其他所有元素的比例,我怀疑size=1在完成的图形中会小得无法接受)。
  • 您可以将+ theme(legend.key.width=units(5, 'lines'))guides(..., size=2)组合使用,以使图例的显示线条更宽(同时仍然有足够的线条可见),以便显示足够的模式的重复,但这会使图例的最后一个元素偏离图像的大小(如下所示),因此您可能需要增大图像尺寸(或减小图例的字体大小)以使其更小。注意:legend.key.width中的默认unit(1.2, 'lines')theme_bw(),因此我通过反复试验选择了5。

    enter image description here

    • 您也可以guides(lty = guide_legend(reverse = FALSE, override.aes = list(size=2), byrow=TRUE, ncol=2))将图例包裹在两行上,不过也许您应该坚持在图的右侧使用原始的垂直方向的图例。请注意,我必须将col=更改为lty=(无论如何它们都是合并的图例) enter image description here
  • 作为一般观察,对于此特定图形,看起来颜色已经标识了线条,因此仅在图例上显示颜色并省略线型也许是可以接受的(尽管当打印黑白时很难区分它们,这可能是您将线型放在首位的原因。