简体   繁体   中英

ggplot2 - control linetypes when more than one line

Take the following example:

library(ggplot2)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]

ggplot(dsamp, aes(x = x)) +
    geom_line(aes(y = y, linetype = "Simple Model")) +
    geom_line(aes(y = z, linetype = "Complex Model"))

Which produces this graph: 在此处输入图片说明

Ok. My problem is I want the linetypes reversed. I want the simple model to have the solid line and the complex model to be dashed. By default, the alphabetical order seems to be deciding the linetype here. I have tried different variations using scale_linetype_manual etc, but try as I might I cannot get the simple line to be solid and the complex to be dashed and at the same time keep the 'simple' & 'complex' titles in the legend. Before someone suggests it I am trying to avoid melting/reshaping this data such that both y variables are in 1 column, because the real data has more in the plot etc and it would be really complex.

Edit: Ok thanks to Haboryme for his reply. I have found the source of my confusion.

Take the following plot:

ggplot(dsamp, aes(x = x)) +
    geom_line(aes(y = y, linetype = "Simple Model"), size = 1.5) +
    geom_line(aes(y = z, linetype = "Complex Model"), size = 1.5) +
    scale_linetype_manual(values=c( 5, 1))

The legend appears to show linetype both as solid lines: 在此处输入图片说明

However if I change it to linetype 3:

ggplot(dsamp, aes(x = x)) +
    geom_line(aes(y = y, linetype = "Simple Model"), size = 1.5) +
    geom_line(aes(y = z, linetype = "Complex Model"), size = 1.5) +
    scale_linetype_manual(values = c( 3, 1))

The linetype legend is correct: 在此处输入图片说明

Well I guess this solves my problem - I will simply have to use linetype 3. It seems linetype 5 with size 1.5 just doesn't fit in the legend space well ?

ggplot(dsamp, aes(x=x)) +
  geom_line(aes(y=y, linetype="Simple Model"),size=1.5) +
  geom_line(aes(y=z, linetype="Complex Model"),size=1.5)+
  scale_linetype_manual(values=c(5,1))

The above code will give you a plot where both lines look similar in the legend.
This is because linetype=5 is equivalent to "longdash" (2 is "dashed"). The longdashes are too long to show in the legend.

If you want to retain the size=1.5 (or higher) with the longdashes and have a proper legend you will need to also change the size of the legend, for example with:

+theme(legend.key.size=unit(2,"cm"))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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