Построить легенду за пределами области построения в базовой графике?
как говорится в названии:как я могу построить легенду вне области построения при использовании базовой графики?
Я думал о возиться с layout
и создать пустой график, чтобы содержать только легенду, но мне было бы интересно использовать только базовые графические объекты и, например,par(mar = )
чтобы получить некоторое пространство справа от сюжет для легенды.
здесь пример:
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(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))
выдает:
но, как уже было сказано, я хотел бы, чтобы легенда была вне области построения (например, справа от графика/графика.
10 ответов:
может быть, что вам нужно это
par(xpd=TRUE)
чтобы можно было рисовать объекты за пределами области построения. Так что если вы делаете основной сюжет сbty='L'
вы будете иметь некоторое пространство справа для легенды. Обычно это будет обрезано в область участка, но dopar(xpd=TRUE)
и с небольшой корректировкой вы можете получить легенду, насколько это возможно:set.seed(1) # just to get the same random numbers par(xpd=FALSE) # this is usually the default plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty='L') # this legend gets clipped: legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # so turn off clipping: par(xpd=TRUE) legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))
никто не упоминал об использовании отрицательного
inset
значенияlegend
. Вот пример, где легенда находится справа от сюжета, выровнена по верху (используя ключевое слово"topright"
).# Random data to plot: A <- data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2)) B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1)) # Add extra space to right of plot area; change clipping to figure par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) # Plot both groups plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1, main="Scatter plot of two groups") points(y ~ x, B, pch=3) # Add legend to top right, outside plot region legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group")
первое значение
inset=c(-0.2,0)
может потребоваться настройка на основе ширины легенды.
другое решение, помимо уже упомянутых ondes (используя
layout
илиpar(xpd=TRUE)
) заключается в наложении вашего участка с прозрачным участком по всему устройству, а затем добавить легенду к этому.трюк заключается в наложении (пустого) графика на всю область построения и добавлении к ней легенды. Мы можем использовать . Сначала мы поручаем R создать новый график по всему устройству построения:
par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
задание
oma
и это так как мы хотим, чтобы интерьер участка охватывал все устройство.new=TRUE
необходимо предотвратить R от запуска нового устройства. Затем мы можем добавить пустой участок:plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
и мы готовы добавить легенду:
legend("bottomright", ...)
добавит легенду в правом нижнем углу устройства. Аналогично, мы можем добавить легенду к верхнему или правому краю. Единственное, что нам нужно, чтобы убедиться, что край исходного сюжета достаточно велик, чтобы вместить легенду.
положить все это в функцию;
add_legend <- function(...) { opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE) on.exit(par(opar)) plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n') legend(...) }
и пример. Сначала создайте сюжет, убедившись, что у нас достаточно места внизу, чтобы добавить легенду:
par(mar = c(5, 4, 1.4, 0.2)) plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)
затем добавьте легенду
add_legend("topright", legend=c("Foo", "Bar"), pch=20, col=c("steelblue", "indianred"), horiz=TRUE, bty='n', cex=0.8)
в результате:
извините за воскрешение старого потока, но я был с той же проблемой сегодня. Самый простой способ, который я нашел следующее:
# Expand right side of clipping rect to make room for the legend par(xpd=T, mar=par()$mar+c(0,0,0,6)) # Plot graph normally 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") # Plot legend where you want legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # Restore default clipping rect par(mar=c(5, 4, 4, 2) + 0.1)
найдено здесь:http://www.harding.edu/fmccown/R/
мне нравится делать это так:
par(oma=c(0, 0, 0, 5)) 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))
единственная настройка требуется в установке правого поля, чтобы быть достаточно широким, чтобы вместить легенду.
однако, это также может быть автоматизирован:
dev.off() # to reset the graphics pars to defaults par(mar=c(par('mar')[1:3], 0)) # optional, removes extraneous right inner margin space plot.new() l <- legend(0, 0, bty='n', c("group A", "group B"), plot=FALSE, pch=c(1, 2), lty=c(1, 2)) # calculate right margin width in ndc w <- grconvertX(l$rect$w, to='ndc') - grconvertX(0, to='ndc') par(omd=c(0, 1-w, 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))
Я могу предложить только пример планировочного решения уже указывал.
layout(matrix(c(1,2), nrow = 1), widths = c(0.7, 0.3)) par(mar = c(5, 4, 4, 2) + 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") par(mar = c(5, 0, 4, 2) + 0.1) plot(1:3, rnorm(3), pch = 1, lty = 1, ylim=c(-2,2), type = "n", axes = FALSE, ann = FALSE) legend(1, 1, c("group A", "group B"), pch = c(1,2), lty = c(1,2))
недавно я нашел очень простую и интересную функцию для печати легенды за пределами области сюжета, где вы хотите.
сделайте внешнее поле в правой части участка.
par(xpd=T, mar=par()$mar+c(0,0,0,5))
создать участок
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")
добавить легенду и просто использовать функцию локатора(1), как показано ниже. Затем вы должны просто нажать, где вы хотите после загрузки следующего скрипта.
legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2))
попробуй
вы могли бы сделать это с помощью Plotly R API, либо с кодом, либо из графического интерфейса, перетаскивая легенду туда, где вы ее хотите.
вот пример. График и код также здесь.
x = c(0,1,2,3,4,5,6,7,8) y = c(0,3,6,4,5,2,3,5,4) x2 = c(0,1,2,3,4,5,6,7,8) y2 = c(0,4,7,8,3,6,3,3,4)
вы можете расположить легенду вне графика, присвоив одно из значений x и y 100 или -100.
legendstyle = list("x"=100, "y"=1) layoutstyle = list(legend=legendstyle)
вот еще варианты:
list("x" = 100, "y" = 0)
для внешнего Правого днаlist("x" = 100, "y"= 1)
Снаружи Справа Сверхуlist("x" = 100, "y" = .5)
Снаружи Справа Посерединеlist("x" = 0, "y" = -100)
Подlist("x" = 0.5, "y" = -100)
В Центрlist("x" = 1, "y" = -100)
В Правеответ.
response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));
Plotly возвращает URL-адрес с вашим графиком, когда вы делаете вызов. Вы можете получить доступ к этому быстрее, позвонив
browseURL(response$url)
таким образом, он откроет ваш график в вашем браузере для вы.url = response$url filename = response$filename
что дает нам этот график. Вы также можете переместить легенду из графического интерфейса, а затем график будет масштабироваться соответственно. Полное раскрытие информации: я в команде заговорщиков.
попробовать
layout()
который я использовал для этого в прошлом, просто создав пустой участок ниже, правильно масштабированный примерно на 1/4 или около того и поместив в него части легенды вручную.есть некоторые старые вопросы о
legend()
который должен заставить вас начать.
добавление еще одной простой альтернативы, которая, на мой взгляд, довольно элегантна.
заговор:
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("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2), inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n" )
результат:
здесь только вторая строка легенды была добавлена к вашему примеру. В свою очередь:
inset=c(0,1)
- перемещение легенды по долям области участка в направлениях (x,y). В этом случае легенда находится на