2010-04-05 14 views
10

que tienen esta trama de datos:Cómo agregar manualmente una leyenda a un objeto ggplot

structure(list(month_num = 1:24, founded_month = c(4L, 5L, 6L, 
7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 1L, 2L, 3L), founded_year = c(2008L, 2008L, 2008L, 
2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, 2009L, 2009L, 
2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 
2010L, 2010L, 2010L), count = c(270L, 222L, 256L, 250L, 277L, 
268L, 246L, 214L, 167L, 408L, 201L, 225L, 203L, 220L, 230L, 225L, 
177L, 207L, 166L, 135L, 116L, 122L, 69L, 42L), month_abb = c("Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", 
"Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", 
"Nov", "Dec", "Jan", "Feb", "Mar"), short_year = c("08", "08", 
"08", "08", "08", "08", "08", "08", "08", "09", "09", "09", "09", 
"09", "09", "09", "09", "09", "09", "09", "09", "10", "10", "10" 
), proj = c(282, 246, 292, 298, 337, 340, 330, 310, 275, 528, 
333, 369, 359, 388, 410, 417, 381, 423, 394, 375, 368, 386, 345, 
330), label = c("Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", 
"Nov", "Dec", "Jan\n09", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 
"Aug", "Sep", "Oct", "Nov", "Dec", "Jan\n10", "Feb", "Mar")), .Names = c("month_num", 
"founded_month", "founded_year", "count", "month_abb", "short_year", 
"proj", "label"), row.names = c(NA, -24L), class = "data.frame") 

y tengo todo este hecho (sé que el código es un poco feo buscando, punteros apreciadas):

p <- ggplot(m_summary2, aes(x = month_num, y = count)) 
p + 
geom_line(colour = rgb(0/255, 172/255, 0/255)) + geom_point(colour = rgb(0/255, 172/255,   
    0/255)) + 
geom_line(aes(x = m_summary2$month_num, y = m_summary2$proj), 
    colour = rgb(18/255, 111/255, 150/255)) + 
geom_point(aes(x = m_summary2$month_num, y = m_summary2$proj), colour = rgb(18/255, 
    111/255, 150/255)) +  
scale_x_continuous("Month", breaks = m_summary2$month_num, labels = m_summary2$label) + 
scale_y_continuous("# Startups Founded") + 
opts(title = paste("# Startups Founded:", m_summary2$month_abb[1], 
    m_summary2$short_year[1], "-", m_summary2$month_abb[nrow(m_summary2)], 
    m_summary2$short_year[nrow(m_summary2)])) 

Ahora me gustaría agregar una leyenda para aclarar que la línea azul es una proyección y la línea verde son los datos actuales. Me gustaría realizar los cambios sin alterar el marco de datos si es posible.

¡Gracias de antemano!

Respuesta

5

Esto se puede lograr fácilmente mediante el uso de fusión (en el paquete de remodelación). Aquí está el código que agrega después de definir el marco de datos.

id1 = c("month_num","founded_month", "founded_year","month_abb","short_year","label"); 
m_summary3 = melt(m_summary2, id = id1); 
p = ggplot(m_summary3, aes(x = month_num, y = value, group = variable, colour = variable)); 
c1 = rgb(0/255, 172/255, 0/255); 
c2 = rgb(18/255, 111/255, 150/255); 
x_scale = scale_x_continuous("Month", breaks = m_summary2$month_num, labels = m_summary2$label); 
y_scale = scale_y_continuous("# Startups Founded") 

p + geom_line() + scale_colour_manual(values = c(c1,c2)) + x_scale + y_scale; 

Ramnath

+0

para que funcione, pero esperaba poder hacerlo sin alterar el marco de datos. Editaré la pregunta para reflejar eso. – Dan

+0

bien, podría definir m_summary3 como un marco de datos temporal solo para dibujar la figura de esta manera. ¿Alguna razón por la que no querría tener un marco de datos temporal? si no quieres crear m_summary3, simplemente pasa data = melt (m_summary2, id = id1) a tu comando ggplot y eso debería solucionarlo – Ramnath

+0

Sí, entiendo eso, y podría continuamente cambiar la forma de los dataframes, realmente no hay nada de malo con ese enfoque. Solo esperaba que hubiera una manera de hacerlo dentro de ggplot. – Dan

5

Aquí es una manera de anotar manualmente su trama. He supuesto que guardas la trama que has impreso como p2. Entonces necesita agregar este código a lo que ya tiene.

x1 = max(m_summary2$month_num)-3; 
y1 = m_summary2$count[x1]; 
y2 = m_summary2$proj[x1]; 
a1 = annotate("text", x = x1, y = y1, label = "Current", vjust = -2, hjust = 0.2, colour = c1); 
a2 = annotate("text", x = x1, y = y2, label = "Projection", vjust = -2, hjust = 0.2, colour = c2);  
p2 + a1 + a2; 

¡Avísame si esto funciona!

+0

después de todo eso, voy a darle la marca de verificación en su primera respuesta. Bien podría comenzar a usar más herramientas. ¡Gracias por sus dos soluciones! – Dan

+0

remodelar y plyr (ambos de Hadley Wickham) son excelentes herramientas para ayudarlo a modificar la estructura de sus datos. hay excelentes tutoriales en ambos. aquí hay un enlace: http://www.cerebralmastication.com/2009/10/kicking-ass-with-plry/ ¡Espero que esto ayude! – Ramnath

+0

sí, los uso ambos. Me molesta que a veces puedan oscurecer la legibilidad humana de una mesa. – Dan

0

Esta es otra forma de agregar una leyenda manualmente. Esto le permite elegir qué color pertenece a cada nombre de leyenda y se puede usar como plantilla. Esta es la leyenda explícita.

x <- 1:10 
y <- x^2 
z <- x^3 
values = data.frame(x, y, z) 
# Color has to be inside the aesthetic. 
ggplot(values, aes(x=x)) + 
geom_line(aes(y=y, 
       color="x^2")) + 
geom_line(aes(y=z, 
       color="x^3")) + 
scale_color_manual(name="", 
        values=c("x^2"="cornflowerblue", "x^3"="lightgreen")) 

Esta es una mejor manera de definir las variables de color. Usted ordena sus datos antes de la visualización. Esta es la leyenda implícita.

library(tidyverse) 

sp500 = rnorm(10, 2400, 50) 
nasdaq = rnorm(10, 6250, 100) 
date = seq(Sys.Date(), Sys.Date()+9, 1) 

dataMatrix = tibble(sp500, nasdaq, date) 

dataMatrix %>% 
    # This creates a varaible for the indexes, which is used for coloring the lines. 
    gather(sp500, nasdaq, key="index", value="price") %>% 
    ggplot(aes(x=date, 
       y=price, 
       color=index)) + 
    geom_line() + 
    # This is used for customizing the legend. 
    scale_color_manual(
     name="Index",     
     values=c("blue", "red"), 
     labels=c("Nasdaq", "S&P 500")) + 
    # This is used for customizing the plot descriptions. 
    labs(title="FINANCIAL MARKETS", 
     subtitle="USA INDEXES", 
     caption="MJR", 
     x="Date", 
     y="Price") 
Cuestiones relacionadas