มีวิธีเปลี่ยนระยะห่างระหว่างรายการในตำนานใน ggplot2 หรือไม่? ฉันมี
legend.position ="top"
ซึ่งจะสร้างคำอธิบายแนวนอนโดยอัตโนมัติ อย่างไรก็ตามระยะห่างของรายการใกล้กันมากและฉันสงสัยว่าจะเว้นระยะห่างออกจากกันได้อย่างไร
มีวิธีเปลี่ยนระยะห่างระหว่างรายการในตำนานใน ggplot2 หรือไม่? ฉันมี
legend.position ="top"
ซึ่งจะสร้างคำอธิบายแนวนอนโดยอัตโนมัติ อย่างไรก็ตามระยะห่างของรายการใกล้กันมากและฉันสงสัยว่าจะเว้นระยะห่างออกจากกันได้อย่างไร
คำตอบ:
ggplot2 v3.0.0
ปล่อยออกมาในปี 2018 ได้กรกฏาคมตัวเลือกการทำงานเพื่อแก้ไขlegend.spacing.x
, และlegend.spacing.y
legend.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)
ฉันคิดว่าตัวเลือกที่ดีที่สุดคือใช้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"))
scale_fill_manual(values=values, labels=setNames(paste(labels, " "), entries))
นี้อาจจะเป็นประโยชน์ในกรณีของหลายรายการ:
ตอนนี้opts
เลิกใช้งานในggplot2
แพ็คเกจแล้วtheme
ควรใช้ฟังก์ชันแทน:
library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))
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
[หมายเหตุเกี่ยวกับการแก้ไข: เมื่อโพสต์คำตอบนี้ครั้งแรกมีข้อบกพร่อง แก้ไขข้อบกพร่องแล้ว]
ดูเหมือนแนวทางที่ดีที่สุด (ในปี 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)))
จากผลงานของ 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()
คอนโซลเพื่อดูแอตทริบิวต์คำอธิบายอื่น ๆ ที่แก้ไขได้
ใช้สิ่งเหล่านี้
legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")
opts
คิดค่าเสื่อมราคาแล้ว