วิธีเปลี่ยนป้ายกำกับ facet?


230

ฉันใช้ggplotคำสั่งต่อไปนี้:

ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
  + scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
  + facet_grid(hospital ~ .)
  + theme(panel.background = theme_blank())

ผลิต

ข้อความแสดงแทน

ฉันต้องการที่จะเปลี่ยนแง่ป้าย แต่บางสิ่งบางอย่างที่สั้นกว่า (เช่นHosp 1, Hosp 2... ) เพราะพวกเขาเป็นเวลานานเกินไปในขณะนี้และดูแคบ (การเพิ่มความสูงของกราฟไม่ได้ตัวก็จะใช้พื้นที่มากเกินไปใน เอกสาร) ฉันดูหน้าช่วยเหลือของfacet_gridแต่ไม่สามารถหาวิธีได้

คำตอบ:


123

เปลี่ยนชื่อระดับปัจจัยพื้นฐานด้วยสิ่งต่อไปนี้:

# Using the Iris data
> i <- iris
> levels(i$Species)
[1] "setosa"     "versicolor" "virginica" 
> levels(i$Species) <- c("S", "Ve", "Vi")
> ggplot(i, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)

12
@wishihadabettername: เพื่อหลีกเลี่ยงการเปลี่ยนแปลงข้อมูลพื้นฐานคุณสามารถใช้: ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
Arnaud A

1
ที่เกี่ยวข้อง ... ถ้าคุณต้องการให้แผงพาเนลเป็นนิพจน์ bquote () (เช่นlevels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))) มันจะไม่ปรากฏในนิพจน์ทางคณิตศาสตร์ หนึ่งจะแสดงนิพจน์เป็นป้ายกำกับ facet ได้อย่างไร
Brian D

เกี่ยวข้องกับการรวมถึงการแสดงออกในฉลาก facet ใช้labellerตัวเลือกเพื่อfacet_grid: stackoverflow.com/questions/37089052/…
Brian D

285

นี่คือทางออกที่หลีกเลี่ยงการแก้ไขข้อมูลของคุณ:

สมมติว่าพล็อตของคุณถูก facetted โดยgroupส่วนหนึ่งของ dataframe ของคุณซึ่งมีระดับcontrol, test1, test2จากนั้นสร้างรายการที่ตั้งชื่อโดยค่าเหล่านั้น:

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

จากนั้นสร้างฟังก์ชั่น 'ฉลาก' และกดลงในการโทร facet_grid ของคุณ:

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

สิ่งนี้ใช้ระดับของกรอบข้อมูลเพื่อสร้างดัชนีรายการ hospital_names ส่งคืนค่ารายการ (ชื่อที่ถูกต้อง)


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

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

ที่ไหนfacet1_namesและfacet2_namesเป็นรายการที่กำหนดไว้ล่วงหน้าของชื่อที่จัดทำดัชนีโดยชื่อดัชนี facet ('Hostpital # 1' ฯลฯ )


แก้ไข:วิธีการข้างต้นล้มเหลวหากคุณผ่านชุดค่าตัวแปร / ค่าที่ผู้จำหน่ายไม่ทราบ คุณสามารถเพิ่มความล้มเหลวที่ปลอดภัยสำหรับตัวแปรที่ไม่รู้จักเช่นนี้:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

คำตอบที่ดัดแปลงมาจากวิธีเปลี่ยน strip.text label ใน ggplot ด้วย facet และ margin = TRUE


แก้ไข: คำเตือน : หากคุณใช้วิธีนี้ในการแสดงผลโดยคอลัมน์อักขระคุณอาจได้รับป้ายกำกับที่ไม่ถูกต้อง ดูรายงานข้อผิดพลาดนี้ แก้ไขใน ggplot2 รุ่นล่าสุด


9
ดี แต่จะไม่ทำงานกับ facet_wrap ในขณะที่โซลูชัน @Vince จะทำงานกับ facet_wrap ด้วย
Arnaud A

@ArnaudAmzallag: ถูกต้อง แต่ถ้ามีคนให้ความรู้สึกเหมือนการบริจาคบางครั้งมันอาจจะในอนาคต
naught101

