Я использовал следующую 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, но не могу понять, как.
ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))
), она не будет отображаться в математическом выражении. Как можно показать выражения в виде меток фасетов?labeller
опцию дляfacet_grid
: stackoverflow.com/questions/37089052/…Вот решение, которое избегает редактирования ваших данных:
Скажем, ваш график огранен
group
частью вашего фрейма данных, которая имеет уровниcontrol, test1, test2
, а затем создайте список, названный этими значениями:Затем создайте функцию labeller и вставьте ее в ваш вызов facet_grid:
При этом используются уровни фрейма данных для индексации списка hospital_names, возвращая значения списка (правильные имена).
Обратите внимание, что это работает, только если у вас есть только одна переменная фасетирования. Если у вас есть два аспекта, ваша функция-метка должна возвращать разные имена для каждого аспекта. Вы можете сделать это с чем-то вроде:
Где
facet1_names
иfacet2_names
- это предварительно определенные списки имен, проиндексированных именами индекса фасета («Hostpital # 1» и т. Д.).Редактирование: приведенный выше метод завершится неудачно, если вы передадите комбинацию переменная / значение, которую не знает метщик. Вы можете добавить отказоустойчивый для неизвестных переменных, как это:
Ответ адаптирован из того, как изменить метки strip.text в ggplot с помощью facet и margin = TRUE
edit: ПРЕДУПРЕЖДЕНИЕ : если вы используете этот метод для фасетирования столбца символов , возможно, вы получаете неправильные метки. Смотрите этот отчет об ошибке .исправлено в последних версиях ggplot2.источник
Вот еще одно решение, которое соответствует духу @naught101, но более простое и не выдает предупреждение о последней версии ggplot2.
По сути, вы сначала создаете именованный символьный вектор
И затем вы используете его в качестве метки, просто изменив последнюю строку кода, заданного @ naught101 для
Надеюсь это поможет.
источник
as_labeller
? Я нашел некоторый исходный код для репозитория CRAN GitHub , но после обновления до последней версии (на CRAN!) У меня, похоже, нет этой функции.hospital ~ gender
или что? Есть ли способ использовать метки на обеих осях? Я не вижу ничего очевидного в документах.Вот как я это сделал с
facet_grid(yfacet~xfacet)
помощью ggplot2, версия 2.2.1:Обратите внимание, что это не содержит призыв к
as_labeller()
- то, с чем я боролся некоторое время.Этот подход вдохновлен последним примером на странице справки «Привести к функции labeller» .
источник
setNames()
stackoverflow.com/a/22428439/3362993Если у вас есть два аспекта
hospital
и ,room
но нужно переименовать только один, вы можете использовать:Для переименования двух аспектов с использованием векторного подхода (как в ответе naught101) вы можете сделать:
источник
Самый простой способ изменить БЕЗ изменения основных данных:
1) Создайте объект с помощью
as_labeller
функции, добавив обратную галочку для каждого значения по умолчанию :2) Добавляем в GGplot:
источник
Обратите внимание, что это решение не будет работать хорошо в случае, если ggplot покажет меньше факторов, чем на самом деле содержит ваша переменная (что могло бы произойти, если бы вы, например, выполняли поднаборы):
Простое решение (помимо добавления всех неиспользованных факторов в names_li, что может быть утомительным) - удалить неиспользуемые факторы с помощью droplevels (), либо в исходном наборе данных, либо в функции labbeler, см.
источник
Это решение очень близко к тому, что имеет @domi, но оно предназначено для сокращения имени путем извлечения первых 4 букв и последнего числа.
источник
Оба
facet_wrap
иfacet_grid
также принимают входные данныеifelse
в качестве аргумента. Поэтому, если переменная, используемая для огранки, логична, решение очень простое:Если переменная имеет больше категорий,
ifelse
оператор должен быть вложенным .Как побочный эффект, это также позволяет создавать группы в рамках
ggplot
вызова.источник
Добавление другого решения, похожего на @ domi's, с разбором математических символов, надстрочного индекса, нижнего индекса, скобок / скобок, .etc.
Создано 2019-03-30 пакетом представлением (v0.2.1.9000)
источник
Я думаю, что все другие решения действительно полезны для этого, но есть еще один способ.
Я предполагаю:
dplyr
пакет, который имеет удобнуюmutate
команду, иВаш набор данных назван
survey
.Опрос%>% мутации (Hosp1 = Больница1, Hosp2 = Больница2, ........)
Эта команда помогает вам переименовывать столбцы, но все остальные столбцы сохраняются.
Тогда сделай то же самое
facet_wrap
, теперь ты в порядке.источник
Определение функции labeller в
variable, value
качестве аргументов не будет работать для меня. Также, если вы хотите использовать выражение, вам нужно использовать lapply, и вы не можете его просто использоватьarr[val]
, поскольку аргументом функции является data.frame.Этот код работал:
источник
Так как я еще не разрешено комментировать сообщения, я отправляю это отдельно в качестве дополнения к ответу Винса и ответ son520804 в . Кредит идет им.
Используя пример ириса Винса и частичный код son520804, я сделал это с помощью функции mutate и нашел простое решение, не касаясь исходного набора данных. Хитрость заключается в том, чтобы создать вектор имен-заменителей и использовать mutate () внутри канала для временной коррекции имен фасетов:
В этом примере вы можете видеть, что уровни i $ Species временно изменяются на соответствующие общие имена, содержащиеся в векторе new_names. Строка, содержащая
может быть легко удален, чтобы показать оригинальное наименование.
Предупреждение: это может легко привести к ошибкам в именах, если вектор new_name настроен неправильно. Вероятно, было бы намного понятнее использовать отдельную функцию для замены переменных строк. Имейте в виду, что вектор new_name может потребоваться повторять различными способами, чтобы соответствовать порядку вашего исходного набора данных. Пожалуйста, дважды и трижды проверьте, что это правильно достигнуто.
источник
new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')
и затем в mutate вы можете создать новый столбец таким образом:mutate(Spec = new_names[Species])
Это работает для меня.
Определите фактор:
и использовать в
ggplot()
:источник
Просто расширяя ответ naught101 - ему достается кредит
Что вам нужно сделать, это создать список с сопоставлением имени к имени
и переопределить
plot_labeller()
с новыми аргументами по умолчанию:А потом:
В качестве альтернативы вы можете создать отдельную функцию для каждого изменения метки, которое вы хотите иметь.
источник
У меня есть другой способ достижения той же цели без изменения базовых данных:
То, что я сделал выше, это изменение меток фактора в исходном фрейме данных, и это единственное отличие по сравнению с вашим исходным кодом.
источник
Вы пытались изменить конкретные уровни вашего
Hospital
вектора?источник
Я чувствую, что должен добавить свой ответ к этому, потому что мне потребовалось довольно много времени, чтобы сделать эту работу:
Этот ответ для вас, если:
bquote
) в ваших ярлыках иЯ в основном поместил метки в именованный вектор, чтобы метки не путались и не переключались.
labeller
Выражение, вероятно , может быть проще, но это по крайней мере , работы (улучшения очень приветствуется). Обратите внимание на `(обратные кавычки), чтобы защитить фасет-фактор.источник
Простое решение ( отсюда ):
источник
После борьбы за какое - то время, что я нашел то , что мы можем использовать
fct_relevel()
иfct_recode()
отforcats
совместно изменить порядок граней , а также исправить фасеты этикетку. Я не уверен, что это поддерживается дизайном, но это работает! Проверьте графики ниже:Создано 2020-02-16 пакетом представлением (v0.3.0)
источник