Ich zeichne Liniendiagramme, die die Veränderung des Preises im Laufe der Zeit für mehrere Instrumente zeigen, mit ggplot2. Es ist mir gelungen, mehrere Linien auf der Handlung zu bekommen und Werte hinzuzufügen, die die letzte Preisänderung zeigen. Was ich tun möchte (und noch nicht erreicht habe), ist, den Legendenschlüssel neu anzuordnen, so dass die am weitesten gestiegene Preisreihe an der Spitze der Legende steht, gefolgt vom Schlüssel der Preisreihe, die am zweithäufigsten gestiegen ist bald.R: Wie wird der Legendenschlüssel im ggplot2-Liniendiagramm neu angeordnet, um den endgültigen Werten in jeder Serie zu entsprechen?
In der folgenden Abbildung zeigt die Legende den Schlüssel in alphabetischer Reihenfolge. Was ich möchte, ist, die Legende Schlüsseleinträge in der Reihenfolge DDD, AAA, CCC und BBB, die die Reihenfolge der Leistung ab dem letzten Datum ist. Wie kann ich das machen?
Minimal-ish-Code folgt.
require(ggplot2)
require(scales)
require(gridExtra)
require(lubridate)
require(reshape)
# create fake price data
set.seed(123)
monthsback <- 15
date <- as.Date(paste(year(now()), month(now()),"1", sep="-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(date), by = "month", length.out = monthsback),
aaa = runif(monthsback, min = 600, max = 800),
bbb = runif(monthsback, min = 100, max = 200),
ccc = runif(monthsback, min = 1400, max = 2000),
ddd = runif(monthsback, min = 50, max = 120))
# function to calculate change
change_from_start <- function(x) {
(x - x[1])/x[1]
}
# for appropriate columns (i.e. not date), replace fake price data with change in price
mydf[, 2:5] <- lapply(mydf[, 2:5], function(myparam){change_from_start(myparam)})
# get most recent values and reshape
myvals <- mydf[mydf$mydate == mydf$mydate[nrow(mydf)],]
myvals <- melt(myvals, id = c('mydate'))
# plot multiple lines
p <- ggplot(data = mydf) +
geom_line(aes(x = mydate, y = aaa, colour = "AAA"), size = 1) +
geom_line(aes(x = mydate, y = bbb, colour = "BBB"), size = 1) +
geom_line(aes(x = mydate, y = ccc, colour = "CCC"), size = 1) +
geom_line(aes(x = mydate, y = ddd, colour = "DDD"), size = 1) +
scale_colour_manual("", values = c("AAA" = "red", "BBB" = "black", "CCC" = "blue", "DDD" = "green")) +
scale_y_continuous(label = percent_format()) +
geom_text(data = myvals, aes(x = mydate + 30, y = value, label = sprintf("%+1.1f%%", myvals$value * 100)), size = 4, colour = "grey50") +
opts(axis.title.y = theme_blank()) +
opts()
# and output
print(p)
Perfekt! Beachten Sie, dass "geordneter Faktor" nicht erforderlich ist. Reihenfolge des Levels ist wichtig, aber ggplot2 kümmert sich nicht darum, ob der Faktor geordnet ist oder nicht. – kohske
Gut zu wissen, @kohske, danke! Ich denke, ich bin über den Code anderer Leute zu paranoid, der über ihre eigene Ordnung entscheidet, wenn der Faktor nicht bestellt wird. – joran
Dank joran dafür - ich habe eine Schmelze für den Hauptdatenrahmen vermieden, aber es hat keine wirkliche Konsequenz und wie Sie darauf hinweisen, spart eine Menge Standard. Ich denke, es wäre möglich, den 'values = c (" aaa "=" red ")' -Teil separat unter Verwendung einer Liste zu definieren, so dass ich den ggplot-Teil des Codes nicht jedes Mal neu eingeben muss, wenn ich etwas machen möchte Änderungen an den Elementen, die ich zeichnen möchte ...? Danke auch an kohske für die Eingabe. – SlowLearner