เพิ่ม Fail-safe สำหรับตัวแปร facetting ที่ไม่รู้จัก
naught101

16
แจ้งให้ทราบล่วงหน้า: สิ่งนี้ไม่ทำงานใน ggplot2 v.2 - ฟังก์ชั่นฉลากเปลี่ยนไป @mbirons คำตอบทำงานstackoverflow.com/a/34811062/162832
Andreas

สิ่งที่น่าสนใจ แต่อาจไม่ได้ผลเสมอไปในขณะที่การแก้ไขปัจจัยจะทำได้ตลอดเวลา
PatrickT

214

นี่เป็นอีกวิธีการหนึ่งที่อยู่ในจิตวิญญาณของที่ได้รับจาก @ naught101 แต่ง่ายขึ้นและไม่ส่งสัญญาณเตือนเกี่ยวกับ ggplot2 เวอร์ชันล่าสุด

โดยทั่วไปคุณสร้างเวกเตอร์อักขระที่มีชื่อเป็นอันดับแรก

hospital_names <- c(
                    `Hospital#1` = "Some Hospital",
                    `Hospital#2` = "Another Hospital",
                    `Hospital#3` = "Hospital Number 3",
                    `Hospital#4` = "The Other Hospital"
                    )

จากนั้นคุณใช้มันเป็นตัวติดฉลากเพียงแก้ไขบรรทัดสุดท้ายของรหัสที่กำหนดโดย @ naught101 เป็น

... + facet_grid(hospital ~ ., labeller = as_labeller(hospital_names))

หวังว่านี่จะช่วยได้


รูปแบบใดของ ggplot2 ที่อยู่as_labellerใน? ฉันพบซอร์สโค้ดบางอย่างสำหรับที่เก็บ CRAN GitHubแต่หลังจากอัปเกรดเป็นเวอร์ชันล่าสุด (บน CRAN!) ฉันดูเหมือนจะไม่มีฟังก์ชั่น
n1k31t4

แปลกแฮะ, แปลกนะ, มันแปลก ๆ นะ. ฉันยังอัปเดตผ่าน CRAN นี่คือเอกสารdocs.ggplot2.org/dev/as_labeller.html
mbiron

4
ที่นี่หนาว. จะเกิดอะไรขึ้นเมื่อคุณมีตัวแปรสองตัวในกริดของคุณ ชอบhospital ~ genderหรืออะไร มีวิธีใช้ฉลากบนแกนทั้งสองหรือไม่? ฉันไม่เห็นสิ่งที่ชัดเจนในเอกสาร
naught101

3
หมายเหตุถ้าคุณเริ่มต้นด้วยคำตอบใดคนหนึ่งนี้จะทำงานเฉพาะกับC ()ไม่ได้เป็นรายการ ()
thomas88wp

1
ส่วนที่ดีอย่างหนึ่งของเรื่องนี้คือมันใช้ได้กับทั้งสองแกนของกริด Facet!
Calum คุณ

30

นี่คือวิธีที่ฉันfacet_grid(yfacet~xfacet)ใช้ ggplot2 เวอร์ชัน 2.2.1:

facet_grid(
    yfacet~xfacet,
    labeller = labeller(
        yfacet = c(`0` = "an y label", `1` = "another y label"),
        xfacet = c(`10` = "an x label", `20` = "another x label")
    )
)

โปรดทราบว่านี่ไม่ได้มีการโทรไป as_labeller() - สิ่งที่ฉันพยายามในขณะที่

วิธีการนี้จะเป็นแรงบันดาลใจจากตัวอย่างที่ผ่านมาบนหน้าความช่วยเหลือบีบบังคับฟังก์ชั่นฉลาก


งานนี้ !!! ฉันไม่สามารถใช้โซลูชันอื่น ๆ ได้เนื่องจากโซลูชันที่แนะนำบางรายการเลิกใช้แล้วในเวอร์ชัน ggplot2 ปัจจุบัน
yanes

คุณสามารถสร้างเวกเตอร์ที่มีชื่อเหล่านี้ได้ด้วยsetNames() stackoverflow.com/a/22428439/3362993
jsta

23

หากคุณมีสองแง่มุมhospitalและroomต้องการเปลี่ยนชื่อเพียงหนึ่งคุณสามารถใช้:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))

