6
votes

Déterminer automatiquement la position de la légende de la parcelle

Vous pouvez positionner la légende clé manuellement dans la plupart des programmes de traçage. Par exemple, dans GNUPLOT, il est fait en utilisant Key Top Right Droite . Dans ggplot2, il est fait comme celui-ci .

Y a-t-il une bibliothèque de tracé, un script ou un simple algorithme qui positionne automatiquement la légende de telle sorte qu'il chevauche les données de l'intrigue au minimum?

Ce que je veux dire, c'est: Supposons que je trace la ligne y = x . Un bon endroit pour la légende dans ce cas serait en haut à gauche ou en bas à droite.


2 commentaires

Dans R, je soupçonne que la réponse est non. Mais vous êtes plus susceptible d'obtenir les globes oculaires d'utilisateurs connectés à une balise [R].


En fait, je suis plus intéressé par une solution autonome (script ou algorithme que je vais mettre en œuvre) qui l'accomplira pour tout programme de traçage (mon arme de choix est gnuplot )


3 Réponses :


8
votes

Essayez ceci,

require(Hmisc)
?largest.empty


0 commentaires

6
votes
x<-rnorm(100)
 y<-rnorm(100)
 plot(x,y,main="Find the empty space",xlab="X",ylab="Y")
 es<-plotrix::emptyspace(x,y)
 # use a transparent background so that any overplotted points are shown
 plotrix::boxed.labels(es,labels="Here is the\nempty space",bg="transparent")

0 commentaires

2
votes

Un astuce rapide pour obtenir l'un des "topleft" code>, "towright" code>, "de base" code> et "bowrdight" :

auto.legend.pos <- function(x,y,xlim=NULL,ylim=NULL) {
  if (dev.cur() > 1) {
    p <- par('usr')
    if (is.null(xlim)) xlim <- p[1:2]
    if (is.null(ylim)) ylim <- p[3:4]
  } else {
    if (is.null(xlim)) xlim <- range(x, na.rm = TRUE)
    if (is.null(ylim)) ylim <- range(y, na.rm = TRUE)
  }
  countIt <- function(a) {
    tl <- sum(x <= xlim[1]*(1-a)+xlim[2]*a & y >= ylim[1]*a+ylim[2]*(1-a))
    tr <- sum(x >= xlim[1]*a+xlim[2]*(1-a) & y >= ylim[1]*a+ylim[2]*(1-a))
    bl <- sum(x <= xlim[1]*(1-a)+xlim[2]*a & y <= ylim[1]*(1-a)+ylim[2]*a)
    br <- sum(x >= xlim[1]*a+xlim[2]*(1-a) & y <= ylim[1]*(1-a)+ylim[2]*a)
    c(topleft=tl,topright=tr,bottomleft=bl,bottomright=br)
  }
  for (k in seq(0.5,0.1,by=-0.05)) {
    a <- countIt(k)
    if (sum(a==0)>0) break
  }
  names(a)[which(a==0)][1]   # may delete "[1]"
}

plot(Sepal.Length~Petal.Length, data=iris, xlim=c(1,5), ylim=c(3.5,6))
auto.legend.pos(iris$Petal.Length, iris$Sepal.Length)
# [1] "bottomright"

Test:

plot(Sepal.Length~Petal.Length, data=iris)
auto.legend.pos(iris$Petal.Length, iris$Sepal.Length)
# [1] "topleft"

EDIT

PAR ("USR") CODE> APRÈS TRACE CODE> Retourne les extrêmes des coordonnées de l'utilisateur des régions de tracé: voir ? Par code>. Nous pouvons donc changer la fonction à: p> xxx pré> p>


1 commentaires

Sera un peu désordonnée si vous avez plusieurs courbes pour tracer.