如何在一个ggplot中拥有两个不同大小的图例?

2023-11-30

想象一下我绘制这个玩具数据:

lev <- c("A", "B", "C", "D")

nodes <- data.frame(ord=c(1,1,1,2,2,3,3,4), brand=
  factor(c("A", "B", "C","B", "C","D", "B","D"), levels=lev), 
  thick=c(16,9,9,16,4,1,4,1))

edge <-  data.frame(ord1=c(1,1,2,3), brand1=factor(c("C","A","B","B"), 
  levels=lev),ord2=c(2,2,3,4), brand2=c("C","B","B","D"),
  N1=c(2,1,2,1), N2=c(5,5,2,1))

ggplot() +
  geom_point(data = nodes,
    aes(x = ord, y = brand, size = sqrt(thick)),
    color = "black", shape = 16, show.legend = T) + 
  scale_x_continuous(limits=c(1, 4), breaks=seq(0,4,1),
    minor_breaks = NULL) + 
  geom_segment(data = edge,
    aes(x = ord1, y = brand1, xend = ord2, yend = brand2), 
    color = "blue", size = edge$N2/edge$N1) +
  ylim(lev) +
  theme_bw()

I get this plot, as expected. enter image description here

我想添加另一个与线段宽度和 N2/N1 有关的图例(在节点下方)。

PD: 根据您的一些建议...

ggplot() + 
  geom_segment(data = edge,
    aes(x = ord1, y = brand1, xend = ord2, yend = brand2, size = N2/N1), 
    color = "blue", show.legend = T) +
  geom_point(data = nodes,
    aes(x = ord, y = brand, size = thick),
    color = "black", shape = 16, show.legend = T) + 
  scale_x_continuous(limits = c(1, 4), breaks = 0:4,
    minor_breaks = NULL) +
  scale_size_continuous(trans = "sqrt", breaks = c(1,4,9,16))  + 
  ylim(lev) +  theme_bw()

enter image description here

我得到了图例,但它与另一个重叠。

我可以尝试使用颜色而不是宽度:

ggplot()+ geom_segment(data=edge, aes(x=ord1, y=brand1, xend=ord2, yend=brand2, alpha=N2/N1) , size=1 ,show.legend = T) +
  geom_point(data=nodes,aes(x=ord, y=brand, size=thick), color="black", shape=16,show.legend = T) + 
  scale_x_continuous(limits=c(1, 4), breaks=seq(0,4,1), minor_breaks = NULL) + scale_size_continuous(trans = "sqrt", breaks=c(1,4,9,16))  + 
   ylim(lev) + theme_bw()

enter image description here

Or varying alpha enter image description here

尽管我更喜欢原始的宽度方法,因为在我的真实图中,我会有很多线交叉。

PD:任何带有点阵的解决方案或任何能够导出为 svg 或矢量 pdf 的替代方案?

PD2:我发现了另一个问题,细点没有正确缩放,有时不可能强制 ggplot 显示正确的图例:如何强制 ggplot 在图例上显示更多级别?


Using a highly我整理的实验包:

library(ggplot2) # >= 2.3.0
library(dplyr)
library(relayer) # install.github("clauswilke/relayer")

# make aesthetics aware size scale, also use better scaling
scale_size_c <- function(name = waiver(), breaks = waiver(), labels = waiver(), 
          limits = NULL, range = c(1, 6), trans = "identity", guide = "legend", aesthetics = "size") 
{
  continuous_scale(aesthetics, "area", scales::rescale_pal(range), name = name, 
                   breaks = breaks, labels = labels, limits = limits, trans = trans, 
                   guide = guide)
}


lev <- c("A", "B", "C", "D")

nodes <- data.frame(
  ord = c(1,1,1,2,2,3,3,4),
  brand = factor(c("A", "B", "C", "B", "C", "D", "B", "D"), levels=lev), 
  thick = c(16, 9, 9, 16, 4, 1, 4, 1)
)

edge <- data.frame(
  ord1 = c(1, 1, 2, 3),
  brand1 = factor(c("C", "A", "B", "B"), levels = lev),
  ord2 = c(2, 2, 3, 4),
  brand2 = c("C", "B", "B", "D"),
  N1 = c(2, 1, 2, 1),
  N2 = c(5, 5, 2, 1)
)

ggplot() + 
  (geom_segment(
    data = edge,
    aes(x = ord1, y = brand1, xend = ord2, yend = brand2, edge_size = N2/N1), 
    color = "blue"
  ) %>% rename_geom_aes(new_aes = c("size" = "edge_size"))) +
  (geom_point(
    data = nodes,
    aes(x = ord, y = brand, node_size = thick),
    color = "black", shape = 16
  ) %>% rename_geom_aes(new_aes = c("size" = "node_size"))) + 
  scale_x_continuous(
    limits = c(1, 4),
    breaks = 0:4,
    minor_breaks = NULL
  ) +
  scale_size_c(
    aesthetics = "edge_size",
    breaks = 1:5,
    name = "edge size",
    guide = guide_legend(keywidth = grid::unit(1.2, "cm"))
  )  + 
  scale_size_c(
    aesthetics = "node_size",
    trans = "sqrt",
    breaks = c(1, 4, 9, 16),
    name = "node size"
  )  + 
  ylim(lev) + theme_bw()

