การใส่คำอธิบายประกอบข้อความลงในแต่ละด้านใน ggplot2


150

ฉันต้องการใส่คำอธิบายประกอบข้อความในส่วนสุดท้ายของพล็อตด้วยรหัสต่อไปนี้:

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)

ป้อนคำอธิบายรูปภาพที่นี่

แต่รหัสนี้จะใส่คำอธิบายประกอบข้อความในทุกแง่มุม ฉันจะขอขอบคุณอย่างมากหากคุณแนะนำวิธีการรับข้อความอธิบายประกอบในแง่มุมเดียว


1
ฉันเชื่อว่ายังไม่ได้ใช้งานดังนั้นฉันสงสัยว่าคุณจะต้องหันไปใช้วิธีการทดลองและความจริงในการสร้างเฟรมข้อมูลด้วยข้อความและคอลัมน์สำหรับตัวแปร faceting
joran

คำตอบ:


144

โดยทั่วไปแล้วคุณจะทำสิ่งนี้:

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

ควรทำงานโดยไม่ระบุตัวแปรปัจจัยอย่างสมบูรณ์ แต่อาจมีคำเตือนบางอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่


2
ฉันดูเหมือนจะมีฉลากเบลอ ๆ เมื่อฉันพยายามใช้ geom_text () บนพล็อตเหลี่ยมเพชรพลอยของฉัน เป็นปัญหาเดียวกันที่กล่าวถึงที่นี่ ( groups.google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4 ) และได้รับการแก้ไขโดยใช้คำอธิบายประกอบ ("text", ... ) มีใครได้รับป้ายกำกับพร่ามัวด้วย geom_text () หรือไม่
Margaret

6
@ มาร์กาเร็ตโดยปกตินั่นเป็นเพราะคุณบอกให้ ggplot เข้าใจผิดว่าจะพล็อตสำเนาของแต่ละป้ายกำกับสำหรับทุกแถวในกรอบข้อมูลดั้งเดิมของคุณ (อันที่มีจุดเส้น ฯลฯ ) โปรดทราบว่าฉันส่งเฟรมข้อมูลแยกต่างหากgeom_textโดยมีเพียงแถวเดียว
joran

3
ตกลงฉันได้รับ - ขอบคุณ ถ้าคุณต้องการใส่ 3 ป้ายกำกับต่าง ๆ บนพล็อตเหลี่ยมเพชรพลอยของคุณ ฉันลองใช้ dataframe ที่มีหลายแถวเท่าที่ฉันมี facets และเลเบลเฉพาะในแต่ละแถว บางทีฉันควรเริ่มจากคำถามแยกต่างหาก
Margaret

8
ขอบคุณสำหรับการแก้ปัญหาของคุณ ฉันสงสัยว่าฉันสามารถทำสิ่งนี้โดยใช้annotate()...
โพลาไรซ์

2
@ user3420448 เช่นเดียวกันคุณเพียงแค่ต้องระบุค่าสำหรับตัวแปร faceting แต่ละตัว
joran

107

นี่คือพล็อตที่ไม่มีคำอธิบายประกอบข้อความ:

library(ggplot2)

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

จุดที่ไม่มีหมายเหตุประกอบข้อความ

มาสร้างเฟรมข้อมูลเพิ่มเติมเพื่อเก็บหมายเหตุประกอบข้อความ:

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
)

พล็อตพร้อมคำอธิบายประกอบข้อความที่ขอบ

หรืออีกวิธีหนึ่งเราสามารถระบุตำแหน่งของแต่ละป้ายกำกับด้วยตนเอง:

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

พล็อตพร้อมป้ายข้อความที่จัดวางด้วยตนเอง

นอกจากนี้เรายังสามารถติดฉลากแปลงข้ามสองแง่มุม:

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
  )

ด้านโดยสองตัวแปร

หมายเหตุ:

  • คุณสามารถใช้-InfและInfวางข้อความที่ขอบของแผง
  • คุณสามารถใช้hjustและvjustเพื่อปรับการจัดชิดขอบข้อความ
  • กรอบข้อมูลป้ายข้อความdat_textควรจะมีคอลัมน์ที่ทำงานร่วมกับคุณหรือfacet_grid()facet_wrap()

6
คำตอบนี้เหนือกว่าคำตอบที่ยอมรับ (เห็นได้ชัดว่ามีความแตกต่างระหว่าง 5 ปี) สำหรับความชัดเจนในแต่ละขั้นตอน ความชัดเจนและคำอธิบายที่มากขึ้น
Brandon

