Ggplot2 içindeki bireysel faset üzerine metin açıklama


150

Aşağıdaki kod ile arsanın son yüzüne bazı metin açıklama eklemek istiyorum:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p <- p + annotate("text", label = "Test", size = 4, x = 15, y = 5)
print(p)

resim açıklamasını buraya girin

Ancak bu kod her yönün metnine açıklama ekler. Ek açıklama metnini yalnızca tek bir yüze nasıl alacağımı yönlendirirseniz çok memnun olurum.


1
Bu henüz uygulanmadığına inanıyorum , bu yüzden metin ile bir veri çerçevesi ve yönlü değişken için bir sütun oluşturmak için denenmiş ve gerçek bir yöntem başvurmak zorunda kalacağından şüpheleniyorum.
joran

Yanıtlar:


144

Genellikle böyle bir şey yapardınız:

ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text")

Faktör değişkenini tamamen belirtmeden çalışmalıdır, ancak muhtemelen bazı uyarılar verecektir:

resim açıklamasını buraya girin


2
Benim yönlü arsa geom_text () kullanmaya çalıştığınızda bazı bulanık etiketlere koşmak gibi görünüyor. Burada tartışılan aynı sorun ( groups.google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4 ) ve ek açıklama ("metin", ...) kullanılarak çözüldü. Başka biri geom_text () ile bulanık etiketler alıyor mu?
Margaret

6
@Margaret Genellikle, ggplot'a, orijinal veri çerçevenizdeki (satırlar, çizgiler vb.) Her satır için her etiketin bir kopyasını çizmesini yanlışlıkla söylemişsinizdir. geom_textSadece bir satır ile ayrı bir veri çerçevesi geçirdiğimi unutmayın.
joran

3
Tamam, teşekkürler. Ya yönlü arsa üzerine 3 farklı etiket koymak istersen? Her satırda yönleri ve benzersiz etiketleri olduğu kadar çok satır içeren bir veri çerçevesi denedim. Belki de buna ayrı bir soru olarak başlamalıyım.
Margaret

8
Çözümünüz için teşekkürler. Bunu kullanarak da yapabilir miyim merak ediyorum annotate()...?
polarize

2
@ user3420448 Aynı şekilde, her yönlü değişken için değerleri belirtmeniz yeterlidir.
joran

107

İşte metin ek açıklamaları olmayan çizim:

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_grid(. ~ cyl) +
  theme(panel.spacing = unit(1, "lines"))
p

metin ek açıklamaları olmadan çizim yapma

Metin ek açıklamalarını saklamak için ek bir veri çerçevesi oluşturalım:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8)
)
p + geom_text(
  data    = dat_text,
  mapping = aes(x = -Inf, y = -Inf, label = label),
  hjust   = -0.1,
  vjust   = -1
)

kenarlarda metin açıklamaları içeren çizim

Alternatif olarak, her bir etiketin konumunu manuel olarak belirleyebiliriz:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8),
  x     = c(20, 27.5, 25),
  y     = c(4, 4, 4.5)
)

p + geom_text(
  data    = dat_text,
  mapping = aes(x = x, y = y, label = label)
)

elle konumlandırılmış metin etiketleri içeren çizim

Grafikleri iki yön boyunca da etiketleyebiliriz:

dat_text <- data.frame(
  cyl   = c(4, 6, 8, 4, 6, 8),
  am    = c(0, 0, 0, 1, 1, 1)
)
dat_text$label <- sprintf(
  "%s, %s cylinders",
  ifelse(dat_text$am == 0, "automatic", "manual"),
  dat_text$cyl
)
p +
  facet_grid(am ~ cyl) +
  geom_text(
    size    = 5,
    data    = dat_text,
    mapping = aes(x = Inf, y = Inf, label = label),
    hjust   = 1.05,
    vjust   = 1.5
  )

iki değişkenle faset

