Гистограмма области с накоплением в R

Я выполнил задание Pig в кластере Hadoop, которое преобразовало кучу данных во что-то, что 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/, но я не могу заставить его работать для меня.

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


person rjurney    schedule 11.02.2010    source источник
comment
Не могли бы вы привести воспроизводимый пример? Без него трудно сказать, что происходит не так.   -  person hadley    schedule 11.02.2010


Ответы (4)


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)

введите здесь описание изображения

person learnr    schedule 11.02.2010
comment
Спасибо - это намного короче моего решения. У меня это работает, но мои полосы вышли из строя. Сейчас работаю над их сортировкой. Это сэкономило мне около 80 строк кода. Браво! :) - person rjurney; 12.02.2010

ggplot (data.set, aes (x = время, y = значение, цвет = тип)) + geom_area (aes (fill = тип), position = 'stack')

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

можно найти здесь http://www.mail-archive.com/[email protected]/msg84857.html

person Dan    schedule 11.02.2010
comment
Спасибо, это звучит разумно, однако - я все еще получаю ленту, а не сложенную полосу. Это зигзагообразная лента с заполнением только самого большого цвета, 70 (красный). Это то, что я получал раньше, поэтому я все еще в тупике. - person rjurney; 11.02.2010

Я смог получить свой результат с этим:

Я загрузил функцию 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);
person rjurney    schedule 11.02.2010

Мне помогло превращение целых чисел в множители и использование 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')
person Jyotirmoy Bhattacharya    schedule 11.02.2010
comment
qplot(y,val,fill=fx,data=df,geom='area') дает вам график площади. - person Jyotirmoy Bhattacharya; 11.02.2010