Зменшення відстані між предметами легенди в R?


9

Я намагаюся створити правильну choropleth()карту в R за допомогою GISToolsпакету. Я використовую choro.legend()для відображення своєї легенди. Однак я не можу створити ні правильне розташування легенди, і / або не розумію роль fmtпараметра в моїй choro.legend()функції. Мені здається, це fmtможе зменшити пробіл між кольорами моєї легенди та описом.

введіть тут опис зображення

Я знайшов choro.legend сторінки довідки , що держави fmtє «форматом типу C для значень , зазначених у вище меж choropleth класу» .

Отже, це має просто працювати зі значеннями моїх класів, а не від відстані між елементами легенди?

АЛЕ який людський зрозумілий сенс цього?

Як я можу зменшити відстань між choro.legend()предметами моїх ?

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

Я трохи копав / експериментував на цьому. Я знайшов це в командах форматування рядків у стилі C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Але це, мабуть, не має відношення до відстані між предметами легенди. Я помічаю, що у вашому коді назва легенди - «Мій заголовок», але на вашому зображенні немає титулу легенди. Чи може тут виникнути проблема? Я сумніваюсь у цьому, але це варто вивчити.
haff

При подальшому огляді, використовуючи значення "% 20.1f", створюється дійсно широка легенда (як і ваша), а значення "% 0,1f" створює один з предметами легенди набагато ближче один до одного. Але ви використовуєте значення "% 0,1f", і ваші предмети розташовані далеко один від одного. Єдине інше, що я міг би придумати, - це потенційний простір, що підбиває перед вашими цінностями, але я не знаю, чому б у вас це було.
haff

Відповіді:


3

fmtне має нічого спільного з інтервалом елементів легенди. Детальний опис fmtдивіться Використання C-стилю форматування рядків команд . Просто вставте наступний фрагмент коду у Rконсоль, щоб побачити відмінності (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()дзвінки legend()внутрішньо. Для зменшення горизонтального проміжку між елементами легенди слід змінити text.widthпараметр legend()функції. На жаль choro.legend, не надає параметр для встановлення text.widthзовні, а обчислює його всередині. Я додав space_reductionпараметр до choro.legendі трохи змінив початкову функцію так:

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

Збережіть цей фрагмент у файлі сценарію R та sourceйого. Розширюваний фрагмент коду буде таким:

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)

Поступово зменшуйте / збільшуйте space_reductionпараметр для досягнення бажаного результату.

введіть тут опис зображення


Спробував використовувати функцію choro.legend, як описано вище, але незалежно від значення, яке я встановив для space_reduction, я отримую таке повідомлення про помилку: Помилка в легенді (x = px, y = py, legend = rep ("", length ( res)), fill = sh $ cols,: 'text.width' має бути числовим,> = 0 Мій виклик функції виглядає так: choro.legend (-85.80,45.3, tneffort.shades, title = 'Підйомники Trapnet на рік' , cex = 0,6, bty = "n", fmt = "% 0,0f", space_reduction = 4000) Чи може хтось визначити джерело проблеми?
Darryl H
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.