繁体   English   中英

ggplot中的图例线型

[英]Legend linetype in ggplot

我在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. geom_errorbar图层使用的是geom_errorbar ='solid',它覆盖或覆盖了geom_line图层的线型(我不确定是哪一个)
  2. 图例中行的大小太大,以至于看不到线型

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

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.widththeme_bw()unit(1.2, 'lines') ,所以我通过反复试验选择了5。

    在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM