Faset etiketler nasıl değiştirilir?


231

Aşağıdaki ggplotkomutu kullandım:

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

üretmek için

alternatif metin

Bununla birlikte, faset etiketlerini daha kısa bir şeye değiştirmek istiyorum (örneğin Hosp 1, Hosp 2...) çünkü artık çok uzunlar ve sıkışık görünüyorlar (grafiğin yüksekliğini artırmak bir seçenek değil, döküman). Ben facet_grid yardım sayfasına baktım ama nasıl anlayamıyorum .

Yanıtlar:


126

Temel faktör düzeyi adlarını aşağıdaki gibi bir şeyle değiştirin:

# 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 ~ .)

14
@wishihadabettername: Temel verilerin değiştirilmesini önlemek için şunları kullanabilirsiniz: ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
Arnaud A

1
related ... panel etiketinin bquote () ifadesi (örn. levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))) olmasını istiyorsanız, matematiksel ifadede görünmez. İfadeler faset etiketleri olarak nasıl gösterilir?
Brian D

faset etiketine ifadeler labellereklemek için aşağıdaki seçeneği kullanın facet_grid: stackoverflow.com/questions/37089052/…
Brian D

286

Verilerinizi düzenlemekten kaçınan bir çözüm:

groupGrafiğinizin veri çerçevenizin düzeyleri olan kısmı tarafından kapandığını control, test1, test2ve ardından bu değerlerle adlandırılmış bir liste oluşturduğunu varsayalım :

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

Ardından bir 'etiketleyici' işlevi oluşturun ve bunu facet_grid çağrınıza itin:

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

Bu liste değerlerini (doğru adlar) döndürerek hastane_adı listesini dizine eklemek için veri çerçevesinin düzeylerini kullanır.


Bunun yalnızca tek bir değişkeniniz varsa işe yaradığını lütfen unutmayın. İki fasetiniz varsa, etiketleyici işlevinizin her faset için farklı bir ad vektörü döndürmesi gerekir. Bunu aşağıdaki gibi bir şeyle yapabilirsiniz:

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

Faset dizin adlarıyla ('Hostpital # 1', vb.) Dizinlenmiş önceden tanımlanmış ad listeleri nerede facet1_namesve facet2_namesbunlar.


Düzenleme: Etiketleyici bilmediği bir değişken / değer birleşimi iletirseniz, yukarıdaki yöntem başarısız olur. Bunun gibi bilinmeyen değişkenler için arıza güvenliği ekleyebilirsiniz:

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

Yanıt , yön ve kenar boşluğu ile ggplot'ta strip.text etiketlerinin nasıl değiştirileceğinden uyarlanmıştır = TRUE


edit: UYARI : bu yöntemi bir karakter sütununa göre düzeltmek için kullanıyorsanız , yanlış etiketler alıyor olabilirsiniz. Bu hata raporuna bakın . ggplot2'nin son sürümlerinde düzeltildi.


9
Güzel, ama facet_wrap ile çalışmayacak, @Vince çözümü de facet_wrap ile çalışacak.
Arnaud A

@ArnaudAmzallag: Doğru, eğer birisi biraz zaman bağışlamak istiyorsa, gelecekte olabilir .
naught101

Bilinmeyen yönlendirme değişkenleri için arıza güvenliği eklendi.
naught101

16
Uyarı: Bu, ggplot2 v.2'de çalışmaz - etiketleyici işlevi değişti. @mbirons cevap çalışır stackoverflow.com/a/34811062/162832
Andreas

İlginç, ancak bu her zaman işe yaramazken faktörleri düzenlemek her zaman işe yarar.
PatrickT

214

İşte @ naught101 tarafından verilenin ruhunda olan başka bir çözüm, ancak daha basit ve aynı zamanda ggplot2'nin en son sürümü için bir uyarı atmıyor.

Temel olarak, önce adlandırılmış bir karakter vektörü oluşturursunuz

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

Ve sonra bunu bir etiketleyici olarak kullanırsınız, sadece @ naught101 tarafından verilen kodun son satırını

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

Bu yardımcı olur umarım.


