Diminuindo a distância entre os itens da legenda em R?

9

Estou tentando criar o choropleth()mapa correto em R usando o GISToolspacote. Eu uso choro.legend()para exibir minha legenda. No entanto, não consigo criar o posicionamento correto da legenda, E / OU Não entendo o papel do fmtparâmetro na minha choro.legend()função. Parece-me que fmtpode diminuir o espaço entre as cores e a descrição da minha legenda.

insira a descrição da imagem aqui

Eu encontrei a página de ajuda choro.legend que os estados fmté "formato de estilo C para valores constantes acima dos limites de classe coropléticos" .

Portanto, isso deve funcionar apenas com os valores das minhas classes, não pela distância entre os itens da legenda em si?

OU qual é o significado humano compreensível disso?

Como posso diminuir a distância entre os choro.legend()itens de meus ?

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
fonte
Eu fiz um pouco de escavação / experimentação sobre isso. Encontrei isso nos comandos de formatação de string no estilo C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Mas isso não parece ter relação com a distância entre itens de legenda. Percebo que no seu código o título da legenda é 'Meu título', mas na sua imagem não há título na legenda. Pode haver um problema aqui? Duvido, mas vale a pena investigar.
haff
Em uma inspeção mais aprofundada, o uso de um valor de "% 20.1f" produz uma legenda muito ampla (como a sua) e um valor de "% 0.1f" produz uma com os itens da legenda muito mais próximos. Mas você usa um valor de "% 0.1f" e seus itens estão espaçados. A única outra coisa em que eu conseguia pensar é em um espaço em branco potencial preenchendo a frente de seus valores, mas não sei por que você teria isso.
haff

Respostas:

3

fmtnão tem nada a ver com o espaçamento dos itens de legenda. Para uma descrição detalhada dos fmtconsulte Uso de estilo C da corda comandos de formatação . Basta colar o seguinte trecho de código no Rconsole para ver as diferenças (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()chama legend()internamente. Para reduzir o espaçamento horizontal entre os itens da legenda, você deve alterar o text.widthparâmetro da legend()função. Infelizmente choro.legend, não fornece um parâmetro para definir text.widthexternamente, mas computa-o internamente. Eu adicionei um space_reductionparâmetro ao choro.legende modifiquei levemente a função original da seguinte maneira:

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

Salve esse trecho em um arquivo de script R e sourcenele. Um snippet de código reproduzível seria o seguinte:

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)

Diminuir / aumentar gradualmente o space_reductionparâmetro para alcançar o resultado desejado.

insira a descrição da imagem aqui

Farid Cheraghi
fonte
Tentei usar a função choro.legend, conforme descrito acima, mas independentemente do valor que defini para space_reduction, recebo a seguinte mensagem de erro: Erro na legenda (x = px, y = py, legend = rep ("", length ( res)), fill = sh $ cols,: 'text.width' deve ser numérico,> = 0 Minha chamada de função se parece com: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet elevadores por ano' , cex = 0,6, bty = "n", fmt = "% 0.0f", space_reduction = 4000) Alguém pode identificar a fonte do problema?
Darryl H