创建于 2018-05-16代表包(v0.2.0)。

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

如何在一个ggplot中拥有两个不同大小的图例? 的相关文章

  • 在 R 的 for 循环中创建动态命名对象并分配动态值

    我正在尝试创建一套动态命名的新对象 例如 temp2015 使用 for 循环 并存储动态值 具体来说 其他对象的名称 例如 Y2015 和 for 循环中使用的值 例如 2015 在动态命名的新对象中 我不确定为什么下面的代码不起作用 Y
  • R - 重塑 - 熔化错误

    我正在尝试融化数据框 但出现了这个奇怪的错误 有什么想法吗 str zx7 data frame 519 obs of 5 variables calday new Date format 2011 01 03 2011 01 04 201
  • 从 data.frame 在 ggplot 图例中添加信息

    我想在图例中添加信息 哪个传感器具有该值 这是我的代码 z lt data frame a c sensor 1 sensor 2 sensor 3 sensor 4 sensor 5 sensor 6 sensor 7 sensor 8
  • 使用选定因子水平的值向 ggplot-barchart 添加水平线

    在这个情节中 df lt data frame factor as factor c rep A 3 rep B 3 Treatment c rep c A B C 2 values runif 6 0 1 ggplot df aes Tr
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • 从数据框中绘制多条平滑线

    我对 R 比较陌生 我正在尝试绘制从 csv 文件加载的数据框 数据由 6 列组成 如下所示 xval col1 col2 col3 col4 col5 第一列 xval 由一系列单调递增的正整数 例如 10 40 60 等 组成 其他列
  • 当将遗传算法与 lme4 一起使用时,glmulti 无限期运行

    我在 R 中使用 glmulti 进行模型平均 我的模型中有大约 10 个变量 使得详尽的筛选不切实际 因此我需要使用遗传算法 GA 调用 method g 我需要包含随机效应 因此我使用 glmulti 作为 lme4 的包装器 此处提供
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso
  • 如何在Rstudio中快速给几个单词加上引号?

    如何将 MI ID FL 转换为 MI ID FL 而无需键入每个双引号 Hmisc 包有一个函数 Cs 它将评估逗号分隔的文本是否带有引号 Cs MI ID FL becomes MI ID FL
  • R:单纯形错误:在下标赋值中不允许使用 NA

    对于以下具有目标函数和约束的最小化 boot simplex返回错误 Error in tab pr lt tab pr tab pr pc pv o tab pr NAs are not allowed in subscripted as
  • R - 基于列名称的子集

    我的数据框有超过 120 列 变量 我想根据列名称创建子集 例如 我想创建一个子集 其中列名称包含字符串 心情 这可能吗 我一般用 SubData lt myData grep whatIWant colnames myData 我很清楚
  • rvest 函数 html_nodes 返回 {xml_nodeset (0)}

    我正在尝试抓取以下网站的数据框 http stats nba com game 0041700404 playbyplay http stats nba com game 0041700404 playbyplay 我想创建一个表格 其中包
  • 如何将参数从 Excel/VBA 传递到 Rstudio 中的脚本

    我正在尝试使用 Rstudio 从 VBA 打开 R 脚本 同时将参数传递给 R 脚本 然后我可以使用 commandArgs 访问该脚本 该问题与此处描述的问题非常相似 WScript Shell 用于运行路径中包含空格且来自 VBA 的
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 条件和分组 mutate dplyr

    假设我有以下每个抽屉库存增加的数据 gt socks year drawer nbr sock total 1990 1 2 1991 1 2 1990 2 3 1991 2 4 1990 3 2 1991 3 1 我想要一个二进制变量来标
  • 是否有weighted.median()函数?

    我正在寻找类似形式的东西weighted mean 我通过搜索找到了一些解决方案 这些解决方案写出了整个函数 但希望有一些更用户友好的解决方案 以下软件包都有计算加权中位数的函数 aroma light isotone limma cwhm
  • 更改ggplot2中的字体

    曾几何时 我改变了我的ggplot2字体使用windowsFonts Times windowsFont TT Times New Roman 现在 我无法摆脱这一切 在尝试设置family in ggplot2 theme 当我用不同的字
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d

