มีวิธีเปลี่ยนระยะห่างระหว่างรายการในตำนานใน ggplot2 หรือไม่?


121

มีวิธีเปลี่ยนระยะห่างระหว่างรายการในตำนานใน ggplot2 หรือไม่? ฉันมี

legend.position ="top" 

ซึ่งจะสร้างคำอธิบายแนวนอนโดยอัตโนมัติ อย่างไรก็ตามระยะห่างของรายการใกล้กันมากและฉันสงสัยว่าจะเว้นระยะห่างออกจากกันได้อย่างไร


มันจะมีประโยชน์หากมีวิธีแก้ปัญหาในปัจจุบันที่optsคิดค่าเสื่อมราคาแล้ว
geotheory

ที่นี่: pastebin.com/NnxMiTeH
PatrickT

3
คำตอบของ Tung ที่ด้านล่างของหัวข้อนี้มีการอัปเดตประจำเดือนกรกฎาคม 2018 ข้อบกพร่องได้รับการแก้ไขแล้วและไม่จำเป็นต้องใช้วิธีแก้ปัญหาแบบแฮ็กเช่นเดียวกับใน Pastebin ด้านบนอีกต่อไป
PatrickT

คำตอบ:


90

ggplot2 v3.0.0ปล่อยออกมาในปี 2018 ได้กรกฏาคมตัวเลือกการทำงานเพื่อแก้ไข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)) 

ตัวอย่าง: สำหรับ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 ฮ่า ๆ !
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 กล่าวไว้สิ่งนี้จะพลาดประเด็นเช่นเดียวกับคำตอบอื่น ๆ หากคำอธิบายแผนภูมิเป็นแนวตั้งมันจะขยายคีย์คำอธิบายแผนภูมิ (เช่นส่วนของบรรทัด) โดยไม่ต้องเว้นช่องว่างระหว่างคีย์
PatrickT

ทำงานร่วมกันได้ดีกับ 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

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
โซลูชันนี้เปลี่ยนความสูง / ความกว้างของกล่องเมื่อเทียบกับระยะห่างระหว่างกล่อง
เบิร์ก 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")))

สำหรับวัตถุggplot2 pคำหลักที่มีและlegend.textmargin

[หมายเหตุเกี่ยวกับการแก้ไข: เมื่อโพสต์คำตอบนี้ครั้งแรกมีข้อบกพร่อง แก้ไขข้อบกพร่องแล้ว]


3
ขณะนี้ข้อบกพร่องได้รับการแก้ไขแล้วนี่ควรเป็นคำตอบที่ยอมรับได้
giocomai

1
ดูคำตอบของ Tung สำหรับการอัปเดตเกี่ยวกับเรื่องเหล่านี้ในเดือนกรกฎาคม 2018
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
นี่เป็นคำตอบที่ตรงไปตรงมาที่สุดและใช้งานง่ายที่สุด imo
Blacklivesmatter

14

จากผลงานของ Koshke ใน ggplot2 และบล็อกของเขา ( บล็อกของ 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
Brandon Bertelsen

2
ฉันสามารถใช้สิ่งนี้เพื่อเพิ่มระยะห่างระหว่างตำนานได้สำเร็จ การใช้ตัวเลขติดลบช่วยลดระยะห่างระหว่างตำนาน
โนวา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.