2010-04-05 10 views
10

ho questo frame di dati:Come aggiungere manualmente una leggenda a un oggetto 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") 

e ho tutto questo fatto (conosco il codice è un po 'brutto da vedere, puntatori apprezzato):

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)])) 

Ora vorrei aggiungere una legenda per chiarire che la linea blu è una proiezione e la linea verde sono i dati correnti. Vorrei apportare le modifiche senza alterare il dataframe se possibile.

Grazie in anticipo!

risposta

5

È possibile ottenere facilmente questo risultato utilizzando la fusione (nel pacchetto di risagoma). Ecco il codice che aggiungi dopo aver definito il frame dei dati.

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

così che funzionerà, ma speravo di poterlo fare senza alterare il dataframe. Modificherò la domanda per riflettere questo. – Dan

+0

bene, è possibile definire m_summary3 come un frame di dati temporaneo solo per disegnare la figura in questo modo. motivi per cui non vorresti avere una cornice dati temporanea? se non vuoi creare m_summary3, passa semplicemente data = melt (m_summary2, id = id1) al tuo comando ggplot e questo dovrebbe occuparsene – Ramnath

+0

yeah lo capisco, e potrei continuamente rimodellare i dataframes, non c'è davvero nulla di sbagliato con questo approccio. Speravo solo che ci fosse un modo per farlo in ggplot. – Dan

5

Ecco un modo di annotare manualmente la trama. Ho dato per scontato che tu salvassi la trama che hai stampato come p2. Quindi è necessario aggiungere questo codice a ciò che già possiedi.

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; 

Fammi sapere se funziona!

+0

dopo tutto ciò, ti darò il segno di spunta sulla tua prima risposta. Potrei anche iniziare a usare più strumenti. Grazie per entrambe le soluzioni! – Dan

+0

reshape e plyr (entrambi di Hadley Wickham) sono strumenti eccellenti per aiutarti a modificare la struttura dei tuoi dati. ci sono ottimi tutorial su entrambi. ecco un link: http://www.cerebralmastication.com/2009/10/kicking-ass-with-plry/ spero che questo aiuti! – Ramnath

+0

sì, li uso entrambi. Mi disturba solo che a volte possono oscurare la leggibilità umana di un tavolo. – Dan

0

Questo è un altro modo per aggiungere manualmente una legenda. Questo ti permette di scegliere quale colore appartiene al nome di ogni leggenda e può essere usato come modello. Questa è la leggenda esplicita.

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

Questo è un modo migliore per definire le variabili di colore. Metti in ordine i tuoi dati prima della visualizzazione. Questa è la leggenda implicita.

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") 
Problemi correlati