Hangi ggplot2 sürümü var as_labeller? CRAN GitHub deposunda bazı kaynak kodu buldum , ancak en son sürüme (CRAN'da!) Yükselttikten sonra işleve sahip görünmüyorum.
n1k31t4

Bu tuhaf. CRAN aracılığıyla da güncelledim. İşte docs.ggplot2.org/dev/as_labeller.html
mbiron

4
Bu havalı. Bununla birlikte, faset ızgarasında iki değişken olduğunda ne olur? Beğendim hospital ~ genderfalan? Her iki eksende etiket kullanmanın bir yolu var mı? Belgelerde bariz bir şey göremiyorum.
naught101

3
Naught cevabı ile başladıysanız, bu sadece bir liste () ile değil c () ile çalışır .
thomas88wp

1
Bunun büyük bir parçası, bunun faset ızgarasının her iki ekseniyle de çalışmasıdır!
Calum You

30

facet_grid(yfacet~xfacet)Ggplot2, sürüm 2.2.1 kullanarak nasıl yaptım :

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

Bunun bir çağrı içermediğine dikkat edin as_labeller()- bir süre mücadele ettiğim bir şey.

Bu yaklaşım, yardım sayfasındaki son örnekten esinlenerek etiketleyiciye zorlama işlevi .


bu çalışıyor!!! Önerilen çözümlerden bazıları mevcut ggplot2 sürümlerinde kullanımdan kaldırıldığı için diğer çözümleri uygulayamadım.
yanes

Bu adlandırılmış vektörleri setNames() stackoverflow.com/a/22428439/3362993
jsta ile

23

İki yönünüz varsa hospitalve roomyalnızca bir tanesini yeniden adlandırmak istiyorsanız, şunları kullanabilirsiniz:

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

Vektör tabanlı yaklaşımı kullanarak iki yönü yeniden adlandırmak için (naught101 yanıtında olduğu gibi) şunları yapabilirsiniz:

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

16

Temel verileri değiştirmeden EN KOLAY değiştirmenin yolu:

1) Varsayılan değerlerin her biri için geri onay işareti ekleyerekas_labeller işlevi kullanarak bir nesne oluşturun :

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'a ekliyoruz:

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

1
Bu en zarif yöntem olduğunu düşünüyorum - etkili ve ggplot2 sürüm 3.0.0.9000
Landak

9

Ggplot değişkeninizin gerçekte içerdiğinden daha az faktör göstermesi durumunda bu çözümün işe yaramayacağını unutmayın (örneğin alt küme olsaydınız olabilir):

 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)

Basit bir çözüm (sıkıcı olabilecek ad_li'ye kullanılmayan tüm faktörleri eklemenin yanı sıra, kullanılmayan faktörleri orijinal veri kümesinde veya etiketleme işlevinde droplevels () ile bırakmaktır:

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

Bu çözüm @domi'ye çok yakındır, ancak ilk 4 harfi ve son rakamı getirerek adı kısaltmak için tasarlanmıştır.

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

resim açıklamasını buraya girin


6

Her ikisi de facet_wrapve bir argüman olarak facet_gridgelen girişi kabul eder ifelse. Bu nedenle, faceting için kullanılan değişken mantıklıysa, çözüm çok basittir:

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

Değişkenin daha fazla kategorisi varsa, ifelseifadenin iç içe yerleştirilmesi gerekir .

Bir yan etki olarak, bu aynı zamanda ggplotçağrıların içinde grupların oluşturulmasını da sağlar .


5

Matematiksel semboller, üst simge, alt simge, parantez / parantez, .etc ayrıştırılarak @ domi'ye benzer başka bir çözüm eklemek.

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 tarihinde reprex paketi tarafından oluşturuldu (v0.2.1.9000)



3

Diğer tüm çözümlerin bunu yapmak için gerçekten yararlı olduğunu düşünüyorum, ancak başka bir yol var.

Sanırım:

  • Yüklediğiniz dplyruygun sahiptir paketini mutatekomutu ve
  • veri kümeniz adlandırılır survey.

    anket%>% mutat (Hosp1 = Hastane1, Hosp2 = Hastane2, ........)

Bu komut sütunları yeniden adlandırmanıza yardımcı olur, ancak diğer tüm sütunlar korunur.

O zaman aynısını yapın facet_wrap, şimdi iyisiniz.


üzgünüm, aynı zamanda sütun içeriğini de değiştirdiği için çalışmıyor
Jens

3

variable, valueArgüman olarak ile etiketleyici işlev tanımı benim için işe yaramaz. Ayrıca, ifadeyi kullanmak istiyorsanız lapply kullanmanız gerekir ve arr[val]işlevin bağımsız değişkeni bir data.frame olduğu için sadece kullanamazsınız .

Bu kod işe yaradı:

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

Henüz gönderiler hakkında yorum yapma iznim olmadığından bunu Vince'in yanıtı ve son520804'ün cevabına ek olarak gönderiyorum . Kredi onlara gidiyor.

Son520804:

İris verilerini kullanarak:

Sanırım: Uygun
mutate komutuna sahip olan dplyr paketini kurdunuz ve veri kümenize anket adı verildi. survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........) Bu komut sütunları yeniden adlandırmanıza yardımcı olur, ancak diğer tüm sütunlar korunur. O zaman aynı facet_wrap'ı yapın, şimdi iyisiniz.

