R中单列数据的绘图频率分布

时间:2014-06-25 02:59:47

标签: r plot distribution frequency points

我有一系列的值(即一列数据),我想创建一个图表,其中包含x轴上的数据值范围以及每个值出现在数据集上的频率。 y轴。

我想要的是非常接近Kernel Density Plot

# Kernel Density Plot
d <- density(mtcars$mpg) # returns the density data 
plot(d) # plots the results
在stackoverflow上

Frequency distribution in R

但是,我想在y轴上频率(而不是密度)。

具体来说,我正在使用网络学位分布,并希望使用开放的圆形点(即this image)进行双对数刻度。

我已经研究了相关的资源和问题,但还没找到我想要的东西:

R'Plotting distributions的食谱接近我想要的,但不准确。我想将密度曲线示例中的y轴替换为直方图示例中定义的“count”。

R中的ecdf()函数(即this question)可能是我想要的,但是我想要观察到的频率,而不是y轴上0到1之间的归一化值。

This question与频率分布有关,但我喜欢点,而不是条。

编辑:

数据是标准的幂律分布,即

dat <- c(rep(1, 1000), rep(10, 100), rep(100, 10), 100)

2 个答案:

答案 0 :(得分:4)

密度的积分大约为1,因此将密度$ y估计值乘以值的数量应该可以得到频率范围内的某些东西。如果你想要一个真实的&#34;然后你应该使用直方图:

d <- density(mtcars$mpg) 
d$y <- d$y * length(mtcars$mpg)  ; plot(d)

这是一个直方图,每个断点为1个单位:

hist(mtcars$mpg, 
     breaks=trunc(min(mtcars$mpg)):(1+trunc(max(mtcars$mpg))), add=TRUE)

所以这是叠加的比较:

d <- density(mtcars$mpg) 
d$y <- d$y * length(mtcars$mpg)  ; plot(d, ylim=c(0,4) )
hist(mtcars$mpg, breaks=trunc(min(mtcars$mpg)):(1+trunc(max(mtcars$mpg))), add=TRUE)

enter image description here

您需要查看密度页面,其中默认密度带宽选择受到批评,并提供替代方案。如果您使用adjust参数,您可能会看到更接近(与直方图的平滑对应

enter image description here

答案 1 :(得分:2)

如果您有观察的离散值,并且想要在对数刻度上绘制带有点的图,那么

dat <- c(rep(1, 1000), rep(10, 100), rep(100, 10), 100)

dd<-aggregate(rep.int(1, length(dat))~dat, FUN=sum)
names(dd)<-c("val","freq")

plot(freq~val, dd, log="xy")

可能就是你想要的。

enter image description here