R에서 범례 항목 사이의 거리가 줄어 듭니까?


9

패키지를 choropleth()사용하여 R에서 올바른 맵 을 만들려고 GISTools합니다. 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"값을 사용하고 항목이 멀리 떨어져 있습니다. 내가 생각할 수있는 유일한 다른 것은 당신의 가치 앞에 공백을 채우는 잠재적 공백이지만, 왜 당신이 이것을 가질 지 모르겠습니다.
haff

답변:


3

fmt범례 항목의 간격과 관련이 없습니다. 자세한 설명은 C 스타일 문자열 형식화 명령 사용을fmt 참조 하십시오 . 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에 설정된 값에 관계없이 다음과 같은 오류 메시지가 나타납니다. legend in error (x = px, y = py, legend = rep ( "", length ( res)), fill = sh $ cols, : 'text.width'는 숫자 여야합니다,> = 0 내 함수 호출은 다음과 같습니다 , cex = 0.6, bty = "n", fmt = "% 0.0f", space_reduction = 4000) 누구나 문제의 원인을 식별 할 수 있습니까?
Darryl H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.