สำหรับการเปลี่ยนชื่อสองแง่มุมโดยใช้วิธีการแบบเวกเตอร์ (ดังคำตอบของ naught101) คุณสามารถทำได้:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
                                                 room = as_labeller(room_names)))

16

วิธีที่ง่ายที่สุดในการเปลี่ยนแปลงโดยไม่ต้องแก้ไขข้อมูลพื้นฐานคือ:

1) สร้างวัตถุโดยใช้as_labellerฟังก์ชั่นเพิ่มเครื่องหมายขีดกลับสำหรับแต่ละค่าเริ่มต้น :

hum.names <- as_labeller(c(`50` = "RH% 50", `60` = "RH% 60",`70` = "RH% 70", `80` = "RH% 80",`90` = "RH% 90", `100` = "RH% 100")) #Necesarry to put RH% into the facet labels

2) เราเพิ่มเข้าไปใน GGplot:

ggplot(dataframe, aes(x=Temperature.C,y=fit))+geom_line()+ facet_wrap(~Humidity.RH., nrow=2,labeller=hum.names)

1
ฉันคิดว่านี่เป็นวิธีที่ยอดเยี่ยมที่สุด - มีประสิทธิภาพและทำงานได้กับ ggplot2 รุ่น 3.0.0.9000
Landak

9

โปรดทราบว่าการแก้ปัญหานี้จะไม่ทำงานได้อย่างดีในกรณีที่ ggplot จะแสดงปัจจัยน้อยกว่าที่ตัวแปรของคุณมีอยู่จริง (ซึ่งอาจเกิดขึ้นได้หากคุณเป็นตัวอย่างของการย่อย):

 library(ggplot2)
 labeli <- function(variable, value){
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
 }

 dat <- subset(iris,Species!="setosa")
 ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)

วิธีง่ายๆ (นอกเหนือจากการเพิ่มปัจจัยที่ไม่ได้ใช้ทั้งหมดใน names_li ซึ่งอาจน่าเบื่อ) คือการวางปัจจัยที่ไม่ได้ใช้ด้วย droplevels () ทั้งในชุดข้อมูลดั้งเดิมหรือในฟังก์ชัน labbeler ดู:

labeli2 <- function(variable, value){
  value <- droplevels(value)
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
}

dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)

9

วิธีนี้ใกล้เคียงกับ @domi มากเพียงใด แต่ได้รับการออกแบบให้ย่อชื่อโดยดึงตัวอักษร 4 ตัวแรกและหมายเลขสุดท้าย

library(ggplot2)

# simulate some data
xy <- data.frame(hospital = rep(paste("Hospital #", 1:3, sep = ""), each = 30),
                 value = rnorm(90))

shortener <- function(string) {
  abb <- substr(string, start = 1, stop = 4) # fetch only first 4 strings
  num <- gsub("^.*(\\d{1})$", "\\1", string) # using regular expression, fetch last number
  out <- paste(abb, num) # put everything together
  out
}

ggplot(xy, aes(x = value)) +
  theme_bw() +
  geom_histogram() +
  facet_grid(hospital ~ ., labeller = labeller(hospital = shortener))

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


6

ทั้งสองfacet_wrapและfacet_gridยังรับอินพุตจากifelseเป็นอาร์กิวเมนต์ ดังนั้นหากตัวแปรที่ใช้ในการประกอบเป็นตรรกะการแก้ปัญหาง่ายมาก:

facet_wrap(~ifelse(variable, "Label if true", "Label if false"))

หากตัวแปรมีหมวดหมู่มากขึ้นifelseคำสั่งจะต้องซ้อนกันซ้อนกัน

ในฐานะที่เป็นผลข้างเคียงนี้ยังช่วยให้การสร้างกลุ่มที่จะประกอบในการggplotโทร


5

การเพิ่มโซลูชันอื่นที่คล้ายกับ @ domi's ด้วยการแยกสัญลักษณ์ทางคณิตศาสตร์, ตัวยก, ตัวห้อย, วงเล็บ / วงเล็บเหลี่ยม, .etc

library(tidyverse)
theme_set(theme_bw(base_size = 18))

