fmt
nie ma nic wspólnego z odstępami między legendami. Szczegółowy opis fmt
można znaleźć Zastosowanie C-style formatowania tekstu poleceń . Po prostu wklej następujący fragment kodu w R
konsoli, 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.width
parametr legend()
funkcji. Niestety choro.legend
nie zawiera parametru do ustawienia na text.width
zewnątrz, lecz oblicza go wewnętrznie. Dodałem space_reduction
parametr choro.legend
i 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 source
to. 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_reduction
parametr, aby osiągnąć pożądany rezultat.