programing

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

newstyles 2023. 6. 8. 19:25

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

ggplot2에서 범례 항목 사이의 간격을 변경할 수 있는 방법이 있습니까?나는 현재 가지고 있습니다.

legend.position ="top" 

수평 범례가 자동으로 생성됩니다.하지만 물건들의 간격이 매우 가까워서 어떻게 더 간격을 두어야 할지 궁금합니다.

ggplot2 v3.0.0 2018년 7월에 출시된 제품에는 수정할 작업 옵션이 있습니다.legend.spacing.x,legend.spacing.y그리고.legend.text.

2021년 12월 업데이트 - 만들 내용legend.spacing.y작업, 설정해야 합니다.byrow = TRUE해당 guide_dll에 있습니다.이 스레드도 참조하십시오.아래의 예.

예:범례 키 사이의 수평 간격 증가

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

참고: 범례 텍스트의 오른쪽으로만 간격을 확장하려면 다음을 사용합니다.

예:수직 간격 증가(마음)byrow = TRUE)

library(ggplot2)

ggplot(mtcars, aes(y = factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  theme(legend.spacing.y = unit(1.0, 'cm'))  +
  ## important additional element
  guides(fill = guide_legend(byrow = TRUE))

예: 범례 키 레이블을 아래로 이동하고 수직 간격을 늘립니다.

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

예: 용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"
    ))
}

### this step is not needed anymore per tjebo's comment below
### see also: https://ggplot2.tidyverse.org/reference/draw_key.html
# 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(key_glyph = "polygon3") +
  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)

가장 좋은 방법은guide_legend이내에guides:

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

의 사용에 주의합니다.default.unit적재할 필요 없음grid꾸러미

수평 범례에서 공백을 추가하고 레이블에 공백을 추가하는 데 사용하는 간단한 수정입니다(아래 발췌 참조).

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

범례의 항목 사이에 간격을 추가하려면 테마 요소의 여백 조정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")))

당분간ggplot2물건p키워드는.legend.text그리고.margin.

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

이제는opts에서 더 이상 사용되지 않습니다.ggplot2패키지, 함수theme대신 다음을 사용해야 합니다.

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

(2018년) 가장 좋은 접근 방식은 다음과 같습니다.legend.key.size의 밑에theme물건.(예: 여기를 참조하십시오)

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

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

다음을 사용하는 경우에는 매우 간단합니다.

  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...

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()콘솔에서 다른 편집 가능한 범례 속성을 볼 수 있습니다.

다음 중 하나를 사용합니다.

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")

언급URL : https://stackoverflow.com/questions/11366964/is-there-a-way-to-change-the-spacing-between-legend-items-in-ggplot2