#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())