Уменьшение расстояния между предметами легенды в R?

9

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

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

Я нашел страницу справки choro.legend, которая гласит fmt: «Формат стиля C для значений, указанных в пределах вышеупомянутых классов классов» .

Так что это должно работать только со значениями моих классов, а не с расстоянием между самими элементами легенды?

ИЛИ каково человеческое значение этого?

Как я могу уменьшить расстояние между моими 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")
maycca
источник
Я немного покопался / экспериментировал с этим. Я нашел это в командах форматирования строк в стиле C: stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/… . Но, похоже, это никак не влияет на расстояние между предметами легенды. Я заметил, что в вашем коде заголовок легенды «Мой заголовок», но на вашем изображении нет заголовка в легенде. Может ли быть проблема здесь? Я сомневаюсь в этом, но это стоит посмотреть.
haff
При дальнейшей проверке использование значения «% 20.1f» создает действительно широкую легенду (например, вашу), а значение «% 0.1f» позволяет получить единицу с элементами легенды, расположенными намного ближе друг к другу. Но вы используете значение «% 0.1f», и ваши предметы расположены далеко друг от друга. Единственное, о чем я мог подумать, - это потенциальный пробел, заполняющий границы ваших ценностей, но я не знаю, почему вы это сделали.
состоится

Ответы:

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) Кто-нибудь может определить источник проблемы?
Дэррил Х.