Как выровнять графики с общей осью х, построенной с использованием двух разных фреймов данных, если значения оси х не идентичны? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть 2 набора данных, оба с колонкой Глубина. Однако df1 имеет ~ 400 строк и df2 7000 строк. Значения глубины, которые я хочу использовать в качестве моей общей оси x, для df1 идут от 48-120, а df2 от 48-133. Когда я делаю свои графики, эта разница в диапазоне останавливает их выравнивание.

Пример данных df1

глубина L F P Депо 67,48 1,003 1,063 1,066 Turb 67,63 1,004 1,020 1,024 67,73 1,011 1,017 1,028 Dri 67,83 1,006 1,007 1,014 Turb 67,92 1,003 1,029 1,032 Pro 68,06 1,004 1,007 1,011 Pro

Пример данных df2

глубина Ca Ti 67,41 378 241 67,91 422 253 67,94 402 262 67,95 412 264 67,98 377 266 68,01 386 263 68,02 326 266 68,08 338 219

Я попытался создать отдельные графики, а затем использовать grid.draw, но это не сработало.

создание графиков из DF1

Lin <- ggplot(DF1, aes(x=depth, y=L)) + geom_line() + geom_point(data = DF1, aes(x=depth, y=L, color = Depo))
Fab <- ggplot(DF1, aes(x=depth, y=P)) + geom_path() + geom_point(data = DF1, aes(x=depth, y=P, color = Depo))
Fol <- ggplot(DF1, aes(x=depth, y=F)) + geom_path() + geom_point(data = DF1, aes(x=depth, y=F, color = Depo))

Объединение графиков с grid.draw работает для графиков df1

grid.draw(rbind(ggplotGrob(Fol), ggplotGrob(Lin), ggplotGrob(Fab), size = "last"))

Создание сюжета из DF2

Ca1 <- ggplot(DF2, aes(x=depth, y=Ca)) + geom_path()

Когда я пытаюсь объединить графики из двух кадров данных, выдается ошибка, что x и y должны иметь одинаковое количество столбцов.

grid.draw(rbind(ggplotGrob(Fol), ggplotGrob(Lin), ggplotGrob(Fab), ggplotGrob(Ca1), size = "last"))

Cowplot работает, но глубина не совпадает для моего графика df2 (Ca1)

plot_grid(Fol, Lin, Fab, Ca1, align="h", axis="b", nrow = 4, rel_widths = c(1,2))

Я пробовал некоторые другие способы выравнивания графиков, но кажется, что все они выравнивают графики вверх, а не фактические значения оси x. Я также пытался использовать фасетную обертку, но не мог понять, как объединить 2 dfs. В поисках решения этой проблемы я продолжаю видеть, как объединить 2 кадра данных, но я не вижу, как это будет работать с моими данными? Кто-нибудь знает, как я могу выстроить эти графики? У меня так много переменных, которые мне нужно сравнить из обоих наборов данных.

1 Ответ

1 голос
/ 04 апреля 2019

Чтобы объединить два набора данных, которые имеют только общую «глубину», вы можете собрать оставшиеся числовые столбцы в «длинный» формат, где мы помечаем тип данных в одном столбце (здесь 'col') изначение в другом ('val' здесь).

После объединения данных мы можем использовать facet_wrap(~col, scales = "free_y") для создания фасетов для каждой переменной, но с общей осью X.

library(tidyverse)
df_combo <- 
  bind_rows(
    df1 %>% gather(col, val, L:P),
    df2 %>% gather(col, val, Ca:Ti)
  )

ggplot(df_combo, aes(depth, val, color = Depo)) +
  geom_path() +
  facet_wrap(~col, scales = "free_y", ncol = 1)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...