具有复杂形状的 ggplot 和 grid.picture 之间的区别

2023-12-14

我希望获得单个字母的 x/y 坐标并用 ggplot 绘制它们。

我在用grImport::PostScriptTrace从 Postscript 文件获取 XML 文件。从那里,我从 Picture 类的 S4 对象中提取 x、y 坐标。

绘制字母grid.picture效果很好:

enter image description here

使用我的方法获取 x, y 坐标并使用 ggplot 效果不佳:

enter image description here

删除数据框的最后一行有一点帮助:

字母“g”的 XML 文件已打开Dropbox.

enter image description here

我该如何使用ggplot绘制没有错误行的字母?

这是代码。

# Difference between ggplot and grid.picture

library(grImport)
library(tidyverse)

letter_xml <- readRDS("letter_g")

# Plot letter with grid.picture
grid.picture(letter_xml)

####################################

# Extract coordinates from Picture object
x <- letter_xml@paths$text@letters[1]$path@x
y <- letter_xml@paths$text@letters[1]$path@y

one_letter <- tibble(
  x, 
  y,
  id = 1
)


ggplot(one_letter, aes(x = x, y = y)) + 
  geom_polygon()

# Remove last row 
one_letter <- one_letter[1:(nrow(one_letter) - 1),]

ggplot(one_letter, aes(x = x, y = y)) + 
  geom_polygon()

尝试这个:

x <- letter_xml@paths$text@letters[1]$path@x
y <- letter_xml@paths$text@letters[1]$path@y

one_letter <- tibble(
  x = x, 
  y = y,
  x.n = names(x)
  # id is not necessary here
)

library(ggpolypath)

one_letter %>%
  mutate(is.move = x.n == "move") %>%
  mutate(section.id = cumsum(is.move)) %>%

  group_by(section.id) %>%
  mutate(section.length = n()) %>%
  ungroup() %>%
  filter(section.length >= 3) %>%

  ggplot(aes(x = x, y = y, group = section.id)) +
  geom_polypath()

result

解释:

当我检查letter_xml@paths$text@letters[1]$path,我注意到x / y是相同的命名向量,其形式为c("move", "line", ..., "line", "move", "line", ..., "line", "move").

> all.equal(names(x), names(y))
[1] TRUE

> table(names(x))    
line move 
 169    4 

考虑到我们正在使用的字母形状,我怀疑每个新的"move"可以指示新段的开始。例如。第一段对应于轮廓,第二段对应于孔,依此类推。

我通过绘制位置序列来测试这个理论(row.id),并为每个新的颜色更改"move":

one_letter %>%
  mutate(row.id = seq(1, n())) %>%               # sequence of x/y coordinates
  mutate(is.move = x.n == "move") %>%            # TRUE for every new "move", FALSE o/w
  mutate(section.id = cumsum(is.move)) %>%       # increments by 1 for every new "move"
  ggplot(aes(x = x, y = y, group = section.id, 
             fill = factor(section.id))) +
  geom_label(aes(label = row.id)) +
  scale_fill_brewer(palette = "Set1")

intermediate plot

如上图所示,线段 2 和 3 确实对应于线段 1 绘制的多边形中的孔。我不确定线段 4(仅包含一个点)发生了什么,但似乎并非如此无论如何都会出现在所需的图片中。我们可以在管道操作中添加一个过滤器,仅保留至少具有 3 个点的线段(2 个点或更少的点不能形成多边形)。

geom_polygon 不能很好地处理带孔的多边形,但是ggpolypath包(可在CRAN)几乎是针对这个确切的用例量身定制的,并且可以很好地完成工作。

Data:

