- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 ggplot
创建一个新几何图形如所述here ,同时对其进行调整以处理简单特征对象。
作为一个例子,让我们进行绘制一组点的凸包的相同练习。因此,我写了一个新的 geom_envelope()
函数借用 geom_sf()
的元素和相应的 GeomEnvelope
ggproto
执行覆盖 draw_group()
的计算的对象方法(因为我想要一个多边形来代表全套点)。
但是,我必须遗漏一些东西,因为我无法绘制多边形。我已经尝试了一段时间,但我要么得到错误,要么没有绘制任何内容。
library(sf); library(ggplot2); library(dplyr)
Npts <- 10
pts <- matrix(runif(2*Npts), ncol = 2) %>%
st_multipoint() %>%
st_sfc() %>%
st_cast("POINT") %>%
st_sf()
GeomEnvelope <- ggproto(
"GeomEnvelope", GeomSf,
required_aes = "geometry",
default_aes = aes(
shape = NULL,
colour = "grey20",
fill = "white",
size = NULL,
linetype = 1,
alpha = 0.5,
stroke = 0.5
),
draw_key = draw_key_polygon,
draw_group = function(data, panel_params, coord) {
n <- nrow(data)
if (n <= 2) return(grid::nullGrob())
gp <- gpar(
colour = data$colour,
size = data$size,
linetype = data$linetype,
fill = alpha(data$fill, data$alpha),
group = data$group,
stringsAsFactors = FALSE
)
geometry <- sf::st_convex_hull(st_combine(sf::st_as_sf(data)))
sf::st_as_grob(geometry, pch = data$shape, gp = gp)
}
)
geom_envelope <- function(
mapping = aes(),
data = NULL,
position = "identity",
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...) {
if (!is.null(data) && ggplot2:::is_sf(data)) {
geometry_col <- attr(data, "sf_column")
}
else {
geometry_col <- "geometry"
}
if (is.null(mapping$geometry)) {
mapping$geometry <- as.name(geometry_col)
}
c(
layer(
geom = GeomEnvelope,
data = data,
mapping = mapping,
stat = "identity",
position = position,
show.legend = if (is.character(show.legend))
TRUE
else
show.legend,
inherit.aes = inherit.aes,
params = list(
na.rm = na.rm,
legend = if (is.character(show.legend))
show.legend
else
"polygon",
...
)
),
coord_sf(default = TRUE)
)
}
ggplot(pts) + geom_sf() + geom_envelope() + theme_bw()
最佳答案
如果这是您的实际用例(而不是它的简化示例),那么我想说您正在寻找的基本部分是自定义 统计 , 不是自定义 几何 .数据计算/操作应该发生在前者中。
(作为引用,我通常查看 GeomBoxplot
/ StatBoxplot
中的代码以找出应该发生的事情,因为该用例包括一堆分位数/异常值的计算,以及不同 grob 元素的组合接受各种美学映射。)
具有可重复性的随机种子数据:
set.seed(123)
pts <- matrix(runif(2*Npts), ncol = 2) %>%
st_multipoint() %>%
st_sfc() %>%
st_cast("POINT") %>%
st_sf()
StatEnvelope
会将数据集传递给相关的几何层,并将每组内的几何值集合(如果未指定分组美学,则整个数据集将被视为一组)转换为凸包:
StatEnvelope <- ggproto(
"StatEnvelope", Stat,
required_aes = "geometry",
compute_group = function(data, scales) {
if(nrow(data) <= 2) return (NULL)
data %>%
group_by_at(vars(-geometry)) %>%
summarise(geometry = sf::st_convex_hull(sf::st_combine(geometry))) %>%
ungroup()
}
)
ggplot(pts) +
geom_sf() +
geom_sf(stat = StatEnvelope,
alpha = 0.5, color = "grey20", fill = "white", size = 0.5) +
theme_bw()
geom_sf
,在创建信封方面做得非常好。如果我们想指定一些默认的美学参数,而不是在
geom_sf
的每个实例中重复,我们仍然不需要定义一个新的 Geom。修改现有
geom_sf
的函数会做得很好。
geom_envelope <- function(...){
suppressWarnings(geom_sf(stat = StatEnvelope,
..., # any aesthetic argument specified in the function
# will take precedence over the default arguments
# below, with suppressWarning to mute warnings on
# any duplicated aesthetics
alpha = 0.5, color = "grey20", fill = "white", size = 0.5))
}
# outputs same plot as before
ggplot(pts) +
geom_sf() +
geom_envelope() +
theme_bw()
# with different aesthetic specifications for demonstration
ggplot(pts) +
geom_sf() +
geom_envelope(alpha = 0.1, colour = "brown", fill = "yellow", size = 3) +
theme_bw()
"setting up parameters"
, 或
"drawing panel, step 3"
等。这使我能够很好地了解引擎盖下发生的事情,并在函数(不可避免地)在第 1 次/第 2 次/.../第 n 次尝试时返回错误时跟踪出错的地方。
print("draw group")
GeomEnvelope
的开头的
draw_group
运行前的函数
ggplot(pts) + geom_sf() + geom_envelope() + theme_bw()
,我们将观察到控制台中没有任何打印的消息。换句话说,
draw_group
函数从未被调用 ,因此其中定义的任何数据操作对输出都没有影响。
draw_*
Geom*
中的函数,当我们想要进行修改时,这可能会令人困惑。来自
code for Geom
,我们可以看到层次结构如下:
draw_layer
(包括 do.call(self$draw_panel, args)
行)draw_panel
(包括 self$draw_group(group, panel_params, coord, ...)
行)draw_group
( Geom
未实现)。 draw_layer
触发器
draw_panel
, 和
draw_panel
触发器
draw_group
. (镜像此,在
Stat
,
compute_layer
触发
compute_panel
和
compute_panel
触发
compute_group
。)
GeomSf
,继承自
Geom
(代码
here ),覆盖
Geom
的
draw_panel
带有返回
sf_grob(...)
的代码块的函数, 和
不 触发
draw_group
.
GeomEnvelope
继承
GeomSf
的
draw_panel
函数,它的
draw_group
中没有任何内容功能很重要。图中绘制的内容取决于
draw_panel
,以及
geom_envelope
问题中的层执行与
geom_sf
基本相同的任务,分别绘制每个单独的点。如果您删除/注释掉
geom_sf
层,你会看到相同的点;仅使用 color = "grey20"、alpha = 0.5 等,如
GeomSf
中所述的
default_aes
.
fill = "white"
未使用,因为
geom_sf
默认为
GeomPoint
的点数据默认美学,这意味着它继承了
GeomPoint
的
pch = 19
的点形状,并绘制了一个实体圆不受任何填充值的影响。)
关于r - 使用 sf 对象的自定义几何图形扩展 ggplot2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55811839/
除了绘制各类分析图形(比如柱状图,折线图,饼图等等)以外, matplotlib 也可以在画布上任意绘制各类几何图形。 这对于计算机图形学、几何算法和计算机辅助设计等领域非常重要。 m
我的问题的背景是,我有一堆几何图形(数量巨大,认为映射到更大的区域)分布在多个 wpf 几何实例中(最初它们是 PathGeometry,但为了减少内存使用量,我对它们进行了预处理并在加载期间创建 S
我正在研究一个传感器网格,它基于(目前)没有比相机更复杂的东西。将来,我希望包括对基于 Kinect 的设备以及其他传感器设备(即麦克风、 radio 接收器等)的支持,但目前,我正在努力启动它。 我
我想制作一系列具有相同颜色的 geom_bar 的图表。我更喜欢偷懒,因此我希望避免每次都指定fill="blue"。 如何根据最新版本的 ggplot2 修改 geom 的默认值或创建具有修改后默认
有没有办法使用准备好的语句将 GIS 数据插入 mysql 数据库(使用 PHP/PDO)? 这是失败的: $stmt = $sql->prepare("INSERT INTO geo SET loc
当用鼠标拖动小部件时,宽度会自由移动(带框架的小部件)。我想要实现的是让移动的小部件捕捉到某些区域,例如屏幕的其他小部件或边框。例如,Winamp 中的播放列表窗口与主窗口对齐。如何实现这种行为? 最
我需要创建一个简单的应用程序,它可以在 C# 中显示来自 Oracle Spatial 的几何图形。这些几何图形从 AutoCAD Map 3D 2010 导出到 Oracle Spatial。 我需
根据一组定义路线的坐标,我想绘制一个模拟该轨道的理论高速公路的几何图形,给定任意米宽(例如 20 米) 我不知道 GeoTools 是否提供了用这样的输入构造一个 Geometry 的工具,所以我最初
我们已经进行了开发智能手机/平板电脑应用程序(最好是 Android 应用程序)的需求可行性研究,该应用程序应该能够执行以下操作 首先,用户会使用带有摄像头的平板电脑或智能手机行走,在建筑物内部绘制整
我正在尝试使用 Three.js STLLoader 从 STL 文件读取并缓存几何图形。我使用事件循环回调来获取数据(类似于 STLLoader 示例)。我打算存储在外部变量“cgeom”中。但是,
我正在尝试使用带获取值的 ST_Makepoint 进行插入,但我遇到了 500 错误。 这是我的 php 代码: prepare("INSERT INTO table(id_a, id_b, geo
我试图让我的几何图形在 SceneKit 中看起来平坦而不平滑。正如您在图像中看到的,在 SceneKit 中,绿色球体默认具有平滑的阴影。我想要的是另一张图片中的扁平“外观”,上面写着“扁平”。 我
我似乎无法直接将 mssql 空间字段导入到 geopandas 中。我可以使用 Pymssql 将普通的 mssql 表导入 pandas,不会出现任何问题,但我无法找到将空间字段导入形状几何的方法
我目前正在将 STL 对象加载到我的 Three.js 场景中。 出于某种原因,渲染/动画需要大量 GPU 资源,从而减慢整个场景的速度,因此我一直在考虑替代方案。 由于它是一个非常简单的形状,我想我
我正在使用 QT 并尝试使用 QGraphicsView 和 QGraphicsScene 绘制图表..我不想要任何额外的依赖项,这就是我不使用 QWT 的原因。当我绘制我的数据时,此刻我使用 sce
新式 sf R 包使其非常容易处理 R中的地理数据,以及ggplot2的开发版本有一个新的geom_sf()用于绘制科幻风格地理数据的图层。 内sf处理数据的范式,是否可以映射 ggplot 美学到
这是一个简单的问题,我还没有找到明确的答案。在 ST_GeomFromGeoJSON 的规范页面上,它指出: ST_GeomFromGeoJSON works only for JSON Geomet
我需要找到一种方法来获取适合传递给某些 X 的几何体窗口命令的 -geometry 选项,以便保证覆盖所有不与任何 GNOME 重叠的 X 根窗口自己管理(例如,GNOME 面板窗口)。这与xwini
我使用sequelize-auto提取了一些PostGis图层的模型,给出: module.exports = function(sequelize, DataTypes) { return sequ
我是一名优秀的程序员,十分优秀!