首页 > 解决方案 > 有没有办法制作一个将经验词对与 ggplot2 连接起来的线图?

问题描述

我不确定这种情节的正确名称是什么,但假设我们有一个名称列表(或此处的字母):data <- data.frame(letters[1:10]) 我们还想说明这些名称中的哪些名称是基于一些经验决定连接的,所以我们有一个观察列表,我们想在如下图中连接(在 powerpoint 中完成):


在此处输入图像描述

这可以在ggplot中完成吗?

标签: rggplot2

解决方案


是的,它可以在 ggplot 中完成。

让我们首先设置一个字母数据框,并在绘图的 x 和 y 轴上具有相关位置。我们将 x 值设为 1 和 2(尽管这是任意的),y 值设为 1:10(也是任意的,只要它们间隔均匀)

labels <- data.frame(x    = c(rep(1, 10), rep(2, 10)), 
                     y    = rep(1:10, 2), 
                     labs = rep(LETTERS[10:1], 2),
                     stringsAsFactors = FALSE)

现在我们还需要一些方法来决定要加入哪些字母。让我们通过一个简单的“左”和“右”值数据框来做到这一点,其中每一行描述将连接哪两个字母:

set.seed(69)

joins <- data.frame(left  = sample(LETTERS[1:10], 6, TRUE),
                    right = sample(LETTERS[1:10], 6, TRUE),
                    stringsAsFactors = FALSE)
joins
#>   left right
#> 1    A     G
#> 2    B     B
#> 3    H     J
#> 4    G     D
#> 5    G     J
#> 6    F     B

现在我们可以通过将这两列中的字母与labels数据框中的列匹配来为行分配开始和结束 x 和 y 坐标:

joins$x    <- rep(1.05, nrow(joins))
joins$xend <- rep(1.9, nrow(joins))
joins$y    <- labels$y[match(joins$left, labels$labs)]
joins$yend <- labels$y[match(joins$right, labels$labs)]

这只是离开了情节。我们想去掉所有的坐标轴、标题和图例,所以我们使用theme_void

library(ggplot2)

ggplot(labels, aes(x, y)) + 
  geom_text(aes(label = labs), size = 8) +
  geom_segment(data = joins, aes(xend = xend, yend = yend, color = left),
               arrow = arrow(type = "closed", length = unit(0.02, "npc"))) +
  coord_cartesian(xlim = c(0.5, 2.5)) +
  theme_void() + 
  theme(legend.position = "none")

reprex 包于 2020-07-10 创建(v0.3.0)


推荐阅读