我有一个简单的数据框,里面有很多条目。我想绘制分布的密度图。
快速数据框摘要:
summary(rr_stats)
rr
Min. : 1.00
1st Qu.:17.00
Median :20.00
Mean :20.33
3rd Qu.:23.00
Max. :96.00
我的df中的前20个条目:
rr_stats[1:20,1]
[1] 30 28 29 32 32 33 28 25 35 24 28 22 30 26 22 26 23 25 23 23
当我绘制这个df时,密度图看起来很奇怪:
ggplot(rr_stats, aes(x=rr)) + geom_density() + xlim(0,55)
我使用具有类似数据的另一个数据框完成了完全相同的操作,但这里的情节看起来更好:
我做错了什么?
(编辑)问题似乎与数据框的大小有关? 有50.000个条目,问题几乎不可知
但是有了80.000个条目,它开始变得更加明显:
答案 0 :(得分:0)
您可能只需重新启动即可。当我在新会话中运行这些命令时,
rr_stats <- data.frame(rr = c(30,28, 29, 32, 32, 33, 28, 25, 35, 24, 28, 22, 30, 26, 22, 26, 23, 25, 23, 23))
require(ggplot2)
ggplot(rr_stats, aes(x=rr)) + geom_density() + xlim(0,55)
我在你的问题中得到第二个情节,而不是第一个情节:
答案 1 :(得分:0)
看来,您的数据是离散的。 geom_density()
为您提供了一个内核平滑密度(例如,您隐式假设连续分布)。为了看出出了什么问题,我模拟了一个小例子:
N<-80000
S<-as.data.frame(rbinom(N,55,0.5))
dens80000<-density(S[,1])
dens80000
dens10000<-density(S[1:1000,])
par(mfrow=c(1,2))
plot(dens80000)
plot(dens10000)
注意带宽如何不同,例如。给你一个更平滑的情节。带宽是自动计算的,所以当N = 80k时,带宽小于N = 10k,这反过来导致了一个“峰值”。由于数据的离散性,估计密度。当然,这可以通过将带宽更改为更高的设置或仅使用更合适的图来解决。
plot(density(S[,1],bw=2))
或在ggplot中,您可以使用stat_density()
中的adjust参数,例如。做类似的事情:
ggplot(S, aes(x=S[,1])) + geom_density() + stat_density(adjust = 2) + xlim(0,55)
我不确定是否有更优雅的方式来设置ggplot中的带宽,但是当我有时间时会调查它。