无论线条大小如何保持线型间距恒定

2023-11-21

当尺寸不同时,我一直尝试在 ggplot2 或网格中绘制线段之间具有相等间距的线。但是我没有成功,所以我请求你的帮助。

在下面的示例中,如何在线条尺寸不同的情况下保持线段之间的绝对间距相等?

我想避免定制makeContent.myclass我自己控制这个的方法。

library(ggplot2)
library(grid)

df <- data.frame(
  x = c(1:2, 1:2),
  y = c(1:2, 2:1),
  size = c(1,1,10,10)
)

# In ggplot2
ggplot(df, aes(x, y, size = size, group = size)) +
  geom_line(linetype = 2)

# In grid
lines <- polylineGrob(
  x = scales::rescale(df$x), 
  y = scales::rescale(df$y), 
  id = c(1,1,2,2),
  gp = gpar(lty = 2, lwd = c(1, 10))
)

grid.newpage(); grid.draw(lines)

我想要一些类似于下面用插画制作的东西。请注意,红线段的长度相等。

enter image description here

有任何想法吗?谢谢阅读!


这可能不是您要寻找的 Teunbrand,但我想您可以将线条转换为一系列沿线条均匀分布的细多边形。

该函数采用一系列 x 和 y 坐标并返回一条虚线(作为单个 treeGrob)。根据您的示例,它以标准化的 npc 坐标返回它。您可以完全控制线宽、虚线长度和中断长度(尽管不是图案)以及颜色。恐怕这些单位有点随意,这与生产标准相去甚远,但它相当有效:

segmentify <- function(x, y, linewidth = 1, dash_len = 1, 
                       break_len = 1, col = "black")
{
  
  linewidth <- 0.002 * linewidth
  dash_len  <- 0.01  * dash_len
  break_len <- 0.04  * break_len

  if(length(y) != length(x)) 
    stop("x and y must be the same length")
  if(!is.numeric(x) | !is.numeric(y))
    stop("x and y must be numeric vectors")
  if(length(x) < 2)
    stop("Insufficient x, y pairs to make line.")
  
  x <- scales::rescale(x)
  y <- scales::rescale(y)
  
  n_dashes <- 0
  skip_len <- break_len + dash_len
  
   df <- list()
  for(i in seq_along(x)[-1])
  {
    x_diff          <- x[i] - x[i - 1]
    y_diff          <- y[i] - y[i - 1]
    seg_len         <- sqrt(x_diff^2 + y_diff^2)
    seg_prop        <- skip_len / seg_len
    dist_from_start <- n_dashes * skip_len
    prop_start      <- dist_from_start/seg_len
    x_start         <- x[i-1] + prop_start * x_diff
    y_len           <- y_diff * seg_prop
    x_len           <- x_diff * seg_prop
    y_start         <- y[i-1] + prop_start * y_diff
    n_breaks        <- (seg_len - dist_from_start)/skip_len
    n_dashes        <- (n_dashes + n_breaks) %% 1
    n_breaks        <- floor(n_breaks)
    
    if(n_breaks)
    {
       df[[length( df) + 1]] <- data.frame(
        x = seq(x_start, x[i], by = x_len),
        y = seq(y_start, y[i], by = y_len)
        )
       df[[length( df)]]$theta <-
        atan(rep(y_diff/x_diff, length( df[[length( df)]]$x)))
    }
  }
  
   df <- do.call(rbind,  df)
   df$x1 <-  df$x + sin( df$theta) * linewidth + cos(df$theta) * dash_len
   df$x2 <-  df$x + sin( df$theta) * linewidth - cos(df$theta) * dash_len
   df$x3 <-  df$x - sin( df$theta) * linewidth - cos(df$theta) * dash_len
   df$x4 <-  df$x - sin( df$theta) * linewidth + cos(df$theta) * dash_len
   
   df$y1 <-  df$y - cos( df$theta) * linewidth + sin(df$theta) * dash_len
   df$y2 <-  df$y - cos( df$theta) * linewidth - sin(df$theta) * dash_len
   df$y3 <-  df$y + cos( df$theta) * linewidth - sin(df$theta) * dash_len
   df$y4 <-  df$y + cos( df$theta) * linewidth + sin(df$theta) * dash_len
  
   do.call(grid::grobTree, lapply(seq(nrow(df)), function(i) {
    grid::polygonGrob(c(df$x1[i], df$x2[i], df$x3[i], df$x4[i]), 
                      c(df$y1[i], df$y2[i], df$y3[i], df$y4[i]),
              gp = gpar(col = "#00000000", lwd = 0, fill = col))
   }))

}

