通过交互和指南修改 ggplot2 中的图例

2023-12-23

df <- data.frame(Depth = c(1, 2, 3, 4, 5, 6, 7, 8), 
                 Var1 = as.factor(c(rep("A", 4), rep("B", 4))),
                 Var2 = as.factor(c(rep(c("C", "D"), 4))),
                 Value = runif(8))


g <- ggplot(df, aes(Depth, Value, col = Var1, shape = Var2, lty = Var2))+
  geom_path(aes(group = interaction(Var1, Var2)), size = 0.5) +
  geom_point(aes(group = interaction(Var1, Var2)), size = 1)+
  scale_shape_manual(values = c(16, 5))+
  ylab("Depth [cmbsf]")

g + guides(colour = guide_legend(override.aes = list(shape = 15, size = 4, linetype = 0)),
           shape = guide_legend(override.aes = list(size = 4)))

我想修改图例Var2。我只想增加形状的大小,而不是线条的大小。不幸的是,size形状指南中的参数也适用于线型。

如果我添加另一个线型指南:

g + guides(colour = guide_legend(override.aes = list(shape = 15, size = 4, linetype = 0)),
           shape = guide_legend(override.aes = list(size = 4)),         
           lty = guide_legend(override.aes = list(size=1)))

I get:

Warning message:
In guide_merge.legend(init, x[[i]]) : Duplicated override.aes is ignored.

如何解开用于图例的参考线?


可能有点矫枉过正,但我​​们可以创造一个替代方案geom_path()图例密钥大小硬编码为 0.5:

ggplot(df, aes(Depth, Value, col = Var1, shape = Var2, lty = Var2)) +
  geom_path2(aes(group = interaction(Var1, Var2)), size = 0.5) +
  geom_point(aes(group = interaction(Var1, Var2)), size = 1) +
  scale_shape_manual(values = c(16, 5)) +
  ylab("Depth [cmbsf]") +
  guides(colour = guide_legend(override.aes = list(shape = 15, size = 4, linetype = 0)),
         shape = guide_legend(override.aes = list(size = 4)))

所需代码geom_path2():

library(grid)

# Create new ggproto object that inherits from GeomPath, 
# except for its draw_key function
GeomPath2 <- ggproto("GeomPath2",
                     GeomPath,
                     draw_key = function (data, params, size) {
                       data$linetype[is.na(data$linetype)] <- 0
                       segmentsGrob(0.1, 0.5, 0.9, 0.5, 
                                    gp = gpar(col = alpha(data$colour, data$alpha), 
                                              lwd = 0.5 * .pt, # originally lwd = data$size * .pt
                                              lty = data$linetype, 
                                              lineend = "butt"), 
                                    arrow = params$arrow)
                     })

