user2498193 user2498193 - 14 days ago 6
R Question

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:
enter image description here

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:
enter image description here

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:
enter image description here

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 ?

Answer
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"))