Zmniejszasz odległość między przedmiotami legendy w R?

9

Próbuję utworzyć poprawną choropleth()mapę w R za pomocą GISToolspakietu. Używam choro.legend()do wyświetlania mojej legendy. Nie mogę jednak utworzyć poprawnego położenia legendy ORAZ / LUB Nie rozumiem roli fmtparametru w mojej choro.legend()funkcji. Wydaje mi się, że fmtmogę zmniejszyć odstęp między kolorami mojej legendy a opisem.

wprowadź opis zdjęcia tutaj

Znalazłem choro.legend stronę pomocy , by państwa fmtjest „format styl C do wartości podanych w wyżej choropleth ograniczeń klasowych” .

Czy to powinno działać z wartościami moich klas, a nie z odległości między samymi przedmiotami z legend?

LUB jakie jest to ludzkie zrozumiałe znaczenie?

Jak mogę zmniejszyć odległość między choro.legend()przedmiotami?

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
źródło
Trochę na tym kopałem / eksperymentowałem. Znalazłem to w poleceniach formatowania ciągów w stylu C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Ale to nie wydaje się mieć żadnego wpływu na odległość między przedmiotami legendy. Zauważam, że w twoim kodzie tytuł legendy to „My Title”, ale na twoim obrazie nie ma tytułu legendy. Czy może tu być problem? Wątpię, ale warto się temu przyjrzeć.
haff
Przy dalszej kontroli użycie wartości „% 20.1f” tworzy naprawdę szeroką legendę (taką jak twoja), a wartość „% 0,1f” tworzy jedną z przedmiotami legendy znacznie bliżej siebie. Ale używasz wartości „% 0,1f”, a twoje przedmioty są daleko od siebie oddalone. Jedyną inną rzeczą, o której mogłem pomyśleć, jest potencjalna biała przestrzeń wypełniająca przód twoich wartości, ale nie wiem, dlaczego miałbyś to mieć.
haff

Odpowiedzi:

3

fmtnie ma nic wspólnego z odstępami między legendami. Szczegółowy opis fmtmożna znaleźć Zastosowanie C-style formatowania tekstu poleceń . Po prostu wklej następujący fragment kodu w Rkonsoli, aby zobaczyć różnice (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()połączenia legend()wewnętrzne. Aby zmniejszyć poziomy odstęp między legendami, należy zmienić text.widthparametr legend()funkcji. Niestety choro.legendnie zawiera parametru do ustawienia na text.widthzewnątrz, lecz oblicza go wewnętrznie. Dodałem space_reductionparametr choro.legendi nieznacznie zmodyfikowałem oryginalną funkcję w następujący sposób:

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

Zapisz ten fragment w pliku skryptu R i sourceto. Odtwarzalny fragment kodu wygląda następująco:

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)

Stopniowo zmniejsz / zwiększ space_reductionparametr, aby osiągnąć pożądany rezultat.

wprowadź opis zdjęcia tutaj

Farid Cheraghi
źródło
Próbowałem użyć funkcji choro.legend, jak opisano powyżej, ale niezależnie od wartości ustawionej dla redukcji spacji, otrzymuję następujący komunikat o błędzie: Błąd w legendzie (x = px, y = py, legend = rep ("", length ( res)), fill = sh $ cols,: 'text.width' musi być liczbowy,> = 0 Moje wywołanie funkcji wygląda następująco: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet lifts per' ' , cex = 0,6, bty = "n", fmt = "% 0,0f", redukcja spacji = 4000) Czy ktoś może zidentyfikować źródło problemu?
Darryl H