Объединение графиков и перекрывающихся объектов geom_rect с использованием ggplot2 и cowplot
Я собираюсь подвести итог некоторым вопросам, заданным ранее на этом форуме ( 1, 2), но в данном случае с моими реальными наборами данных и кодами, все вместе. Я застрял и мне нужна помощь, чтобы узнать, как правильно его кодировать.
Давайте начнем с наборов данных. Скачайте и загрузите их отсюда:
perio <- read.csv(url("http://vivaelsoftwarelibre.com/wp-content/uploads/2018/05/perio.csv"), header = TRUE, sep = ",", quote = "\"", dec = ".")
pk <- read.csv(url("http://vivaelsoftwarelibre.com/wp-content/uploads/2018/05/pk.csv"), header = TRUE, sep = ",", quote = "\"", dec = ".")
Как видите, у нас есть два разных набора данных.
Теперь я собираюсь вычислить доверительные интервалы (CL) групп A и B в pk
и А и Б в perio
, предварительно рассчитав средние значения, sd и legnth на группу.
# Calculate mean, sd and length in pk by Comparison
mean_pk <- aggregate(pk[, 1], list(Type=pk$Comparison), mean)
sd_pk <- aggregate(pk[, 1], list(Type=pk$Comparison), sd)
length_pk <- aggregate(pk[, 1], list(Type=pk$Comparison), length)
# 95 confidence limits of pk by Comparison (A and B)
CL_A_pk <- qnorm(0.975)*sd_pk[1,2]/sqrt(length_pk[1,2])
CL_A_pk_lw <- mean_pk[1,2] - CL_A_pk
CL_A_pk_up <- mean_pk[1,2] + CL_A_pk
CL_B_pk <- qnorm(0.975)*sd_pk[2,2]/sqrt(length_pk[2,2])
CL_B_pk_lw <- mean_pk[2,2] - CL_B_pk
CL_B_pk_up <- mean_pk[2,2] + CL_B_pk
# Calculate mean, sd and length in perio by Site
mean_perio <- aggregate(perio[, 2], list(Type=perio$Site), mean)
sd_perio <- aggregate(perio[, 2], list(Type=perio$Site), sd)
length_perio <- aggregate(perio[, 2], list(Type=perio$Site), length)
# 95 confidence limits of pk by Site (A and B)
CL_A_perio <- qnorm(0.975)*sd_perio[1,2]/sqrt(length_perio[1,2])
CL_A_perio_lw <- mean_perio[1,2] - CL_A_perio
CL_A_perio_up <- mean_perio[1,2] + CL_A_perio
CL_B_perio <- qnorm(0.975)*sd_perio[2,2]/sqrt(length_perio[2,2])
CL_B_perio_lw <- mean_perio[2,2] - CL_B_perio
CL_B_perio_up <- mean_perio[2,2] + CL_B_perio
Теперь я собираю их отдельно, с гистограммами, плотностями и объектами geom_rects, с учетом групп (A, B)
# ggplot histogram of pk
library(ggplot2)
dif_pk <- ggplot(pk, aes(x=Count, color=Comparison, fill=Comparison)) +
geom_density(alpha=0.25) +
geom_histogram(aes(y=..density..), alpha=0.25) +
geom_rect(aes(xmin=CL_A_pk_lw, xmax=CL_A_pk_up, ymin=0, ymax=0.3), alpha = 0.5, colour = "darkred", fill = "red") +
geom_rect(aes(xmin=CL_B_pk_lw, xmax=CL_B_pk_up, ymin=0, ymax=0.3), colour = "darkblue", fill = "blue", alpha = 0.5) +
geom_vline(aes(xintercept=0), lwd=0.5, lty=2) +
theme_minimal() +
theme(panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")) +
lims(x=c(-50, 50), y=c(0,0.3))
# ggplot histogram of perio
library(ggplot2)
dif_perio <- ggplot(perio, aes(x=vsSAP, color=Site, fill=Site)) +
geom_density(alpha=0.25, kernel = "gaussian", adjust = 2) +
geom_histogram(aes(y=..density..), alpha=0.25) +
geom_rect(aes(xmin=CL_A_perio_lw, xmax=CL_A_perio_up, ymin=0, ymax=2, alpha=0.5), colour = "darkblue", fill = "blue", alpha =0.5) +
geom_rect(aes(xmin=CL_B_perio_lw, xmax=CL_B_perio_up, ymin=0, ymax=2, alpha=0.5), colour = "darkred", fill = "red", alpha =0.5) +
geom_vline(aes(xintercept=0), lwd=0.5, lty=2) +
theme_minimal() +
theme(panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")) +
scale_x_continuous(position = "top", limits = c(-75, 20)) +
scale_y_reverse(position = "right",limits = c(2,0)) +
coord_flip()
Теперь я объединяю их обоих, используя cowplot
library(cowplot)
ggdraw(dif_pk) +
draw_plot(dif_perio)
Чего я хочу?
Принимая во внимание последнюю картину, мне нужно исправить несколько проблем, чтобы получить идеальный сюжет:
- Идеальное выравнивание оси обоих участков с использованием
cowplot
, Вы можете видеть в верхнем левом и нижнем правом углах, как ось смещена. Поэтому я хотел бы, чтобы они образовали полный и равномерный прямоугольник. - Я хочу изобразить 95 доверительных границ, но только показывая перекрывающиеся области обоих графиков. Таким образом, только два перекрывающихся прямоугольника могут появляться приблизительно в центре диаграммы, один для группы A и один для группы B. Вертикальные и горизонтальные полосы должны исчезнуть.
- Я хотел бы, чтобы предыдущие прямоугольники были
alpha = .5
, так что область перекрытия между ними очевидна. - Каждый из предыдущих прямоугольников должен сохранять цвет каждой группы: A (красный) и B (синий).
- Я хотел бы удалить одну легенду и заменить другую, чтобы облегчить интерпретацию.
Прямоугольники должны быть похожи на те, что были сделаны вручную с помощью Inkscape:
Буду искренне признателен за вашу помощь. Надеюсь, эксперт по кодированию R поможет мне!