Как добавить процентные или подсвеченные надписи над графиком процентного бара?
Используя 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)
- Сохранить графики, сделанные в блестящем приложении
- Разделить фрейм данных на несколько выходных файлов
- geom_boxplot с предварительно вычисленными значениями
- Сортировка строк по алфавиту
- Вставка изображения в ggplot2
Тем не менее, я не могу получить метку для общего счета или процента над каждым из графиков при использовании geom_text
.
Каково правильное дополнение к вышеуказанному коду, который также сохраняет процентную ось y?
- Как сказать, что находится в одном векторе, а не в другом?
- Каково значение новых эталонных classов?
- Получение предупреждения: «« newdata »имеет 1 строку, но найденные переменные содержат 32 строки» в файле outlookа.lm
- Ошибка анализа JSON-файла с помощью пакета jsonlite
- Использование R для загрузки ZIP-файла, извлечения и импорта данных
- Использование динамических имен столбцов в `data.table`
- Зацикливание объекта datetime приводит к числовому iteratorу
- Игнорировать выбросы в ggplot2 boxplot
Оставаясь внутри 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)
График из первой версии показан ниже.
Это проще сделать, если вы предварительно суммируете свои данные. Например:
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")
)
Я использовал весь ваш код и придумал это. Сначала назначьте свой 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)