ggraph/ggplot2 中的手动图例 [R]

2024-01-26

除了这个帖子 https://stackoverflow.com/questions/51569831/how-to-draw-graph-corresponding-with-its-attributes-in-ggraph-r,在这里我提出新问题如何调整由ggraph.

以下是生成当前绘图的脚本:

    ## Packages
    library(igraph)
    library(tidygraph)
    library(ggraph)
    library(ggplot2)
    library(tidyverse)

    ## Edge and node
    edge <- data.frame(from=c(0,0,0,0,1,2,3),
                       to=c(0,1,2,3,0,0,0),
                       weight=c(1,3,1,1,3,1,1))
    node <- data.frame(id=c(0,1,2,3),
                       p=c(9,1,0,0),
                       w=c(0,2,0,0),
                       s=c(0,1,1,1),
                       size=c(9,3,1,1),
                       gr=c(0,1,1,2))

    ## Load data frames as tbl_graph class
    edge <- edge %>% mutate(from=from+1,to=to+1)
    net <- tbl_graph(nodes=node,edges=edge,directed=TRUE)

    ## Set arrows
    ar <- arrow(angle=30,length=unit(5,"mm"),ends="last",type="closed")
    ## Plot
    ggraph(net,layout="graphopt") +
    ## Edges
    geom_edge_link(aes(start_cap=circle(log(node1.size)+2,unit="native"),
                       end_cap=circle(log(node2.size)+2,unit="native"),
                       width=weight,label=weight),
        position="identity",angle_calc="along",force_flip=TRUE,
        label_dodge=unit(4.0,"mm"),label_push=unit(-0.4,"mm")) +
        ## Width scale
        scale_edge_width(range=c(0.4,4),breaks=c(1:10),name="Movements\nbetween zones") +
    ## Add arrows separately
    geom_edge_link(arrow=ar,aes(start_cap=circle(log(node1.size)+1,unit="native"),
        end_cap=circle(log(node2.size)+1,unit="native"))) +
    ## Nodes
        ## Plot location id
        geom_node_label(aes(label=id,hjust=log(size+6),vjust=log(size+6)),repel=TRUE,
                        label.padding=unit(0.8,"mm"),label.r=unit(0.0,"mm"),label.size=0.1,size=3.5) +
        ## Circle
        geom_node_circle(aes(r=log(size)+1),color="black",fill="white",size=0.4) +
        ## Plot work activity
        geom_node_text(aes(size=w,hjust=log(w)+0.4),label="w",color="red",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Plot school activity
        geom_node_text(aes(size=s,hjust=-log(s)-0.2),label="s",color="blue",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Size scale
        scale_size(range=c(0,5),breaks=c(1:100),name="Numberof\nActivities",
                   guide=guide_legend(override.aes=list(label="a",color="black"))) +
        # scale_color() +
    ## Theme
    theme_graph() + coord_fixed()

这就是我想要的结果。

这是上述脚本的结果。

要达到我想要的结果,有两个与图例相关的问题:

  • 如何用其他字体替换“活动数量”中重叠的“w”和“s”,例如黑色的“a”(活动),如所需结果所示?
  • 如何添加所需结果中显示的另一手动图例“活动类型”?

虽然它写在ggraph,我想语法似乎与ggplot2。我很感激你的建议!

==========更新==========

第一个问题已通过更改解决scale_size参数如更新的脚本中所示。

然而,第二个问题仍然存在,我又发现了一个问题0-value符号位于圆圈中心(非常小的点)。我找到了一些解决方案来解决该问题,方法是应用 1)subset()省略0-value数据框中的记录data=subset(df,x!=0), 2) 只需用 NA 填充 0 值即可data=ifelse(x==0,NA,.)方法,但是正如它所写的那样graph对象,它可能不适用于这种情况。

========== 更新版本 2 ==========

这确实很棘手,但不知怎的,我可以删除线中心的点并添加一个图例。

