ggplot2에서 범례 항목 사이의 간격을 변경하는 방법이 있습니까?


120

ggplot2에서 범례 항목 사이의 간격을 변경하는 방법이 있습니까? 나는 현재

legend.position ="top" 

수평 범례를 자동으로 생성합니다. 그러나 항목의 간격이 매우 가까워서 어떻게 간격을 두어야할지 궁금합니다.


현재 opts감가 상각 된 해결책을 가지고있는 것이 유용 할 것 입니다.
지리학 2014-06-03


3
현재이 스레드의 맨 아래에있는 Tung의 답변에는 2018 년 7 월 업데이트가 있습니다. 버그가 수정되었으며 위의 pastebin에있는 것과 같은 해키 해결 방법이 더 이상 필요하지 않습니다.
PatrickT

답변:


90

ggplot2 v3.0.02018 년 7 월에 릴리스 된 작업 옵션에는 legend.spacing.x, legend.spacing.ylegend.text.

예 : 범례 키 사이의 가로 간격 늘리기

library(ggplot2)

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'))

참고 : 범례 텍스트 오른쪽의 간격 만 확장하려면 stringr::str_pad()

예 : 범례 키 레이블을 맨 아래로 이동하고 세로 간격 늘리기

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_legend(title = "Cyl",
                             label.position = "bottom",
                             title.position = "left", title.vjust = 1)) 

예 : for scale_fill_xxx&guide_colorbar

ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(fill = hp), pch = I(21), size = 5)+
  scale_fill_viridis_c(guide = FALSE) +
  theme_classic(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(0.5, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_colorbar(title = "HP",
                               label.position = "bottom",
                               title.position = "left", title.vjust = 1,
                               # draw border around the legend
                               frame.colour = "black",
                               barwidth = 15,
                               barheight = 1.5)) 


수직 범례의 경우 설정 legend.key.size하면 범례 키 사이의 수직 공간이 아닌 범례 키의 크기 만 증가합니다.

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key.size = unit(1, "cm"))

범례 키 사이의 거리를 늘리려면 legend-draw.r기능을 수정 해야합니다. 자세한 내용은이 를 참조하십시오.

# function to increase vertical spacing between legend keys
# @clauswilke
draw_key_polygon3 <- function(data, params, size) {
  lwd <- min(data$size, min(size) / 4)

  grid::rectGrob(
    width = grid::unit(0.6, "npc"),
    height = grid::unit(0.6, "npc"),
    gp = grid::gpar(
      col = data$colour,
      fill = alpha(data$fill, data$alpha),
      lty = data$linetype,
      lwd = lwd * .pt,
      linejoin = "mitre"
    ))
}

# register new key drawing function, 
# the effect is global & persistent throughout the R session
GeomBar$draw_key = draw_key_polygon3

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key = element_rect(color = NA, fill = NA),
        legend.key.size = unit(1.5, "cm")) +
  theme(legend.title.align = 0.5)


3
지적 해 주셔서 감사합니다. 이것은 정말 대단한 새로운 기능입니다. 저는 항상 @ user2568648의 dirty-fix를 사용하고있었습니다. 하하!
Tjebo

1
범례 키 사이의 수직 간격을 늘리는 기능은 내가 원하는대로 정확하게 작동하고 사용하기 쉬운 유일한 솔루션입니다. 감사!
Docconcoct

69

가장 좋은 방법은 guide_legend내 에서 사용하는 것 입니다 guides.

p + guides(fill=guide_legend(
                 keywidth=0.1,
                 keyheight=0.1,
                 default.unit="inch")
      )

을 사용하고 패키지 default.unit를로드 할 필요가 없습니다 grid.


2
이것은 더 많은 찬성 투표가 필요하고 다른 답변은 구식입니다.
Brandon Bertelsen

8
이것은 수평 범례에 대해 작동 할 수 있습니다. 그러나 플롯 오른쪽에있는 내 세로 범례의 경우 키 사이의 간격이 아니라 키의 높이 만 증가합니다. 내 전설 키는 여전히 서로 매우 가깝습니다.
Muhsin Zahid Ugur

9
Mushin이 말했듯이 이것은 다른 답변과 마찬가지로 범례가 VERTICAL 이면 키 사이의 공간을 채우지 않고 범례 키 (예 : 선분)를 늘립니다.
PatrickT 2017 년

geom_line 및 geom_point와 함께 잘 작동합니다.
Niels Holst

45

가로 범례에 공백을 추가하는 데 사용하는 간단한 수정은 레이블에 공백을 추가하는 것입니다 (아래 추출 참조).

  scale_fill_manual(values=c("red","blue","white"),
                    labels=c("Label of category 1          ",
                             "Label of category 2          ",
                             "Label of category 3"))

13
이것은 지금까지 질문을 다루는 유일한 대답입니다! 다음 항목이 많은 경우 유용 할 수 있습니다 scale_fill_manual(values=values, labels=setNames(paste(labels, " "), entries))..
SaschaH

2
특히 이러한 공간을 요인 수준에 도입해야하는 경우 기술적으로별로 좋지는 않지만 유일하게 작동하는 솔루션입니다.
Patrick Bucher 2017