Notlar:

  • Sen kullanabilirsiniz -Infve Infbir panelin kenarlarında metni konumlandırmak için.
  • Sen kullanabilirsiniz hjustve vjustmetin gerekçe ayarlayın.
  • Metin etiketi veri çerçevesinde veya dat_textile çalışan bir sütun olmalıdır .facet_grid()facet_wrap()

6
Bu cevap, her adımda ne kadar açık bir şekilde ilerlediğine dair kabul edilen cevaptan (açıkçası ikisi arasında 5 yıllık bir fark) üstündür. Ayrıca daha fazla netlik ve açıklamalar.
Brandon

1
Eğer birden fazla satır metin eklemek isterseniz, emin senin olun colnames()metinde data.framesize arsa üzeresiniz verilerin eşleşir.
Kots

Bunu kendi yönlerimden bir tanesi için yapmaya çalıştığımda ek açıklama ortaya çıkıyor, ancak gerçek noktalar kayboluyor (veya gizleniyor mu?).
Ben G

Ben G, kodunuzu ve rakamınızı paylaşmak için yeni bir gönderi yapmayı düşünebilirsiniz.
Kamil Slowikowski

36

Herhangi biri raporları veya yayınları yönleriyle etiketlemenin kolay bir yolunu arıyorsa, egg( CRAN ) paketinin oldukça şık tag_facet()ve tag_facet_outside()işlevleri vardır.

library(ggplot2)

p <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(. ~ am) +
  theme_bw(base_size = 12)

# install.packages('egg', dependencies = TRUE)
library(egg)

İçindeki etiket

Varsayılan

tag_facet(p)

Not: Eğer şerit metin ve arka plan tutmak istiyorsanız, eklemeyi deneyin strip.textvestrip.background geri themeveya kaldırma theme(strip.text = element_blank(), strip.background = element_blank())Orijinalden tag_facet()fonksiyonu.

tag_facet <- function(p, open = "(", close = ")", tag_pool = letters, x = -Inf, y = Inf, 
                      hjust = -0.5, vjust = 1.5, fontface = 2, family = "", ...) {

  gb <- ggplot_build(p)
  lay <- gb$layout$layout
  tags <- cbind(lay, label = paste0(open, tag_pool[lay$PANEL], close), x = x, y = y)
  p + geom_text(data = tags, aes_string(x = "x", y = "y", label = "label"), ..., hjust = hjust, 
                vjust = vjust, fontface = fontface, family = family, inherit.aes = FALSE) 
}

Sağ üste hizala ve Romen rakamlarını kullan

tag_facet(p, x = Inf, y = Inf, 
          hjust = 1.5,
          tag_pool = as.roman(1:nlevels(factor(mtcars$am))))

Sol altta hizala ve büyük harfler kullan

tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1,
          open = "", close = ")",
          tag_pool = LETTERS)

Kendi etiketlerinizi tanımlayın

my_tag <- c("i) 4 cylinders", "ii) 6 cyls")
tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1, hjust = -0.25,
          open = "", close = "",
          fontface = 4,
          size = 5,
          family = "serif",
          tag_pool = my_tag)

Dışında etiketle

p2 <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(cyl ~ am, switch = 'y') +
  theme_bw(base_size = 12) +
  theme(strip.placement = 'outside')

tag_facet_outside(p2)

Düzenleme : yapışkan etiket paketini kullanarak başka bir alternatif ekleme

- `.n` numbers the facets numerically: `"1"`, `"2"`, `"3"`...
- `.l` numbers the facets using lowercase letters: `"a"`, `"b"`, `"c"`...
- `.L` numbers the facets using uppercase letters: `"A"`, `"B"`, `"C"`...
- `.r` numbers the facets using lowercase Roman numerals: `"i"`, `"ii"`, `"iii"`...
- `.R` numbers the facets using uppercase Roman numerals: `"I"`, `"II"`, `"III"`...

# devtools::install_github("rensa/stickylabeller")
library(stickylabeller)

ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_wrap(. ~ am, 
             labeller = label_glue('({.l}) am = {am}')) +
  theme_bw(base_size = 12)

