Diminuer la distance entre les éléments de la légende dans R?

9

J'essaie de créer une choropleth()carte correcte dans R en utilisant le GISToolspackage. J'utilise choro.legend()pour afficher ma légende. Cependant, je ne peux pas créer de placement de légende correct, ET / OU Je ne comprends pas le rôle du fmtparamètre dans ma choro.legend()fonction. Il me semble que cela fmtpeut diminuer l'espace entre les couleurs et la description de ma légende.

entrez la description de l'image ici

J'ai trouvé page d'aide choro.legend que les États fmtest « format de style C pour les valeurs indiquées dans les limites ci - dessus de la classe choroplèthes » .

Donc, cela devrait simplement fonctionner avec les valeurs de mes classes, pas par la distance entre les éléments de légende lui-même?

OU quelle est la signification humaine compréhensible de cela?

Comment puis-je réduire la distance entre mes choro.legend()articles?

choropleth(my.shp, nc.lI[,1], shading = income.shade)
choro.legend(-12919698, 5314317,income.shade,title='My title',cex=0.8, bty = "n", fmt = "%0.1f")
maycca
la source
J'ai un peu creusé / expérimenté à ce sujet. J'ai trouvé cela sur les commandes de formatage de chaînes de style C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Mais cela ne semble pas avoir d'incidence sur la distance entre les éléments de légende. Je remarque que dans votre code le titre de la légende est «Mon titre» mais dans votre image il n'y a pas de titre sur la légende. Pourrait-il y avoir un problème ici? J'en doute, mais cela vaut la peine d'être examiné.
haff
Après une inspection plus approfondie, l'utilisation d'une valeur de «% 20.1f» produit une légende très large (comme la vôtre) et une valeur de «% 0.1f» en produit une avec les éléments de légende beaucoup plus rapprochés. Mais vous utilisez une valeur de "% 0.1f" et vos articles sont espacés très loin. La seule autre chose à laquelle je pourrais penser, c'est un espace blanc potentiel remplissant le devant de vos valeurs, mais je ne sais pas pourquoi vous auriez cela.
haff

Réponses:

3

fmtn'a rien à voir avec l'espacement des éléments de légende. Pour obtenir une description détaillée de fmts'il vous plaît voir Utiliser C-style String commandes de formatage . Collez simplement l'extrait de code suivant dans votre Rconsole pour voir les différences (pi ~ 3.14):

sprintf("%f", pi)
sprintf("%.3f", pi)
sprintf("%1.0f", pi)
sprintf("%5.1f", pi)
sprintf("%05.1f", pi)
sprintf("%+f", pi)
sprintf("% f", pi)
sprintf("%-10f", pi) # left justified
sprintf("%e", pi)
sprintf("%E", pi)
sprintf("%g", pi)
sprintf("%g",   1e6 * pi) # -> exponential
sprintf("%.9g", 1e6 * pi) # -> "fixed"
sprintf("%G", 1e-6 * pi)

choro.legend()appelle en legend()interne. Pour réduire l'espacement horizontal entre les éléments de légende, vous devez modifier le text.widthparamètre de la legend()fonction. Malheureusement, choro.legendne fournit pas de paramètre à définir en text.widthexterne, mais le calcule en interne. J'ai ajouté un space_reductionparamètre à la choro.legendet j'ai légèrement modifié la fonction d'origine comme suit:

choro.legend <- function (px, py, sh, under = "under", over = "over", between = "to", 
          fmt = "%g", cex = 1, space_reduction = 0, ...) 
{
  x = sh$breaks
  lx = length(x)
  if (lx < 3) 
    stop("break vector too short")
  res = character(lx + 1)
  res[1] = paste(under, sprintf(fmt, x[1]))
  for (i in 1:(lx - 1)) res[i + 1] <- paste(sprintf(fmt, x[i]), 
                                            between, sprintf(fmt, x[i + 1]))
  res[lx + 1] <- paste(over, sprintf(fmt, x[lx]))
  maxwidth <- max(strwidth(res)) - space_reduction
  temp <- legend(x = px, y = py, legend = rep(" ", length(res)), 
                 fill = sh$cols, text.width = maxwidth, cex = cex, ...)
  text(temp$rect$left + temp$rect$w, temp$text$y, res, pos = 2, 
       cex = cex)
}

Enregistrez cet extrait dans un fichier de script R et sourcele. Un extrait de code reproductible serait comme suit:

library(GISTools)

data(newhaven)
blocks

val <- blocks@data$POP1990
shade <- auto.shading(val)
choropleth(blocks, v= val, shade)
choro.legend(514000, 175000,shade,title='My Legend',cex=.8, bty = "n", fmt = "%0.0f",
             space_reduction=4000)

Diminuez / augmentez progressivement le space_reductionparamètre pour obtenir le résultat souhaité.

entrez la description de l'image ici

Farid Cheraghi
la source
J'ai essayé d'utiliser la fonction choro.legend comme indiqué ci-dessus, mais quelle que soit la valeur que j'ai définie pour space_reduction, j'obtiens le message d'erreur suivant: Erreur dans la légende (x = px, y = py, legend = rep ("", longueur ( res)), fill = sh $ cols,: 'text.width' doit être numérique,> = 0 Mon appel de fonction ressemble à: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet lifts per year' , cex = 0,6, bty = "n", fmt = "% 0,0f", space_reduction = 4000) Quelqu'un peut-il identifier la source du problème?
Darryl H