### create separate name vectors
# run `demo(plotmath)` for more examples of mathematical annotation in R
am_names <- c(
  `0` = "delta^{15}*N-NO[3]^-{}",
  `1` = "sqrt(x,y)"
)

# use `scriptstyle` to reduce the size of the parentheses &
# `bgroup` to make adding `)` possible 
cyl_names <- c(
  `4` = 'scriptstyle(bgroup("", a, ")"))~T~-~5*"%"',
  `6` = 'scriptstyle(bgroup("", b, ")"))~T~+~10~degree*C',
  `8` = 'scriptstyle(bgroup("", c, ")"))~T~+~30*"%"'
)

ggplot(mtcars, aes(wt, mpg)) + 
  geom_jitter() +
  facet_grid(am ~ cyl,
             labeller = labeller(am  = as_labeller(am_names,  label_parsed),
                                 cyl = as_labeller(cyl_names, label_parsed))
             ) +
  geom_text(x = 4, y = 25, size = 4, nudge_y = 1,
            parse = TRUE, check_overlap = TRUE,
            label = as.character(expression(paste("Log"["10"], bgroup("(", frac("x", "y"), ")")))))

### OR create new variables then assign labels directly
# reverse facet orders just for fun
mtcars <- mtcars %>% 
  mutate(am2  = factor(am,  labels = am_names),
         cyl2 = factor(cyl, labels = rev(cyl_names), levels = rev(attr(cyl_names, "names")))
  )

ggplot(mtcars, aes(wt, mpg)) + 
  geom_jitter() +
  facet_grid(am2 ~ cyl2,
             labeller = label_parsed) +
  annotate("text", x = 4, y = 30, size = 5,
           parse = TRUE, 
           label = as.character(expression(paste("speed [", m * s^{-1}, "]"))))

สร้างเมื่อ 2019-03-30 โดยแพ็คเกจ reprex (v0.2.1.9000)



3

ฉันคิดว่าโซลูชันอื่น ๆ ทั้งหมดมีประโยชน์จริง ๆ ในการทำสิ่งนี้ แต่ยังมีวิธีอื่น

ผมถือว่า:

  • คุณได้ติดตั้งdplyrแพคเกจซึ่งมีmutateคำสั่งที่สะดวกและ
  • surveyชุดข้อมูลของคุณจะถูกตั้งชื่อ

    แบบสำรวจ%>% กลายพันธุ์ (Hosp1 = Hospital1, Hosp2 = Hospital2, ........ )

คำสั่งนี้ช่วยให้คุณเปลี่ยนชื่อคอลัมน์ แต่คอลัมน์อื่น ๆ ทั้งหมดจะถูกเก็บไว้

จากนั้นทำเช่นเดียวกันfacet_wrapคุณก็สบายดี


ขออภัยมันใช้งานไม่ได้เพราะมันเปลี่ยนแปลงเนื้อหาคอลัมน์ด้วย
Jens

3

ฟังก์ชั่นการทำงานของฉลากด้วยการใช้variable, valueอาร์กิวเมนต์จะไม่เหมาะกับฉัน นอกจากนี้หากคุณต้องการใช้นิพจน์คุณจำเป็นต้องใช้ lapply และไม่สามารถใช้งานได้ง่ายarr[val]เนื่องจากอาร์กิวเมนต์ของฟังก์ชันคือ data.frame

รหัสนี้ใช้งานได้:

libary(latex2exp)
library(ggplot2)
arr <- list('virginica'=TeX("x_1"), "versicolor"=TeX("x_2"), "setosa"=TeX("x_3"))
mylabel <- function(val) { return(lapply(val, function(x) arr[x])) }
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) + geom_line() + facet_wrap(~Species, labeller=mylabel)

3

ตั้งแต่ผมยังไม่ได้รับอนุญาตให้แสดงความคิดเห็นในโพสต์ผมโพสต์นี้แยกเป็นภาคผนวกคำตอบของวินซ์และคำตอบของ son520804 เครดิตไปกับพวกเขา

Son520804:

ใช้ข้อมูล Iris:

