绘制2D密度图

R
ggdensity
Author

Rui

Published

March 24, 2024

密度图可以看作是平滑后的直方图,能大致观察连续变量的分布情况;那么 2D 密度图(2d density plot)就是 x 轴和 y 轴上各有一个连续变量,同时展示两个变量的关系。

并且,当数据的点非常多并且出现严重重叠时,2D 密度图能通过颜色的渐变,更清晰的展现两个数值变量间的关系。

ggdensity 是一个新的 ggplot2 扩展 R 包,其中包含几个简单函数替换 ggplot2原有函数,能更加简单的制作 2D 密度图以及相关图形。

https://github.com/jamesotto852/ggdensity

安装和载入需要的 R 包:

# install.packages("ggdensity")
library("ggdensity")
library("ggplot2")

以 iris 数据为例,使用函数 geom_hdr()

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_hdr(xlim = c(3, 9), ylim = c(0, 5))

右侧 legend 显示对应区域的概率,默认为 50%,80%,95% 和 99%。

并且,geom_hdr() 能兼容使用 ggplot2 包中的其它函数:

# 去除背景颜色和网格线
ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_hdr(xlim = c(3, 9), ylim = c(0, 5)) +
  theme_bw() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

分面图:

ggplot(iris, aes(Sepal.Length, Sepal.Width, fill = Species)) +
  geom_hdr(xlim = c(3, 9), ylim = c(0, 5)) +
  scale_fill_brewer(palette = "Set1") + # 调色
  theme_bw() + # 主题
  facet_wrap(~Species) # 分成多个图

可以使用 geom_hdr_lines() 绘制等高线图(contour plot)。

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_hdr_lines(aes(
    colour = after_stat(probs)), 
    alpha = 1, 
    xlim = c(3, 9), 
    ylim = c(0, 5)
    ) + # 等高线图
  geom_point(alpha = 0.5) +
  scale_colour_brewer(palette = 1) +
  theme_bw()