Я думаю, чтобы решить вашу ошибку, вы должны написать:
dens1 <- density(bodydata$neck[bodydata$bodycat == "Average"], bw = 4)
Итак, слегка изменив код, вы можете написать:
h1 <- hist(bodydata$neck[bodydata$bodycat == "Athlete"], plot = FALSE, breaks = 15)
h2 <- hist(bodydata$neck[bodydata$bodycat == "Average"], plot = FALSE, breaks = 15)
h3 <- hist(bodydata$neck[bodydata$bodycat == "Obese"], plot = FALSE, breaks = 15)
plot(h1, add = FALSE, col=rgb(1,0,0,0.25), xlim = c(30,55), ylim = c(0,25),
main = "Neck for the three body categories",
xlab = "Body categories",
ylab = "Neck")
plot(h2, add = TRUE, col = rgb(0,0,1,0.25))
plot(h3, add = TRUE, col = rgb(0,1,0,0.25))
legend("topright", c("Athlete", "Average", "Obese"),
col=c(rgb(1,0,0,0.25),rgb(0,0,1,0.25),rgb(0,1,0,0.25)), lwd=15)
dens1 <- density(bodydata$neck[bodydata$bodycat == "Athlete"], bw = 4)
dens2 <- density(bodydata$neck[bodydata$bodycat == "Average"], bw = 4)
dens3 <- density(bodydata$neck[bodydata$bodycat == "Obese"], bw = 4)
lines(x = dens1$x, y = dens1$y*length(bodydata$neck[bodydata$bodycat == "Athlete"])*diff(h1$breaks)[1], lwd = 2, col = rgb(1,0,0))
lines(x = dens2$x, y = dens2$y*length(bodydata$neck[bodydata$bodycat == "Average"])*diff(h2$breaks)[1], lwd = 2, col = rgb(0,0,1))
lines(x = dens3$x, y = dens3$y*length(bodydata$neck[bodydata$bodycat == "Obese"])*diff(h3$breaks)[1], lwd = 2, col = rgb(0,1,0))
Если вам не нужно останавливаться на графике R base
, вы можете использовать ggplot2
, чтобы собрать все гистограммы и графики плотности в меньшее количество строк и разделить их на три разные панели. используя facet_wrap
. Это улучшит читабельность вашего графика и вашего кода:
library(ggplot2)
ggplot(bodydata, aes(neck, fill = bodycat))+
geom_histogram(aes(y = ..count..),color = "black", alpha = 0.25)+
geom_density(aes(y = ..count.., color = bodycat), fill = NA, alpha = 0.25)+
facet_wrap(.~bodycat)