ฉันถือว่า:
คุณได้ติดตั้งแพคเกจ dplyr ซึ่งมีคำสั่งกลายพันธุ์ที่สะดวกและชุดข้อมูลของคุณมีชื่อว่าแบบสำรวจ survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........) คำสั่งนี้ช่วยให้คุณเปลี่ยนชื่อคอลัมน์ แต่คอลัมน์อื่น ๆ ทั้งหมดจะถูกเก็บไว้ จากนั้นทำ facet_wrap เดียวกันตอนนี้คุณก็สบายดี

ด้วยการใช้ตัวอย่างม่านตาของ Vince และรหัสบางส่วนของ son520804 ฉันทำสิ่งนี้ด้วยฟังก์ชั่นกลายพันธุ์และได้รับการแก้ปัญหาที่ง่ายโดยไม่ต้องสัมผัสชุดข้อมูลดั้งเดิม เคล็ดลับคือการสร้างเวกเตอร์ชื่อแบบสแตนด์อะโลนและใช้ mutate () ภายในไพพ์เพื่อแก้ไขชื่อ facet ชั่วคราว:

i <- iris

levels(i$Species)
[1] "setosa"     "versicolor" "virginica"

new_names <- c(
  rep("Bristle-pointed iris", 50), 
  rep("Poison flag iris",50), 
  rep("Virginia iris", 50))

i %>% mutate(Species=new_names) %>% 
ggplot(aes(Petal.Length))+
    stat_bin()+
    facet_grid(Species ~ .)

ในตัวอย่างนี้คุณสามารถเห็นระดับของ i $ Species เปลี่ยนชั่วคราวเป็นชื่อสามัญที่เกี่ยวข้องที่มีอยู่ในเวกเตอร์ new_names บรรทัดที่มี

mutate(Species=new_names) %>%

สามารถลบออกได้อย่างง่ายดายเพื่อเปิดเผยการตั้งชื่อดั้งเดิม

คำเตือน:วิธีนี้อาจทำให้เกิดข้อผิดพลาดในชื่อได้ง่ายถ้าตั้งค่าเวกเตอร์ new_name ไม่ถูกต้อง มันอาจจะสะอาดกว่านี้ถ้าใช้ฟังก์ชั่นแยกเพื่อแทนที่สตริงตัวแปร โปรดทราบว่าอาจต้องมีการทำซ้ำเวกเตอร์ในรูปแบบต่างๆเพื่อให้ตรงกับคำสั่งของชุดข้อมูลดั้งเดิมของคุณ โปรดตรวจสอบสองครั้งและสามครั้งว่าสิ่งนี้ทำได้อย่างถูกต้อง


อาจจะดีกว่าที่จะใช้: new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')จากนั้นในการกลายพันธุ์คุณสามารถสร้างคอลัมน์ใหม่ได้ดังนี้:mutate(Spec = new_names[Species])
filups21

3

มันใช้งานได้สำหรับฉัน

กำหนดปัจจัย:

hospitals.factor<- factor( c("H0","H1","H2") )

และใช้ในggplot():

facet_grid( hospitals.factor[hospital] ~ . )

2

เพียงแค่ขยายคำตอบของ naught101 - เครดิตไปหาเขา

plot_labeller <- function(variable,value, facetVar1='<name-of-1st-facetting-var>', var1NamesMapping=<pass-list-of-name-mappings-here>, facetVar2='', var2NamesMapping=list() )
{
  #print (variable)
  #print (value)
  if (variable==facetVar1) 
    {
      value <- as.character(value)
      return(var1NamesMapping[value])
    } 
  else if (variable==facetVar2) 
    {
      value <- as.character(value)
      return(var2NamesMapping[value])
    } 
  else 
    {
      return(as.character(value))
    }
}

สิ่งที่คุณต้องทำคือสร้างรายการที่มีการแมปชื่อต่อชื่อ

clusteringDistance_names <- list(
  '100'="100",
  '200'="200",
  '300'="300",
  '400'="400",
  '600'="500"
)

และกำหนดใหม่plot_labeller()ด้วยอาร์กิวเมนต์เริ่มต้นใหม่:

plot_labeller <- function(variable,value, facetVar1='clusteringDistance', var1NamesMapping=clusteringDistance_names, facetVar2='', var1NamesMapping=list() )

แล้ว:

