2010-02-11 4 views
4

Я запустил задание Pig в кластере Hadoop, которое сбило кучу данных в то, что R может обрабатывать, чтобы выполнить когортный анализ. У меня есть следующий сценарий, а также второго по последней строке у меня есть данные в формате:Гистограмма вложенной области в R

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

VisitWeek является датой. ThingAge и MyMetric являются целыми числами.

Данные выглядит следующим образом:

2010-02-07  49 12345 

Сценарий у меня до сих пор:

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

Эта последняя строка не работает. Я пробовал много вариаций, баров, гистограмм, но, как обычно, R docs побеждает меня.

Я хочу, чтобы он показывал стандартную диаграмму в виде таблицы в стиле Excel - один временной ряд для каждой ThingAge, уложенной в течение недель по оси x, с датой на оси y. Примером такого рода диаграммы здесь: http://upload.wikimedia.org/wikipedia/commons/a/a1/Mk_Zuwanderer.png

Я читать документы здесь: http://had.co.nz/ggplot2/geom_area.html и http://had.co.nz/ggplot2/geom_histogram.html и этот блог http://chartsgraphs.wordpress.com/2008/10/05/r-lattice-plot-beats-excel-stacked-area-trend-chart/, но я не могу достаточно заставить его работать на меня.

Как я могу это достичь?

+0

Могли бы вы предоставить воспроизводимый пример? Трудно сказать, что происходит не так. – hadley

ответ

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

дает мне изображение ниже. Я подозреваю, что ваша проблема заключается в правильно указать отображение заливки для области участка: fill=factor(ThingAge)

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

+0

Спасибо - это намного короче моего решения. У меня есть работа, но мои группы вышли из строя. Работа над их сортировкой сейчас. Это спасло мне около 80 строк кода. Браво! :) – rjurney

2

ggplot (data.set, АЕС (х = Время, у = Значение, цвет = тип)) + geom_area (АЕС (заполняющая = тип), позиция = 'стек')

вы должны дать geom_area заливки элементов, а также стек его (хотя это может быть по умолчанию)

здесь http://www.mail-archive.com/[email protected]/msg84857.html

+0

Спасибо, это звучит разумно, однако - я все равно получаю ленту, а не штабеля. Его лента зигзагообразного цвета - только с самым большим цветом, 70 (красные) заполнены. Это то, что я получал раньше, поэтому я все еще в тупике. – rjurney

2

Я был в состоянии получить мой результат с этим:

Я загрузил функцию stackedPlot() из https://stat.ethz.ch/pipermail/r-help/2005-August/077475.html

Функции (не моя, смотрите ссылку) была:


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

Тогда я видоизмененная мои данные в широкий формат. Тогда это сработало!


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

Включение целых чисел на множители и используя geom_bar, а не geom_area работал для меня:

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, fill = fx, data = df, geom = 'area') дает вам участок участка. –

Смежные вопросы