Измените порядок в направлении оси Y на гистограмме с накоплением в ggplot2, как показано последовательностью

используя этот воспроизводимый пример tibble

 # install and attach packages
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, dplyr, ggplot2)  

# Create example dataset (tib1)
tib1 = tibble(location = c("loc1", rep(c("loc1", "loc2"), 8), rep("loc2",2)),
              drill = sort(c(1, rep(1:4, 4),4, 4)),
              thickness = c(20, 34, 99, 67, 29, 22, 53, 93, 64, 98, 76, 42, 49, 23, 11, 74, 
                            19, 50, 40),
              soiltype = c("gravel", rep( c("sand", "loam", "clay"),5 ), "sand", "gravel", "clay")) %>% 
  arrange(location, drill)

tib1 <- tib1 %>% group_by(location, drill) %>% 
  mutate(order = row_number(),
         bottom_of_layer = cumsum(thickness),
         top_of_layer = bottom_of_layer-thickness) %>% 
  ungroup %>% 
  select(location, drill, bottom_of_layer, top_of_layer, thickness, soiltype, order)

tib1

Я хочу нарисовать поперечный разрез почвы. Я пытаюсь сделать это с помощью geom_bar или geom_col из ggplot2. В данных примера дан порядок (1: 3). Я хочу, чтобы столбики располагались в порядке, указанном в столбце порядка. Таким образом, это будет означать, что полоса, в которой:

  • location == loc2 и Drill == 4 должны быть раскрашены в следующем порядке (сверху вниз):

оранжевый (суглинок) - желтый (песок) - серый (гравий) - морской зеленый (глина)

А ТАКЖЕ

  • location == loc1 и Drill == 1 должны быть раскрашены в следующем порядке (сверху вниз):

серый (гравий) - желтый (песок) - морской зеленый (глина)

В то время как остальные столбцы в стопке остаются в том же порядке и цвете.

Другими словами: мне нужно, чтобы цвета на полосе с накоплением менялись в соответствии с последовательностью, указанной в порядке столбцов.

colpalette = c("darkseagreen3", "darkgrey", "#FF9966", "palegoldenrod")

ggplot(tib1,
       aes(x = drill))+
  geom_bar(aes(fill = soiltype, y = -thickness),
           stat = "identity")+
  scale_fill_manual(values = colpalette)+
  facet_wrap(vars(location), scale = "free_x")+
  xlab("drill")+
  ylab("depth (cm)")+
  ggtitle("how to plot the bars in the 'preferred order'? ",
          subtitle = "the order of loc2 and drill == 4 should be: loam-sand-gravel-clay")+
  theme_minimal()

поперечное сечение профиля почвы с geom_bar

Сравнимые, но немного разные проблемы:

Порядок уложенных стержней ggplot2 - профиль почвы и Изменить порядок столбчатой ​​диаграммы с накоплением в ggplot2

Интересно, возможно ли вообще то, о чем я прошу, в ggplot как:

Гистограммы автоматически складываются, когда несколько столбцов помещаются в одно и то же место. Порядок заливки соответствует легенде.

Так что мне, возможно, придется искать альтернативный вариант ... если у кого-то нет взлома? Любая помощь, ответы, альтернативные варианты построения, ссылки приветствуются :) Я предпочитаю ggplot2, если это возможно.


person T. BruceLee    schedule 12.11.2020    source источник


Ответы (2)


Уровни следует заказывать:

ie:

tib1 <- tib1 %>% 
    mutate(soiltype = ordered(soiltype, c("clay", "gravel", "sand", "loam")))

colpalette = c("darkseagreen3", "darkgrey","palegoldenrod","#FF9966")

ggplot(tib1,
       aes(x = drill))+
    geom_bar(aes(fill = soiltype, y = -thickness),
             stat = "identity")+
    scale_fill_manual(values = colpalette)+
    facet_wrap(vars(location), scale = "free_x")+
    xlab("drill")+
    ylab("depth (cm)")+
    ggtitle("how to plot the bars in the 'preferred order'? ",
            subtitle = "the order of loc2 and drill == 4 should be: loam-sand-gravel-clay")+
    theme_minimal()

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

person Onyambu    schedule 12.11.2020
comment
Спасибо за ответ @Onyambu, но мне нужно, чтобы цвета были упорядочены в порядке, указанном в столбце. Это означает, что для некоторых почвенных профилей последовательность цветов отличается от других: Таким образом, почвенный профиль A может быть сверху вниз: желтый - зеленый - желтый - оранжевый В то время как почвенный профиль B может иметь совершенно другой порядок, скажем: зеленый - оранжевый - желтый, находящийся на том же участке. Возможно ли это в ggplot? Если нет, то есть ли другой пакет, который мог бы предоставить решение? - person T. BruceLee; 12.11.2020
comment
@ T.BruceLee разный порядок в одном и том же сюжете? Это настоящая задача. Никогда раньше такого не видел. Но, вероятно, вы могли бы подумать о том, чтобы упорядочить уровни по-разному в каждой подгруппе (на самом деле не знаю, может ли это сработать - возможно, нет). - person Onyambu; 12.11.2020
comment
Да, это странный вопрос. Поскольку ggplot2 не предназначен для такой визуализации. Но тем не менее попробовать стоит. - person T. BruceLee; 12.11.2020

geom_col и geom_bar не являются подходящими ggplot2 функциями, если вы хотите, чтобы заливка или цвет изменялись вместе с последовательностью, поскольку заливка и / или цвет сгруппированы на одной панели. geom_rect может разделять два слоя заливки или цвета внутри полосы / прямоугольника.

p1 <- ggplot(tib1)+
  geom_rect(data = tib1,
            aes(x = NULL, NULL, 
                xmin = drill-0.45, xmax = drill+0.45,
                fill = soiltype,
                ymin = -bottom_of_layer, ymax = -top_of_layer))+
  scale_fill_manual(values = colpalette)+
  facet_wrap(vars(location))+
  xlab("drill")+
  ylab("depth (cm)")+
  ggtitle("how to plot the bars in the 'preferred order'? ",
          subtitle = "the order of loc2 and drill == 4 should be: loam-sand-gravel-clay")+
  theme_minimal()

  # Optional:
  # Adding in text the column called "order"
p1 + geom_text(aes(x = drill,
                y = (bottom_of_layer + top_of_layer)/-2,
                label = order))

Это также возможно с дискретными значениями оси x: как использовать geom_rect с дискретными значениями осей?

График профиля почвы с geom_rect

person T. BruceLee    schedule 15.11.2020