Я хочу нарисовать две гистограммы в одном окне графика, но расположенные вертикально. Один из таких примеров можно найти по адресу https://blogs.sas.com/content/graphicallyspeaking/files/2013/11/MirrorHistogramVert.png
Ниже мой код
library(ggplot2)
set.seed(1)
dat = rbind(data.frame('val' = rnorm(100), 'met' = 'Metric1'), data.frame('val' = rt(100, 2), 'met' = 'Metric12'))
ggplot(dat, aes(x = val, y = met, color = met)) + geom_histogram()
Однако я получаю ошибку ниже
Error in `geom_histogram()`:
! Problem while computing stat.
ℹ Error occurred in the 1st layer.
Caused by error in `setup_params()`:
! `stat_bin()` must only have an x or y aesthetic.
Run `rlang::last_trace()` to see where the error occurred.
Я также хочу добавить кривую вероятности для Normal distribution
для обеих гистограмм.
Любое предложение о том, какой подход может быть правильным, будет очень полезно.
Вы можете создать два отдельных слоя для двух групп, используя y = -after_stat(count)
во втором слое (по умолчанию для geom_histogram
установлено y = after_stat(count)
.
Убедитесь, что breaks
для обоих слоев одинаковы, чтобы ячейки совпадали.
ggplot(dat, aes(x = val, fill = met)) +
geom_histogram(data = dat[dat$met == 'Metric1',],
breaks = seq(-40, 10, 0.5),
colour = "black",
alpha = 0.3) +
geom_histogram(data = dat[dat$met == 'Metric12', ],
breaks = seq(-40, 10, 0.5),
mapping = aes(y = -after_stat(count)),
colour = "black",
alpha = 0.3) +
scale_fill_manual(values = c('blue3', 'red3')) +
coord_cartesian(xlim = c(-10, 10)) +
labs(y = 'count') +
theme_bw(20) +
theme(panel.border = element_blank())
Это очень хорошо. Я также хотел добавить normal density plots
для обеих гистограмм. Как я могу это сделать?
@Bogaso, если вы имеете в виду оценки ядра плотности, это по сути то же самое, используя geom_density
вместо geom_histogram
. Вам также необходимо указать положительный after_stat(count)
для эстетики положительной переменной. Если вы имеете в виду, что вам нужно правильно масштабированное нормальное распределение со средним значением и стандартным отклонением, определяемым данными, это возможно, но весьма сложно и, по сути, является совершенно новым вопросом.
@Bogaso, вы можете просто предварительно рассчитать график плотности с помощью density()
, а затем просто умножить один из показателей на -1
.
@stefan Спасибо за это. Я исправил исходное сообщение