ggplot() + 
  facet_grid(clusteringDistance ~ . , labeller=plot_labeller) 

หรือคุณสามารถสร้างฟังก์ชั่นเฉพาะสำหรับการเปลี่ยนแปลงฉลากแต่ละรายการที่คุณต้องการ


2

ฉันมีวิธีอื่นเพื่อบรรลุเป้าหมายเดียวกันโดยไม่ต้องเปลี่ยนข้อมูลพื้นฐาน:

ggplot(transform(survey, survey = factor(survey,
        labels = c("Hosp 1", "Hosp 2", "Hosp 3", "Hosp 4"))), aes(x = age)) +
  stat_bin(aes(n = nrow(h3),y=..count../n), binwidth = 10) +
  scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2)) +
  facet_grid(hospital ~ .) +
  opts(panel.background = theme_blank())

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


1

คุณได้ลองเปลี่ยนระดับHospitalเวกเตอร์ของคุณแล้วหรือยัง?

levels(survey$hospital)[levels(survey$hospital) == "Hospital #1"] <- "Hosp 1"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #2"] <- "Hosp 2"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #3"] <- "Hosp 3"

1

ฉันรู้สึกว่าฉันควรเพิ่มคำตอบของฉันเพราะมันใช้เวลาค่อนข้างนานในการทำให้งานนี้:

คำตอบนี้สำหรับคุณถ้า:

  • คุณทำไม่ได้ต้องการแก้ไขข้อมูลต้นฉบับของคุณ
  • ถ้าคุณต้องการการแสดงออก (bquote ) ในป้ายกำกับและ
  • ถ้าคุณต้องการความยืดหยุ่นของป้ายชื่อแยกต่างหาก- เวกเตอร์

โดยทั่วไปฉันใส่ป้ายชื่อในเวกเตอร์ที่มีชื่อดังนั้นป้ายกำกับจะไม่สับสนหรือเปลี่ยนไป การlabellerแสดงออกอาจจะง่ายขึ้น แต่อย่างน้อยก็ใช้งานได้ (การปรับปรุงยินดีต้อนรับมาก) หมายเหตุ `(เครื่องหมายคำพูดด้านหลัง) เพื่อป้องกัน facet-factor

n <- 10
x <- seq(0, 300, length.out = n)

# I have my data in a "long" format
my_data <- data.frame(
  Type = as.factor(c(rep('dl/l', n), rep('alpha', n))),
  T = c(x, x),
  Value = c(x*0.1, sqrt(x))
)

# the label names as a named vector
type_names <- c(
  `nonsense` = "this is just here because it looks good",
  `dl/l` = Linear~Expansion~~Delta*L/L[Ref]~"="~"[%]", # bquote expression
  `alpha` = Linear~Expansion~Coefficient~~alpha~"="~"[1/K]"
  )


ggplot() + 
  geom_point(data = my_data, mapping = aes(T, Value)) + 
  facet_wrap(. ~ Type, scales="free_y", 
             labeller = label_bquote(.(as.expression(
               eval(parse(text = paste0('type_names', '$`', Type, '`')))
               )))) +
  labs(x="Temperature [K]", y="", colour = "") +
  theme(legend.position = 'none')

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



0

หลังจากดิ้นรนมาระยะหนึ่งแล้วสิ่งที่ฉันพบคือเราสามารถใช้fct_relevel()และfct_recode()จากการforcatsร่วมกันเพื่อเปลี่ยนลำดับของ facets และแก้ไขป้ายกำกับ facet ฉันไม่แน่ใจว่าได้รับการสนับสนุนจากการออกแบบ แต่ใช้งานได้! ตรวจสอบแปลงด้านล่าง:

library(tidyverse)

before <- mpg %>%
  ggplot(aes(displ, hwy)) + 
  geom_point() +
  facet_wrap(~class)
before

after <- mpg %>%
  ggplot(aes(displ, hwy)) + 
  geom_point() + 
  facet_wrap(
    vars(
      # Change factor level name
      fct_recode(class, "motorbike" = "2seater") %>% 
        # Change factor level order
        fct_relevel("compact")
    )
  )
after

สร้างเมื่อ 2020-02-16 โดยแพ็คเกจ reprex (v0.3.0)

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