Vince'in iris örneğini ve son520804'ün kısmi kodunu kullanarak bunu mutasyon işleviyle yaptım ve orijinal veri kümesine dokunmadan kolay bir çözüm elde ettim. Hile, bir stand-in isim vektörü oluşturmak ve faset adlarını geçici olarak düzeltmek için borunun içinde mutate () kullanmaktır:

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

Bu örnekte, i $ Türlerinin düzeylerinin geçici olarak new_names vektöründe bulunan karşılık gelen adlarla değiştirildiğini görebilirsiniz. İçeren satır

mutate(Species=new_names) %>%

orijinal adlandırma ortaya çıkarmak için kolayca kaldırılabilir.

Dikkat kelimesi: Yeni_adı vektörü doğru şekilde ayarlanmamışsa, adlarda kolayca hatalar oluşabilir. Değişken dizeleri değiştirmek için ayrı bir işlev kullanmak muhtemelen daha temiz olacaktır. Yeni_adı vektörünün, orijinal veri kümenizin sırasına uyması için farklı şekillerde tekrarlanması gerekebileceğini unutmayın. Lütfen bunun doğru bir şekilde yapıldığını iki ve üç kez kontrol edin.


Kullanmak biraz daha hoş olabilir: new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')ve sonra mutasyonda böylece yeni bir sütun oluşturabilirsiniz:mutate(Spec = new_names[Species])
filups21

3

Bu benim için çalışıyor.

Bir faktör tanımlayın:

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

ve kullanımı ggplot():

facet_grid( hospitals.factor[hospital] ~ . )

2

Sadece naught101'in cevabını genişletmek - kredi ona gidiyor

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

Yapmanız gereken, isimle eşleme içeren bir liste oluşturmaktır

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

ve plot_labeller()yeni varsayılan bağımsız değişkenlerle yeniden tanımlayın :

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

Ve sonra:

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

Alternatif olarak, yapmak istediğiniz her etiket değişikliği için özel bir işlev oluşturabilirsiniz.


2

Temel verileri değiştirmeden aynı hedefe ulaşmak için başka bir yol var:

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

Yukarıda yaptığım, orijinal veri çerçevesindeki faktörün etiketlerini değiştirmek ve orijinal kodunuzla karşılaştırıldığında tek fark bu.


1

HospitalVektörünüzün belirli seviyelerini değiştirmeyi denediniz mi?

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

Cevabımı buna eklemeliyim gibi hissediyorum çünkü bu işi yapmak oldukça uzun sürdü:

Bu cevap sizin için:

  • Eğer do not orijinal verileri düzenlemek istediğiniz
  • etiketlerinizde ifadelere ( bquote) ihtiyacınız varsa ve
  • ayrı bir etiketleme ad-vektörünün esnekliğini istiyorsanız

Temelde etiketleri adlandırılmış bir vektöre koydum, böylece etiketler karışmayacak veya değiştirilmeyecekti. labellerİfadesi muhtemelen daha basit olabilir, ama bu az işlerde (iyileştirmeler çok are welcome). Faset faktörünü korumak için `` (geri tırnaklar) not edin.

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

resim açıklamasını buraya girin


1

Basit çözüm ( buradan ):

p <- ggplot(mtcars, aes(disp, drat)) + geom_point()
# Example (old labels)
p + facet_wrap(~am)


to_string <- as_labeller(c(`0` = "Zero", `1` = "One"))
# Example (New labels)
p + facet_wrap(~am, labeller = to_string)

0

Bir süre mücadele sonra ne buldum kullanabileceğimiz olduğunu fct_relevel()ve fct_recode()gelen forcatsiyi faset etiketleri sabitlediğinizde yönleri sırasını değiştirmek için birlikte. Tasarım tarafından desteklenip desteklenmediğinden emin değilim, ama işe yarıyor! Aşağıdaki çizimlere göz atın:

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 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)

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.