我真的不确定原因,但前一个问题已通过 1) 替换解决0 values in node数据帧由NA, 2) 替换NA in aes(size=...)geom_node_text 中的语句为aes(size=ifelse(is.na(w),0,w) ...,然后 3) 指定颜色color=ifelse(w==0,"white","red")。它不会删除数据,只是改变颜色0-value变成白色,使其看不见。

我想这不是正式的解决方案,只是我在数十次试验中遇到的方式。有趣的是 1) 和 2) 应该结合起来,否则会返回错误。

因此,这是最终更新:

## Packages
    library(igraph)
    library(tidygraph)
    library(ggraph)
    library(ggplot2)
    library(tidyverse)

    ## Edge and node
    edge <- data.frame(from=c(0,0,0,0,1,2,3),
                       to=c(0,1,2,3,0,0,0),
                       weight=c(1,3,1,1,3,1,1))
    node <- data.frame(id=c(0,1,2,3),
                       p=c(9,1,0,0),
                       w=c(0,2,0,0),
                       s=c(0,1,1,1),
                       size=c(9,3,1,1),
                       gr=c(0,1,1,2))

    ## Load data frames as tbl_graph class
    edge <- edge %>% mutate(from=from+1,to=to+1)
    # THIS IS QUITE STRANGE OPERATION FOR CHANGING COLOR
    node <- node %>% mutate_at(vars(p,w,s,size),funs(ifelse(.==0,NA,.)))
    net <- tbl_graph(nodes=node,edges=edge,directed=TRUE)

