Вот решение, позволяющее избежать редактирования ваших данных:
Скажем, ваш график фасетирован 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 с фасетом и полем = ИСТИНА
edit: ПРЕДУПРЕЖДЕНИЕ: если вы используете этот метод для фасетирования столбца символом, вы можете получать неправильные метки. См. этот отчет об ошибке. исправлено в последних версиях ggplot2.
person
naught101
schedule
24.08.2012