ggplot2, гистограмма с накоплением и сводные метки

Я пытаюсь получить данные о событиях (A, B, C и D - ниже), которые происходят в 4 местах (1, 2, 3, 4 - ниже). Я хочу изобразить их как столбик с накоплением, который заполняется, чтобы показать вклад каждого события (A, B, C, D) в это место И Я хочу показать целочисленные значения этих вкладов . Я хотел бы видеть не только отдельные значения (как это показано ниже), но также хотел бы увидеть общий вклад, который я не могу понять, как это сделать.

Таким образом, возникают две проблемы: 1. Печать не только отдельных значений столбца с накоплением, но также (или даже отдельно / только) печати общего значения вверху. 2: текстовые метки печатаются со смещением по оси y их значения, поэтому они перезаписывают друг друга и не выстраиваются в линию. Я бы предпочел, чтобы они ожидали где-нибудь внутри суббара, например, в середине или наверху.

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)

Я хочу составить краткое изложение этого - вот таблица ()

table(df$a, df$b)

  A B C D
1 2 2 2 1
2 2 1 1 1
3 0 2 2 0
4 1 0 1 2

Теперь вернемся к data.frame для построения графика с помощью ggplot:

df2 <- data.frame(table(df$a, df$b))

Затем нарисуйте это:

library(ggplot2)
ggplot(df2, aes(x=Var1, y=Freq, fill=Var2, label=Freq)) + 
  geom_bar(stat="identity") + 
  geom_text(stat="identity")

Я был бы очень признателен за помощь. Разве мне не нужно перебирать мой фрейм данных через таблицу, чтобы обобщить его, а затем обратно во фрейм данных? Могу ли я достичь полной высоты планки и распечатать эту этикетку?

Мне кажется, что если бы я не использовал fill, я мог бы получить значение ..count .., но stat = "bin", но поскольку я перешел на stat = "identity", я не могу этого понять итоговая стоимость.

Спасибо!


person Ullapool    schedule 10.06.2014    source источник
comment
Это и это может помочь   -  person user20650    schedule 11.06.2014


Ответы (2)


Я бы суммировал данные, как у вас, чтобы создать желаемый сюжет. Что касается меток, вам также необходимо создать переменные, которые определяют, где ваши метки должны быть размещены на вашем графике.

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)
df2 <- data.frame(table(df$a, df$b))

Теперь создайте переменную для общего подсчета:

df2$overall <- NA
df2$overall[1:length(unique(df2$Var1))] <- xtabs(Freq~Var1,data=df2)

Теперь создайте переменную для подсчета каждого бара с помощью пакета ddply:

library(plyr)
df2 <- ddply(df2, "Var1", transform, cumvars=cumsum(Freq))
# Remove Zeros from printing on labels
df2$Freq2 <- ifelse(df2$Freq==0,NA,df2$Freq)


library(ggplot2)

ggplot(df2, aes(x=Var1, y=Freq, fill=Var2, label=Freq)) + 
  geom_bar(stat="identity") + 
  geom_text(aes(x=Var1, y=overall, label=overall),vjust=-.2,stat="identity") + 
  geom_text(aes(x=Var1, y=cumvars, label=Freq2),vjust=1.5, colour="white", stat="identity")

Вы можете изменить размер, цвет, положение и т. Д. Меток, чтобы график выглядел красиво.

person Mark Nielsen    schedule 10.06.2014
comment
Спасибо, что заметили слабину в моем ответе! - person Gregor Thomas; 11.06.2014

Хорошо, сначала давайте возьмем несколько разумных имен, потому что, когда ваш текст всегда говорит о «событиях» и «местах», а имена ваших переменных a и b, легко запутаться. Кроме того, поскольку ваши местоположения относятся к категории, мы позаботимся о том, чтобы они были указаны как фактор.

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)
names(df) <- c("location", "event")
df$location <- factor(df$location)

После того, как это прояснено, ggplot сделает за нас все обобщение, по крайней мере, для гистограммы.

library(ggplot2)
ggplot(df, aes(x = location, fill = event)) + geom_bar()

Я думаю, нам нужно подвести итоги, чтобы получить итоги:

library(dplyr)
totes <- df %.% group_by(location) %.% summarize(total = n())

ggplot(df, aes(x = location)) + geom_bar(aes(fill = event)) +
    geom_text(data = totes,
              mapping = aes(y = total + .2, label = total))

Получить индивидуальные вклады в столбцах внутри столбцов будет сложнее, и я оставлю это в качестве упражнения для читателя или для того, чтобы кто-то другой ответил. Я также рекомендую вам использовать что-то иное, чем столбчатый график, который значительно упростит сравнение этих чисел. Может быть, примерно так:

df.counts <- df %.% group_by(location, event) %.% summarize(n = n())

ggplot(totes, aes(x = location, y = total)) +
    geom_line(aes(group = 1), size = 1) +
    geom_line(data = df.counts, aes(y = n, color = event, group = event), size = 0.9,
              position = position_jitter(w = 0.05, h = 0.1)) +
    # jitter not pictured, but it helps with the overlapping lines
    expand_limits(y = 0) +
    annotate(geom = "text", x = 2, y = 6, label = "Total", size = 10)

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

person Gregor Thomas    schedule 10.06.2014
comment
Спасибо. Я пойду и узнаю больше о пакете dplyr. Спасибо! - person Ullapool; 11.06.2014
comment
Я разделяю вашу озабоченность по поводу того, как визуализировать данные, и сомнительную ценность накопленных данных. Однако мне кажется, что линии подразумевают некоторую связь между точками данных оси x (или местоположением в этом примере). Наклон между точками, кажется, говорит об изменении, дельте, которой на самом деле не существует в этом примере. Возможно, лучше было бы уклоняться от брусков. . . хм, спасибо за идею. - person Ullapool; 11.06.2014
comment
@Ullapool. Используя уклоненные полосы, вы можете отобразить итоговую сумму в виде сегмента горизонтальной линии в каждом месте. - person Gregor Thomas; 11.06.2014