Diminuzione della distanza tra gli oggetti della legenda in R?


9

Sto cercando di creare una choropleth()mappa corretta in R usando il GISToolspacchetto. Uso choro.legend()per visualizzare la mia leggenda. Tuttavia, non riesco a creare il corretto posizionamento della legenda, E / O Non capisco il ruolo del fmtparametro nella mia choro.legend()funzione. Mi sembra che fmtpossa diminuire lo spazio tra i colori e la descrizione della mia legenda.

inserisci qui la descrizione dell'immagine

Ho trovato la pagina di aiuto di choro.legend che afferma che fmtè "Formato in stile C per i valori indicati nei limiti di classe coropleth sopra" .

Quindi questo dovrebbe funzionare solo con i valori delle mie classi, non con la distanza tra gli elementi della legenda stessa?

O qual è il significato umano comprensibile di questo?

Come posso ridurre la distanza tra i miei choro.legend()oggetti?

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

Ho fatto un po 'di ricerca / sperimentazione su questo. Ho trovato questo sui comandi di formattazione delle stringhe in stile C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Ma questo non sembra influire sulla distanza tra gli oggetti della legenda. Noto che nel tuo codice il titolo della legenda è "Il mio titolo" ma nella tua immagine non c'è titolo sulla legenda. Potrebbe esserci un problema qui? Ne dubito, ma vale la pena esaminarlo.
Haff

A ulteriore esame, l'utilizzo di un valore di "% 20.1f" produce una legenda davvero ampia (come la tua) e un valore di "% 0.1f" produce uno con gli elementi della legenda molto più vicini tra loro. Ma usi un valore di "% 0.1f" e i tuoi oggetti sono distanziati. L'unica altra cosa che mi viene in mente è il potenziale spazio bianco che riempie la parte anteriore dei tuoi valori, ma non so perché tu abbia questo.
Haff

Risposte:


3

fmtnon ha nulla a che fare con la spaziatura degli elementi della legenda. Per una descrizione dettagliata di fmtconsultare Usa in stile C String comandi di formattazione . Basta incollare il seguente frammento di codice nella Rconsole per vedere le differenze (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()chiama legend()internamente. Per ridurre la spaziatura orizzontale tra gli elementi della legenda è necessario modificare il text.widthparametro della legend()funzione. Purtroppo choro.legendnon fornisce un parametro da impostare text.widthesternamente, ma lo calcola internamente. Ho aggiunto un space_reductionparametro choro.legende modificato leggermente la funzione originale come segue:

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

Salva questo snippet in un file di script R e source. Uno snippet di codice riproducibile sarebbe simile al seguente:

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)

Diminuire / aumentare gradualmente il space_reductionparametro per ottenere il risultato desiderato.

inserisci qui la descrizione dell'immagine


Ho provato a usare la funzione choro.legend come indicato sopra, ma indipendentemente dal valore impostato per space_reduction, ricevo il seguente messaggio di errore: Errore nella legenda (x = px, y = py, legenda = rep ("", lunghezza ( res)), fill = sh $ cols,: 'text.width' deve essere numerico,> = 0 La mia chiamata alla funzione è simile a: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet lifts all'anno' , cex = 0.6, bty = "n", fmt = "% 0.0f", space_reduction = 4000) Qualcuno può identificare la fonte del problema?
Darryl H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.