使用起来相当简单:

set.seed(2)

x <- 1:10
y <- rnorm(10)

grid::grid.newpage()
grid::grid.draw(segmentify(x, y))

enter image description here

而改变线宽而不影响间距就像这样:

grid::grid.newpage()
grid::grid.draw(segmentify(x, y, linewidth = 3))

enter image description here

您可以像这样控制间距和颜色:

grid::grid.newpage()
grid::grid.draw(segmentify(x, y, linewidth = 2, break_len = 0.5, col = "forestgreen"))

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无论线条大小如何保持线型间距恒定 的相关文章

  • dplyr:带引号变量名的 mutate 的标准评估

    我将如何使用mutate 我的假设是我正在寻找标准评价就我而言 因此mutate 但我对此并不完全有信心 当使用接受变量名列表的函数时 如下所示 createSum function data variableNames data gt m
  • R 带有列和行的分面 qqplots

    我需要使用按行和列的构面创建 qqplot 我了解如何用列和行绘制分面图 但我不确定如何设置我的数据 最终 我想按列和行对数据集进行分组 然后按升序对 建模 结果和 观察到 结果进行排序 同时添加带有 行 组的列和带有 列 组的列 我一直在
  • 更新两组单选按钮 - 闪亮

    我问了这个问题 反应式更新两组单选按钮 闪亮 https stackoverflow com questions 35040579 update two sets of radiobuttons reactively shiny 昨天 但也
  • 如何在R中将英尺转换为厘米?

    我得到了一个高度的字符向量 如下所示 859 5 10 5 8 5 11 6 0 5 10 6 2 5 11 6 2 6 2 5 7 5 9 5 7 6 1 6 0 5 11 6 0 6 5 6 1 6 1 5 10 5 11 5 11 6
  • R - 通过合并和超过 2 个后缀进行减少(或者:如何合并多个数据帧并跟踪列)

    我正在尝试基于 2 列合并 4 个数据帧 但要跟踪列源自哪个数据帧 我在跟踪列时遇到问题 参见 dput dfs 帖子末尾 df example df1 Name Color Freq banana yellow 3 apple red 1
  • R中使用余弦距离的层次聚类

    我想通过使用余弦相似度与 R 编程语言对文档语料库进行层次聚类 但出现以下错误 if is na n n gt 65536L stop 大小不能为 NA 或 超过 65536 需要 TRUE FALSE 时缺少值 我应该怎么办 为了重现它
  • R:(中缀)运算符的两个定义之间的冲突:如何指定包?

    在 R 中 每当两个包定义相同的函数时 很容易指定要使用哪个包pkg foo 但是 当冲突的功能是一个时 你该怎么办 infix运算符 即使用定义 举个例子 两者ggplot2 and crayon define 有没有一种方法可以让我默认
  • XLConnect 无法确定 JAVA_HOME 错误

    感谢您的帮助 我正在尝试运行 XLconnect 但收到此错误消息 gt library XLConnect lib loc C Users 1144143929 Documents R win library 2 15 Error onL
  • 跨类别和列自动化卡方

    我有一个调查数据框 其中包含几个问题 列 编码为 1 同意 0 不同意 受访者 行 根据 年龄 年轻 中年 老年 地区 东 中 西 等指标进行分类 大约有30个类别总共 3个年龄 3个地区 2个性别 11个职业等 在每个指标中 类别不重叠且
  • 如何通过组度量的平均值在 df 内排列 dplyr:: 组?

    借鉴吴卡拉的设计https stackoverflow com a 26555424 9350837 https stackoverflow com a 26555424 9350837答案 我希望根据各个组汇总测量的平均值对分组 df 进
  • 在ggplot2中,箱线图线的末尾代表什么?

    我找不到箱线图线条端点代表什么的描述 For example here are point values above and below where the lines end 我意识到盒子的顶部和底部是第 25 个和第 75 个百分位数
  • 如何在R中创建for循环? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 R 编程中启动 for 循环 https stackoverflow com questions 4162363 how to start a for loop in r programmin
  • 使用 R Markdown 文档作为函数源

    我正在研究 R Markdown 来记录我经常使用的功能 我会将它们放入 R Markdown 文件中以记录它们 然后如果我几个月后回来查看它 就能够阅读我在函数背后的想法 我的问题是 如果我开始一个新的 R 项目 是否可以获取 r mar
  • 如何不显示 ggplot 轴上的所有标签?

    I m trying to using ggplot2 to plot this But as you can see on the x axis you can t read anything 那么如何在 x 轴上显示每 10 年的值呢
  • 来自大型数据帧的共现

    我有一个数据框 其中包含有关每个用户访问过哪些城市的信息 df visited lt data frame user c john john claire claire doe doe city c Antananarivo Barcelo
  • 如何创建 highcharter 事件函数以在 Shiny R 中创建“下拉函数”

    我正在建造一个shiny应用程序 我想要完成的事情之一是创建一个下拉菜单 我想将劳动力变量绘制为不同级别的年份变量的函数 请参阅下面的示例数据框 year level 2 level 3 labour 1 2013 10 101 1 2 2
  • R 3.5 - read.csv 无法读取 UTF-16 csv 文件

    我的代码如下 read csv http asic gov au Reports YTD 2018 RR20180420 001 SSDailyYTD csv skip 1 fileEncoding UTF 16 sep t header
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • ggplot 按因子和梯度颜色

    我正在尝试绘制一个对两个变量 一个因子和一个强度 进行着色的图 我希望每个因素都是不同的颜色 并且我希望强度是白色和该颜色之间的渐变 到目前为止 我已经使用了诸如对因子进行分面等技术 将颜色设置为两个变量之间的相互作用 并将颜色设置为因子并
  • SparkR 和 Sparklyr 之间导入 parquet 文件所需的时间差异

    我正在使用 databricks 导入镶木地板文件SparkR and sparklyr data1 SparkR read df dbfs data202007 source parquet header TRUE inferSchema

