Ggplot2'deki açıklama öğeleri arasındaki aralığı değiştirmenin bir yolu var mı?


121

Ggplot2'deki açıklama öğeleri arasındaki aralığı değiştirmenin bir yolu var mı? Şu anda sahibim

legend.position ="top" 

otomatik olarak yatay bir gösterge oluşturur. Bununla birlikte, öğelerin aralıkları birbirine çok yakın ve onları nasıl daha uzağa yerleştireceğimi merak ediyorum.


Şimdi optsamortismana tabi tutulmuş mevcut bir çözüme sahip olmak faydalı olacaktır .
geotheory


3
Tung'un şu anda bu konunun altında yer alan cevabında bir Temmuz 2018 güncellemesi var. Hatalar düzeltildi ve yukarıdaki pastebin'deki gibi geçici çözümlere artık gerek yok.
PatrickT

Yanıtlar:


90

ggplot2 v3.0.0Temmuz 2018'de piyasaya sürülen legend.spacing.x, legend.spacing.yve değiştirmek için çalışma seçeneklerine sahiptir legend.text.

Örnek: Açıklama tuşları arasındaki yatay aralığı artırın

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

Not: Boşluğu yalnızca açıklama metninin sağına doğru genişletmek istiyorsanız, stringr::str_pad()

Örnek: Açıklama anahtar etiketlerini en alta taşıyın ve dikey aralığı artırın

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

Örnek: için 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)) 


Dikey göstergeler için ayarlama legend.key.size, aralarındaki dikey boşluğu değil, yalnızca açıklama tuşlarının boyutunu artırır

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

Açıklama tuşları arasındaki mesafeyi artırmak için legend-draw.rişlevde değişiklik yapılması gerekir. Daha fazla bilgi için bu sayıya bakın

# 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
Bunu işaret ettiğiniz için teşekkürler. Bu harika bir yeni özellik, her zaman @ user2568648'in kirli düzeltmesini kullanıyordum, haha!
Tjebo

1
Açıklama tuşları arasındaki dikey aralığı artırma işleviniz, tam olarak istediğim gibi ve kullanım kolaylığı ile çalışan bulduğum tek çözümdür. Teşekkürler!
Docconcoct

69

Ben en iyi seçenek kullanmaktır düşünüyorum guide_legendiçinde guides:

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

Paket default.unityüklemeye gerek yok kullanımına dikkat edin grid.


2
Bunun daha fazla oylamaya ihtiyacı var, diğer cevaplar güncel değil.
Brandon Bertelsen

8
Bu yatay lejantlar için işe yarayabilir. Ancak, grafiğin sağındaki dikey açıklamam için bu, tuşlar arasındaki boşluğu değil, yalnızca anahtarın yüksekliğini artırır. Efsane anahtarlarım hala birbirine çok yakın.
Muhsin Zahid Uğur

9
Mushin'in dediği gibi, bu, diğer cevaplarda olduğu gibi, noktayı kaçırır, eğer efsane DÜŞEY ise, tuşlar arasındaki boşluğu doldurmadan gösterge tuşlarını (örn. Çizgi bölümleri) uzatır.
PatrickT

Geom_line ve geom_point ile birlikte güzel çalışır.
Niels Holst

45

Yatay göstergelerde boşluk eklemek için kullandığım basit bir düzeltme, etiketlere boşluk eklemeniz yeterlidir (aşağıdaki özete bakın):

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

13
Şu ana kadar soruyla ilgilenen tek cevap bu! Bu, pek çok girişler durumunda yararlı olabilir: scale_fill_manual(values=values, labels=setNames(paste(labels, " "), entries)).
SaschaH

2
Teknik olarak pek hoş değil, özellikle bu boşlukları faktör seviyelerine dahil etmeniz gerektiğinde, ancak bunun için çalışan tek çözüm bu.
Patrick Bucher

2
Ya da hayatı biraz daha kolaylaştırmak için str_pad'i kullanabiliriz
Tung

37

Artık pakette optskullanımdan kaldırıldı, bunun yerine ggplot2işlev themekullanılmalıdır:

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

18
Bu çözüm, aralarındaki boşluğun aksine kutuların yüksekliğini / genişliğini değiştirir.
Berk U.

25

Göstergedeki girişler arasına boşluk eklemek için tema öğesinin kenar boşluklarını ayarlayın legend.text.

Her açıklama etiketinin sağına 30 punto boşluk eklemek için (yatay gösterge için yararlı olabilir):

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

Her açıklama etiketinin soluna 30 punto boşluk eklemek için (dikey bir açıklama için yararlı olabilir):

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

bir ggplot2nesne için p. Anahtar kelimeler legend.textve margin.

[Düzenleme ile ilgili not: Bu yanıt ilk gönderildiğinde bir hata vardı. Hata şimdi düzeltildi]


3
Hata şimdi düzeltildi, kabul edilen cevap bu olmalı.
giocomai

1
Ayrıca Tung'un bu konularla ilgili bir Temmuz 2018 güncellemesi için cevabına da bakın.
PatrickT

17

Görünüşe göre en iyi yaklaşım (2018'de) nesnenin legend.key.sizealtında kullanmak theme. (örneğin, buraya bakın ).

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

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

Şunları kullanıyorsanız çok kolaydır 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)

görüntü açıklamasını buraya girin

Ancak, aksi halde bu pek iyi çalışmaz (örneğin, gösterge sembolünüzün gri arka planına ihtiyacınız varsa):

  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

Beyaz karelerin açıklama başlığını (ve değeri artırmaya devam edersek sonunda grafiğin kendisini) engellemeye başladığına dikkat edin.

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

görüntü açıklamasını buraya girin

Yukarıdaki sorunu çözmek için bir çözüm bulamadım ... Bir fikriniz varsa yorumlarda bana bildirin ve buna göre güncelleme yapacağım!

  • Bir şeyleri yeniden katmanlandırmanın bir yolu olup olmadığını merak ediyorum $layers...

legend.keyŞeffaf olun :theme(legend.key = element_rect(size = 30,color=alpha("transparent",0)))
ukosteopath

1
bu en basit cevaptı ve kullanımı en kolay
imo'ydu

14

Koshke'nin ggplot2 ve blogundaki çalışmasından ( Koshke'nin blogu )

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

Tip theme_get()diğer düzenlenebilir efsane özelliklerini görmek için konsolda.


12
Öneri ve Koshke'nin bloguna bağlantı için teşekkürler! Ne yazık ki bu, kutuların boyutunu değiştiriyor gibi görünüyor, ancak öğeler arasındaki aralığı değiştirmiyor.
overflowname

Bir tür üst üste bindirme grobuyla onu "taklit edebilirsiniz". Ama efsanenin içinde fazladan boşluk bırakmanın bir yolu olduğunu sanmıyorum. Bu, ggplot2'nin posta listesinde bulabildiğim tek şey: groups.google.com/forum/?fromgroups#!topic/ggplot2/PhkJpP8zJuM
Brandon Bertelsen

2
Efsaneler arasındaki mesafeyi başarılı bir şekilde artırmak için bunu kullanabilirim. Negatif sayılar kullanmak, göstergeler arasındaki boşluğu azaltmaya yardımcı oldu.
Nova

5

Bunlardan herhangi birini kullanın

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.