Изменение порядка переменных на графике ggplot

#r #ggplot2

Вопрос:

У меня возникли проблемы с представлением нескольких переменных в конкретном порядке. По умолчанию я получил переменные в алфавитном порядке, но я хочу упорядочить их в зависимости от их природы (в моем случае показаны сначала климатические переменные, морфологические переменные и, наконец, экологические переменные). Как я могу этого достичь? Вот код, который я использую:

 
pdf("posterior_means.pdf", width=8, height=6)

ggplot(EstimatesMCMC, aes(Predictor, Mean))  
  geom_point()  
  geom_point( colour = 'black', size = 3)  
  labs(y = "Posterior distribution")  
  labs(x = "")  
  theme_bw()  
  theme(text=element_text(size = 12))  
  geom_hline(yintercept=0, linetype="dashed", color = "grey", size=1)  
  coord_flip()  
  geom_pointrange(aes(ymin = `LowerCI`, ymax = `UpperCI`))```

Predictor variables are represented in Y axe, while X axe shows posterior distribution range. 

I really appreaciate any comments
 

Комментарии:

1. Привет, ОП, вы захотите установить уровни столбца через factor(... , levels=) до построения графика. Без репрезентативного примера трудно предложить больше поддержки. Вы можете указать levels= вручную, но я бы рекомендовал (1) сгруппировать ваш фрейм данных по переменной группировки, (2) применить новый порядок, если вам нужно, (3) установить уровни на основе этого конкретного порядка. Зависит от того, как выглядит фрейм данных.

2. Привет, вот как выглядит мой фрейм данных: Предсказатель Средняя температура нижнего уровня 1,103450 1,321270 1,558359 Излучение 0,5196805 0,6963046 0,9059417 Скорость ветра -0,5603989 -0,3723035 -0,2111619 Широта -0,3181382 -0,1045898 0,1045085 Масса тела -5,479218 -1,796575 1,562540 Длина предплюсны -0,788459 2,299675 5,612284 Добывание пищи:Открыто 0,5471171 6,068451 12,405987 Добывание пищи:Вброд -4,462589 -0,9187676 2,622324 Оценка оперения -2,368234 -0,253684 1,856699

Ответ №1:

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

Приведенные ниже данные примера содержат 3 столбца: категория-общая категория для переменной (одна из 3), my_variable-столбец, используемый для оси x. Вы увидите на графике ниже, что ось x расположена в алфавитном порядке, и я покажу вам, как мы можем расположить ее в порядке «категория».

 library(ggplot2)

set.seed(8675309)

df <- data.frame(
  category = sample(c('Category A','Category B','Category C'), 26, replace=TRUE),
  my_variable =LETTERS,
  values = rnorm(26, 10, 5)
)

p <- ggplot(df, aes(x=my_variable, y=values))   geom_col(aes(fill=category))
p
 

введите описание изображения здесь

Метод 1: Определение уровней в факторе

Порядок меток столбцов будет определяться в первую очередь порядком levels того, является ли это фактором. В противном случае ggplot2 значение по умолчанию будет буквенно-цифровым. Поэтому вы можете задать порядок, преобразовав этот столбец в коэффициент и установив levels= аргумент. В этом случае мы захотим разложить на множители столбец «my_variable». Во-первых, мы хотим привести все в порядок.

 df_ordered <- df %>%
  dplyr::arrange(category)
 

Если вы строите df_ordered так же, как и раньше, вы все равно будете my_variable организованы в алфавитном порядке. Причина в том, что мы не установили этот столбец в качестве фактора. Мы хотим сделать это и указать, что levels= для этого фактора следует использовать порядок, в котором значения отображаются в кадре данных. В этом случае у нас есть только по одному value на каждого my_variable . Если бы у нас было более одного значения для каждого my_variable , мы бы хотели указать каждый элемент my_variable только один раз в levels= аргументе, поэтому я пишу его для более общего использования unique() :

 df_ordered$my_variable <- factor(df_ordered$my_variable,
  levels=unique(df_ordered$my_variable))
 

Теперь, когда вы строите график, порядок определяется порядком уровней фактора df_ordered$my_variable . Мы указали уровни этого фактора в порядке, в котором уровни отображаются в упорядоченном наборе данных, так что теперь это работает нормально:

 ggplot(df_ordered, aes(x=my_variable, y=values))   geom_col(aes(fill=category))
 

введите описание изображения здесь

Способ 2: Используйте Огранку

Альтернативой настройке уровней и изменению порядка вашего фрейма данных является группировка с помощью графика. Самый простой способ сделать это-огранить свой сюжет.

 p   facet_grid(~category, scales='free_x', space="free_x")
 

введите описание изображения здесь

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

 p   facet_grid(~category, scales='free_x', space="free_x", switch = "x")  
  theme(
    panel.spacing = unit(0, 'pt'),
    strip.placement = 'outside',
    strip.background = element_rect(fill='NA', color='black'),
    strip.text = element_text(size=11, face='bold')
  )
 

введите описание изображения здесь

Поиграйте с этими настройками, и вы, вероятно, сможете заставить его выглядеть так, как вы хотите.