9 votos

¿Disminuir la distancia entre los elementos de la leyenda en R?

Estoy intentando crear choropleth() en R utilizando GISTools paquete. Utilizo choro.legend() para mostrar mi leyenda. Sin embargo, no puedo crear ni la colocación correcta de la leyenda, Y / O no entiendo el papel de fmt en mi choro.legend() función. Me parece que fmt puede disminuir el espacio entre los colores de mi leyenda y la descripción.

enter image description here

He encontrado Página de ayuda de choro.legend que establece fmt es "C .

Entonces, ¿esto debería funcionar sólo con los valores de mis clases, no por la distancia entre los elementos de leyenda en sí?

O ¿cuál es el significado humano comprensible de esto?

¿Cómo puedo reducir la distancia entre mi choro.legend() ¿'s items?

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")

0 votos

He investigado/experimentado un poco sobre esto. Encontré esto en comandos de formato de cadena de estilo C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/ . Pero esto no parece tener ninguna relación con la distancia entre los elementos de la leyenda. Me he dado cuenta de que en su código el título de la leyenda es "Mi título", pero en su imagen no hay título en la leyenda. ¿Podría haber algún problema? Lo dudo, pero vale la pena investigarlo.

0 votos

En una inspección más detallada, el uso de un valor de "%20.1f" produce una leyenda realmente ancha (como la tuya) y un valor de "%0.1f" produce una con los elementos de la leyenda mucho más juntos. Pero si usas un valor de "%0.1f" tus elementos están muy separados. La única otra cosa que se me ocurre es un posible espacio en blanco rellenando la parte delantera de tus valores, pero no sé por qué tendrías esto.

3voto

Farid Cher Puntos 5306

fmt no tiene nada que ver con el espaciado de los elementos de la leyenda. Para una descripción detallada de fmt Consulte Uso de comandos de formato de cadenas de estilo C . Sólo tiene que pegar el siguiente fragmento de código en su R consola para ver las diferencias (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() llama a legend() internamente. Para reducir el espacio horizontal entre los elementos de la leyenda, debe cambiar la opción text.width del legend() función. Por desgracia, choro.legend no proporciona un parámetro para establecer text.width externamente en lugar de calcularlo internamente. He añadido un space_reduction al parámetro choro.legend y modificó ligeramente la función original de la siguiente manera

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)
}

Guarde este fragmento en un archivo de script R y source eso. Un fragmento de código reproducible sería como el siguiente:

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)

Disminuir/aumentar gradualmente el space_reduction para lograr el resultado deseado.

enter image description here

0 votos

He intentado utilizar la función choro.legend como se indica más arriba, pero independientemente del valor que establezca para space_reduction, obtengo el siguiente mensaje de error: Error in legend(x = px, y = py, legend = rep(" ", length(res)), fill = sh$cols, : 'text.width' must be numeric, >= 0 Mi llamada a la función tiene el siguiente aspecto: choro.legend(-85.80,45.3,tneffort.shades,title='Trapnet lifts per year', cex=0.6,bty="n",fmt = "%0.0f",space_reduction=4000) ¿Puede alguien identificar el origen del problema?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X