Verringern des Abstands zwischen den Elementen der Legende in R?

9

Ich versuche, choropleth()mit dem GISToolsPaket die richtige Karte in R zu erstellen. Ich verwende choro.legend(), um meine Legende anzuzeigen. Ich kann jedoch keine korrekte Legendenplatzierung erstellen, UND / ODER ich verstehe die Rolle von fmtParametern in meiner choro.legend()Funktion nicht. Es scheint mir, dass fmtder Abstand zwischen meinen Legendenfarben und der Beschreibung verringert werden kann.

Geben Sie hier die Bildbeschreibung ein

Ich fand choro.legend Hilfeseite , dass die Staaten fmtsind „für Werte C - Stil - Format in über choropleth Klassengrenzen angegeben“ .

Das sollte also nur mit meinen Klassenwerten funktionieren, nicht mit dem Abstand zwischen den Legendenelementen selbst?

ODER was ist die vom Menschen verständliche Bedeutung davon?

Wie kann ich den Abstand zwischen meinen choro.legend()Gegenständen verringern ?

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
quelle
Ich habe ein wenig gegraben / experimentiert. Ich fand dies bei Zeichenfolgenformatierungsbefehlen im C-Stil: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Dies scheint jedoch keinen Einfluss auf den Abstand zwischen Legendenelementen zu haben. Ich stelle fest, dass in Ihrem Code der Titel der Legende "Mein Titel" lautet, in Ihrem Bild jedoch kein Titel in der Legende. Könnte es hier ein Problem geben? Ich bezweifle es, aber es lohnt sich, es zu untersuchen.
Haff
Bei weiterer Prüfung wird bei Verwendung eines Werts von "% 20.1f" eine wirklich breite Legende (wie bei Ihnen) und bei einem Wert von "% 0.1f" eine Legende erzeugt, bei der die Legendenelemente viel näher beieinander liegen. Sie verwenden jedoch den Wert "% 0.1f" und Ihre Artikel sind weit voneinander entfernt. Das einzige andere, woran ich denken könnte, ist ein potenzieller Leerraum, der die Vorderseite Ihrer Werte auffüllt, aber ich weiß nicht, warum Sie dies haben würden.
Haff

Antworten:

3

fmthat nichts mit dem Abstand von Legendenelementen zu tun. Eine ausführliche Beschreibung finden fmtSie unter Verwenden von Zeichenfolgenformatierungsbefehlen im C-Stil . Fügen Sie einfach das folgende Codefragment in Ihre RKonsole ein, um die Unterschiede zu sehen (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()Anrufe legend()intern. Um den horizontalen Abstand zwischen Legendenelementen zu verringern, sollten Sie den text.widthParameter der legend()Funktion ändern . Leider choro.legendgibt es keinen Parameter zum text.widthexternen Setzen, sondern zum internen Berechnen. Ich habe dem space_reductionParameter einen Parameter hinzugefügt choro.legendund die ursprüngliche Funktion wie folgt leicht geändert:

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

Speichern Sie dieses Snippet in einer R-Skriptdatei und sourcees. Ein reproduzierbares Code-Snippet würde wie folgt aussehen:

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)

Verringern / erhöhen Sie den space_reductionParameter schrittweise , um das gewünschte Ergebnis zu erzielen.

Geben Sie hier die Bildbeschreibung ein

Farid Cheraghi
quelle
Es wurde versucht, die oben beschriebene Funktion choro.legend zu verwenden, aber unabhängig von dem Wert, den ich für space_reduction festgelegt habe, wird die folgende Fehlermeldung angezeigt: Fehler in der Legende (x = px, y = py, legend = rep ("", length () res)), fill = sh $ cols ,: 'text.width' muss numerisch sein,> = 0 Mein Funktionsaufruf sieht aus wie folgt: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet hebt pro Jahr' , cex = 0.6, bty = "n", fmt = "% 0.0f", space_reduction = 4000) Kann jemand die Ursache des Problems identifizieren?
Darryl H