# define geom_path2 to be exactly the same as geom_path, except that
# it uses Geom = GeomPath2 instead of Geom = GeomPath
geom_path2 <- function (mapping = NULL, data = NULL, stat = "identity", position = "identity", 
                        ..., lineend = "butt", linejoin = "round", linemitre = 10, 
                        arrow = NULL, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) {
  layer(data = data, mapping = mapping, stat = stat, 
        geom = GeomPath2, # originally GeomPath
        position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
        params = list(lineend = lineend, linejoin = linejoin, 
                      linemitre = linemitre, arrow = arrow, na.rm = na.rm, 
                      ...))
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过交互和指南修改 ggplot2 中的图例 的相关文章

  • 如何在 R 中的另一个函数中使用 `sink` 函数?

    我有一个函数fun依赖于外部函数external 即来自某个包 我如何收集来自的所有警告external在字符向量中 这是一个最小的设置 External function from another package external lt
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 使用 R 从字符串中提取函数参数

    最好使用stringr包 我想创建一个函数extract 以字符串向量作为参数 vec lt c div span icon hospital user i18n t Enrolments or i18n t Paper a string
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • 在 R Shiny 中,如何使用可排序 js 将其在列表中出现的顺序次数附加到每个列表元素?

    下面的可重现代码适用于将元素从一个面板拖动到另一个面板 并在 拖动到 面板中自动使用 HTML CSS 对拖入的每个元素进行排名顺序编号 但是 我现在尝试附加到每个 拖动到 列表元素的末尾 使用某种形式的paste0 我假设 该元素在 拖至
  • 编写健壮的 R 代码:命名空间、屏蔽和使用 `::` 运算符

    简洁版本 对于那些不想阅读我的 案例 的人来说 这就是本质 最小化新包破坏现有代码 即编写您编写的代码 的机会的推荐方法是什么尽可能坚固 充分利用该功能的推荐方法是什么 命名空间机制 when a just using贡献的软件包 比如在一
  • Shiny可以识别用鼠标选择的文本(突出显示的文本)吗?

    我需要用户将文本片段分配给 Shiny 中的类别或 代码 基本上 我希望用户突出显示输出中的文本 在下面的示例中 来自table or text输出 然后按一个按钮 code 并将选定的文本分配给应用程序内的对象 在下面的应用程序中 所选文
  • 将 read.csv 与符号链接文件一起使用

    我正在尝试做什么 我的源文件非常大 我想避免将其复制到其他文件夹中 我决定创建一个指向大文件的符号链接并想使用read csv读取文件 文件夹结构 项目1 数据 源文件 csv 项目2 数据 别名到源文件 csv 什么地方出了错 读取源文件
  • warnings() 在函数内不起作用?如何解决这个问题?

    op lt options warn 0 although doesn t work for any value of warn assign last warning NULL envir baseenv thisDoesntWork l
  • 使用管道语法处理模型列表

    我经常喜欢拟合和检查与 R 数据框中的两个变量相关的多个模型 我可以使用如下语法来做到这一点 require tidyverse require broom models lt list hp exp cyl hp cyl map df m
  • R:编写抛硬币的随机采样程序

    假设我们有以下情况 有一枚硬币 如果它正面朝上 那么下一次抛掷正面的概率是 0 6 如果是反面 那么下一次抛掷反面的概率也是 0 6 一个班有100名学生 每个学生随机抛掷硬币几次 Student n 的最后一次抛硬币不会影响 Studen
  • 使用滑动窗口动画 ggplot 时间序列图

    我正在寻找在不失去分辨率的情况下对长时间序列图进行动画处理的方法 我希望视图能够 平移 数据 显示从开始到结束的滑动子集 假设我有以下内容 library ggplot2 library dplyr library gganimate df
  • R texreg:如何选择要显示的 gof 统计信息?

    我正在使用 texreg 通过 plm 生成面板回归的输出表 我想抑制所有 gof 统计数据的输出 这不是显示 R2 adj R2 和 N 我只想显示 adj R2 有谁知道一个简单的方法来做到这一点 好吧 这实际上很简单 只需在调用中包含
  • 如何从R中的日期中提取月份

    我正在使用lubridate封装并应用month从日期中提取月份的函数 我在日期字段上运行了 str 命令 得到了 Factor w 9498 levels 01 01 1979 01 01 1980 5305 1 1 1 1 1 1 1
  • ggplot 图例标签内的希腊字母、符号和换行符

    我在尝试着 有换行符 自动或强制 对齐文本 左对齐或左右对齐 有希腊字母和百分号 在 gglot 图例标签内 我尝试了几种方法 但我似乎无法将我读到的所有技巧结合起来 我可以通过插入来换行 n进入标签 但这似乎不适用于希腊字母 不适用于图例
  • 如何有效地将多个光栅 (.tif) 文件导入 R

    我是 R 新手 尤其是在空间数据方面 我正在尝试找到一种方法来有效地将多个 600 单波段栅格 tif 文件导入到 R 中 所有文件都存储在同一文件夹中 不确定这是否重要 但请注意 在我的 Mac 和 Windows 并行 VM 上的文件夹
  • R data.table 连接不等式条件

    我想使用 data table 包根据多个不等式条件对数据进行子集化 data table 手册中的示例展示了如何使用字符变量执行此操作 但不显示数字不等式 我还了解了如何使用子集函数来执行此操作 但我真的很想利用 data table 二
  • 将所有分号替换为空格 pt2

    我尝试对 2000 多行关键字的列表运行文本分析 但它们的列出方式如下 战略 管理风格 组织 所以当我使用 tm 删除标点符号时 它就变成了 组织的战略管理风格 我认为这在某种程度上破坏了我常用术语的分析 我尝试过使用 vector lt

随机推荐

  • 如何在 Kotlin 中获取具体化泛型参数的实际类型参数?

    Using 具体化类型参数 https kotlinlang org docs reference inline functions html reified type parameters 可以编写一个内联函数 在运行时通过反射来处理类型
  • java中正十进制值和负十进制值的正则表达式

    负十进制值和正十进制值的正则表达式 以便可以 使用模式和匹配器与字符串匹配以获得正确的实现 谁能给我提供一下吗 0 9 0 9
  • RMI 连接在本地主机上被拒绝

    我正在尝试学习 RMI 编码 当我运行 RMI 的服务器端时 连接被拒绝 这是我的服务器主要方法 public static void main String args throws Exception Implementation imp
  • 如何绑定到 SwiftUI 中可选的数据

    我很好奇 我们如何指定对属于可选部分的状态数据的绑定 例如 struct NameRecord var name var isFunny false class AppData ObservableObject Published var
  • 使用 SSZipArchive 解压缩文件 - Swift

    我正在尝试使用 SSZipArchive 框架解压缩文件 let unzipper SSZipArchive unzipFileAtPath String document toDestination String documentsUrl
  • PyQt 打印原始 PDF

    假设我有一个test pdf文件在当前目录中 我想使用以下命令将此原始文件发送到打印机PyQt 图形用户界面打印机 下面的Python3代码打印PDF源代码 我不希望 Qt 为我构建 PDF 而只是使用 gui 对话框将其发送到打印机 这应
  • NVidia CUDA 工具包 7.5.27 无法在 OS X 上安装

    下载 CUDA 工具包 DMG 可以工作 但安装程序在选择软件包后失败 并出现神秘的 软件包清单解析错误 错误 使用内部二进制文件从命令行运行安装程序也会以类似的方式失败 var log cuda installer log 处的日志文件基
  • JavaScript 数组问题

    好的 我只是回顾一下 JavaScript 中的一些基本编程原则 我是编程新手 所以请耐心等待 下面是我遇到问题的代码 特别注意数组的字符串组件 var name new Array var sales new Array var tota
  • 如何突出显示列中非空白的重复项?

    我想突出显示 I 列中连接字符串的所有重复项 并在突出显示任何重复项时提供错误消息 但是 该列中有几个空白单元格 我不希望在运行宏时这些单元格显示为重复项 我从这里得到了这个代码 Sub HighlightDuplicateValues D
  • 没有编译器优化的 SSE 内在函数

    我是 SSE 内在函数的新手 并尝试通过它来优化我的代码 这是我的程序 用于计算等于给定值的数组元素 我将代码更改为 SSE 版本 但速度几乎没有改变 我想知道我是否以错误的方式使用SSE 此代码用于不允许我们启用编译器优化选项的分配 无
  • 当从 C# 程序中反序列化 JSON 时,我是否需要使用 JavaScriptSerializer 以外的任何东西?

    NET 中提供了 JavaScriptSerializer 类 System Web Script Serialization 命名空间 在 System Web Extensions dll 中提供 它最初旨在支持 AJAX Web 服务
  • 如何使用通配符设置docker的NO_PROXY

    正如 docker 官方文档中提到的here https docs docker com config daemon systemd configure where the docker daemon listens for connect
  • flatMap API 合约如何将可选输入转换为非可选结果?

    这是 Swift 3 0 2 中 flatMap 的合约 public struct Array
  • 从 Unity 中的 Android Studio 读取意图

    我有一个 Unity 游戏导出到 Android Studio 中 我有一个已保存游戏的列表 其中存储了玩家玩的每个游戏的最后一个场景 基本上存储玩家的进度 从 Unity 到 Android Studio 播放的最后一个场景的编写效果非常
  • Delphi 应用程序的插件系统 - bpl 与 dll?

    我正在编写delphi应用程序 它应该具有加载插件的能力 我使用 JvPluginManager 作为插件系统 管理器 现在 在新的插件向导中 他们说最好使用 bpl 类型插件而不是 dll 插件 这个解决方案与 dll 类型插件相比有什么
  • 增量求解有什么好处?

    如果 pop 完全破坏了上下文 即学到的引理 增量约束求解使用 堆栈 的目的是什么 模式 理由 我想如果我只有 1 个约束 几个 合词 最好进行单个查询 而不是 将单独帧中的合取词堆叠到堆栈上 如果我 有超过 1 个约束并决定使用增量求解
  • 如何使用 Gekko 加快优化速度?

    我的计划是优化家用电池的充电和放电 以最大限度地降低年底的电力成本 每15分钟测量一次家庭用电量 所以我在1天内有96个测量点 我想优化电池 2 天的充电和放电 以便第 1 天考虑到第 2 天的使用情况 我编写了以下代码并且它有效 from
  • new 类名(). 方法名(); VS className ref = new className();

    我遇到了我的同事在一个内部使用的代码eventListner 即 private void someActionPerformed java awt event ActionEvent evt new className methodNam
  • makefile“没有规则来创建目标”错误

    我已经研究这个问题有一段时间了 但仍然不知道出了什么问题 我的 makefile 如下所示 F90 pgf90 NETCDF DIR opt netcdf LBS L NETCDF DIR lib lnetcdff lnetcdf INCL
  • 通过交互和指南修改 ggplot2 中的图例

    df lt data frame Depth c 1 2 3 4 5 6 7 8 Var1 as factor c rep A 4 rep B 4 Var2 as factor c rep c C D 4 Value runif 8 g l