r - 将更改的几何从对象传递到其他 ggplot
问题描述
我先做一个情节
df <- data.frame(x = c(1:40, rep(1:20, 3), 15:40))
p <- ggplot(df, aes(x=x, y = x)) +
stat_density2d(aes(fill='red',alpha=..level..),geom='polygon', show.legend = F)
然后我想更改 geom_density 值并在另一个图中使用它们。
# build plot
q <- ggplot_build(p)
# Change density
dens <- q$data[[1]]
dens$y <- dens$y - dens$x
使用改变的密度构建另一个图,如下所示:
# Built another plot
ggplot(df, aes(x=x, y =1)) +
geom_point(alpha = 0.3) +
geom_density2d(dens)
这不起作用但是有没有办法做到这一点?
编辑:当有多个组时这样做:
df <- data.frame(x = c(1:40, rep(1:20, 3), 15:40), group = c(rep('A',40), rep('B',60), rep('C',26)))
p <- ggplot(df, aes(x=x, y = x)) +
stat_density2d(aes(fill=group,alpha=..level..),geom='polygon', show.legend = F)
q <- ggplot_build(p)
dens <- q$data[[1]]
dens$y <- dens$y - dens$x
ggplot(df, aes(x=x, y =1)) +
geom_point(aes(col = group), alpha = 0.3) +
geom_polygon(data = dens, aes(x, y, fill = fill, group = piece, alpha = alpha)) +
scale_alpha_identity() +
guides(fill = F, alpha = F)
解决方案
像这样?可以绘制由 绘制的形状的变换geom_density
。但这与操纵潜在密度并不完全相同......
ggplot(df, aes(x=x, y =1)) +
geom_point(alpha = 0.3) +
geom_polygon(data = dens, aes(x, y, fill = fill, group = piece, alpha = alpha)) +
scale_alpha_identity() +
guides(fill = F, alpha = F)
编辑 - OP 现在有多个组。我们可以使用下面的代码绘制它们,这会产生一个实用性可疑的艺术图。它会按照您的建议进行,但如果您正在寻找有代表性的输出,我建议转换基础数据并对其进行总结会更有成效。
ggplot(df, aes(x=x, y =1)) +
geom_point(aes(col = group), alpha = 0.3) +
geom_polygon(data = dens, aes(x, y, fill = group, group = piece, alpha = alpha)) +
scale_alpha_identity() +
guides(fill = F, alpha = F) +
theme_minimal()
推荐阅读
- django - 如何在 Django REST 中发布列表
- angular - 有条件地执行switchMap,否则,取消所有而不触发错误事件
- sql - 有没有办法将列与日期范围相关联?
- javascript - 如何在 child_process spawn() 调用的输出的每一行加上文本前缀?
- excel - 如何获取第 n 个特殊字符右侧的单元格内容
- tinymce - TinyMCE 中独特的自定义格式
- linux - 删除在开始位置和结束位置之间包含特定子字符串的所有行
- vue.js - Vue.js 应用程序在子路径上不返回带有 Nginx Ingress 的脚本(EKS Kubernetes)
- express - 如何在 NestJS 中安装 Express 中间件(express-openapi-validator)?
- mysql - 我无法使用 process.env.variable 连接到 mysql 数据库