Подтвердить что ты не робот

Как добавить процентные или подсвеченные надписи над графиком процентного бара?

Используя ggplot2 1.0.0, я выполнил инструкции, приведенные в нижеприведенной статье, чтобы выяснить, как построить графики процентных баров по всем факторам:

Сумма процентов для каждой грани - уважение "заполнение"

test <- data.frame(
     test1 = sample(letters[1:2], 100, replace = TRUE), 
     test2 = sample(letters[3:8], 100, replace = TRUE)
     )
library(ggplot2)
library(scales)
ggplot(test, aes(x= test2, group = test1)) + 
geom_bar(aes(y = ..density.., fill = factor(..x..))) + 
facet_grid(~test1) +
scale_y_continuous(labels=percent)

enter image description here

Однако при использовании geom_text я не могу получить ярлык для общего счета или процента над каждым из графиков.

Какое правильное дополнение к вышеуказанному коду, который также сохраняет процентную ось y?

4b9b3361

Ответ 1

Оставаясь внутри ggplot, вы можете попробовать

ggplot(test, aes(x= test2,  group=test1)) + 
  geom_bar(aes(y = ..density.., fill = factor(..x..))) +
  geom_text(aes( label = format(100*..density.., digits=2, drop0trailing=TRUE),
                 y= ..density.. ), stat= "bin", vjust = -.5) +
  facet_grid(~test1) +
  scale_y_continuous(labels=percent)

Для подсчета, измените..density.. на..count.. в geom_bar и geom_text

ОБНОВЛЕНИЕ для ggplot 2.x

ggplot2 2.0 внес много изменений в ggplot, включая тот, который нарушил исходную версию этого кода, когда он изменил функцию stat по умолчанию, используемую geom_bar ggplot 2.0. 0. Вместо того, чтобы называть stat_bin, как и раньше, для загрузки данных, он теперь вызывает stat_count для подсчета наблюдений в каждом месте. stat_count возвращает prop как долю счетчиков в этом месте, а не density.

Приведенный ниже код был изменен для работы с этой новой версией ggplot2. Я включил две версии, каждая из которых показывает высоту баров в процентах от счетчиков. Первая показывает пропорцию счета над баром в процентах, а вторая показывает количество выше бара. Я также добавил метки для оси y и легенды.

  library(ggplot2)
  library(scales)
#
# Displays bar heights as percents with percentages above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes( label = scales::percent(..prop..),
                   y= ..prop.. ), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)
#
# Displays bar heights as percents with counts above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes(label = ..count.., y= ..prop..), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)

Ниже показан график из первой версии.

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

Ответ 2

Это проще сделать, если вы предварительно суммируете свои данные. Например:

library(ggplot2)
library(scales)
library(dplyr)

set.seed(25)
test <- data.frame(
  test1 = sample(letters[1:2], 100, replace = TRUE), 
  test2 = sample(letters[3:8], 100, replace = TRUE)
)

# Summarize to get counts and percentages
test.pct = test %>% group_by(test1, test2) %>%
  summarise(count=n()) %>%
  mutate(pct=count/sum(count)) 

ggplot(test.pct, aes(x=test2, y=pct, colour=test2, fill=test2)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ test1) +
  scale_y_continuous(labels=percent, limits=c(0,0.27)) + 
  geom_text(data=test.pct, aes(label=paste0(round(pct*100,1),"%"),
                               y=pct+0.012), size=4)

(FYI, вы также можете поместить метки внутри панели, например, изменив последнюю строку кода: y=pct*0.5), size=4, colour="white"))

enter image description here

Ответ 3

Я использовал весь ваш код и придумал это. Сначала назначьте свой ggplot переменной, то есть p < - ggplot (...) + geom_bar (...) и т.д. Тогда вы можете это сделать. Вам не нужно много суммировать, так как ggplot имеет функцию построения, которая дает вам все это. Я оставлю это вам для форматирования и тому подобного. Удачи.


    dat <- ggplot_build(p)$data %>% ldply() %>% select(group,density) %>% 
       do(data.frame(xval = rep(1:6, times = 2),test1 = mapvalues(.$group, from = c(1,2), to = c("a","b")), density = .$density))

    p + geom_text(data=dat, aes(x = xval, y = (density + .02), label = percent(density)), colour="black", size = 3)

enter image description here