как перекрыть гистограмму и график плотности числами на оси Y вместо плотности - PullRequest
2 голосов
/ 08 октября 2019

У меня есть график гистограммы, созданный в ggplot2, и я хотел бы перекрыть его линией плотности для тех же данных. Важно отметить, что я не хочу превращать гистограмму в значения плотности, но хочу сохранить N (числа) на оси Y. Есть ли способ перекрывать гистограмму и график плотности, не преобразовывая гистограмму, а увеличивая кривую плотности?

Гистограмма для этих данных:

img1

Начальный график плотности для тех же данных:

img2

Желаемое наложение, но с плотностью по оси Y вместо подсчетов:

img3

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы захотите использовать параметр ..count.., созданный stat_density, а затем масштабировать его по ширине корзины.

library(ggplot2)
set.seed(15)
df <- data.frame(x=rnorm(500, sd=10))
ggplot(df, aes(x=x)) + 
  geom_histogram(colour="black", fill="white", binwidth = 5 ) +
  geom_density(aes(y=..count..*5), alpha=.2, fill="#FF6666") 

enter image description here

2 голосов
/ 08 октября 2019

Да, но вы должны выбрать правильный масштабный коэффициент. Поскольку вы не предоставляете никаких данных, я проиллюстрирую их встроенными данными радужной оболочки.

H = hist(iris$Sepal.Width, main="")

Base histogram

Поскольку высоты представляют собой счетчики частоты, сумма высот должна равняться количеству точек, равных nrow (радужной оболочке). Площадь под кривой (прямоугольники) представляет собой сумму высот, умноженную на ширину прямоугольников, поэтому

  Area = nrow(iris) * (H$breaks[2] - H$breaks[1])

В этом случае она равна 150 * 0,2 = 30, но лучше сохранить ее какформула.

Теперь область под стандартной кривой плотности равна единице, поэтому масштабный коэффициент, который мы хотим использовать, равен nrow(iris) * (H$breaks[2] - H$breaks[1]), чтобы сделать области одинаковыми. Где вы применяете масштабный коэффициент?

DENS = density(iris$Sepal.Width)
str(DENS)
List of 7
 $ x        : num [1:512] 1.63 1.64 1.64 1.65 1.65 ...
 $ y        : num [1:512] 0.000244 0.000283 0.000329 0.000379 0.000436 ...
 $ bw       : num 0.123
 $ n        : int 150
 $ call     : language density.default(x = iris$Sepal.Width)
 $ data.name: chr "iris$Sepal.Width"
 $ has.na   : logi FALSE

Мы хотим масштабировать значения y для графика плотности, поэтому мы используем:

DENS$y = DENS$y * nrow(iris) * (H$breaks[2] - H$breaks[1])

и добавляем линию к гистограмме

lines(DENS)

Histogram with density curve

Вы можете сделать это немного лучше, настроив полосу пропускания для расчета плотности

H = hist(iris$Sepal.Width, main="")
DENS = density(iris$Sepal.Width, adjust=0.7)
DENS$y = DENS$y * nrow(iris) * (H$breaks[2] - H$breaks[1])
lines(DENS)

Histogram with adjusted density curve

...