Disminución de la distancia entre los elementos de la leyenda en R?

9

Estoy tratando de crear el choropleth()mapa correcto en R usando el GISToolspaquete. Yo uso choro.legend()para mostrar mi leyenda. Sin embargo, no puedo crear la ubicación correcta de la leyenda, Y / O NO entiendo el papel del fmtparámetro en mi choro.legend()función. Me parece que fmtpuede disminuir el espacio entre los colores y la descripción de mi leyenda.

ingrese la descripción de la imagen aquí

He encontrado página de ayuda choro.legend que los estados fmtes "formato de estilo de C para los valores establecidos en los límites de clase por encima de choropleth" .

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

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

¿Cómo puedo disminuir la distancia entre mis choro.legend()artículos?

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
fuente
Hice un poco de excavación / experimentación en esto. Encontré esto en los 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. Noto 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 un problema aquí? Lo dudo pero vale la pena investigarlo.
haff
En una inspección posterior, usar un valor de "% 20.1f" produce una leyenda realmente amplia (como la suya) y un valor de "% 0.1f" produce uno con los elementos de la leyenda mucho más juntos. Pero utiliza un valor de "% 0.1f" y sus elementos están muy separados. Lo único que se me ocurre es el potencial espacio en blanco que rellena el frente de sus valores, pero no sé por qué tendría esto.
haff

Respuestas:

3

fmtno tiene nada que ver con el espaciado de elementos de leyenda. Para una descripción detallada de fmtconsulte Uso de estilo secuencia de C Comandos de formatos . Simplemente pegue el siguiente fragmento de código en su Rconsola 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()Llamadas legend()internas. Para reducir el espacio horizontal entre los elementos de la leyenda, debe cambiar el text.widthparámetro de la legend()función. Desafortunadamente choro.legend, no proporciona un parámetro para establecer text.widthexternamente, sino que lo calcula internamente. Agregué un space_reductionparámetro choro.legendy modifiqué 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 secuencia de comandos R y source. Un fragmento de código reproducible sería 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)

Disminuya / aumente gradualmente el space_reductionparámetro para lograr el resultado deseado.

ingrese la descripción de la imagen aquí

Farid Cheraghi
fuente
Intenté usar la función choro.legend como se describe anteriormente, pero independientemente del valor que configuré para space_reduction, recibo el siguiente mensaje de error: Error en la leyenda (x = px, y = py, legend = rep ("", length ( res)), fill = sh $ cols,: 'text.width' debe ser numérico,> = 0 Mi función se ve así: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet se eleva por año' , cex = 0.6, bty = "n", fmt = "% 0.0f", space_reduction = 4000) ¿Alguien puede identificar la fuente del problema?
Darryl H