Reprex paketi tarafından oluşturuldu (v0.2.1)


2
Source, "Fasetleri etiketlemek için ggplot'a sahte bir metin katmanı ekler ve faset şeritleri boş olarak ayarlar." Ergo, kaybetmek istemediğiniz özel faset etiket şeritleriniz varsa, komut dosyasını tag_facetnixing ile düzenleyinstrip.text = element_blank()
CrunchyTopping

@CrunchyTopping Bu aslında aradığım şapka, ama benim için çalışmıyor gibi görünüyor:Warning: Ignoring unknown parameters: strip.text
efrem

1
Yukarıdaki sorunlarımı cevaplamak için ... Bu yazı şeritleri nasıl saklayacağınızı güzel bir şekilde açıklar: stackoverflow.com/a/56064130/3609450
efrem

22

Ben yukarıdaki cevap için laboratuvar = "Metin" işe yaramaz olduğunu düşünüyorum, aşağıdaki kod da tamam.

ann_text <- data.frame(mpg = 15,wt = 5,
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text" )

Ancak, farklı alt grafiklerde farklı etiketleme yapmak istiyorsanız, bu şekilde uygun olacaktır:

ann_text <- data.frame(mpg = c(14,15),wt = c(4,5),lab=c("text1","text2"),
                       cyl = factor(c(6,8),levels = c("4","6","8")))
p + geom_text(data = ann_text,aes(label =lab) )

7
Önceden verilen ve kabul edilen cevaba kıyasla çözümünüzün neler sunduğunu derinlemesine anlatmalısınız.
Sascha Wolf

3
Teşekkürler, bu farklı alt grafikleri etiketlemek için kullanışlıdır.
Deathkill14

Bazı nedenlerden dolayı, bunu yaptığımda, cyl = 2 ve cyl = 3 faktörleri için (boş) yönler ekler.
emudrak

6

Etiket veri çerçevesinin nasıl çalıştığını netleştirmek için joran'ın mükemmel cevabına biraz genişleyerek.

Sırasıyla "mpg" ve "wt" yi x ve y koordinatları olarak düşünebilirsiniz (Kamil'in de mükemmel cevabında olduğu gibi, orijinal değişken adlarını yeniden adlandırmaktan daha kolay buluyorum). Etiket başına bir satıra ihtiyacınız vardır ve "cyl" sütununda, her satırın hangi fasetle ilişkili olduğu gösterilir.

ann_text<-data.frame(mpg=c(25,15),wt=c(3,5),cyl=c(6,8),label=c("Label 1","Label 2"))

ann_text
>  mpg wt cyl  label
>  25  3   6   Label 1
>  15  5   8   Label 2

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))
p + geom_text(data = ann_text,label=ann_text$label)

etiketleri ile çizim


2

eggPaketi bilmiyordum , bu yüzden burada sade bir ggplot2paket çözümü var

library(tidyverse)
library(magrittr)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))
bind_cols(
Data1 %>% gather("Vars","Data_1"),
Data2 %>% gather("Vars","Data_2")
) %>% select(-Vars1) -> Data_combined
Data_combined %>%
  group_by(Vars) %>%
  summarise(r=cor(Data_1,Data_2),
            r2=r^2,
            p=(pt(abs(r),nrow(.)-2)-pt(-abs(r),nrow(.)-2))) %>%
  mutate(rlabel=paste("r:",format(r,digits=3)),
         plabel=paste("p:",format(p,digits=3))) ->
  label_df 
label_df %<>% mutate(x=60,y=190)
Data_combined %>%
  ggplot(aes(x=Data_1,y=Data_2,color=Vars)) +
  geom_point() + 
  geom_smooth(method="lm",se=FALSE) +
  geom_text(data=label_df,aes(x=x,y=y,label=rlabel),inherit.aes = FALSE) + 
  geom_text(data=label_df,aes(x=x,y=y-10,label=plabel),inherit.aes = FALSE) + 
    facet_wrap(~ Vars)
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.