Интервал и настраиваемые отметки по оси x в ggplot

#r #ggplot2 #geom-bar

#r #ggplot2 #геометрическая шкала

Вопрос:

Я пытаюсь принудительно увеличить пространство и отметки на моей оси x. У меня есть следующие данные

df

        Antibiotic timepoint resistant intermediate susceptible
1    Erythromycin0        T0 20.588235    79.411765     0.00000
2    Erythromycin1        T1 32.352941    67.647059     0.00000
3     Doxycycline0        T0  0.000000     0.000000   100.00000
4     Doxycycline1        T1  2.941176     0.000000    97.05882
5     Clindamycin0        T0  2.941176     5.882353    91.17647
6     Clindamycin1        T1 11.764706     5.882353    82.35294
7      Gentamycin0        T0  5.882353     5.882353    88.23529
8      Gentamycin1        T1 17.647059    11.764706    70.58824
9  Clarithromycin0        T0 17.647059    14.705882    67.64706
10 Clarithromycin1        T1 26.470588    23.529412    50.00000

    
 

когда я использую функцию geom_bar, я получаю следующий график

 
ggplot(df, aes(fill= variable, y=value, x=Antibiotic,  pattern = timepoint))   
  geom_bar_pattern(position="fill", stat="identity",
                   color = "black", 
                   pattern_fill = "black",
                   pattern_angle = 45,
                   pattern_density = 0.1,
                   pattern_spacing = 0.025,
                   pattern_key_scale_factor = 0.6) 
       scale_fill_manual(values = c("#0066CC","#FFFFFF","#FF8C00"))  
       theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())  
       scale_pattern_manual(values = c(T0 = "none", T1="stripe"))  
    guides(pattern = guide_legend(override.aes = list(fill = "white")),fill = guide_legend(override.aes = list(pattern = "none")))
 

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

Я хотел бы увеличить пространство между 2-м и 3-м барами, 4-м и 5-м барами и т.д. А также удалите отметки и добавьте пользовательские отметки с метками между 1-м и 2-м столбцами и т. Д. Любая помощь приветствуется

Ответ №1:

Вместо того, чтобы выполнять сложные действия с осью x, рассматривали ли вы возможность фасетирования ваших данных? Прочитав ваш вопрос, это делает очень похожую вещь.

 library(ggplot2)
library(tidyr)

txt <- "Antibiotic timepoint resistant intermediate susceptible
1    Erythromycin0        T0 20.588235    79.411765     0.00000
2    Erythromycin1        T1 32.352941    67.647059     0.00000
3     Doxycycline0        T0  0.000000     0.000000   100.00000
4     Doxycycline1        T1  2.941176     0.000000    97.05882
5     Clindamycin0        T0  2.941176     5.882353    91.17647
6     Clindamycin1        T1 11.764706     5.882353    82.35294
7      Gentamycin0        T0  5.882353     5.882353    88.23529
8      Gentamycin1        T1 17.647059    11.764706    70.58824
9  Clarithromycin0        T0 17.647059    14.705882    67.64706
10 Clarithromycin1        T1 26.470588    23.529412    50.00000"

df <- read.table(text = txt)
df <- df %>% pivot_longer(3:5)
df$abiotic_name <- gsub("0|1", "", df$Antibiotic)

ggplot(df, aes(timepoint, value, fill = name))  
  geom_col()  
  facet_grid(~ abiotic_name, switch = "x")  
  theme(strip.placement = "outside")
 

Создано 2020-12-05 пакетом reprex (версия 0.3.0)

Ответ №2:

Основываясь на изложении Teunbrand с огранкой, вот более полный пример, который показывает, как более полно подделать ось x, используя пользовательские аннотации и элементы темы:

 library(dplyr)
library(tidyr)
library(ggpattern)

df %>% 
  mutate(Antibiotic = gsub("\d", "", Antibiotic)) %>%
  pivot_longer(3:5) %>%
  ggplot(aes(timepoint, value, fill = name, pattern = timepoint))   
  geom_bar_pattern(position="fill", 
                   stat="identity",
                   color = "black", 
                   pattern_fill = "black",
                   pattern_angle = 45/4,
                   pattern_density = 0.1,
                   pattern_spacing = 0.025,
                   pattern_key_scale_factor = 0.6) 
  scale_fill_manual(values = c("#ffabab","#fff5ba","#dbffd7"), 
                    name = "variable")  
  scale_pattern_manual(values = c(T0 = "none", T1="stripe"))  
  labs(x = "Antibiotic")  
  guides(pattern = guide_legend(override.aes = list(fill = "white")),
         fill = guide_legend(override.aes = list(pattern = "none")))  
  facet_grid(.~Antibiotic, switch = "x")  
  annotation_custom(grid::linesGrob(), xmin = 1.5, xmax = 1.5, 
                    ymin = -0.075, ymax = -0.05)  
  coord_cartesian(clip = "off")  
  theme(strip.placement = "outside",
        strip.background = element_blank(),
        panel.spacing = unit(0, "points"),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())
 

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