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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.