随机推荐

  • SQLAlchemy 可以自动从数据库模式创建关系吗?

    从带有外键的现有 SQLite 数据库开始 SQLAlchemy 可以自动构建关系 SQLAlchemy 类是通过自动创建的 table args autoload True 目标是轻松访问相关表中的数据 而无需手动一一添加所有关系 即不使
  • 为什么此代码会导致 Excel 无法正常关闭?

    为什么这行代码会导致Excel无法退出 Excel Range range Excel Range ws Cells 1 1 如果是因为转换的原因 那么这段代码不会导致同样的问题吗 Excel Worksheet ws Excel Work
  • 使用 LINQ 的多个或单个存储库

    我一直在阅读 Professional ASP NET MVC 1 0 书中的第 11 章 可测试设计模式 在本章的示例中 数据访问被分为多个存储库 IOrderRepository IProductRepository 等 这一切都有意义
  • 谷歌地理编码停止为乌克兰克里米亚工作

    我发现了一个非常奇怪的问题 地理编码 API 突然停止支持克里米亚坐标 示例 辛菲罗波尔市 但它适用于乌克兰和俄罗斯的任何其他地方 示例 乌克兰基辅 最近API运行正常 请教一下 是不是因为乌克兰的政治事件而对谷歌进行了限制 该服务是否应该
  • 如何在 Vue Router v4 中为自定义元字段声明 TypeScript 类型接口?

    With Vue 路由器版本 4 目前是在 vue router next repo 的 beta 11 中 有一个文档页 about 如何使用 TypeScript 定义元字段自定义类型接口 declare module vue rout
  • 如何比较 C 中的多字节字符

    我尝试解析文本并在其中找到一些字符 我使用下面的代码 它适用于普通字符 例如abcdef但它不适用于 GCC 给出编译警告 我应该做什么来工作 Code include
  • HTTP 与 Websockets 的开销对比

    我正在两端使用 node js 构建一个文件同步程序 与 Dropbox 不同 我需要有潜在的数千个客户端同时请求数据 这是我当前的系统 服务器通过 websocket 向客户端推送通知 文件已更新 客户端对下载进行排队并在空闲时发出 HT
  • 回形针和 xhr.sendAsBinary

    我使用回形针将文件添加到我的模型中 我想使用firefox 3 6的新功能 xhr sendAsBinary 通过 ajax 请求发送文件 以下是我如何构建我的请求 var xhr new XMLHttpRequest xhr open P
  • JWT 中的复杂声明

    The JWT RFC包含复杂数组似乎没有任何问题 例如 email email protected businesses businessId 1 businessName One roles admin accountant busin
  • 将 swift 可变参数公开给 Objective-C

    我目前正在开发一个快速动态框架 它将用于 Objective C 应用程序 我创建了这个方法 签名 public init buttons ActionButton code 然而 这个方法永远无法从使用该框架的 Objective C 应
  • 如何检查 Java 代码的汇编输出?

    我发现这个问题可以回答 C 的问题 如何从 gcc 中的 C C 源代码获取汇编程序输出 Java uses both bytecode and assembly language machine code It s a two step
  • 将参数从刚刚单击的 添加到 URL

    该场景是很多 html 文件 它们之间有很多链接 当我调用其中第一个 它将是索引 时 链接通过 URL 传递几个参数 我们可以将它们称为首选项 现在我希望 当单击页面的几个链接中的任何一个时 将添加这些参数 所以这个问题与其他问题类似 如何
  • 将 XML 映射到 Java 中的对象

    假设我有一个名为Test 像这样 public class Test private String testId private String description private String department public Tes
  • Facebook Messenger 应用程序链接 [iOS]

    我正在创建一个 iOS 应用程序 我想在其中集成 Facebook Messenger 以便用户互相发送消息 我尝试过通过 fb messenger user thread user id 进行深度链接 它按预期工作 当我通过应用程序打开
  • Android-广播接收器和意图过滤器

    我是 android 平台的新手 请帮助我了解广播接收器和意图过滤器在 android 中的行为方式 请用简单的行或示例进行解释 提前致谢 广播接收器是 Android 项目中的一个类 负责接收其他活动通过使用发送的所有意图android
  • #define 指令中的 Inno Setup 字符串连接

    Inno Setup 网站是否未能记录 define指令还是我在某个地方错过了 是否允许使用已定义的字符串进行定义并将它们连接起来 define MyApp ABC define MyAppVersion 1 2 1 define MyFo
  • PHP / SQLite - 将表从磁盘复制到内存

    我的硬盘上有一个 sqlite3 数据库 file db 有 5 个表 我想将其中 3 个表复制到内存数据库 memory 有没有一种简单的方法可以使用 PHP5 的 PDO 格式来做到这一点 不是特定于 pdo 的解决方案 对于您的情况可
  • Windows 是否有集成的内置 C/C++ 编译器包?

    我希望能够在 Windows 环境下编译 C 和 C 代码 而无需使用 IDE 只需使用 Windows 命令提示符 cmd exe 即可 我来自 Linux 您可以在其中安装gcc只需在终端中使用命令即可打包 sudo apt insta
  • 如何禁用动态频率缩放?

    我想做一些微基准测试 并尝试做正确的事情 不幸的是 动态频率缩放使得基准测试非常不可靠 有没有办法以编程方式 C Windows 查明是否启用了动态频率缩放 如果 可以在程序中禁用它吗 我尝试在实际基准测试发生之前使用 100 CPU 的预
  • 无论线条大小如何保持线型间距恒定

    当尺寸不同时 我一直尝试在 ggplot2 或网格中绘制线段之间具有相等间距的线 但是我没有成功 所以我请求你的帮助 在下面的示例中 如何在线条尺寸不同的情况下保持线段之间的绝对间距相等 我想避免定制makeContent myclass我