Объединение графиков и перекрывающихся объектов geom_rect с использованием ggplot2 и cowplot - PullRequest
0 голосов
/ 30 мая 2018

Я собираюсь подвести итог некоторым вопросам, заданным ранее на этом форуме ( 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 и A и B в 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()

Вот результаты: enter image description here enter image description here

Сейчас,Я объединяю их обоих, используя cowplot

library(cowplot)
ggdraw(dif_pk) +
  draw_plot(dif_perio)

С таким результатом: enter image description here

Что я хочу?

ПодшипникИмея в виду последнее изображение, мне нужно исправить несколько проблем, чтобы получить идеальный график:

  • Идеальное выравнивание оси обоих графиков с использованием cowplot.Вы можете видеть в верхнем левом и нижнем правом углах, как ось смещена.Поэтому я хотел бы, чтобы они образовали полный и однородный прямоугольник.
  • Я хочу представить 95 доверительных границ, но только показывая перекрывающиеся области обоих графиков.Таким образом, только два перекрывающихся прямоугольника могут появиться приблизительно в центре диаграммы , один для группы A и один для группы B.Вертикальные и горизонтальные полосы должны исчезнуть.
  • Мне бы хотелось, чтобы предыдущие прямоугольники были alpha = .5, чтобы перекрывающаяся область между ними была очевидной.
  • Каждый из предыдущих прямоугольников должен сохранять цвет из каждой группы: A (красный)и B (синий).
  • Я хотел бы удалить одну легенду и заменить другую, чтобы облегчить интерпретацию.

Прямоугольники должны быть похожи на те, которые были сделанывручную с использованием Inkscape:

enter image description here

Буду искренне признателен за вашу помощь.Надеюсь, эксперт по кодированию R поможет мне!

...