我在ggplot2中的密度图有什么问题

时间:2014-10-15 17:10:38

标签: r ggplot2

我有一个简单的数据框,里面有很多条目。我想绘制分布的密度图。

快速数据框摘要:

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)

enter image description here

我使用具有类似数据的另一个数据框完成了完全相同的操作,但这里的情节看起来更好:

enter image description here

我做错了什么?

(编辑)问题似乎与数据框的大小有关? 有50.000个条目,问题几乎不可知 enter image description here

但是有了80.000个条目,它开始变得更加明显: enter image description here

2 个答案:

答案 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)

我在你的问题中得到第二个情节,而不是第一个情节:

enter image description here

答案 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)

densities 注意带宽如何不同,例如。给你一个更平滑的情节。带宽是自动计算的,所以当N = 80k时,带宽小于N = 10k,这反过来导致了一个“峰值”。由于数据的离散性,估计密度。当然,这可以通过将带宽更改为更高的设置或仅使用更合适的图来解决。

plot(density(S[,1],bw=2))

enter image description here

或在ggplot中,您可以使用stat_density()中的adjust参数,例如。做类似的事情:

ggplot(S, aes(x=S[,1])) + geom_density() + stat_density(adjust = 2) + xlim(0,55)

enter image description here

我不确定是否有更优雅的方式来设置ggplot中的带宽,但是当我有时间时会调查它。