Нарисуйте произвольные линии на полях, R график с несколькими панелями - PullRequest
0 голосов
/ 17 марта 2020

У меня есть этот код

par(mfrow = c(1,2))
plot(1:5, 5:1)

Что делает этот участок

enter image description here

Я хотел бы добавить случайные линии по всему графику (см., например, красные линии). Они могут быть на графике сами, на внутренних полях или на внешних полях.

  • Координаты линии не должны относиться к одной из панелей. Они должны быть относительно всей площади участка. В идеале, нарисованные до или после прорисовки графиков.
  • Должно быть возможным пересечение линий от одного графика к другому и от внутренних к внешним полям.

I не хочу использовать ggplot2. У меня такое чувство, что мне нужно использовать grid, но я не уверен, с чего начать.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Это не сложно. Добавляя новую белую панель (по всем графикам), Вы можете нарисовать нужные сегменты с помощью xpd = TRUE

Вот мой пример;

set.seed(111)
random_segments <- data.frame(x0 = runif(5, 0, 2), y0 = runif(5, 0, 2), 
                             x1 = runif(5, 0, 2), y1 = runif(5, 0, 1))

par(mfrow = c(1,2))
plot(1:5, 5:1)
plot(11:20, 20:11)
par(new = T, mfrow = c(1, 1))
plot(1, type = "n", axes = F, ann = F)
with(random_segments, segments(x0, y0, x1, y1, xpd = TRUE))

enter image description here

[EDITED]

Вы можете сделать это, сделав белую панель с нужным вам коррдинатом и без полей (вам не нужно использовать xpd = TRUE из-за отсутствия полей).

set.seed(111)
random_segments <- data.frame(x0 = runif(5, 0, 1), y0 = runif(5, 0, 1), 
                             x1 = runif(5, 0, 1), y1 = runif(5, 0, 1))

def_par <- par(no.readonly = TRUE)
par(mfrow = c(1,2))
plot(1:5, 5:1)
plot(11:20, 20:11)
par(new = T, mfrow = c(1, 1), mar = c(0,0,0,0))
plot(1, type = "n", axes = F, ann = F, xaxs = "i", yaxs = "i", 
     xlim = c(0, 1), ylim = c(0, 1))
with(random_segments, segments(x0, y0, x1, y1))
points(c(0, 0, 1, 1), c(0, 1, 0, 1), col = "red")  # to check coordinate
par(def_par)  # recover   

enter image description here

0 голосов
/ 17 марта 2020

Отличное решение от cuttlefi sh! Ключ xpd = TRUE (позволяет строить за пределами области печати) Поскольку я набрал, вот оно ...

dev.off()
par(mfrow = c(1,2))
par(xpd=TRUE)
plot(1:5, 5:1)
lines(x=-1:2,y=-2:1,col="red")
lines(x=-1:1,y=-1:1,col="red")
lines(x= 1:3,y= 4:2,col="red")
lines(x= 4:7,y= 5:8,col="red")
lines(x= 2:4,y= 5:7,col="red")
# Control the length & slope of lines
plot(1:5, 5:1)
lines(x= -1:1,y=2:4,col="red")
lines(x=rep(1,3),y=0:2,col="red")
lines(x= 1:3,y=rep(6,3),col="red")
lines(x= 3:6,y= 2:5,col="red")
lines(x=c(4,4.2,4.4),y=4:6,col="red")

redlines

...