2010-02-11 5 views
4

J'ai exécuté un travail Pig sur un cluster Hadoop qui a réduit un tas de données en quelque chose que R peut gérer pour effectuer une analyse de cohorte. J'ai le script suivant, et à partir de la deuxième à la dernière ligne je les données dans le format:Histogramme de zone empilée dans R

> names(data) 
[1] "VisitWeek" "ThingAge" "MyMetric" 

VisitWeek est une date. ThingAge et MyMetric sont des entiers.

Les données ressemble à:

2010-02-07  49 12345 

Le script que j'ai à ce jour est:

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

Cette dernière ligne ne fonctionne pas. J'ai essayé beaucoup de variations, de barres, d'histogrammes, mais comme d'habitude, les docs R me battent. Je veux qu'il affiche un diagramme de zone empilé standard de style Excel - une série chronologique pour chaque ThingAge empilé sur les semaines dans l'axe des x, avec la date sur l'axe des ordonnées. Un exemple de ce type de graphique est ici: http://upload.wikimedia.org/wikipedia/commons/a/a1/Mk_Zuwanderer.png

J'ai lu les docs ici: http://had.co.nz/ggplot2/geom_area.html et http://had.co.nz/ggplot2/geom_histogram.html et ce blog http://chartsgraphs.wordpress.com/2008/10/05/r-lattice-plot-beats-excel-stacked-area-trend-chart/ mais je ne peux pas faire tout le travail pour moi.

Comment puis-je y parvenir?

+0

Pourriez-vous s'il vous plaît donner un exemple reproductible? Il est difficile de dire ce qui ne va pas sans un. – hadley

Répondre

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

me donne l'image ci-dessous. Je soupçonne que votre problème réside dans la spécification correctement la mise en correspondance de remplissage pour le tracé de la zone: fill=factor(ThingAge)

alt text http://www.imageurlhost.com/images/wbc5alknt1apvg3czzmb.png

+0

Merci - c'est beaucoup plus court que ma solution. Je l'ai fonctionné - mais mes groupes sont en panne. Travailler sur les trier maintenant. Cela m'a sauvé environ 80 lignes de code. Bravo! :) – rjurney

2

ggplot (Data.Set, aes (x = temps, y = valeur, color = Type)) + geom_area (aes (fill = Type), position = 'pile')

vous devez donner l'geom_area un élément de remplissage et de la pile aussi (bien que peut-être un défaut)

trouvé ici http://www.mail-archive.com/[email protected]/msg84857.html

+0

Merci, cela semble raisonnable, cependant - je reçois toujours un ruban, pas une barre empilée. C'est un ruban en zig-zag - avec seulement la plus grande couleur, 70 (rouge) rempli. C'est ce que je recevais avant, donc je suis toujours perplexe. – rjurney

2

j'ai pu obtenir mon résultat avec ceci:

I chargé de la fonction stackedPlot() de https://stat.ethz.ch/pipermail/r-help/2005-August/077475.html

La fonction (pas la mienne, voir le lien) était:


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 
      ); 
    } 
} 

Je remodelés mes données au format large. Alors ça a marché!


wide = reshape(data, idvar="ThingAge", timevar="VisitWeek", direction="wide"); 
stackedPlot(wide); 
2

Turning entiers en facteurs et en utilisant geom_bar plutôt que geom_area a fonctionné pour moi:

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') 
+0

qplot (y, val, remplissage = fx, données = df, geom = 'aire') vous donne un tracé de surface. –

Questions connexes