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

Показывать частоты вместе с barplot в ggplot2

Я пытаюсь отображать частоты в пределах barplot... ну, я хочу, чтобы они где-то на графике: под барами, в барах, над барами или в области легенды. И я помню (возможно, ошибаюсь), что это можно сделать в ggplot2. Это, наверное, легкий... по крайней мере, это кажется легким. Здесь код:

p <- ggplot(mtcars)
p + aes(factor(cyl)) + geom_bar()

Есть ли вероятность, что я могу получить частоты, встроенные в график?

4b9b3361

Ответ 1

geom_text является аналогом text из базовой графики:

p + geom_bar() + stat_bin(aes(label=..count..), vjust=0, 
                          geom="text", position="identity")

Если вы хотите отрегулировать y-позицию меток, вы можете использовать эстетику y= в пределах stat_bin: например, y=..count..+1 поместит метку на один блок над панелью.

Вышеуказанное также работает, если вы используете внутри geom_text и stat="bin".

Ответ 2

Трудный способ сделать это. Я уверен, что есть лучшие подходы.

ggplot(mtcars,aes(factor(cyl))) + 
geom_bar() + 
geom_text(aes(y=sapply(cyl,function(x) 1+table(cyl)[names(table(cyl))==x]),
label=sapply(cyl,function(x) table(cyl)[names(table(cyl))==x])))

Ответ 3

При желании добавить другую информацию выполните следующие действия:

ggplot(mydata, aes(x=clusterSize, y=occurence)) +
geom_bar() + geom_text(aes(x=clusterSize, y=occurence, label = mydata$otherinfo))

Ответ 4

В качестве альтернативы я нашел полезным использовать некоторые из доступных функций аннотаций: ggplot2::annotate, ggplot2::annotation_custom или cowplot::draw_label (который является оболочкой annotation_custom).

ggplot2::annotate просто перерабатывает текстовый параметр geom. Для построения графиков в любом месте на холсте более ggplot2::annotation_custom возможности, предоставляемые ggplot2::annotation_custom или cowplot::draw_label.

Примеры с ggplot2::annotate

library(ggplot2)

p <- ggplot(mtcars) + aes(factor(cyl)) + geom_bar()

# Get data from the graph
p_dt <- layer_data(p) # or ggplot_build(p)$data

p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = 15)

Или позвольте y изменить:

p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = p_dt$y + 1)

Пример с ggplot2::annotation_custom

У ggplot2::annotate есть ограничения при попытке построения графика в более "нетрадиционных" местах, как было задано изначально (" где-то на графике"). Тем не менее, ggplot2::annotation_custom в сочетании с установкой отсечения позволяет ggplot2::annotation_custom в любом месте холста/листа, как показано в следующем примере:

p2 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
  p2 <- p2 + annotation_custom(grid::textGrob(p_dt$count[i]), 
                               xmin = p_dt$x[i], xmax = p_dt$x[i], ymin = -1, ymax = -1)
}
p2

Пример с cowplot::draw_label

cowplot::draw_label является оболочкой ggplot2::annotation_custom и немного менее многословен (как следствие). Это также нуждается в обрезке, чтобы построить где-нибудь на холсте.

library(cowplot)
#> Warning: package 'cowplot' was built under R version 3.5.2
#> 
#> Attaching package: 'cowplot'
#> The following object is masked from 'package:ggplot2':
#> 
#>     ggsave
# Revert to default theme; see https://stackoverflow.com/a/41096936/5193830
theme_set(theme_grey())

p3 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
  p3 <- p3 + draw_label(label = p_dt$count[i], x = p_dt$x[i], y = -1.8)
}
p3

Обратите внимание, что draw_label также можно использовать в сочетании с cowplot::ggdraw, переключаясь на относительные координаты в диапазоне от 0 до 1 (относительно всего холста, см. Примеры с help(draw_label)). В этом случае установка coord_cartesian(clip = "off") больше не требуется, так как ggdraw позаботится ggdraw.

Создано в 2019-01-16 пакетом представлением (v0.2.1)

Ответ 5

Если вы не ограничены ggplot2, вы можете использовать? текст из базовой графики или? boxed.labels из пакета plotrix.