Разместите различные переменные на разных графиках друг над другом - PullRequest
1 голос
/ 07 февраля 2020

У меня есть 3 разные переменные (A, B, C), которые должны быть нанесены на 3 графика друг на друга (так как они имеют разные оси). Мой вывод имеет много места между графиками, и я хотел бы уменьшить это пространство и иметь только одну ось X в нижней части и более широкие Y-пределы графика для всех.

Я также читал, что facet_wrap - это лучший способ построения нескольких графиков? Не могли бы вы дать мне совет, что лучше делать? Спасибо

Мои данные:

Location = c(1,2,3,4,5,6,7)
A = c(1.16, 0.96, 0.67,0.78, 0.55, 0.3,0.26)
B = c(6.51, 4.98, 2.85, 3.19, 3.60, 10.82, 8.60)
C = c(75.45, 86.66, 103.36, NA, 107.53, NA, 128.49)

df = data.frame(Location, A, B, C)

Мой код:

par(mfrow=c(3,1))

plot(A, type = "l", col = "red", ylab = "A", main="Title", xlab = NULL)
plot(B, type = "l", col = "Blue", ylab = "B", xlab = NULL)
plot(C, type = "p", pch= 19, col = "Blue", ylab = "C", xlab = Location)

enter image description here

Ответы [ 3 ]

2 голосов
/ 07 февраля 2020

Вот вариант с facet_wrap. Я немного реструктурировал ваши данные.

df <- data.frame(Location = rep(Location, 3), y = c(A,B,C), letter = rep(c("A","B","C"), each = 7))

library(ggplot2)

ggplot(df, aes(x = Location, y = y, color = letter)) +
  geom_line() +
  geom_point() +
  scale_x_continuous(breaks = c(1:7), labels = c(1:7)) +
  facet_wrap(~letter, nrow = 3, scales = "free_y") +
  scale_color_manual(values = c("red", "blue", "blue")) + 
  theme(legend.position = "none")
2 голосов
/ 07 февраля 2020

здесь у вас есть x метка "Местоположение" только в конце

par(mfrow=c(3,1))

plot(A, type = "l", col = "red", ylab = "A", main="Title", xlab = "")
plot(B, type = "l", col = "Blue", ylab = "B", xlab = "")
plot(C, type = "p", pch= 19, col = "Blue", ylab = "C", xlab = "Location")
1 голос
/ 07 февраля 2020

Здесь немного другой способ сделать это путем изменения формы вашего фрейма данных с использованием функции pivot_longer из пакета tidyr:

library(dplyr)
library(tidyr)
library(ggplot2)
df %>% pivot_longer(.,-Location, names_to = "var",values_to = "val") %>%
  filter(!is.na(val)) %>%
  ggplot(aes(x = Location, y = val, group = var, color = var))+
  geom_line()+
  ylab("")+
  facet_wrap(.~var, strip.position = "left", ncol = 1, scales = "free_y")+
  theme(strip.background = element_blank(),
        strip.placement = "outside")

enter image description here

РЕДАКТИРОВАТЬ: Изменение масштаба только фасета

Чтобы изменить масштаб только фасета B, чтобы значения y находились в диапазоне от 0 до 40, вы не можете использовать scale_y_continuous, потому что это будет применяться на всех гранях.

Но то, что вы можете сделать, это добавить две точки в вашем фрейме данных со значениями 0 и 40 для группы B, чтобы заставить ggplot строить график во всем диапазоне. Затем вы можете передать цвет этой части прозрачному, чтобы (визуально) удалить их из графика:

df %>% pivot_longer(.,-Location, names_to = "var",values_to = "val") %>%
  filter(!is.na(val)) %>%
  mutate(NewVar = var) %>%
  add_row(., Location = c(1,1),
          var = c("B","B"),
          val = c(0,40),
          NewVar = c("Out","Out")) %>%
  ggplot(aes(x = Location, y = val, group = NewVar, color = NewVar))+
  geom_line()+
  ylab("")+
  facet_wrap(.~var, strip.position = "left", ncol = 1, scales = "free_y")+
  theme(strip.background = element_blank(),
        strip.placement = "outside")+
  scale_color_manual(values = c("red","green","blue","transparent"), breaks = c("A","B","C"))

enter image description here

...