наложение двух нормальных распределений на две гистограммы на один график в R

Я пытаюсь построить график двух нормальных распределений по двум гистограммам на одном графике в R. Вот пример того, как я хотел бы, чтобы это выглядело: Что я хотел бы

Вот мой текущий код, но я не получаю правильное наложение второго нормального распределения:

g = R_Hist$`AvgFeret,20-60`
m<-mean(g)
std<-sqrt(var(g))

h <- hist(g, breaks = 20, xlab="Average Feret Diameter", main = "Histogram of 60-100um beads", col=adjustcolor("red", alpha.f =0.2))
xfit <- seq(min(g), max(g), length = 680)
yfit <- dnorm(xfit, mean=mean(g), sd=sd(g))
yfit <- yfit*diff(h$mids[1:2]) * length(g)

lines(xfit, yfit, col = "red", lwd=2)

k = R_Hist$`AvgFeret,60-100`
ms <-mean(k)
stds <-sqrt(var(k))

j <- hist(k, breaks=20, add=TRUE, col = adjustcolor("blue", alpha.f = 0.3))
xfit <- seq(min(j), max(j), length = 314)
yfit <- dnorm(xfit, mean=mean(j), sd=sd(j))
yfit <- yfit*diff(j$mids[1:2]) * length(j)

lines(xfit, yfit, col="blue", lwd=2)

и вот график, который генерирует этот код: Мой текущий график

Я еще не работал над выяснением того, как изменить масштаб оси, поэтому любая помощь в этом также будет оценена, но я уверен, что могу просто посмотреть это! Должен ли я использовать ggplot2 для этого приложения? Если да, то как вы накладываете нормальную кривую в этой библиотеке?

Кроме того, в качестве примечания, вот ошибки, возникающие при построении графика второй (синей) линии: введите здесь описание изображения


person IdRatherNot    schedule 26.08.2020    source источник


Ответы (1)


Чтобы они были в одном масштабе, проще всего сначала запустить hist(), чтобы получить значения.

h <- hist(g, breaks = 20, plot = FALSE)
j <- hist(k, breaks = 20, plot = FALSE)

ymax <- max(c(h$counts, j$counts))
xmin <- 0.9 * min(c(g, k))
xmax <- 1.1 * max(c(g,k))

Затем вы можете просто использовать параметры xlim и ylim при первом вызове hist():

h <- hist(g, breaks = 20,
          xlab="Average Feret Diameter",
          main = "Histogram of 60-100um beads",
          col=adjustcolor("red", alpha.f =0.2),
          xlim=c(xmin, xmax),
          ylim=c(0, ymax))

Ошибки во второй (синей) строке связаны с тем, что вы не заменили j (объект гистограммы) на k (необработанные значения):

xfit <- seq(min(k), max(k), length = 314)
yfit <- dnorm(xfit, mean=mean(k), sd=sd(k))
yfit <- yfit*diff(j$mids[1:2]) * length(k)

Что касается подхода ggplot2, вы можете найти хороший ответ здесь и в сообщениях, связанных в нем.

person Alexlok    schedule 27.08.2020
comment
Спасибо!!! Это был один из тех моментов, когда сколько ни смотришь на вопрос, все равно приходишь 22-2=11... - person IdRatherNot; 28.08.2020