2
아니면 사용할 수 str_pad을 조금 더 쉽게 인생을 만들기 위해

37

이제 패키지에서 opts더 이상 사용되지 않으므로 대신 ggplot2함수를 theme사용해야합니다.

library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))

18
이 솔루션은 상자 사이의 간격이 아니라 상자의 높이 / 너비를 변경합니다.
Berk U.

25

범례의 항목 사이에 간격을 추가하려면 테마 요소의 여백을 조정합니다 legend.text.

각 범례 레이블 오른쪽에 30pt의 공백을 추가하려면 (가로 범례에 유용 할 수 있음) :

p + theme(legend.text = element_text(
    margin = margin(r = 30, unit = "pt")))

각 범례 레이블 왼쪽에 30pt의 공간을 추가하려면 (세로 범례에 유용 할 수 있음) :

p + theme(legend.text = element_text(
    margin = margin(l = 30, unit = "pt")))

A의 ggplot2객체 p. 키워드는 legend.textmargin입니다.

[편집에 대한 참고 사항 :이 답변이 처음 게시되었을 때 버그가있었습니다. 이제 버그가 수정되었습니다.]


3
이제 버그가 수정되었습니다. 이것이 허용되는 답변입니다.
giocomai

1
이러한 문제에 대한 2018 년 7 월 업데이트에 대한 Tung의 답변을 참조하십시오.
PatrickT

17

가장 좋은 접근법 (2018 년)은 객체 legend.key.size아래에서 사용 하는 것 theme같습니다. (예 : 여기 참조 ).

#Set-up:
    library(ggplot2)
    library(gridExtra)

    gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) +
        geom_point()

다음을 사용하면 정말 쉽습니다 theme_bw().

  gpbw <- gp + theme_bw()

#Change spacing size:

  g1bw <- gpbw + theme(legend.key.size = unit(0, 'lines'))
  g2bw <- gpbw + theme(legend.key.size = unit(1.5, 'lines'))
  g3bw <- gpbw + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1bw,g2bw,g3bw,nrow=3)

여기에 이미지 설명 입력

그러나 이것은 그렇지 않으면 잘 작동하지 않습니다 (예 : 범례 기호에 회색 배경이 필요한 경우).

  g1 <- gp + theme(legend.key.size = unit(0, 'lines'))
  g2 <- gp + theme(legend.key.size = unit(1.5, 'lines'))
  g3 <- gp + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1,g2,g3,nrow=3)

#Notice that the legend symbol squares get bigger (that's what legend.key.size does). 

#Let's [indirectly] "control" that, too:
  gp2 <- g3
  g4 <- gp2 + theme(legend.key = element_rect(size = 1))
  g5 <- gp2 + theme(legend.key = element_rect(size = 3))
  g6 <- gp2 + theme(legend.key = element_rect(size = 10))

  grid.arrange(g4,g5,g6,nrow=3)   #see picture below, left

흰색 사각형이 범례 제목을 차단하기 시작합니다 (그리고 값을 계속 증가 시키면 결국 그래프 자체).

  #This shows you why:
    gt <- gp2 + theme(legend.key = element_rect(size = 10,color = 'yellow' ))

여기에 이미지 설명 입력

위의 문제를 해결하기위한 해결 방법을 찾지 못했습니다 ... 아이디어가 있으면 댓글로 알려 주시면 그에 따라 업데이트하겠습니다!

  • $layers...를 사용하여 물건을 다시 레이어링하는 방법이 있는지 궁금합니다 .

만들기 기능 legend.key: 투명theme(legend.key = element_rect(size = 30,color=alpha("transparent",0)))
ukosteopath

1
이것은 가장 간단하고 사용하기 쉬운 대답이었습니다.
Blacklivesmatter

14

ggplot2에 대한 Koshke의 작업과 그의 블로그 ( Koshke의 블로그 )에서

... + theme(legend.key.height=unit(3,"line")) # Change 3 to X
... + theme(legend.key.width=unit(3,"line")) # Change 3 to X

theme_get()다른 편집 가능한 범례 속성을 보려면 콘솔에 입력 하십시오.


12
제안 및 Koshke의 블로그 링크에 감사드립니다! 그러나 불행히도 이것은 상자의 크기를 변경하는 것처럼 보이지만 항목 사이의 간격은 변경하지 않습니다.
overflowname

어떤 유형의 오버레이 grob으로 "위조"할 수 있습니다. 하지만 범례 내부에 추가 간격을 두는 방법은 없다고 생각합니다. 이것은 단지 내가 ggplot2의 메일 링리스트에서 찾을 수 그것을 말할 수 있습니다 : groups.google.com/forum/?fromgroups#!topic/ggplot2/PhkJpP8zJuM
브랜든 Bertelsen

2
이것을 사용하여 범례 사이의 간격을 성공적으로 늘릴 수 있습니다. 음수를 사용하면 범례 사이의 간격을 줄이는 데 도움이되었습니다.
Nova

5

다음 중 하나를 사용하십시오.

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.