Как изменить метки фасетов? - PullRequest
201 голосов
/ 13 августа 2010

Я использовал следующую команду 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())

для производства

alt text

Я бы хотел изменить метки facet на более короткие (например, Hosp 1, Hosp 2 ...), потому что они слишком длинные и выглядят тесными (увеличивая высоту графика не вариант, это заняло бы слишком много места в документе). Я посмотрел на страницу справки facet_grid , но не могу понять, как.

Ответы [ 17 ]

3 голосов
/ 21 августа 2018

Поскольку мне еще не разрешено комментировать сообщения, я публикую это отдельно как дополнение к ответу Винса и ответу son520804 .Кредит идет на них.

Son520804:

с использованием данных Iris:

Я предполагаю:
Вы установили пакет dplyr, который имеет удобное преобразованиекоманда, и ваш набор данных называется опросом.survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........) Эта команда помогает вам переименовывать столбцы, но все остальные столбцы сохраняются.Затем сделайте то же самое facet_wrap, теперь вы в порядке.

Используя пример ириса Винса и частичный код son520804, я сделал это с помощью функции mutate и нашел простое решение, не касаясь исходного набора данных.,Хитрость заключается в создании резервного имени вектора и использовании mutate () внутри канала для временной коррекции имен фасетов:

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_name может потребоваться повторять различными способами, чтобы соответствовать порядку вашего исходного набора данных.Пожалуйста, дважды и трижды проверьте, что это правильно достигнуто.

3 голосов
/ 04 августа 2018

Определение функции labeller с 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 голосов
/ 20 декабря 2017

Я думаю, что все другие решения действительно полезны для этого, но есть еще один способ.

Я предполагаю:

  • вы установили пакет dplyr, который имеет удобную команду mutate, и
  • ваш набор данных называется survey.

    опрос%>% мутировать (Hosp1 = Больница1, Hosp2 = Больница2, ........)

Эта команда помогает вам переименовывать столбцы, но все остальные столбцы сохраняются.

Тогда сделайте то же самое facet_wrap, теперь вы в порядке.

2 голосов
/ 17 июня 2015

Просто расширив ответ 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 голосов
/ 10 марта 2017

У меня есть другой способ достичь той же цели без изменения базовых данных:

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 голос
/ 16 декабря 2018

Это работает для меня.

Определите коэффициент:

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

и используйте, в ggplot():

facet_grid( hospitals.factor[hospital] ~ . )
1 голос
/ 28 апреля 2018

Вы пытались изменить конкретные уровни вашего 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"
...