#r #ggplot2 #arc-diagram
#r #ggplot2 #дуговая диаграмма
Вопрос:
Я пытаюсь создать дуговой график, похожий на пакет arcdiagram, используя ggplot2 geom_curve
:
library(ggplot2)
ggplot(myDat, aes(x = A, xend = B, y = 0, yend = 0))
geom_curve(alpha = 0.2, curvature = 1, ncp = 1000, lineend = 'butt')
Некоторые кривые идут ниже 0, как я могу заставить их все идти выше Y = 0?
Данные:
myDat <-
structure(list(A = c(36047276L, 36074979L, 36074979L, 36074979L,
36074979L, 36074979L, 36074979L, 36074979L, 36074979L, 36074979L,
36074979L, 36077099L, 36077099L, 36077099L, 36077099L, 36077099L,
36077099L, 36077099L, 36077099L, 36098040L, 36098040L, 36098040L,
36098040L, 36098040L, 36098040L, 36098040L, 36098040L, 36098040L,
36098040L, 36098040L, 36098040L, 36098040L, 36098040L, 36098040L,
36098040L, 36098040L, 36099840L, 36099840L, 36099840L, 36099840L,
36099840L, 36099840L, 36099840L, 36099840L, 36099840L, 36099840L,
36099840L, 36099840L, 36099840L, 36099840L, 36099840L, 36099840L,
36099840L, 36101586L, 36101586L, 36101586L, 36101586L, 36101586L,
36101586L, 36101586L, 36101586L, 36101586L, 36101586L, 36101586L,
36101586L, 36101586L, 36101586L, 36101586L, 36101586L, 36101586L,
36103565L, 36103565L, 36103565L, 36103565L, 36103565L, 36103565L,
36103565L, 36103565L, 36103565L, 36103565L, 36103565L, 36103565L,
36103565L, 36103565L, 36103565L, 36103565L, 36103565L),
B = c(36047417L,
36077099L, 36077279L, 36077863L, 36078510L, 36079111L, 36079565L,
36080165L, 36080428L, 36082473L, 36082907L, 36074979L, 36077279L,
36077863L, 36078510L, 36079111L, 36079565L, 36080165L, 36082907L,
36096300L, 36097775L, 36098987L, 36099840L, 36099952L, 36100767L,
36101156L, 36101586L, 36101633L, 36101926L, 36102035L, 36102381L,
36102833L, 36103149L, 36103565L, 36103872L, 36104121L, 36096300L,
36097775L, 36098040L, 36098987L, 36099952L, 36100767L, 36101156L,
36101586L, 36101633L, 36101926L, 36102035L, 36102381L, 36102833L,
36103149L, 36103565L, 36103872L, 36104121L, 36096300L, 36097775L,
36098040L, 36098987L, 36099840L, 36099952L, 36100767L, 36101156L,
36101633L, 36101926L, 36102035L, 36102381L, 36102833L, 36103149L,
36103565L, 36103872L, 36104121L, 36096300L, 36097775L, 36098040L,
36098987L, 36099840L, 36099952L, 36100767L, 36101156L, 36101586L,
36101633L, 36101926L, 36102035L, 36102381L, 36102833L, 36103149L,
36103872L, 36104121L)), .Names = c("A", "B"),
class = "data.frame", row.names = c(NA, -87L))
Ответ №1:
В зависимости от curvature
кривой будет либо изгибаться влево, либо вправо. В данном случае это означает, что когда кривая рисуется от А до В, а кривизна равна 1, она будет иметь правый изгиб. Поэтому, если A меньше, чем B, кривая будет «отрицательной» (ниже оси y), а если A больше, чем B, она будет положительной.
Один из способов получить все кривые на одной стороне — использовать две geom_curve
s, по одной для каждой ситуации:
ggplot(mapping = aes(x = A, xend = B, y = 0, yend = 0))
geom_curve(data = subset(myDat, A > B),
alpha = 0.2, curvature = 1, ncp = 1000, lineend = 'butt')
geom_curve(data = subset(myDat, A < B),
alpha = 0.2, curvature = -1, ncp = 1000, lineend = 'butt')
Или мы можем поменять местами пары, когда они выровнены неправильно:
myDat2 <- myDat
myDat2$A <- pmax(myDat$A, myDat$B)
myDat2$B <- pmin(myDat$A, myDat$B)
ggplot(myDat2, aes(x = A, xend = B, y = 0, yend = 0))
geom_curve(alpha = 0.2, curvature = 1, ncp = 1000, lineend = 'butt')
Оба результата: