Подтвердить что ты не робот

Размещение легенды R в сюжете

У меня есть сюжет, который содержит данные, которые попадают в область, которую я хотел бы использовать для легенды. Есть ли способ, чтобы график автоматически помещал что-то вроде пространства заголовка над наивысшими точками данных, чтобы соответствовать легенде?

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

enter image description here

4b9b3361

Ответ 1

Изменить 2017:

используйте ggplot и theme (legend.position = ""):

library(ggplot2)
library(reshape2)

set.seed(121)
a=sample(1:100,5)
b=sample(1:100,5)
c=sample(1:100,5)

df = data.frame(number = 1:5,a,b,c)
df_long <- melt(df,id.vars = "number")
ggplot(data=df_long,aes(x = number,y=value, colour=variable)) +geom_line() +
theme(legend.position="bottom")

Оригинальный ответ 2012: Поместите легенду внизу:

set.seed(121)
a=sample(1:100,5)
b=sample(1:100,5)
c=sample(1:100,5)

dev.off()

layout(rbind(1,2), heights=c(7,1))  # put legend on bottom 1/8th of the chart

plot(a,type='l',ylim=c(min(c(a,b,c)),max(c(a,b,c))))
lines(b,lty=2)
lines(c,lty=3,col='blue')

# setup for no margins on the legend
par(mar=c(0, 0, 0, 0))
# c(bottom, left, top, right)
plot.new()
legend('center','groups',c("A","B","C"), lty = c(1,2,3),
       col=c('black','black','blue'),ncol=3,bty ="n")

enter image description here

Ответ 2

Вы должны добавить размер окна легенды к диапазону ylim

#Plot an empty graph and legend to get the size of the legend
x <-1:10
y <-11:20
plot(x,y,type="n", xaxt="n", yaxt="n")
my.legend.size <-legend("topright",c("Series1","Series2","Series3"),plot = FALSE)

#custom ylim. Add the height of legend to upper bound of the range
my.range <- range(y)
my.range[2] <- 1.04*(my.range[2]+my.legend.size$rect$h)

#draw the plot with custom ylim
plot(x,y,ylim=my.range, type="l")
my.legend.size <-legend("topright",c("Series1","Series2","Series3"))

enter image description here

Ответ 3

Основываясь на решении @P-Lapointe, но делая его чрезвычайно простым, вы можете использовать максимальные значения из ваших данных с помощью max(), а затем повторно использовать эти максимальные значения для установки координат legend xy. Чтобы убедиться, что вы не выходите за границы, вы немного настроили ylim на максимальные значения.

a=c(rnorm(1000))
b=c(rnorm(1000))
par(mfrow=c(1,2))
plot(a,ylim=c(0,max(a)+1))
legend(x=max(a)+0.5,legend="a",pch=1)
plot(a,b,ylim=c(0,max(b)+1),pch=2)
legend(x=max(b)-1.5,y=max(b)+1,legend="b",pch=2)

enter image description here

Ответ 4

?legend расскажет вам:

Аргументы

x, y
координаты x и y, которые будут использоваться для позиционирования легенды. Они могут быть указаны по ключевому слову или любым способом, который принимается xy.coords: См. "Детали.

Подробности:

Аргументы x, y, legend интерпретируются нестандартным способом, позволяющим определять координаты через один или два аргумента. Если легенда отсутствует, а y не является числовой, предполагается, что второй аргумент предназначен для легенды и что первый аргумент определяет координаты.

Координаты могут быть указаны любым способом, который принимается xy.coords. Если это дает координаты одной точки, она используется как верхняя левая координата прямоугольника, содержащего легенду. Если он дает координаты двух точек, они указывают противоположные углы прямоугольника (любую пару углов в любом порядке).

Местоположение также можно указать, установив x в одно ключевое слово из списка "rightright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right", и "центр". Это помещает легенду в рамку графика в данном месте. Используется частичное сопоставление аргументов. Дополнительный аргумент вставки указывает, насколько далека легенда вставки из полей графика. Если задано одно значение, оно используется для обоих полей; если заданы два значения, первый используется для x-расстояния, второй для y-расстояния.