如何使用 ggrepel (或其他方式)在 ggalluvial 中对齐和标记地层

2023-11-29

我有一些使用生成的冲积地块ggalluvial in R.

下面的代码示例产生的结果接近我想要实现的目标。例如,

library("ggalluvial")
par(mar = c(1,1,1,1)*12, cex = 0.6, xpd=NA)

# generate some example data
somelongnames <- c("homo sapiens", "homo sapiens", letters[18],
                   "some other long name", letters[seq(4)])

df <- data.frame(x = factor(somelongnames),
                 y = factor(c("this label is long", "Golgi", 
                       letters[13:18])),
                 count = c(2, 10, 4, 5, 5, 1, 9, 3))

ll <- unique(c(as.character(df$x), as.character(df$y)))
grid.col <- rainbow(length(ll))
grid.col <- setNames(grid.col, ll)

# set colours for alluvial plot (this is a little tricky as strata 
# colour ordering is required for ggalluvial strata)
names(df) <- c("Condition1", "Condition2", "value")
levs1 <- levels(df$Condition1) 
levs2 <- levels(df$Condition2)
res1 <- unique(df$Condition1)
res2 <- unique(df$Condition2)
cond1_cols <- grid.col[levs1[levs1 %in% res1]]
cond2_cols <- grid.col[levs2[levs2 %in% res2]]
columnCols <- c(cond1_cols, cond2_cols)
stratCols <- c(rev(cond1_cols), rev(cond2_cols))

# plot alluvial diagram
q <- ggplot(df,
            aes(y = value, axis1 = Condition1, axis2 = Condition2)) +
  geom_alluvium(aes(fill = Condition1), width = 0) +
  scale_fill_manual(values = columnCols) +
  geom_stratum(width = 1/8, fill = paste0(stratCols), color = "white") +
  scale_x_discrete(limits = c("Condition1", "Condition2"), 
                   expand = c(.09, .09)) +
  scale_y_continuous(breaks = NULL) +
  theme_minimal() +
  theme(axis.ticks.y = element_blank(),
        axis.text.y = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.major.x = element_blank()) +
  theme(legend.position = "none") +
  ylab(NULL)

# add labels
  q +
    geom_label(stat = "stratum", aes(label = after_stat(stratum)),
               color = stratCols, fontface = "bold", size = 3)     

enter image description here

我想移动标签,使它们位于层的左侧和右侧,这样它们就不会与图重叠(当标签很长时,这特别烦人)。我见过使用的例子ggrepel包来做到这一点。

我尝试过使用 for 循环ifelse调用中的声明aes in geom_text_repel(按照解决方案2在这里)但无法完全弄清楚代码。任何人都可以提供帮助或有更好的解决方案来实现这一目标吗?

使用失败的代码示例ggrepel e.g.

q + ggrepel::geom_text_repel(
    aes(label = ifelse(Condition1 == as.character(res1)[1],as.character(res1)[1], NA)),
        stat = "stratum", size = 4, 
        direction = "y", nudge_x = -.5
) 

enter image description here

理想情况下我想制作类似的东西解决方案2在 Jason Cory Brunson 的这个例子中。

> sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 10.16

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] parallel  stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggalluvial_0.12.3    RColorBrewer_1.1-2   archivist_2.3.6      circlize_0.4.12      dplyr_1.0.5          viridis_0.6.0       
 [7] viridisLite_0.4.0    pheatmap_1.0.12      pRolocdata_1.29.1    ggplot2_3.3.3        bandle_1.0           pRoloc_1.30.0       
[13] BiocParallel_1.24.1  MLInterfaces_1.70.0  cluster_2.1.1        annotate_1.68.0      XML_3.99-0.6         AnnotationDbi_1.52.0
[19] IRanges_2.24.1       MSnbase_2.16.1       ProtGenerics_1.22.0  mzR_2.24.1           Rcpp_1.0.6           Biobase_2.50.0      
[25] S4Vectors_0.28.1     BiocGenerics_0.36.0  BiocStyle_2.18.1    

