2016-06-06 10 views
3

Ich versuche, ein Liniendiagramm für 2 Aktien AAPL und FB zu erstellen. Anstatt eine separate Legende hinzufügen, würde ich gerne die Lager Symbole entlang mit den Linien drucken. Wie kann ich geom_text zum folgenden Code hinzufügen?
Ich schätze jede Hilfe, die Sie zur Verfügung stellen könnten.Hinzufügen von Text zu geom_line in ggplot

library (ggplot2) 
library(quantmod) 
getSymbols('AAPL') 
getSymbols('FB') 

AAPL = data.frame(AAPL) 
FB = data.frame(FB) 
p1 = ggplot(AAPL)+geom_line(data=AAPL,aes(as.Date(rownames(AAPL)),AAPL.Adjusted,color="AAPL")) 
p2 = p1+geom_line(data=FB,aes(as.Date(rownames(FB)),FB.Adjusted,color="FB")) 
p2 + xlab("Year")+ylab("Price")+theme_bw()+theme(legend.position="none") 

Antwort

2

Sie haben einfach geom_text hinzufügen, wie u sagte:

Definieren Sie die x, y Positionen, die label Sie (und die color) angezeigt werden soll:

enter image description here

library(quantmod) 
getSymbols('AAPL') 
getSymbols('FB') 

AAPL = data.frame(AAPL) 
FB = data.frame(FB) 

p1 =  ggplot(AAPL)+geom_line(data=AAPL,aes(as.Date(rownames(AAPL)),AAPL.Adjusted,color="AAPL")) 
p2 = p1+geom_line(data=FB,aes(as.Date(rownames(FB)),FB.Adjusted,color="FB")) 
p2 + xlab("Year") + ylab("Price")+theme_bw()+theme(legend.position="none") +  
geom_text(aes(x = as.Date("2011-06-07"), y = 60, label = "AAPL", color = "AAPL")) + 
geom_text(aes(x = as.Date("2014-10-01"), y = 45, label = "FB", color = "FB")) 

BEARBEITEN

Wenn Sie automatisch möchten Positionen finden x und y in geom_text, werden Sie neue Probleme stellen mit überlappenden Etiketten, wenn Sie die Anzahl der Variablen erhöhen. Hier ist ein Anfang Lösung, könnte man die Methode anpassen x und `y

AAPL$date = rownames(AAPL) 
AAPL$var1 = "AAPL" 
names(AAPL)[grep("AAPL", names(AAPL))] = gsub("AAPL.", "", names(AAPL)[grep("AAPL", names(AAPL))]) 
FB$date = rownames(FB) 
FB$var1 = "FB" 
names(FB)[grep("FB", names(FB))] = gsub("FB.", "", names(FB)[grep("FB", names(FB))]) 

# bind the 2 data frames 
df = rbind(AAPL, FB) 

# where do you want the legend to appear 
legend = data.frame(matrix(ncol = 3, nrow = length(unique(df$var1)))) 
colnames(legend) = c("x_pos" , "y_pos" , "label") 
legend$label = unique(df$var1) 
legend$x_pos = as.POSIXct(legend$x_pos) 

df$date = as.POSIXct(df$date) 
for (i in legend$label) 
{ 
    legend$x_pos[legend$label == i] <- as.POSIXct(min(df$date[df$var1 == i]) + 
as.numeric(difftime(max(df$date[df$var1 == i]), min(df$date[df$var1 == i]), units = "sec"))/2) 
    legend$y_pos[legend$label == i] <- df$Adjusted[df$date > legend$x_pos[legend$label == i] & df$var1 == i][1] 
} 

# Plot 
ggplot(df, aes(x = as.POSIXct(date), y = Adjusted, color = var1)) + 
geom_line() + xlab("Year") + ylab("Price") + 
geom_text(data = legend, aes(x = x_pos, y = y_pos, label = label, color = label, hjust = -1, vjust = 1)) 
+ guides(color = F) 

enter image description here

+0

bVa, Vielen Dank für den Vorschlag. Es wird klappen. Ich suche jedoch nach einer Möglichkeit, den Text mit den Zeilen zu drucken, ohne die x, y-Koordinaten anzugeben. Wenn ich mehr Aktien hinzufüge oder mehr Diagramme erzeuge, wird es ein wenig mühsam, die Koordinaten zu finden/hinzuzufügen. – user6296218

+0

Sie werden neue Probleme haben: überlappenden Text. Siehe bearbeitete Antwort. – bVa

+0

Vielen Dank, dass Sie eine andere Lösung vorgeschlagen haben. Ich stimme Ihnen zu, dass Sie, wie Sie sagten, die Lösung komplizierter machen wird. Ich möchte es einfach halten. Ich schätze Ihre Hilfe. – user6296218

6

Dies ist die Art von Handlung zu definieren, die für das directlabels Paket perfekt. Und es ist einfacher zu plotten, wenn die Daten in einem Datenrahmen verfügbar sind.

# Data 
library(quantmod) 
getSymbols('AAPL') 
getSymbols('FB') 
AAPL = data.frame(AAPL) 
FB = data.frame(FB) 

# rbind into one dataframe 
AAPL$label = "AAPL" 
FB$label = "FB" 
names = gsub("^FB\\.(.*$)", "\\1", names(FB)) 
names(AAPL) = names 
names(FB) = names 
df = rbind(AAPL, FB) 


# Packages 
library(ggplot2) 
library(directlabels) 

# The plot - labels at the beginning and the ends of the lines. 
ggplot(df, aes(as.Date(rownames(df)), Adjusted, group = label, colour = label)) + 
    geom_line() + 
    scale_colour_discrete(guide = 'none') +  
    geom_dl(aes(label = label), method = list(dl.combine("first.points", "last.points"))) 

Ein besseres Diagramm: Vergrößern Sie den Abstand zwischen den Endpunkten der Linien und den Beschriftungen. Andere Optionen finden Sie unter here.

ggplot(df, aes(as.Date(rownames(df)), Adjusted, group = label, colour = label)) + 
    geom_line() + 
    scale_colour_discrete(guide = 'none') +  
    scale_x_date(expand=c(0.1, 0)) + 
    geom_dl(aes(label = label), method = list(dl.trans(x = x + .2), "last.points")) + 
    geom_dl(aes(label = label), method = list(dl.trans(x = x - .2), "first.points")) 

enter image description here


Frage ist möglicherweise ein Duplikat this one.

+0

Danke Sandy. Für mich geht das. Mir waren die ersten Punkte und letzten Punkte nicht bekannt. Eine kleine Korrektur: Sie haben Tippfehler in den Paketnamen. – user6296218

+0

Hoppla. Es tut uns leid. Fixed denke ich. –

Verwandte Themen