2010-04-05 16 views
10

ich diesen Datenrahmen haben:Wie man manuell eine Legende zu einem ggplot Objekt hinzufügen

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

und ich habe all das getan habe (ich der Code ist ein bisschen hässlich wissen suchen, Zeiger geschätzt):

Jetzt möchte ich eine Legende hinzufügen, um zu verdeutlichen, dass die blaue Linie eine Projektion ist und die grüne Linie die aktuellen Daten. Ich würde gerne die Änderungen vornehmen, ohne den Datenrahmen zu verändern, wenn es möglich ist.

Vielen Dank im Voraus!

Antwort

5

Sie können dies leicht durch Verwendung von Schmelze (im Umformpaket) erreichen. Hier ist der Code, den Sie hinzufügen, nachdem Sie den Datenrahmen definiert haben.

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

so dass wird funktionieren, aber ich hatte gehofft, ich könnte es tun, ohne den Datenrahmen zu ändern. Ich werde die Frage bearbeiten, um das zu reflektieren. – Dan

+0

Nun, Sie könnten m_summary3 als temporären Datenrahmen definieren, nur um die Figur auf diese Weise zu zeichnen. Gründe, warum Sie keinen temporären Datenrahmen haben möchten? Wenn Sie m_summary3 nicht erstellen möchten, übergeben Sie einfach data = melt (m_summary2, id = id1) an Ihren ggplot-Befehl, und das sollte darauf achten – Ramnath

+0

Ja, ich bekomme das, und ich konnte Dataframes immer wieder neu gestalten, da ist wirklich nichts falsch mit diesem Ansatz. Ich habe nur gehofft, dass es einen Weg gibt, es innerhalb von ggplot zu machen. – Dan

5

Hier ist ein Weg, um Ihr Grundstück manuell annotieren. Ich habe angenommen, dass Sie das Plot speichern, das Sie als p2 gedruckt haben. Also müssen Sie diesen Code zu dem hinzufügen, was Sie bereits haben.

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; 

Lassen Sie mich wissen, ob dies funktioniert!

+0

nach all dem, werde ich Ihnen das Häkchen bei Ihrer ersten Antwort geben. Ich könnte genauso gut anfangen, mehr Werkzeuge zu verwenden. Danke für beide Lösungen! – Dan

+0

reshape und plyr (beide von Hadley Wickham) sind ausgezeichnete Werkzeuge, um Ihnen zu helfen, die Struktur Ihrer Daten zu ändern. Es gibt großartige Tutorials zu beiden. Hier ist ein Link: http://www.cerebralmastication.com/2009/10/kicking-ass-with-plry/ hoffe das hilft! – Ramnath

+0

Ja, ich benutze sie beide. Es stört mich nur, dass sie manchmal die menschliche Lesbarkeit eines Tisches verdecken können. – Dan

0

Dies ist eine weitere Möglichkeit, eine Legende manuell hinzuzufügen. Auf diese Weise können Sie auswählen, welche Farbe zu jedem Legendennamen gehört, und sie können als Vorlage verwendet werden. Dies ist die explizite Legende.

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

Dies ist eine bessere Möglichkeit, Farbvariablen zu definieren. Sie bereinigen Ihre Daten vor der Visualisierung. Dies ist die implizite Legende.

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