也许这适合你的需要。第一的。因为我不太熟悉ggalluvial我更改了数据的设置,以遵循链接中示例中的代码,首先扩展数据集并将其转换为长格式。这样做可以让我在stratum and alluviumaes 并使其更容易调节您的Condition多变的。

执行此操作后,您可以使用默认值geom_text通过使用对齐标签ifelse。或者你可以利用两个geom_text_repel图层将标签放置在图层的左侧或右侧。

library(tidyr)
library(dplyr)

df_expanded <- df[rep(row.names(df), df$value), ]
df_expanded <- df_expanded %>%
  mutate(id = row_number()) %>%
  pivot_longer(-c(value, id), names_to = "Condition", values_to = "label")

# plot alluvial diagram
q <- ggplot(df_expanded, aes(x = Condition, stratum = label, alluvium = id, fill = label)) +
  geom_flow(width = 0) +
  scale_fill_manual(values = columnCols) +
  scale_color_manual(values = stratCols) +
  geom_stratum(width = 1 / 8, color = "white") +
  scale_x_discrete(
    expand = c(.25, .25)
  ) +
  scale_y_continuous(breaks = NULL) +
  theme_minimal() +
  theme(
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    panel.grid.major.y = element_blank(),
    panel.grid.major.x = element_blank()
  ) +
  theme(legend.position = "none") +
  ylab(NULL)

q +
  geom_text(
    aes(
      label = after_stat(stratum),
      hjust = ifelse(Condition == "Condition1", 1, 0),
      x = as.numeric(factor(Condition)) + .075 * ifelse(Condition == "Condition1", -1, 1),
      color = after_stat(stratum)
    ),
    stat = "stratum", fontface = "bold", size = 3
  )
#> Warning: The `.dots` argument of `group_by()` is deprecated as of dplyr 1.0.0.

q +
  ggrepel::geom_text_repel(
  aes(label = ifelse(after_stat(x) == 1, as.character(after_stat(stratum)), "")),
  stat = "stratum", size = 4, direction = "y", nudge_x = -.6) +
  ggrepel::geom_text_repel(
    aes(label = ifelse(after_stat(x)  == 2, as.character(after_stat(stratum)), "")),
    stat = "stratum", size = 4, direction = "y", nudge_x = .6
  )

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