1
หากคุณต้องการเพิ่มข้อความในหลายแถวตรวจสอบให้แน่ใจว่าcolnames()ข้อความของคุณdata.frameตรงกับข้อมูลที่คุณกำลังจะลงจุด
Kots

เมื่อฉันลองทำสิ่งนี้เพื่อหาหนึ่งในแง่มุมของฉันคำอธิบายประกอบจะปรากฏขึ้น แต่คะแนนจริงหายไป (หรือบดบัง?)
เบ็นจี

คุณอาจลองสร้างโพสต์ใหม่เพื่อแบ่งปันรหัสและรูปภาพของคุณ
Kamil Slowikowski

36

หากใครที่กำลังมองหาวิธีที่ง่ายในแง่มุมฉลากสำหรับรายงานหรือสิ่งพิมพ์egg( CRAN ) แพคเกจมีสวยเก๋tag_facet()และtag_facet_outside()ฟังก์ชั่น

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)

ติดแท็กภายใน

ค่าเริ่มต้น

tag_facet(p)

หมายเหตุ:หากคุณต้องการเก็บแถบข้อความและพื้นหลังไว้ให้ลองเพิ่มstrip.textและstrip.backgroundย้อนกลับthemeหรือลบออกtheme(strip.text = element_blank(), strip.background = element_blank())จากtag_facet()ฟังก์ชั่นดั้งเดิม

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

จัดแนวด้านบนขวาและใช้ตัวเลขโรมัน

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

จัดแนวซ้ายล่างและใช้อักษรตัวพิมพ์ใหญ่

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

กำหนดแท็กของคุณเอง

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)

ติดแท็กด้านนอก

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)

แก้ไข : การเพิ่มทางเลือกอื่นโดยใช้แพ็คเกจstickylabeller

- `.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 (v0.2.1)


2
ที่มาบอกว่า "เพิ่มเลเยอร์ข้อความปลอมไปยัง ggplot เพื่อติดฉลาก facets และตั้งค่าแถบ facet ให้ว่างเปล่า" Ergo ถ้าคุณมีแถบ facet label แบบกำหนดเองที่คุณไม่ต้องการเสียให้แก้ไขสคริปต์tag_facetโดย nixingstrip.text = element_blank()
CrunchyTopping

@ CrunchyTopping นี่คือหมวกที่ฉันกำลังมองหา แต่ดูเหมือนจะไม่เหมาะกับฉัน:Warning: Ignoring unknown parameters: strip.text
efrem

1
หากต้องการตอบปัญหาของฉันด้านบน ... โพสต์นี้อธิบายวิธีการเก็บแถบอย่างดี: stackoverflow.com/a/56064130/3609450
efrem

22

ฉันคิดว่าคำตอบข้างต้น lab = "Text" นั้นไม่มีประโยชน์อะไรรหัสด้านล่างก็โอเค

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

อย่างไรก็ตามหากคุณต้องการติดป้ายกำกับที่แตกต่างกันในกราฟย่อยที่แตกต่างกันก็จะเป็นเช่นนี้:

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
คุณควรอธิบายในเชิงลึกว่าโซลูชันของคุณนำเสนอเป็นอย่างไรเมื่อเปรียบเทียบกับคำตอบที่ได้รับและยอมรับแล้ว
Sascha Wolf

3
ขอบคุณสิ่งนี้มีประโยชน์สำหรับการติดป้ายกราฟย่อยที่แตกต่างกัน
Deathkill14

ด้วยเหตุผลบางอย่างเมื่อฉันทำเช่นนี้มันจะเพิ่ม (ว่าง) facets สำหรับปัจจัย cyl = 2 และ cyl = 3
emudrak

6

ขยายคำตอบที่ยอดเยี่ยมของ joran เล็กน้อยเพื่อชี้แจงวิธีการทำงานของฉลากข้อมูล

คุณสามารถนึกถึง "mpg" และ "wt" เป็นพิกัด x และ y ตามลำดับ (ฉันพบว่าการติดตามชื่อตัวแปรดั้งเดิมได้ง่ายกว่าการเปลี่ยนชื่อพวกมันเช่นเดียวกับคำตอบที่ยอดเยี่ยมของ Kamil) คุณต้องมีหนึ่งแถวต่อป้ายกำกับและคอลัมน์ "cyl" แสดงให้เห็นว่า facet แต่ละแถวเชื่อมโยงกับอะไร

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)

พล็อตที่มีฉลาก


2

ฉันไม่ทราบเกี่ยวกับeggแพคเกจดังนั้นนี่เป็นggplot2โซลูชันแบบธรรมดา

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