web-dev-qa-db-fra.com

R légende placement dans une parcelle

J'ai un complot qui contient des données dans la zone que j'aimerais utiliser pour une légende. Existe-t-il un moyen de placer automatiquement l'intrigue dans un en-tête situé au-dessus des points de données les plus élevés dans lequel s'inscrit la légende?

Je peux le faire fonctionner si je saisis manuellement les arguments ylim() pour agrandir la taille, puis donner les coordonnées exactes de l'emplacement de la légende, mais je préférerais disposer d'un moyen plus souple de procéder. c'est une interface pour une requête de base de données et les niveaux de données peuvent avoir des niveaux très différents.

enter image description here

33
screechOwl

Éditer 2017:

utilisez ggplot et 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")

Réponse originale 2012: Mettez la légende en bas:

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

28
aatrujillob

Vous devez ajouter la taille de la boîte de légende à la plage 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

25
Pierre Lapointe

En vous appuyant sur la solution @ P-Lapointe, mais en le rendant extrêmement facile, vous pouvez utiliser les valeurs maximales de vos données à l'aide de max(), puis réutiliser ces valeurs maximales pour définir le legend xy. coordonnées. Pour vous assurer de ne pas dépasser les frontières, vous configurez ylim légèrement au-dessus des valeurs maximales.

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

10
Geek On Acid

?legend vous dira:

Arguments

x, y
Les coordonnées x et y à utiliser pour positionner la légende. Ils peuvent être spécifiés par mot-clé ou par tout moyen accepté par xy.coords: Voir les détails'.

Détails:

Les arguments x, y, la légende sont interprétés de manière non standard pour permettre la spécification des coordonnées via un ou deux arguments. Si la légende est manquante et que y n'est pas numérique, on suppose que le deuxième argument est censé être une légende et que le premier argument spécifie les coordonnées.

Les coordonnées peuvent être spécifiées de n'importe quelle manière acceptée par xy.coords. Si cela donne les coordonnées d'un point, il est utilisé comme coordonnée en haut à gauche du rectangle contenant la légende. Si elle donne les coordonnées de deux points, ceux-ci spécifient les coins opposés du rectangle (soit une paire de coins, dans n'importe quel ordre).

Vous pouvez également spécifier l'emplacement en définissant x sur un mot-clé unique de la liste bottomright, bottom, bottomleft, left, topleft, top, topright, right et center. Cela place la légende à l'intérieur du cadre de la parcelle à l'emplacement donné. La correspondance d'arguments partielle est utilisée. L'argument optionnel inset spécifie la distance entre la légende et les marges du tracé. Si une seule valeur est donnée, elle est utilisée pour les deux marges; si deux valeurs sont données, la première est utilisée pour la distance x, la seconde pour la distance y.

1
Carl Witthoft