Вот решение, позволяющее избежать редактирования ваших данных:
Скажем, ваш график огранен частью group
вашего фрейма данных, имеющей уровни control, test1, test2
, затем создайте список с такими значениями:
hospital_names <- list(
'Hospital#1'="Some Hospital",
'Hospital#2'="Another Hospital",
'Hospital#3'="Hospital Number 3",
'Hospital#4'="The Other Hospital"
)
Затем создайте функцию 'labeller' и вставьте ее в ваш вызов 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, возвращая значения списка (правильные имена).
Обратите внимание, что это работает, только если у вас есть только одна фацетная переменная. Если у вас есть два аспекта, ваша функция-метка должна возвращать разные имена для каждого аспекта. Вы можете сделать это с чем-то вроде:
plot_labeller <- function(variable,value){
if (variable=='facet1') {
return(facet1_names[value])
} else {
return(facet2_names[value])
}
}
Где facet1_names
и facet2_names
- это предварительно определенные списки имен, проиндексированных именами индекса фасета («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 в ggplot с фасетом и полем = TRUE
edit: WARNING : если вы используете этот метод для фасетки столбца символ , возможно, вы получаете неправильные метки См. этот отчет об ошибке . , исправленный в последних версиях ggplot2.