我想将 stat_density2D 函数与分类变量一起使用,但将我的绘图限制在高密度区域,以减少重叠并提高易读性。
让我们以以下数据为例:
plot_data <-
data.frame(X = c(rnorm(300, 3, 2.5), rnorm(150, 7, 2)),
Y = c(rnorm(300, 6, 2.5), rnorm(150, 2, 2)),
Label = c(rep('A', 300), rep('B', 150)))
ggplot(plot_data, aes(X, Y, colour = Label)) + geom_point()
Run Code Online (Sandbox Code Playgroud)
使用 2D 密度图,我们获得重叠密度
ggplot(plot_data, aes(X, Y)) +
stat_density_2d(geom = "polygon", aes(alpha = ..level.., fill = Label))
Run Code Online (Sandbox Code Playgroud)
是否可以只绘制高密度区域(例如level>0.03)?我找到的唯一解决方案是“欺骗”并手动修改..levels..变量,无论是使用阶跃函数还是任何幂变换,就像在这个简单的例子中一样。
ggplot(plot_data, aes(X, Y)) +
stat_density_2d(geom = "polygon", aes(alpha = (..level..) ^ 2, fill = Label)) +
scale_alpha_continuous(range = c(0, 1))
Run Code Online (Sandbox Code Playgroud)
..levels..是否可以要求 ggplot2/stat_density2D 函数仅关注特定范围的密度级别,而不是修改变量?我试图在没有任何相关结果的情况下使用函数range或limits函数参数scale_alpha_continuous......
谢谢!
选项 1
通过添加到stat_density_2d参数中bins,您绝对可以避免过度绘制,以非常经济的方式控制和吸引对许多密度区域的注意。
set.seed(123)
plot_data <-
data.frame(
X = c(rnorm(300, 3, 2.5), rnorm(150, 7, 2)),
Y = c(rnorm(300, 6, 2.5), rnorm(150, 2, 2)),
Label = c(rep('A', 300), rep('B', 150))
)
ggplot(plot_data, aes(X, Y, group = Label)) +
stat_density_2d(geom = "polygon",
aes(alpha = ..level.., fill = Label),
bins = 4)
Run Code Online (Sandbox Code Playgroud)
选项 2
手动分配颜色,对于我们不想绘制的那些级别不适用。主要缺点是,我们应该提前知道所需的级别和颜色数量(或计算它们)。在我的示例中,set.seed(123)我们需要 7。
ggplot(plot_data, aes(X, Y, group = Label)) +
stat_density_2d(geom = "polygon", aes(fill = as.factor(..level..))) +
scale_fill_manual(values = c(NA, NA, NA,"#BDD7E7", "#6BAED6", "#3182BD", "#08519C"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6181 次 |
| 最近记录: |