## Set arrows
ar <- arrow(angle=30,length=unit(5,"mm"),ends="last",type="closed")
## Plot
ggraph(net,layout="graphopt") +
    ## Edges
    geom_edge_link(aes(start_cap=circle(log(node1.size)+2,unit="native"),
                       end_cap=circle(log(node2.size)+2,unit="native"),
                       width=weight,label=weight),
        position="identity",angle_calc="along",force_flip=TRUE,
        label_dodge=unit(4.0,"mm"),label_push=unit(-0.4,"mm")) +
        ## Width scale
        scale_edge_width(range=c(0.4,4),breaks=c(1:10),name="Movements\nbetween zones") +
    ## Add arrows separately
    geom_edge_link(arrow=ar,aes(start_cap=circle(log(node1.size)+1,unit="native"),
        end_cap=circle(log(node2.size)+1,unit="native"))) +
    ## Nodes
        ## Plot location id
        geom_node_label(aes(label=id,hjust=log(size+6),vjust=log(size+6)),repel=TRUE,
                        label.padding=unit(0.8,"mm"),label.r=unit(0.0,"mm"),label.size=0.1,size=3.5) +
        ## Circle
        geom_node_circle(aes(r=log(size)+1),color="black",fill="white",size=0.4) +
        ## Plot work activity: NOT KNOW WHY IT WORKS!!
        geom_node_text(aes(size=ifelse(is.na(w),0,w),hjust=log(w)+0.4,color=ifelse(w==0,"white","red")),label="w",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Plot school activity
        geom_node_text(aes(size=ifelse(is.na(s),0,s),hjust=-log(s)-0.2,color=ifelse(s==0,"white","blue")),label="s",
                       position="identity",vjust=0.4,fontface="bold") +
        ## Edit legend
        scale_size_continuous(range=c(0,5),breaks=c(1:100),name="Numberof\nActivities",
                   guide=guide_legend(override.aes=list(label="a",color="black"))) +
        scale_color_manual(name="Type of Activity",guide=guide_legend(override.aes=list(label=c("w","s"))),
                           values=c("red","blue"),labels=c("Work","School")) +
    ## Theme
    theme_graph() + coord_fixed()

然而,由于它仍然是丑陋的代码,我仍在等待您的建议以进行更合适的操作。


None

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

ggraph/ggplot2 中的手动图例 [R] 的相关文章

  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 使用officer R导出时如何提高ggplots的分辨率

    我想将图表导出到 PPT 并使用Officer 包来实现相同的目的 但是 图表的默认分辨率较低 我想更改它 我目前正在使用以下电话 ph with gg p1 type chart res 1200 其中 p1 是 ggplot 对象 运行
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 多个动态滤镜更新闪亮

    我希望能够让 UI 输入闪亮 并根据用户之前的选择进行自我更新 因此 在下面的示例中 预期的行为是用户选择cyl vsor carb那么这将 过滤数据集mtcars用于创建绘图 即用户根据过滤条件调整绘图并 更新其他过滤器中的剩余输入选择
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • R ggplot 中的柯尔莫哥洛夫-斯米尔诺夫图

    我正在尝试在 r 中绘制 KS 图 一切似乎都很顺利 除了我只能使用颜色来可视化两个不同的样本而不是线型这一事实 我已经尝试过以下方法 sample1 lt SD13009 sample2 lt SD13009PB group lt c r
  • 在 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
  • 如何按定义的顺序将图像合并到一个文件中

    我有大约 100 张图像 png 我不想手动执行此操作 而是希望将它们按照定义的顺序 基于文件名 并排放置在一个 pdf 中 每行 12 个图像 有人有什么建议吗 我按照下面托马斯告诉我的方法尝试了 它把它们贴在旁边有一个黑边 我怎样才能去
  • 在网格中制作一个矩形图例,并标记行和列

    我有一个 ggplot 我将因子映射到填充和 alpha 如下所示 set seed 47 the data lt data frame value rpois 6 lambda 20 cat1 rep c A B each 3 cat2
  • 从数据框中绘制多条平滑线

    我对 R 比较陌生 我正在尝试绘制从 csv 文件加载的数据框 数据由 6 列组成 如下所示 xval col1 col2 col3 col4 col5 第一列 xval 由一系列单调递增的正整数 例如 10 40 60 等 组成 其他列
  • 需要在R中跳过不同数量的行

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

随机推荐

  • 在外部登录/注册 ASP.NET Web API 2.0 和 Identity 期间从 Facebook 检索其他配置文件信息

    似乎有很多关于如何使用 ASP NET Identity 和 MVC 客户端从 Facebook 配置文件获取附加信息的文档 但我似乎找不到任何关于如何从 Web API 控制器访问附加信息声明的信息 我的 Startup Auth cs
  • 为什么在 forEach 循环中不会追加列表项?

    我有一个简单的 forEach 循环 其中我尝试将列表项附加到无序列表中 但是 当我运行脚本时 我只看到添加了一个列表项 谁能解释为什么会发生这种情况 JS let bookElement document getElementsByCla
  • 如何在C#中使用文本框搜索列表视图的项目

    我有一个列表视图名称listView1 它包含计算机ID和它们的一些信息 所以我想做的是我有一个文本框名称过滤框 当我写东西时它会过滤它 它工作得很好 我的问题是它只是寻找第一列不是其他列 例如 PCNAME USER MODEL AAAA
  • 知道类中的所有变量是否为空的最佳方法是什么?

    这意味着类已初始化 但变量尚未设置 示例类 public class User String id null String name null public String getId return id public void setId
  • Groovy 不在集合中

    在 Groovy 中检查列表是否包含某些内容的惯用方法是使用in if b in a b c 但是如何很好地检查某些内容是否不在集合中呢 if g in a b c 使用逻辑看起来并不混乱 不经意的一瞥是隐藏的 在 Groovy 中是否有更
  • 如何从 ion-searchbar 获取输入?

    这是超级简单的问题 但我似乎无法弄清楚这一点 是的 我已经阅读了文档 我正在尝试获取用户输入的内容ion searchbar 在 Ionic v4 中 在他们按搜索并放入 const let 后 麻哈HTML
  • 带有 std::thread 和 std::chrono 的基本计时器

    我正在尝试使用经典方法来实现一个基本计时器 start 和 stop 我将 c 11 与 std thread 和 std chrono 一起使用 启动方法 创建一个在给定间隔时间内休眠的新线程 然后执行给定的 std function 当
  • 设置 UIView 的背景颜色会增加内存使用量

    我正在将许多 UIView 加载到 UIScrollView 上 并试图找出它们使用这么多内存的原因 经过使用 Instruments 的排除过程后 我发现设置视图的背景颜色会增加 4 倍的内存使用量 如果我不设置背景颜色 内存使用量约为
  • 上传到firebase时如何防止重复图像?

    当我想将图像上传到 firebase 实时数据库和存储 时遇到一些问题 在实时数据库中 我的图像对象默认有一张图像 并且当我上传其他图像时我不想覆盖图像所以我使用了传播运算符 SO 当我选择时一张图片并单击上传它们 它可以工作并保存 没有重
  • 更新列表列表中的属性

    问题是 如何在不循环的情况下更新 allItems 内的 ItemCount 字段 例如使用 Linq 例如 如果 Index 0 我想将 ItemCount 设置为 ItemCount 5 您可以看到下面的代码 我有以下课程 public
  • 尝试使用 LEFT OUTER JOIN 优化 MySQL 查询

    我有这个查询 它工作正常 只是需要很长时间 7 秒 jobs 表中有 40k 条记录 wq 表中有 700k 条记录 我尝试了 EXPLAIN 它说它查看作业表中的所有记录 并且不使用任何索引 我不知道如何告诉 MySQL 在查找 wq 表
  • 淘汰赛验证插件自定义错误消息

    根据以下内容 我到底如何设置回调以显示自定义错误消息而不是默认消息 ko validation rules exampleAsync async true the flag that says Hey I m Async validator
  • Pyaudio:将输入连接到输出时出错

    我正在 Intel Edison 主板上尝试 pyaudio 但它在内置测试中失败了 单独录音和播放在我的设置中工作得很好 但如果我尝试将输入连接到输出 则会出现错误 文件 wire full py 第 33 行 位于 data strea
  • 将子组件的配置传递给父组件

    通常 要定义网格类型 我会执行以下操作 Ext define MyApp view MyGrid extend Ext grid Panel alias widget myGrid store MyStore columns 然后我通过其
  • 如何在iOS App Store Sandbox中测试自动续订订阅的“续订”组件?

    Folks 我正在尝试验证自动续订订阅是否确实在沙盒环境中续订 首先 沙盒中的自动续订订阅似乎只有 5 分钟的有效期 说得通 我预计如果我等待五分钟 然后再拨打 https sandbox itunes apple com verifyRe
  • NSString 为空

    如何测试 NSString 是否为空 或全部空白或为零 通过单个方法调用 你可以尝试这样的事情 implementation NSString JRAdditions BOOL isStringEmpty NSString string i
  • 如何有效地对Delta表进行分区?

    在将数据帧存储在增量表中时 为我的数据帧寻找有效的分区策略 我当前的数据帧 1 5000 000 rowa 将数据从数据帧移动到增量表需要 3 5 小时 为了寻找一种更有效的方法来完成此写作 我决定尝试表中的不同列作为分区列 我搜索了列的基
  • Moment js - 显示距离日期还有几天和几小时

    我正在开发一个项目 需要对日期对象进行这种文本响应 1天7小时路程 需要这样 而不是 距离 31 小时 或 距离 1 天 我也在使用 moment js 因为我正在英语和德语之间进行语言切换 所以我已经利用了 moment js 语言区域设
  • Mac 上的 Docker Beta:无法使用 ip 访问 nginx 容器

    我安装了 docker beata https beta docker com https beta docker com 对于 OSX 接下来 我用这个文件创建了一个文件夹docker compose yml web image ngin
  • ggraph/ggplot2 中的手动图例 [R]

    除了这个帖子 https stackoverflow com questions 51569831 how to draw graph corresponding with its attributes in ggraph r 在这里我提出