Есть ли способ изменить расстояние между элементами легенды в ggplot2?
Есть ли способ изменить расстояние между элементами легенды в ggplot2? В настоящее время у меня
legend.position ="top"
который автоматически создает горизонтальную легенду. Тем не менее, расстояние между пунктами очень близко друг к другу, и мне интересно, как их расстояние дальше.
Ответы
Ответ 1
Я думаю, что лучший вариант - использовать guide_legend
внутри guides
:
p + guides(fill=guide_legend(
keywidth=0.1,
keyheight=0.1,
default.unit="inch")
)
Обратите внимание на использование default.unit
, не нужно загружать пакет grid
.
Ответ 2
Простое исправление, которое я использую для добавления пространства в горизонтальные легенды, просто добавьте пробелы в метки (см. извлечение ниже):
scale_fill_manual(values=c("red","blue","white"),
labels=c("Label of category 1 ",
"Label of category 2 ",
"Label of category 3"))
Ответ 3
Теперь, когда opts
устарел в пакете ggplot2
, вместо него следует использовать функцию theme
:
library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))
Ответ 4
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_viridis_d("Cyl") +
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_viridis_d("Cyl") +
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(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(fill = factor(cyl), x = cyl) +
geom_bar() +
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(fill = factor(cyl), x = cyl) +
geom_bar() +
theme(legend.key = element_rect(color = NA, fill = NA),
legend.key.size = unit(1.5, "cm"))
![]()
Ответ 5
Чтобы добавить расстояние между записями в легенде, отрегулируйте поля элемента 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
.
[Примечание о редактировании: когда этот ответ был впервые опубликован, произошла ошибка. Теперь исправлена ошибка]
Ответ 6
Из Кошке работают над ggplot2 и его блогом (блог Кошке)
... + theme(legend.key.height=unit(3,"line")) # Change 3 to X
... + theme(legend.key.width=unit(3,"line")) # Change 3 to X
Введите theme_get()
в консоли, чтобы увидеть другие доступные атрибуты легенды.
Ответ 7
Похоже, лучший подход (в 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)
![enter image description here]()
Однако это не так хорошо работает (например, если вам нужен серый фон на символе легенды):
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 what legend.key.size does).
#Let [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' ))
![enter image description here]()
Я не нашел рабочего решения для устранения вышеуказанной проблемы... Дайте мне знать в комментариях, если у вас есть идея, и я буду обновлять соответственно!
- Интересно, есть ли способ переделать вещи, используя
$layers
...
Ответ 8
Используйте любой из этих
legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")