How to add a label for a vertical line with a legend in ggplot2

R 3.1.2 / ggplot2_1.0.0 / Windows7

How can I add two vertical lines with legends in a graded graph without changing the type of line? In the following example, I cannot get the legends to represent how I represent them (two solid lines and a conditional legend) from the code I write. Playable example:

library(ggplot2) library(plyr) library(e1071) set.seed(89) pm <- data.frame(pm10=rnorm(400, 150, 50), estacion=gl(4,100, labels = c('sur', 'norte', 'este', 'oeste'))) # data curtosis <- ddply(pm, .(estacion), function(val) sprintf("curtosis==%.2f", kurtosis(val$pm10))) asimetria <- ddply(pm, .(estacion), function(val) sprintf("asimetría==%.2f", skewness(val$pm10))) p1 <- ggplot(data=pm, aes(x=pm10, y=..density..)) + geom_histogram(bin=15, fill='#deebf7', colour='#bdbdbd')+ geom_density(size=1, colour='#cccccc')+ geom_vline(data=aggregate(pm[1], pm[2], quantile, .8), mapping=aes(xintercept=pm10, linetype='percentil .8'), size=1, colour='#dfc27d', show_guide = T)+ geom_vline(data=aggregate(pm[1], pm[2], median), mapping=aes(xintercept=pm10, linetype='mediana'), size=1, colour='#80cdc1', show_guide = T)+ geom_text(data=curtosis, aes(x=350, y=.010, label=V1), size=3, parse=T)+ geom_text(data=asimetria, aes(x=350, y=.008, label=V1), size=3, parse=T)+ guides(linetype=guide_legend(override.aes=list(colour = c("#dfc27d","#80cdc1"))))+ xlim(0,500)+ facet_wrap(~ estacion, ncol=2) print(p1) 

enter image description here

I want the lines to be solid (color in order) and the name of the legend to say: "Medida de tendencia".

+6
source share
1 answer

The main idea of ​​a rather complicated ggplot like yours is to separate the data preparation from the actual plotting. At the stage of data preparation, you can organize your data in accordance with the construction concept that you have in mind.

In your case, this involves a preliminary calculation of the statistics in question:

 df_vline <- rbind( aggregate(pm[1], pm[2], quantile, .8), aggregate(pm[1], pm[2], median) ) df_vline$stat <- rep(c("percentil .8", "mediana"), each = nrow(df_vline) / 2) 

and then the mapping scheme is pretty simple, so you don’t have to think about manually redefining the legend.

 ggplot(data=pm, aes(x=pm10, y=..density..)) + geom_histogram(bin=15, fill='#deebf7', colour='#bdbdbd')+ geom_density(size=1, colour='#cccccc')+ geom_vline(data=df_vline, mapping=aes(xintercept=pm10, colour = stat), linetype = 1, size=1, show_guide = T)+ geom_text(data=curtosis, aes(x=350, y=.010, label=V1), size=3, parse=T)+ geom_text(data=asimetria, aes(x=350, y=.008, label=V1), size=3, parse=T)+ scale_colour_manual(values = c("#dfc27d","#80cdc1"), name = "Medida de tendencia")+ xlim(0,500)+ facet_wrap(~ estacion, ncol=2) 

enter image description here

(Good story, by the way.)

+5
source

Source: https://habr.com/ru/post/985385/


All Articles