随机推荐

  • 使用 jQuery 和 PHP 实现长轮询

    我想构建一个基于 JavaScript jQuery 将用于 AJAX 和 PHP 的聊天 我听说这样做的一个好方法是使用长轮询 我确实理解这个想法 但我不知道如何在服务器端实现它 无限循环听起来是个坏主意 您不想创建无限循环 但可以设置超
  • 可滚动 div 无法在 Android 模拟器、iPhone 模拟器中工作

    我正在使用phonegap 我想保留固定的页眉和页脚 并且我想在它们之间滚动内容 为此 我将 div 与 div width 249px height 299px background color Gray overflow y auto
  • 如何使用宏在 SAS 中获取当前月份名称和年份

    我正在 SAS 中触发一封邮件 该邮件应在邮件中保存当前月份和年份 如何创建宏变量 month year这样 month应显示十月 year应显示 2020 目前使用 let sysmonth sysfunc month sysdate d
  • SqlDataSourceEnumerator.Instance.GetDataSources() 找不到本地 SQL Server 2008 实例

    我使用以下代码列出所有远程和本地 SQL Server 实例 public static void LocateSqlInstances using DataTable sqlSources SqlDataSourceEnumerator
  • 如何使用新的 OpenSSL 库编译 PHP

    我正在尝试使用 OpenSSL 编译 PHP 只需配置即可与默认 OpenSSL 库 0 9 6 配合使用 with openssl usr 但是 我安装了一个新的 OpenSSL 库 1 0 0 我想用它来编译 PHP 这个图书馆位于 u
  • 如何仅通过这种回溯找到第一个解决方案

    我正在尝试编写一个数独求解器 它将仅返回第一个可能的解决方案 我设法用 void 方法打印所有可能的解决方案 但我不能在第一个发现时停止 我知道首选方法是切换到布尔方法并返回true上树 但我找不到正确的写法 我尝试的任何方式总是给出编译错
  • setTimeout 函数的第三个参数是什么?

    我正在阅读一些使用 Promise 对象的代码 有一个setTimeout函数有三个参数 我想知道第三个参数是做什么的 因为通常它只有两个参数 代码如下 function timeout ms return new Promise reso
  • 在意图android中传递一个数组

    所以我一直假设你不能在带有额外功能的活动之间传递数组 但我刚刚浏览 Bundle 类文档并看到putStringArray String key String value and public String getStringArray S
  • 使用自己的登录表单进行太多重定向 - Spring Security

    我想制作自己的登录表单 当我更改登录页面时 我无法打开它 Google Chrome 告诉我此页面的重定向太多 My code RequestMapping value login method RequestMethod GET publ
  • 通过从“外部”Angular JS 更改服务,观察者停止工作

    我正在这样做 angular element body injector get myService somevar true 我在其他地方抓住了它 scope watch function return myService somevar
  • 扫描仪应该只实例化一次吗?如果是这样的话为什么会这样呢?

    我知道我在这里有点冒险 但我似乎无法理解为什么我们不能两次创建 Scanner 类的实例 我将添加一个示例以防万一 import java util Scanner public class Nope public static void
  • 使用 jsFiddle 的全局变量

    在 jsFiddle 环境中 我希望创建一个循环 以随机顺序显示数字 1 到 10 不重复 jsFiddle 在这里 除此之外 在 jsFiddle 环境中使用全局变量有困难 将不胜感激 jsFiddle 中全局变量的解释 让我的代码工作
  • AngularJS + 路由 + 解析

    我收到此错误 错误 错误 injector unpr http errors angularjs org 1 3 7 injector unpr p0 HttpResponseProvider 20 3C 20HttpResponse 20
  • 如何使用 Ant 重命名文件和文件夹

    如何使用 Ant 重命名多个文件和文件夹 对于我知道的文件我可以这样做 question 如何对文件夹做同样的事情 例如 文件夹集 输入 com google appengine eclipse sdkbundle 1 5 2 r37v20
  • 反转 DOMNodeList 中项目的顺序

    你好 我正在制作 RSS 阅读器并且正在使用 DOM 现在我卡住了 试图反转 DOMNodeList 中项目的顺序 我可以用 2 个周期来完成 一个周期将其作为数组 另一个周期用于rsort 有没有办法反转 DOMNodeList 中的顺序
  • 如何使用phonegap-videoplayer-plugin 播放Youtube 视频?

    我在用用于播放视频的 Phonegap 插件在我的 iOS 应用程序中 我可以播放 URL 格式的视频 例如http easyhtml5video com images happyfit2 mp4 如何使用phonegap videopla
  • Swift 相等需要 ObjectIdentifier 吗?

    我们有一个自定义 Swift 类的多个实例 它继承自 SKSpriteNode 并且能够正确执行以下代码 针对此问题进行了大幅简化 let instance1 CustomClass let instance2 CustomClass le
  • C# 中的每像素碰撞问题

    我正在为自己的目的用 C 编写一个小型 2d 游戏引擎 除了精灵碰撞检测之外 它工作得很好 我决定将其设为逐像素检测 对我来说最容易实现 但它并没有按照预期的方式工作 该代码在冲突发生之前很久就检测到了 我已经检查了检测的每个组件 但找不到
  • 如何在Windows 10命令提示符下正确执行MySQL中的SQL文件?

    我已经尝试了近三十分钟试图弄清楚如何从 Win 10 命令提示符执行 sql 文件 但我仍然不知道如何去做 我位于 mysql gt 目录中 我无法弄清楚文件路径之前的 源 是什么 我需要在 MySql 文件路径之前输入的 源 是什么 这是
  • 如何在一个ggplot中拥有两个不同大小的图例?

    想象一下我绘制这个玩具数据 lev lt c A B C D nodes lt data frame ord c 1 1 1 2 2 3 3 4 brand factor c A B C B C D B D levels lev thick