Mengurangi jarak antara item legenda di R?


9

Saya mencoba membuat choropleth()peta yang benar di R menggunakan GISToolspaket. Saya gunakan choro.legend()untuk menampilkan legenda saya. Namun saya tidak dapat membuat penempatan legenda yang benar, DAN / ATAU Saya tidak mengerti peran fmtparameter dalam choro.legend()fungsi saya . Sepertinya saya yang fmtbisa mengurangi jarak antara warna dan deskripsi legenda saya.

masukkan deskripsi gambar di sini

Saya menemukan halaman bantuan choro.legend yang menyatakan fmtadalah "format gaya C untuk nilai-nilai yang dinyatakan dalam batas kelas choropleth di atas" .

Jadi ini seharusnya hanya bekerja dengan nilai kelas saya, bukan oleh jarak antara item legenda itu sendiri?

ATAU apa makna yang bisa dimengerti manusia dari ini?

Bagaimana saya bisa mengurangi jarak antara choro.legend()barang saya?

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

Saya melakukan sedikit penggalian / percobaan pada ini. Saya menemukan ini pada perintah pemformatan string gaya C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Tapi ini sepertinya tidak ada kaitannya dengan jarak antara item legenda. Saya memperhatikan bahwa dalam kode Anda, judul legenda adalah 'Judul Saya' tetapi dalam gambar Anda tidak ada judul pada legenda. Mungkinkah ada masalah di sini? Saya meragukannya, tetapi ada baiknya melihat.
haff

Pada pemeriksaan lebih lanjut, menggunakan nilai "% 20.1f" menghasilkan legenda yang sangat luas (seperti milik Anda) dan nilai "% 0.1f" menghasilkan satu dengan item legenda yang lebih dekat satu sama lain. Tetapi Anda menggunakan nilai "% 0,1f" dan item Anda berjarak berjauhan. Satu-satunya hal lain yang bisa saya pikirkan adalah ruang putih potensial yang melapisi bagian depan nilai-nilai Anda, tetapi saya tidak tahu mengapa Anda menginginkan ini.
haff

Jawaban:


3

fmttidak ada hubungannya dengan jarak item legenda. Untuk penjelasan rinci tentang fmtsilakan lihat Menggunakan Perintah Memformat String C-style . Cukup tempelkan cuplikan kode berikut di Rkonsol Anda untuk melihat perbedaannya (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()panggilan legend()internal. Untuk mengurangi jarak horizontal antara item legenda, Anda harus mengubah text.widthparameter legend()fungsi. Sayangnya choro.legendtidak menyediakan parameter untuk ditetapkan secara text.widtheksternal, melainkan menghitung secara internal. Saya menambahkan space_reductionparameter ke choro.legenddan sedikit memodifikasi fungsi asli sebagai berikut:

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

Simpan potongan ini dalam file skrip R dan sourceitu. Cuplikan kode yang dapat direproduksi akan seperti berikut:

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)

Secara bertahap memperkecil / menambah space_reductionparameter untuk mencapai hasil yang diinginkan.

masukkan deskripsi gambar di sini


Mencoba menggunakan fungsi choro.legend seperti diuraikan di atas, tetapi terlepas dari nilai yang saya tetapkan untuk space_reduction, saya mendapatkan pesan galat berikut: Kesalahan dalam legenda (x = px, y = py, legend = rep ("", panjang ( res)), fill = sh $ cols,: 'text.width' harus berupa angka,> = 0 Panggilan fungsi saya terlihat seperti: choro.legend (-85.80,45.3, tneffort.shades, title = 'Trapnet lifts per year' , cex = 0,6, bty = "n", fmt = "% 0,0f", space_reduction = 4000) Adakah yang bisa mengidentifikasi sumber masalahnya?
Darryl H
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.