Как автоматизировать позиционирование легенды в r сюжете для нескольких легенд? - PullRequest
1 голос
/ 23 июня 2019

Я делаю сюжет R и хочу расположить несколько легенд рядом друг с другом (за пределами области черчения).Цель - автоматизировать размещение легенды.

Я использую подход отсюда: https://stackoverflow.com/a/34624632/4978977

Вот пример кода с двумя легендами справа от графика:

dev.off()
par(mar=c(par('mar')[1:3], 0))
plot.new()
l1 <- legend(0, 0, bty='n', c("group A", "group B"), plot=FALSE, pch=c(1, 2), lty=c(1, 2))
l2 <- legend(0, 0, bty='n', c("group A", "group B"), plot=FALSE, pch=c(1, 2), lty=c(1, 2))
w1 <- grconvertX(l1$rect$w, to='ndc') - grconvertX(0, to='ndc')
w2 <- grconvertX(l2$rect$w, to='ndc') - grconvertX(0, to='ndc')
par(omd=c(0, 1-sum(w1, w2), 0, 1))
plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2))
lines(1:3, rnorm(3), pch=2, lty=2, type="o")
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1, 2))
legend(par('usr')[2]+l1$rect$w, par('usr')[4], bty='n', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1, 2))

Я могу визуально получить нужное количество поля справа от графика, чтобы получить достаточно места для обеих легенд рядом друг с другом.

Как я понимаю l1$rect$w - ширина первой легендыв «пользовательских» координатах.Как вы видите в коде - я добавляю это значение в левую позицию первой легенды, чтобы получить вторую позицию легенды.В результате вторая легенда смещается вправо, но недостаточно далеко, и перекрывается с текстом первой легенды.

![plot](https://ibb.co/vQ7H7WV)

Как правильно указать положение второй легенды, чтобы она не перекрывалась с первой легендой?

1 Ответ

1 голос
/ 23 июня 2019

Вы можете сделать это намного проще:

# expand margin on the right side for the legend
par(mar=c(par("mar")[1:3], 13.1))

# plot the points
plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2))

# add the lines
lines(1:3, rnorm(3), pch=2, lty=2, type="o")

# add the first legend and save it's position
l1 <- legend("topleft", c("group A", "groupB"), bty='n', xpd=TRUE, 
             pch=c(1,2), lty=c(1,2), inset=c(1,0))

# add second legend and adjust x axis position based on width of first legend
legend(l1$rect$left+l1$rect$w, l1$rec$top, c("group A", "groupB", "groupC"),
       bty='n', xpd=TRUE, pch=c(1,2,3), lty=c(1,2,3), inset=c(1,0))

pic

Обратите внимание на несколько «хитростей»:

  1. Я использовал xpd=TRUE, чтобы легенда отображалась даже за пределами основной области сюжета.
  2. Для первой легенды я указал местоположение как "topleft", а затем использовал inset=c(1,0) - это смещает легенду на долюобласти построения (1 = вся область построения), которая удобно размещает его только вне графика.
...