R语言——直方图

发布于:2025-04-14 ⋅ 阅读:(24) ⋅ 点赞:(0)

参考资料:学习R

        如果我们要研究一个连续变量的分布,直方图是最佳的选择。

1、base绘图

        在base中可以使用hist函数绘制直方图,与plot函数一样,它没有data参数,须把数据框置于with中。

data(obama_vs_mccain,package="learningr")
with(
  obama_vs_mccain,
  hist(Obama)
)

        直方图的区间间距的数值默认是由斯特奇斯(sturges)算法进行计算。我们可以实验着使用各种不同的子区间(bin)宽度,这样对分布的理解将更加完整:这个非常灵活,可以通过多种方式来实现:给hist函数传递一个数字来指定区间的数目,或一个区间边缘的向量,或用于计算区间数目的算法名称(除了默认的"sturges",还支持"scott"和"fd"),或一个能计算两个选项之一的函数

        hist函数的main参数用于创建图中的主标题。

with(
  obama_vs_mccain,
  hist(Obama,4,main="An exact number of bins")
)

with(
  obama_vs_mccain,
  hist(
    Obama,
    seq.int(0,100,5),
    main="A vector of bin edges"
  )
)

with(
  obama_vs_mccain,
  hist(Obama,"FD",main="The name of method")
)

with(
  obama_vs_mccain,
  hist(
    Obama,
    nclass.scott,
    main="A function for the number of bins"
  )
)

binner<-function(x){
  seq(
    min(x,na.rm=TRUE),
    max(x,na.rm=TRUE),
    length.out=50)
}
with(
  obama_vs_mccain,
  hist(
    Obama,
    binner,
    main="A function for the bin edges"
  )
)

        freq参数控制直方图是否显示计数或显示每个区间的概率密度。当且仅当区间是均匀分布时,它默认为TRUE

with(
  obama_vs_mccain,
  hist(
    Obama,
    freq=FALSE
  )
)

2、lattice绘图

        lattice中的直方图与base类似,不过它还使用了一个data参数,这个参数使它能更易于分割成多个面板,且能把绘图保存为变量。breaks参数与其在hist中的使用方式相同。

library(lattice)
histogram(
  ~Obama,
  obama_vs_mccain  
)

library(lattice)
histogram(
  ~Obama,
  obama_vs_mccain,
  breaks=10
)

        lattice中的直方图能通过type参数为"count"、"density"或"percent"指定y轴的显示类型:计数、概率密度和百分比,默认是百分比。

histogram(
  ~Obama,
  obama_vs_mccain,
  type="density"
)

3、ggplot2

        ggplot2直方图是通过添加一个直方图的geom来创建的。其区间规格很简单:只需要传递一个数字宽度到geom_histogram即可。其原因是为了让我们手动尝试不同的区间数,而不是仅仅满足于默认值。

library(ggplot2)
ggplot(
  obama_vs_mccain,
  aes(Obama)
)+
  geom_histogram(binwidth=5)

        我们可以通过传递特殊的名字..count..或..density..到y-aesthetic中来选择计数或密度。

ggplot(
  obama_vs_mccain,
  aes(Obama)
)+
  geom_histogram(binwidth=5,aes(y=..density..))
输入上面的代码会提示如下:
The dot-dot notation (`..density..`) wasdeprecated in ggplot2 3.4.0.
 Please use `after_stat(density)` instead.

        因此,建议改成新的参数:

ggplot(
  obama_vs_mccain,
  aes(Obama)
)+
  geom_histogram(binwidth=5,aes(y=after_stat(density)))