Размещение легенды R в сюжете - PullRequest
33 голосов
/ 19 января 2012

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

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

enter image description here

Ответы [ 4 ]

28 голосов
/ 22 января 2012

Редактировать 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

25 голосов
/ 19 января 2012

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

#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

10 голосов
/ 19 января 2012

Опираясь на решение @ 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

1 голос
/ 19 января 2012

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

Аргументы

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

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

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

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

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

...