如何使用 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 中对齐和标记地层 的相关文章

  • 如何以 HH:MM 表示小数时间

    我有一个十进制格式的时间 22 13以小时为单位 我想在 R 中将其表达为HH MM 我是说 22 08 贬值秒 有人可以帮助我吗 语法 02 0f是将值四舍五入为整数并使其始终为 2 个单位 所以 7 8分钟将转换为字符 08 x lt
  • 从 R 中的函数绘制到文件

    背景 嘿大家 我是 R 的新手 在一位团队成员提供了关于 R 在学术环境中的有用性的教程后 我对使用它产生了兴趣 我正在尝试编写一个脚本来自动从多个文件中读取数据 然后将结果图表绘制到多个文件中 以便可以轻松地将它们添加到手稿中 Power
  • R中舍入单位的舍入数字[重复]

    这个问题在这里已经有答案了 我正在尝试按舍入单位对数字进行舍入 例如 value lt c 8 21 1 76 6 42 1 94 10 38 如果舍入单位为 0 2 则结果为 8 2 1 8 6 4 2 0 10 4 我怎样才能在R中做到
  • 按列名称索引拆分数据框

    这是先前问题的变体 df lt data frame matrix rnorm 9 9 ncol 9 names df lt c c 1 d 1 e 1 a p b p c p 1 o1 2 o1 3 o1 我想按下划线 后面的column
  • 错误消息:fn(x, ...) 中的错误:已过时的 VtV 不是正定的

    我正在尝试使用 lmer 函数创建一个最小足够模型 我的模型已配对 尺寸 尝试 状态 随机因素 as logical Mated as numeric Size as factor Attempts as factor Status 这些都
  • 检查远程错误时出错 (val):5 个节点产生错误:未找到对象

    我尝试使用并行处理 parLapply 进行 10 倍交叉验证并估计联合模型的模型性能 我试图找出为什么我收到错误消息 checkForRemoteErrors val 中的错误 五个节点产生错误 未找到对象 Week 代码如下 Valid
  • 重塑错误 - 无效的“row.names”长度

    我有以下数据库 宽格式 st all 其中有两个我希望重塑的变量 P 和 PLC 主题的 ID 是 g id g id study condition sample PLC1 PLC2 PLC3 PLC4 PLC5 PLC6 PLC7 PL
  • dplyr 中每组的 cumsum

    我开始享受dplyr但我陷入了一个用例 我希望能够申请cumsum数据框中的每个组与包 但我似乎无法正确处理 对于演示数据框 我生成了以下数据 set seed 123 len 10 dates as Date 2014 01 01 1 l
  • 条件格式 DT 中的样式

    我想根据 B 列中的值对 A 列中的行进行着色 下面的代码基于小插图中的示例Link https rstudio github io DT 010 style html 但仅显示两列的条件 mobile number by mobile f
  • OpenBUGS:伯努利分布中缺失值

    我正在尝试通过 R R2OpenBUGS 使用 OpenBUGS 将观察 时间 建模为随机变量 如果所有观察时间都可用 没有 NA 则一切正常 但如果我将其中一个时间设置为 NA 则什么也不会发生 我使用 WinBUGS 测试了相同的代码
  • 如何在 R 中解析年份+周数?

    有没有一种好方法可以将年 周数转换为R中的日期 我已经尝试过以下方法 gt as POSIXct 2008 41 format Y U 1 2008 02 21 EST gt as POSIXct 2008 42 format Y U 1
  • 具有重复值的两个向量之间的“设置差异”

    我有 3 个向量 x lt c 1 3 5 7 3 8 y lt c 3 5 7 z lt c 3 3 8 我想找到以下元素x那些不在y并且不在z 有没有一个功能f这会给我以下输出 gt f x y 1 3 8 gt f x z 1 5 7
  • 无法使用 R 中的 Quantmod 从雅虎财经下载数据

    我正在尝试使用以下代码从雅虎下载数据 library quantmod getSymbols WOW auto assign F 过去 这对我来说在任何场合都有效 除了现在 在我的小组作业到期前 5 天 但现在我收到此错误 Error in
  • 调整 R 图的边距

    我对调整 R 图的边距很感兴趣 我在 MacOS 上使用 R Studio 在 2013 intel CPU Macbook pro 上运行 这是我用于生成绘图的数据 spins lt runif 50 min 0 max 50 这是我用来
  • 嵌套循环中的索引

    我是 R 和这个网站的新手 我的目标是创建一个 R 函数 在 ggplot2 中生成特殊类型的箱线图 这肯定是不必要的晦涩难懂的代码 我首先需要通过计算稍后希望绘制的变量来处理其中的潜在输入 我首先生成一些随机数据 称为datos c1 r
  • 有人可以解释一下这段代码吗?尤其是“函数x和[[x]]”的作用?

    这是 R 中的代码 我无法理解其作用function x and qdata x 在这行代码中 有人能给我详细解释一下吗 这段代码不是我写的 谢谢 outs lapply names qdata 12 35 function x hist
  • 将 R 中的 arules 生成的规则应用于新交易

    我的目标是使用 R 包生成的规则arules来预测topic每个事务 每个事务有 1 个主题 其中每个事务是文档中的一组单词 我有一个训练集trans train 用于创建规则 和测试集trans test 我想预测它的 主题 我还希望能够
  • xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象

    我创建了一个包含两列的数据框 gt head data frame Date Rainfall 1 1992 01 06 14 00 00 0 3 2 1992 01 06 15 00 00 0 2 3 1992 01 06 16 00 0
  • 使用 geom_bar 按列中一个特定值的计数对 y 轴进行排序

    想知道如何通过减少猕猴桃的数量来对 y 轴上的簇进行排序 df data frame df data frame matrix df nrow 200 ncol 2 colnames df lt c cluster name df clus
  • R中按字母顺序对每一行字符串进行排序

    我环顾四周 似乎找不到解决这个问题的好方法 我有一个包含行名称的列 我想按字母顺序对每一行进行排序 以便稍后可以识别具有相同名称但顺序不同的行 数据如下 names lt c John D Josh C Karl H John D Bob

随机推荐

  • 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