如何将直方图和密度图与 Y 轴上的数字而不是密度重叠
how to overlap histogram and density plot with Numbers on Y-axis instead of density
我在 ggplot2 中创建了直方图,我想将它与相同数据的密度线重叠。重要的是,我不想将直方图转换为密度值,而是想在 y 轴上保留 N(数字)。
有什么方法可以在不变换直方图的情况下将直方图和密度图重叠,而是按比例放大密度曲线?
此数据的直方图:
相同数据的初始密度图:
所需的叠加层,但 Y 轴上的密度而不是计数:
是的,但是你必须选择正确的比例因子。由于您不提供任何数据,我将使用内置的虹膜数据进行说明。
H = hist(iris$Sepal.Width, main="")
由于高度是频率计数,因此高度之和应等于点数,即 nrow(iris)。曲线(框)下的面积是高度乘以框宽的总和,所以
Area = nrow(iris) * (H$breaks[2] - H$breaks[1])
在这种情况下,它是 150 * 0.2 = 30,但最好保留为公式。
现在标准密度曲线下的面积是1,所以我们要使用的比例因子是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)
您可以通过调整密度计算的带宽来使它更好一些
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)
您需要使用 stat_density
创建的 ..count..
参数,然后按 bin 宽度缩放它。
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")
我在 ggplot2 中创建了直方图,我想将它与相同数据的密度线重叠。重要的是,我不想将直方图转换为密度值,而是想在 y 轴上保留 N(数字)。 有什么方法可以在不变换直方图的情况下将直方图和密度图重叠,而是按比例放大密度曲线?
此数据的直方图:
相同数据的初始密度图:
所需的叠加层,但 Y 轴上的密度而不是计数:
是的,但是你必须选择正确的比例因子。由于您不提供任何数据,我将使用内置的虹膜数据进行说明。
H = hist(iris$Sepal.Width, main="")
由于高度是频率计数,因此高度之和应等于点数,即 nrow(iris)。曲线(框)下的面积是高度乘以框宽的总和,所以
Area = nrow(iris) * (H$breaks[2] - H$breaks[1])
在这种情况下,它是 150 * 0.2 = 30,但最好保留为公式。
现在标准密度曲线下的面积是1,所以我们要使用的比例因子是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)
您可以通过调整密度计算的带宽来使它更好一些
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)
您需要使用 stat_density
创建的 ..count..
参数,然后按 bin 宽度缩放它。
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")