如何使用 ggrepel (或其他方式)在 ggalluvial 中对齐和标记地层 的相关文章

  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • 时间戳半小时窗口内字段的平均值

    我的数据框有列名Timestamp es看起来像 Timestamp es 2015 04 01 09 07 42 31 2015 04 01 09 08 01 29 5 2015 04 01 09 15 03 18 5 2015 04 0
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • kernlab 中 SVM 训练之外的核矩阵计算

    我正在开发一种新算法 该算法可以生成修改后的核矩阵以用于 SVM 训练 但遇到了一个奇怪的问题 出于测试目的 我比较了使用 kernelMatrix 接口和普通内核接口学习的 SVM 模型 例如 Model with kernelMatri
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 更改闪亮 R 中的默认浏览器

    我在 RStudio 中使用 01 hello 虽然在 IE 中默认打开程序时它不会显示直方图 但即使在 Chrome 中 滑块也不起作用 我无法滑动条形图并看到直方图中的变化 如何更改 R 中的默认浏览器 以便闪亮启动 Chrome 而不
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 如何获得所有大于x且有位置的数字?

    V lt c 1 3 2 4 2 3 1 X lt 3 pos lt V V X pos is 3 3 我需要的是所有 3 个的位置 I need 2 and 6 哪些职位是3 in V Use which pos lt which V 3
  • 使用 ggmap 截断密度多边形

    我在使用 R ggmap 绘制密度图时遇到问题 我的数据如下所示 gt head W date lat lon dist 1 2010 01 01 31 942 86 659 292 415 2 2010 01 10 32 970 84 1
  • 将不均匀的层次列表转换为数据框

    我认为还没有有人问过这个问题 但是有没有一种方法可以将具有多个级别和不均匀结构的列表的信息组合成 长 格式的数据帧 具体来说 library XML library plyr xml inning lt http gd2 mlb com c
  • read_html(url) 和 read_html(content(GET(url), "text")) 之间的区别

    我正在看这个很棒的答案 https stackoverflow com a 58211397 3502164 https stackoverflow com a 58211397 3502164 解决方案的开头包括 library httr
  • applyStrategy 错误

    我是R新手 最近运行后遇到以下错误applyStrategy函数来自quantstrat包裹 Error in eval expr envir enclos object signal not found Error in colnames
  • 实三次多项式的最快数值解?

    R 问题 寻找最快的方法来数值求解一堆已知具有实系数和三个实根的任意三次方程 据报道 R 中的 polyroot 函数对复杂多项式使用 Jenkins Traub 算法 419 但对于实多项式 作者参考了他们早期的工作 对于实三次或更一般的
  • 闭包作为数据合并习惯的解决方案

    我正在尝试解决闭包问题 而且我think我发现了一个案例 他们可能会有所帮助 我有以下几部分需要处理 一组正则表达式 旨在清理状态名称 位于函数中 具有州名称 上述函数创建的标准化形式 和州 ID 代码的 data frame 用于链接两者
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

    我正在搜索 但仍然找不到一个非常简单的问题的答案 我们如何使用 R 中的 ggplot2 生成一个变量的简单线图 我正在分析时间序列数据 并且想要对图表进行更复杂的操作 我认为如果我使用 ggplot2 代替会更好plot It works

