减少R中图例项之间的距离?


9

我正在尝试choropleth()使用GISTools包在R中创建正确的地图。我choro.legend()用来显示我的图例。但是我无法创建正确的图例位置,并且/或者我不了解fmt参数在choro.legend()函数中的作用。在我看来,fmt可以减少我的图例颜色和描述之间的空间。

在此处输入图片说明

我发现choro.legend帮助页面显示fmt“上述choropleth类限制中所述值的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")

我对此做了一些挖掘/实验。我在C样式的字符串格式化命令上发现了此内容:stuff.mit.edu/afs/sipb/project/r-project/lib/R/library/base/…。但这似乎与图例项之间的距离没有任何关系。我确实注意到,在您的代码中,图例的标题为“我的标题”,但在您的图像中,图例上没有标题。这里可能有问题吗?我对此表示怀疑,但值得研究。
haff

在进一步检查时,使用值“%20.1f”会生成一个非常宽的图例(如您的图例),而值“%0.1f”会生成一个图例项距离更近的图例。但是,您使用的值为“%0.1f”,并且您的项之间的距离很远。我唯一想到的另一件事是潜在的空白会填充您的值的前面,但我不知道您为什么会有这个。
哈夫

Answers:


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,图例= rep(“”,length( res)),fill = sh $ cols,:'text.width'必须为数字,> = 0我的函数调用如下:choro.legend(-85.80,45.3,tneffort.shades,title ='每年的吊网索道' ,cex = 0.6,bty =“ n”,fmt =“%0.0f”,space_reduction = 4000)谁能找出问题的根源吗?
Darryl H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.