Gestapelte Fläche Histogramm in R
Frage
lief ich ein Schwein Job auf einem Hadoop-Cluster, die eine Reihe von Daten nach unten in etwas R knirschten umgehen kann eine Kohortenanalyse zu tun. Ich habe das folgende Skript, und als die zweitletzten Zeile Ich habe die Daten im Format:
> names(data)
[1] "VisitWeek" "ThingAge" "MyMetric"
ist VisitWeek ein Datum. ThingAge und MyMetric ganze Zahlen sind.
Die Daten sieht aus wie:
2010-02-07 49 12345
Das Skript, das ich bisher habe, ist:
# Load ggplot2 for charting
library(ggplot2);
# Our file has headers - column names
data = read.table('weekly_cohorts.tsv',header=TRUE,sep="\t");
# Print the names
names(data)
# Convert to dates
data$VisitWeek = as.Date(data$VisitWeek)
data$ThingCreation = as.Date(data$ThingCreation)
# Fill in the age column
data$ThingAge = as.integer(data$VisitWeek - data$ThingCreation)
# Filter data to thing ages lt 10 weeks (70 days) + a sanity check for gt 0, and drop the creation week column
data = subset(data, data$ThingAge <= 70, c("VisitWeek","ThingAge","MyMetric"))
data = subset(data, data$ThingAge >= 0)
print(ggplot(data, aes(x=VisitWeek, y=MyMetric, fill=ThingAge)) + geom_area())
Diese letzte Zeile funktioniert nicht. Ich habe versucht, viele Variationen, Bars, Histogramme, aber wie üblich R docs besiegen mich.
Ich möchte es ein Standard-Excel-Stil gestapelte Flächendiagramm zeigen - eine Zeitreihe für jede ThingAge über die Wochen in der x-Achse gestapelt, mit dem Datum auf der y-Achse. Ein Beispiel für diese Art von Grafik ist hier: http: // Upload. wikimedia.org/wikipedia/commons/a/a1/Mk_Zuwanderer.png
Ich habe hier die Dokumentation lesen: http://had.co.nz/ggplot2 /geom_area.html und http://had.co.nz/ggplot2/geom_histogram .html und Blog http://chartsgraphs.wordpress.com/2008/10/05/r-lattice-plot-beats-excel-stacked-area-trend-chart/ aber ich kann nicht ganz macht es für mich arbeiten.
Wie kann ich das erreichen?
Lösung
library(ggplot2)
set.seed(134)
df <- data.frame(
VisitWeek = rep(as.Date(seq(Sys.time(),length.out=5, by="1 day")),3),
ThingAge = rep(1:3, each=5),
MyMetric = sample(100, 15))
ggplot(df, aes(x=VisitWeek, y=MyMetric)) +
geom_area(aes(fill=factor(ThingAge)))
gibt mir das Bild unten. Ich vermute, dass Ihr Problem liegt in korrekt das fill-Mapping für den Bereich Grundstück Angabe: fill=factor(ThingAge)
Andere Tipps
ggplot (data.set, aes (x = Zeit, y = Wert, color = Typ)) + geom_area (aes (fill = Typ), Position = 'Stack')
müssen Sie die geom_area ein Füllelement geben und es auch zu stapeln (obwohl das könnte ein Verzug)
finden Sie hier http: //www.mail -archive.com/r-help@r-project.org/msg84857.html
Ich konnte mein Ergebnis erhalten mit diesem:
lud ich die stackedPlot () Funktion von https: / /stat.ethz.ch/pipermail/r-help/2005-August/077475.html
Die Funktion (nicht von mir, siehe Link) war:
stackedPlot = function(data, time=NULL, col=1:length(data), ...) {
if (is.null(time))
time = 1:length(data[[1]]);
plot(0,0
, xlim = range(time)
, ylim = c(0,max(rowSums(data)))
, t="n"
, ...
);
for (i in length(data):1) {
# Die Summe bis zu aktuellen Spalte
prep.data = rowSums(data[1:i]);
# Das Polygon muss seinen ersten und letzten Punkt auf der Nulllinie haben
prep.y = c(0
, prep.data
, 0
)
prep.x = c(time[1]
, time
, time[length(time)]
)
polygon(prep.x, prep.y
, col=col[i]
, border = NA
);
}
}
Dann umgestalteten ich meine Daten auf Wide-Format. Dann arbeitete sie!
wide = reshape(data, idvar="ThingAge", timevar="VisitWeek", direction="wide");
stackedPlot(wide);
Drehen ganze Zahlen in Faktoren und mit geom_bar anstatt geom_area für mich gearbeitet:
df<-expand.grid(x=1:10,y=1:6)
df<-cbind(df,val=runif(60))
df$fx<-factor(df$x)
df$fy<-factor(df$y)
qplot(fy,val,fill=fx,data=df,geom='bar')