Replacing ggplot2 legend key for geom_line with symbol
Asked Answered
A

3

1

I have a line plot of prices for three stocks, which I normalise by taking the percentage change from the beginning of the period I am looking at. This seems to work fine, but instead of the coloured lines on a grey background that currently make up the legend key, I would like squares or circles of colour next to the key label.

Is this even possible in ggplot2? Any pointers, however brief, appreciated. Code to produce the chart follows below.

Date <- c("2011-09-19","2011-09-20","2011-09-21","2011-09-22",
                "2011-09-23","2011-09-26","2011-09-27","2011-09-28","2011-09-29","2011-09-30")
CoA <- c(100,100,95,93,88,91,98,109,115,106)
CoB <- c(16.5,16.8,17.2,17,17.5,16.5,16,15.5,16.1,16.3)
CoC <- c(3.2,3.18,3.15,3.12,3.15,3.1,3.08,3.11,3.35,3.42)
prices <- data.frame(Date,CoA,CoB,CoC)
changes <- as.data.frame(matrix(nrow=nrow(prices),ncol=ncol(prices)))
changes[,1]=prices[,1]
for(i in 2:ncol(prices)){ # calculate changes in price
    changes[,i]= (prices[,i]-prices[,i][1])/prices[,i][1]
}
colnames(changes) <- colnames(prices)
changes <- melt(changes, id = "Date")
changes$Date <- as.Date(as.character(changes$Date))
chart1 <- ggplot(data=changes,aes(x=changes$Date,y=changes$value,colour=changes$variable))
chart1 <- chart1 + geom_line(lwd=0.5) + ylab("Change in price (%)") + xlab("Date") +
    labs(colour="Company")
print(chart1)
Achromatism answered 3/10, 2011 at 11:18 Comment(0)
T
7

You can define new geom like this:

GeomLine2 <- proto(GeomLine, {
    objname <- "line2"
    guide_geom <- function(.) "polygon"
    default_aes <- function(.) aes(colour = "black", size=0.5, linetype=1, alpha = 1, fill = "grey20")
     })
geom_line2 <- GeomLine2$build_accessor()

chart1 <- ggplot(data=changes,aes(x=Date, y=value, colour=variable, fill = variable))
chart1 <- chart1 + geom_line2(lwd=0.5) + ylab("Change in price (%)") + xlab("Date") +
  labs(colour="Company",  fill = "Company")
print(chart1)

Not sure but note that this will not work in the next version of ggplot2.

enter image description here

Too answered 3/10, 2011 at 12:33 Comment(0)
I
1

In ggplot the legend matches the plot itself. So, to get circles or squares in the legend you need to add circles or squares to the plot.

This can be done with geom_point(shape=...). shape=1 generates circles, shape=7 generates squares.

chart1 + geom_point(shape=7)

enter image description here

Impotence answered 3/10, 2011 at 11:42 Comment(1)
thanks, it is good to have confirmation of something I had already suspected. Is there some way to work around this limitation?Achromatism
T
0

A more recent option to achieve your desired result would be to change the key_glyph= to "point":

library(ggplot2)

p <- ggplot(data = changes, aes(x = Date, y = value, colour = variable)) +
  geom_line(lwd = 0.5, key_glyph = "point") +
  ylab("Change in price (%)") +
  xlab("Date") +
  labs(colour = "Company") 

p 

And if you prefer a different shape you could do so using the override.aes= parameter of guide_legend:

p +
  guides(color = guide_legend(override.aes = list(shape = 15, size = 5)))

Thames answered 12/7 at 8:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.