> dput(letter_xml)
new("Picture", paths = list(text = new("PictureText", string = c(string = "g"), 
    w = 54.5977, h = 100, bbox = c(292.688, 8032.13, 345.328, 
    8110.3), angle = 0, letters = list(path = new("PictureChar", 
        char = c(char = "g"), x = c(move = 317.422, line = 315.605, 
        line = 310.16, line = 304.367, line = 300.527, line = 299.141, 
        line = 299.141, line = 299.141, line = 299.797, line = 301.297, 
        line = 301.719, line = 300.805, line = 298.199, line = 295.684, 
        line = 294.172, line = 293.672, line = 293.672, line = 293.672, 
        line = 294.172, line = 295.684, line = 298.199, line = 300.805, 
        line = 301.719, line = 300.684, line = 297.75, line = 294.93, 
        line = 293.246, line = 292.688, line = 292.688, line = 292.688, 
        line = 294.367, line = 299.203, line = 306.891, line = 314.566, 
        line = 317.125, line = 319.695, line = 327.41, line = 335.234, 
        line = 340.207, line = 341.953, line = 341.953, line = 341.953, 
        line = 340.152, line = 334.797, line = 325.941, line = 316.715, 
        line = 313.641, line = 312.145, line = 307.656, line = 303.695, 
        line = 301.5, line = 300.828, line = 300.828, line = 300.828, 
        line = 301.121, line = 301.906, line = 303.047, line = 304.066, 
        line = 304.406, line = 305.078, line = 306.82, line = 307.094, 
        line = 308.059, line = 312.82, line = 317.008, line = 318.406, 
        line = 320.199, line = 325.586, line = 331.316, line = 335.109, 
        line = 336.484, line = 336.484, line = 336.484, line = 336.016, 
        line = 334.609, line = 332.25, line = 329.828, line = 328.938, 
        line = 328.953, line = 329.332, line = 330.355, line = 332.008, 
        line = 333.723, line = 334.297, line = 334.863, line = 336.563, 
        line = 338.102, line = 338.375, line = 338.004, line = 336.723, 
        line = 336.188, line = 336.188, line = 336.188, line = 336.516, 
        line = 337.395, line = 338.664, line = 339.793, line = 340.172, 
        line = 340.664, line = 342.148, line = 343.793, line = 344.91, 
        line = 345.328, line = 345.328, line = 345.328, line = 344.5, 
        line = 342.234, line = 338.832, line = 335.664, line = 334.609, 
        line = 333.41, line = 329.813, line = 326.332, line = 324.152, 
        line = 323.328, line = 323.281, line = 322.734, line = 318.75, 
        line = 317.422, line = 317.422, move = 317.719, line = 318.82, 
        line = 322.137, line = 325.664, line = 327.996, line = 328.844, 
        line = 328.844, line = 328.844, line = 328.023, line = 325.723, 
        line = 322.172, line = 318.75, line = 317.609, line = 316.52, 
        line = 313.258, line = 309.871, line = 307.672, line = 306.891, 
        line = 306.891, line = 306.891, line = 307.727, line = 310.031, 
        line = 313.469, line = 316.656, line = 317.719, line = 317.719, 
        move = 317.813, line = 319.559, line = 324.809, line = 330.023, 
        line = 333.281, line = 334.406, line = 334.406, line = 334.406, 
        line = 333.215, line = 329.797, line = 324.387, line = 319.008, 
        line = 317.219, line = 315.516, line = 310.41, line = 305.215, 
        line = 301.898, line = 300.734, line = 300.734, line = 300.734, 
        line = 301.906, line = 305.289, line = 310.66, line = 316.023, 
        line = 317.813, line = 317.813, move = 344.598), y = c(move = 8101.36, 
        line = 8101.36, line = 8100.18, line = 8096.9, line = 8091.93, 
        line = 8087.22, line = 8085.66, line = 8084.56, line = 8081.29, 
        line = 8078.09, line = 8077.52, line = 8077.23, line = 8075.97, 
        line = 8073.87, line = 8071.21, line = 8068.79, line = 8067.98, 
        line = 8067.23, line = 8064.98, line = 8062.39, line = 8060.21, 
        line = 8058.79, line = 8058.44, line = 8058.05, line = 8056.45, 
        line = 8053.89, line = 8050.75, line = 8047.95, line = 8047.02, 
        line = 8045.46, line = 8040.79, line = 8036.11, line = 8033.15, 
        line = 8032.13, line = 8032.13, line = 8032.13, line = 8033.22, 
        line = 8036.35, line = 8041.29, line = 8046.18, line = 8047.81, 
        line = 8049.44, line = 8054.32, line = 8059.05, line = 8061.93, 
        line = 8062.91, line = 8062.91, line = 8062.91, line = 8063.15, 
        line = 8063.99, line = 8065.55, line = 8067.38, line = 8067.98, 
        line = 8068.39, line = 8069.6, line = 8070.93, line = 8071.82, 
        line = 8072.16, line = 8072.16, line = 8072.16, line = 8071.58, 
        line = 8071.45, line = 8071.03, line = 8069.53, line = 8068.88, 
        line = 8068.88, line = 8068.88, line = 8070.09, line = 8073.45, 
        line = 8078.52, line = 8083.29, line = 8084.88, line = 8085.88, 
        line = 8088.91, line = 8092.53, line = 8095.71, line = 8097.88, 
        line = 8098.47, line = 8099.19, line = 8101.34, line = 8103.39, 
        line = 8104.62, line = 8105.03, line = 8105.03, line = 8105.03, 
        line = 8104.52, line = 8103.37, line = 8103.05, line = 8102.77, 
        line = 8101.41, line = 8100.18, line = 8099.77, line = 8099.41, 
        line = 8098.35, line = 8097.18, line = 8096.39, line = 8096.09, 
        line = 8096.09, line = 8096.09, line = 8096.54, line = 8097.78, 
        line = 8099.61, line = 8101.3, line = 8101.86, line = 8102.7, 
        line = 8105.23, line = 8107.9, line = 8109.66, line = 8110.3, 
        line = 8110.3, line = 8110.3, line = 8109.68, line = 8107.85, 
        line = 8104.8, line = 8101.63, line = 8100.56, line = 8100.69, 
        line = 8101.36, line = 8101.36, line = 8101.36, move = 8094.8, 
        line = 8094.8, line = 8094.05, line = 8092, line = 8088.89, 
        line = 8085.95, line = 8084.97, line = 8084.01, line = 8081.13, 
        line = 8078.12, line = 8076.14, line = 8075.44, line = 8075.44, 
        line = 8075.44, line = 8076.13, line = 8078.1, line = 8081.17, 
        line = 8084.17, line = 8085.17, line = 8086.12, line = 8088.97, 
        line = 8092.03, line = 8094.06, line = 8094.8, line = 8094.8, 
        line = 8094.8, move = 8056.27, line = 8056.27, line = 8055.66, 
        line = 8053.93, line = 8051.15, line = 8048.35, line = 8047.42, 
        line = 8046.52, line = 8043.83, line = 8041.07, line = 8039.3, 
        line = 8038.67, line = 8038.67, line = 8038.67, line = 8039.27, 
        line = 8041, line = 8043.75, line = 8046.5, line = 8047.42, 
        line = 8048.34, line = 8051.1, line = 8053.89, line = 8055.65, 
        line = 8056.27, line = 8056.27, line = 8056.27, move = 8050
        ), rgb = "#000000", lty = numeric(0), lwd = 10, lineend = 1, 
        linejoin = 1, linemitre = 10)), x = 290, y = 8050, rgb = "#000000", 
    lty = numeric(0), lwd = 10, lineend = numeric(0), linejoin = numeric(0), 
    linemitre = numeric(0))), summary = new("PictureSummary", 
    numPaths = 1, xscale = c(xmin = 290, xmax = 345.328), yscale = c(ymin = 8032.13, 
    ymax = 8110.3)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有复杂形状的 ggplot 和 grid.picture 之间的区别 的相关文章

  • 在 R 中,如何获得某些向量值的所有可能组合?

    背景 我有一个需要一些参数的函数 我想要获得所有可能的参数组合的函数结果 一个简化的例子 f lt function x y return paste x y sep colors c red green blue days c Monda
  • 安装 R 包。包含目录为空。开发标头

    我目前正在尝试运行一些最初在 2 11 0 下运行的 R 代码 我使用的 R 版本 2 14 1 无法运行该代码 我不熟悉 R 及其向后兼容性 据我所知 我的问题可能与版本无关 我会很高兴得知这是我做错的事情 其余的代码是无关紧要的 即使我
  • 尝试使用 movie3d 制作 3D PCA 图(rgl)的电影

    我已经使用 pca3d 包在 R 中制作了 rgl 3D PCA 图 并且我正在尝试使用 movie3d 制作一个包含旋转图电影的 gif 文件 pca3d 包 makeMoviePCA 中有一个函数 它将其参数传递给 movie3d 这是
  • 计算横截面积作为高度的函数

    我试图弄清楚如何计算不同水位的河流横截面的充满水的面积 对于横截面 我有 5 m 宽河流上每 25 cm 的深度 并且可以根据之前很好回答的问题来计算面积计算不同高度的横截面积 https stackoverflow com questio
  • if(interactive()) 是否相当于 Python 中的“if __name__ == ”__main__“: main()”?

    我希望 R 脚本有一个 main 函数 可以在交互模式下执行 但在获取文件时不应执行 main 函数 已经有一个关于这个的问题了 https stackoverflow com questions 2968220 is there an r
  • 计算网格中物种的出现次数

    我有大约500 000点R美国各地候鸟物种的出现数据 我试图在这些点上覆盖网格 然后计算每个网格中出现的次数 统计完计数后 我想将它们引用到网格单元 ID 在 R 中 我使用了over 函数只获取范围图中的点 这是一个形状文件 Read i
  • R:从 Github 安装包时出现编码问题

    我正在尝试安装dcStockR https github com yutannihilation dcStockR来自 Github 的包 这是一个htmlwidgets http www htmlwidgets org 周围的包装纸dc
  • 使用多边形图层下方的轮廓线切割多边形

    我想根据高程将多边形图层切割成两部分 上部和下部 多边形可能是凸的或凹的 并且切割的位置可能彼此不同 等高线的间隔为 5m 这意味着我可能需要生成一个具有更紧凑的等高线的等高线 例如 1m 的间隔 关于如何做到这一点的任何想法 在 ArcG
  • 如果 RCurl::getURL() 执行时间太长,如何停止执行?

    有没有办法告诉 R 或 RCurl 包在超过指定时间段时放弃尝试下载网页并转到下一行代码 例如 gt library RCurl gt u http photos prnewswire com prnh 20110713 NY34814 b
  • R 监督潜在狄利克雷分配包

    我在用着这个LDA包 https cran r project org web packages lda 对于 R 具体来说 我正在尝试做监督潜在狄利克雷分配 slda https www cs princeton edu blei pap
  • 将多个函数应用于一个向量

    我正在寻找一种将多个函数应用于一个向量的选项 我认为这对于逆应用函数来说是一种仁慈 其中一个函数应用于许多向量 或列 有没有办法指定两个或多个函数 例如 min 和 max 并将其应用于向量 与 CathG的评论类似 但没有get v lt
  • R闪亮:基于checkboxgroupinput的子集数据

    我想根据复选框输入动态选择的列对数据进行子集 有什么方法可以使我的输入文件在我的代码中全局可用 以便可以方便地进行进一步的操作 以下是我的代码 Server R library shiny shinyServer function inpu
  • 如何修改反应链以便最后修改的对象控制其他链接的对象?

    新注释 1 最终解决的代码发布在最底部 反映了 ismirsehregal 于 2021 年 12 月 3 日的解决方案 以及一些标记为 ADDED 和 MODIFIED 的小调整 ADD 是为了解决我在矩阵 2 添加值后从矩阵 1 中删除
  • Dplyr 过滤多个类似条件

    我正在尝试在 dplyr 中做一个过滤器 其中的列就像某些观察结果 我可以使用 sqldf 作为 Test lt sqldf select from database Where SOURCE LIKE ALPHA OR SOURCE LI
  • 省略 RColorBrewer 调色板上较亮的颜色以在 ggplot2 中使用

    我想在 RColorBrewer 的 Oranges 调色板中使用较深的颜色 以便在我的 ggplot 条形图 中使用 然而我却做不到 帮助 下面是示例代码 my palette brewer pal n 9 Oranges 4 9 Bar
  • ggplot2以限制为中心的多边形世界地图给出了有趣的边缘

    使用下面的代码我生成了一张以华盛顿特区为中心的地图 解决方案基于科斯克的解决方案在这里 https stackoverflow com questions 10620862 use different center than the pri
  • “条件长度 > 1 并且仅使用第一个元素”错误

    我对 f 语句有疑问 因为它返回给我以下错误消息 条件长度 gt 1 并且仅使用第一个元素 我有一个名为 data summary 的数据框 我想创建两个新变量vol up and vol down取决于我的数据框的其他变量 这是我的脚本代
  • 如何在复杂的皂膜GAM中设置更平滑的边界条件?

    我正在对南太平洋岛屿泻湖中宽吻海豚的分布进行建模 我想使用肥皂膜平滑器来模拟海豚在二维表面 经度 x 纬度 上存在的概率 考虑到陆地边界 显然海豚不能在陆地上行走 我想知道如何将我的研究区域 陆地和近海水域 的边界固定为等于零的条件 因为我
  • 当我添加形状时,分组哑铃图变得不稳定

    我有以下数据显示白人与黑人在各个领域的一致性百分比 我想创建一个分组哑铃图 其中国家值和州值彼此相邻 以便于比较 Domain c A B C D E F G A B C D E F G A B C D E F G A B C D E F
  • 二部图匹配以匹配两个集合

    我是新手igraphR 中的包 我有两套A and B 每个都有N顶点 A1 A2 AN and B1 B2 BN 每个元素之间都有一个边缘A对每一个元素B 我有一个函数fWgt Ai Bj 返回之间的边的权重Ai and Bj 我一直在尝

随机推荐