web-dev-qa-db-fra.com

Ajouter du texte à geom_line dans ggplot

J'essaie de créer un tracé de ligne pour 2 stocks AAPL et FB. Au lie d'ajouter un légende séparée, je voudrais imprimer les symboles de stock le long avec les lignes. Comment puis-je ajouter geom_text au code suivant?
J'apprécie toute aide que vous pourriez apporter.

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

C'est le type de tracé parfait pour le package directlabels. Et il est plus facile de tracer si les données sont disponibles dans une trame de données.

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

Un meilleur tracé: augmentez l'espace entre les extrémités des lignes et les étiquettes. Voir ici pour d'autres options.

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


La question est peut-être un doublon de celui-ci .

11
Sandy Muspratt

Vous devez simplement ajouter geom_text comme vous l'avez dit:

Définissez les positions x, y, le label que vous souhaitez voir apparaître (et le color):

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

[~ # ~] modifier [~ # ~]

Si vous souhaitez rechercher automatiquement les positions de x et y dans geom_text, vous rencontrerez de nouveaux problèmes avec les étiquettes qui se chevauchent si vous augmentez le nombre de variables. Voici un début de solution, vous pouvez adapter la méthode pour définir x et `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

7
bVa