Да, это можно сделать в 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
Теперь мы можем назначить начало и конец x и y co -координаты для строк путем сопоставления букв в этих двух столбцах со столбцами в нашем labels
фрейме данных:
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")
Created on 2020-07-10 by the пакет реплекс (v0.3.0)