我有一个几天的年龄列表,我希望在密度图上显示它们多年。
我这样做了两种方法 - 将x轴上的标签更改为年,并将数据除以365.这些方法给出了不同的密度估算值:
df <- data.frame(id = 1:80000, age = rnorm(80000, 46, 5) * 365)
第一张图使用以下方式生成:
breaks <- seq(from = min(df$age), to = max(df$age), by = 10*365)
ggplot(data = df, aes(x = age)) +
geom_density(aes(y = ..density..)) +
scale_x_continuous(breaks= breaks, labels = floor(breaks/365))
y轴上显示的密度范围为0至0.0002
当我这样做时(将年龄除以365以获得年数 - 不仅仅是更改上面的x标签):
ggplot(data = df, aes(x = age/365)) +
geom_density(aes(y = ..density..))
图表看起来相同,但密度范围为0到0.08 我正在努力了解发生了什么 - 为什么两个地块之间的密度不同?
答案 0 :(得分:4)
两个图中的密度不同,因为在一种情况下,水平单位是365倍,所以垂直单位需要是另一个图的1/355,因为概率密度函数(下面的区域)这些曲线)必须总和为一。
从容器而不是密度曲线来看,这更容易考虑。如果你有一个垃圾箱替换365个垃圾箱,那么一个垃圾箱的着陆概率远远高于个别垃圾箱的平均降落概率。
对于您提供的特定样本数据,我们可以通过查看两个函数的峰值来查看垂直单位之间的转换:
> max(density(df$age)$y) # max of density in days, more horizontal units
[1] 0.0002178977
> df$ageinyears <- df$age/365 # create an age-in-years variable
> max(density(df$ageinyears)$y) # max density in years, fewer horizontals
[1] 0.07953267
> max(density(df$age)$y)*365
[1] 0.07953267
这是绘图中的一个问题的实际原因(可能是你问题的主要推力)是估计ggplot密度的函数是从父aes()继承x参数。所以它对你正在使用的自定义x轴一无所知。您可以明确告诉geom_density不要使用继承的x值,而不是仅仅更改第一个图中的x轴:
ggplot(data = df, aes(x = age)) +
geom_density(aes(x = age/365, y = ..density..))
答案 1 :(得分:2)
最好的建议是忽略y轴上的刻度标签,它们对解释密度图没有任何帮助,而且你所看到的更容易混淆而不是帮助。
我的偏好是密度图,直方图和任何类似图的默认行为,不标记y轴刻度标记,因为它们通常没有任何意义,只会分散注意图的重要部分并经常造成混乱。即使它们被缩放到意图有意义的值,它们也无助于绘图的主要目的,并且仍然可能引起混淆(我改变了直方图中的箱数,现在我的y-tick标签非常不同,恐慌!恐慌!)。不幸的是,在策划它们时存在很大的惯性,以至于我不可能改变它。