随机推荐

  • chown 和 chmod 后用户的文件夹权限被拒绝

    我有一个目录 home ec2 user vertica1 我正在尝试让用户dbadmin该文件夹中的所有权限 我已经对该文件夹执行了 chown 到 dbadmin 和 chmod 777 但 dbadmin 仍然收到权限被拒绝错误 如果
  • 在 iOS 中关联我的应用程序的自定义文件

    我正在尝试关联我的应用程序创建的自定义文件 它是 XML 以便用户可以通过电子邮件相互发送文件 我已经遵循了这里的优秀教程 如何将文件类型与 iPhone 应用程序关联 该文件名为 XXX checklist 但这不是关联 我相信我的问题出
  • 如何使用itext删除PDF附件

    我是 pdf 新手 我使用以下代码将文件嵌入到 pdf 中 但是 我想编写另一个程序来删除嵌入文件 我可以知道我该怎么做吗 真的感谢 public void addAttachments String src String dest Str
  • 根据反应中另一个选择框的值动态加载选择框的选项

    我正在尝试创建 2 个选择框 其中第一个选择框的选项是固定的 但第二个选择框的选项根据第一个 div 的选定值而变化 例如 第一个选择
  • 如何在 CANoe/CAPL 中包含 .h 或 .dll 文件

    我想在CAPL中集成一个头文件 h或 dll 具体是Visa32 dll visa h或sicl h 来控制万用表34461A 如何在 CANoe 中包含 h 文件或 dll 文件 我创建了一个名为万用表的 ECU 模块 谢谢 在 CAPL
  • 忽略 pexpect 响应中的 ANSI 颜色

    我可以用吗pexpect以忽略输出中的 ANSI 转义码 尤其是颜色 的方式 我正在尝试这样做 expect foo 3 bar 5 but 有时我得到带有 ANSI 颜色数字的输出 问题是我不知道哪些数字有 ANSI 颜色 哪些没有 有没
  • 带有文本和图标的微调器

    在我的应用程序中 我有一个Spinner 可以填充两个Arrays of Strings 存储在我的values strings xml资源 根据两个单选按钮的状态 选择正确数组中的值并填充我的微调器 对于每个字符串数组 我都有一个大小相同
  • iOS XMPP PubSub 在向我的订阅用户发布节点时未接收事件

    我将 XMPPClient 与 ejjaberd 用于我的聊天应用程序 如 Whatsapp 我想实现 XMPPPubsub 以在任何用户更改其个人资料图片时通知所有用户 我的框架 https github com robbiehanson
  • 如何在隐藏溢出的范围内显示点(“...”)?

    My CSS content right head span display inline block width 180px overflow hidden important 现在正在显示内容内容 但我想表现得像内容内容 我需要在内容后
  • Android:如何保存用户填写的表单的html文件

    I was able to download this form to my sdcard from a given URL 我的应用程序可以通过 Android Web 视图访问此表单 我的问题是 用户在表单中填写数据后如何将其保存到文本
  • 无法从 MAC OSX 上的后台 java 应用程序复制到剪贴板

    我们有 2 个 Java 应用程序在 MAC 上运行 一个后台应用程序将文本或图像发送到剪贴板 然后另一个应用程序抓取该数据并将其粘贴到其应用程序中 当应用程序在剪贴板上复制某些内容时 我们会遇到这个问题 后台应用程序将无法更新剪贴板 直到
  • 杰克逊+建造者模式?

    我希望杰克逊使用以下构造函数反序列化一个类 public Clinic String name Address address 反序列化第一个参数很容易 问题是 Address 定义为 public class Address privat
  • 如何查看linux的socket缓冲区大小

    Linux 的默认套接字缓冲区大小是多少 有什么命令可以看到吗 如果您想在终端中查看缓冲区大小 您可以查看 proc sys net ipv4 tcp rmem 供阅读 proc sys net ipv4 tcp wmem 用于写入 它们包
  • 为线程配置 log4j2

    有一个类叫做Test 它延伸自Thread 如何配置 log4j2 以便为每个测试线程创建我自己的日志文件 我正在尝试这样做 public class Test extends Thread private String name priv
  • 在 COCOS2D 中移动的触摸上绘制线条

    我正在使用 iPhone 开发一款游戏COCOS2D 其中 当用户将手指从一个点拖动到另一个点时 我需要画一条线 据我所知 我需要这样做Touches Moved method从哪里我可以获得积分 但我不知道该怎么做 有人能帮我解决这个问题
  • 如何在Xamarin中使用研究套件框架

    我正在使用 ResearchKit 制作一个健康应用程序 我想在 Xamarin 中执行此操作 因为我已经有很多可以在 Xamarin 中使用的共享代码 然而 研究套件尚未集成到 Xamarin 中 我正在考虑将框架绑定到我在 Xamari
  • 使用 EWS 托管 API 2.0 为现有约会绑定自定义扩展属性

    我想使用自定义扩展属性进行唯一的预约以放入数据库 我使用 FindAppointments 查找所有约会 var appointments service FindAppointments WellKnownFolderName Calen
  • 在 PHP 中使用正则表达式找出子域

    抱歉 如果这个挑战太小 不适合作为堆栈溢出问题 但我对正则表达式有点陌生 我的问题是 对于下面的所有示例返回字符串 token 的正则表达式是什么 token domain com token domain com token domain
  • 如何删除多页文档中的空白页?

    编辑 添加了一个答案 因为编辑太长 参见答案2 继以前关于文档合并的帖子我最终得到了一个工作脚本 感谢 Henrique 但我仍然有一个小问题 最终的 合并 文档有时包含我想删除的空白页面 取决于其他文档内容 我找不到简单的方法来做到这一点
  • 如何使用 ggrepel (或其他方式)在 ggalluvial 中对齐和标记地层

    我有一些使用生成的冲积地块ggalluvial in R 下面的代码示例产生的结果接近我想要实现的目标 例如 library ggalluvial par mar c 1 1 1 1 12 cex 0 6 xpd NA generate s