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 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)
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.
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)
精彩评论