📅  最后修改于: 2023-12-03 14:51:08.731000             🧑  作者: Mango
在 R 编程中,核密度图常常被用来描述数据分布的形态。有时候,我们需要在图中突出数据分布的某一部分,比如在两点之间添加颜色,这时使用 with() 函数是一种方便且简单的方法。
在使用 with() 函数之前,需要安装两个依赖包 ggplot2 和 plyr,执行以下命令进行安装:
install.packages("ggplot2")
install.packages("plyr")
首先,我们需要准备一个数据集,这里我们使用 R 自带的 iris 数据集。
data(iris)
head(iris)
输出结果如下:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
这个数据集包含了150个鸢尾花的观测数据,每个观测数据包括花萼长度、花萼宽度、花瓣长度、花瓣宽度以及所属种类。
接下来,我们使用 ggplot2 包生成一个针对花萼长度的核密度图,并对左侧两个鸢尾花品种之间的密度区域进行添加颜色。
library(ggplot2)
library(plyr)
# 选取花萼长度数据
sepal_length <- iris$Sepal.Length
# 生成核密度图
p <- ggplot(data.frame(x = sepal_length), aes(x = x))
p <- p + geom_density(fill = "gray", alpha = 0.1, col = "black")
# 添加两点之间的颜色
selected_species <- c("setosa", "versicolor")
selected_points <- data.frame(x = c(5.5, 6.5))
add_color <- function(df_points) {
# 最左侧和最右侧的点坐标设置为 Na
left_point <- min(df_points$x)
right_point <- max(df_points$x)
df_points[df_points$x == left_point, "x"] <- NA
df_points[df_points$x == right_point, "x"] <- NA
# 构造 df_lines 数据框,用于表示选中的两点间隔的线段
df_lines <- data.frame(x = c(left_point, df_points$x, right_point),
y = 0)
df_lines$y[1] <- max(density(sepal_length, from = -Inf, to = left_point)$y)
df_lines$y[length(df_lines$y)] <- max(density(sepal_length, from = right_point, to = Inf)$y)
# 生成与 df_lines 对应的颜色区域
df_area <- ddply(df_lines, .(y), summarise, xmin = min(x, na.rm = TRUE),
xmax = max(x, na.rm = TRUE))
df_area$y_min <- df_area$y - 0.05
df_area$y_max <- df_area$y + 0.05
# 生成色彩图层
p_layers <- layer(data = df_area,
mapping = aes(xmin = xmin, xmax = xmax,
ymin = y_min, ymax = y_max,
alpha = 0.4,
fill = as.factor(y)))
ggplot_build(p)$plot$data <- c(ggplot_build(p)$plot$data, p_layers)
return(p)
}
p <- add_color(selected_points)
p <- p + scale_fill_manual(values = c("1" = "red", "2" = "blue"))
p
以上代码会生成如下图片:
该图显示出花萼长度的分布密度,左侧灰色部分为两个品种之间的密度区域,添加了红色填充颜色。我们可以随意更改 add_color() 函数中的 selected_species 和 selected_points 变量来修改颜色区域的位置和颜色。