Несколько графиков на одной фигуре в R - PullRequest
0 голосов
/ 07 мая 2020

У меня есть три графика, и я хочу показать их на рисунке, как показано ниже

ссылка enter image description here

Я сделал несколько попытки, но я не увенчалась успехом. Мои коды приведены ниже:

dat <- read.table(text="
dates   PS.230  PS.286  PS.389
3.01.2018   20.75103    16.69312    -6.503637
15.01.2018  15.00284    16.03211    16.1058
8.02.2018   11.0789 7.438522    -2.970704
20.02.2018  15.10865    12.8969 3.935687
4.03.2018   24.74799    19.25148    9.186779
28.03.2018  -1.299456   7.028817    -8.126284
9.04.2018   4.778902    8.309322    -3.450085
21.04.2018  7.131915    9.484932    -4.326919


", header=T, stringsAsFactors=FALSE)
dat$dates <- as.Date(dat$dates, "%d.%m.%Y")


library(ggplot2)
library(tidyverse)

a <- ggplot(dat, aes(x=dates, y=PS.230)) +
  geom_point() +
  geom_line() +
  geom_smooth(se = FALSE, method = lm, size = 0.15, color = "#da0018") +  #cizgi eklemek icin
  scale_x_date(date_breaks = "1 months",date_labels = "%Y-%m",
               limits = as.Date.character(c("01/12/2017","31/12/2018"),
                                          format = "%d/%m/%Y")) +
  ylim(-20,40) +
  ylab("[mm/year]") +
  xlab("") +
  theme_linedraw() #theme_light
a + theme(
  axis.text.x = element_text(angle = 45, hjust = 1),
  panel.grid.major.x = element_blank(),
  panel.grid.minor.x = element_blank()
)

b <- ggplot(dat, aes(x=dates, y=PS.286)) +
  geom_point() +
  geom_line() +
  geom_smooth(se = FALSE, method = lm, size = 0.15, color = "#da0018") +  #cizgi eklemek icin
  scale_x_date(date_breaks = "1 months",date_labels = "%Y-%m",
               limits = as.Date.character(c("01/12/2017","31/12/2018"),
                                          format = "%d/%m/%Y")) +
  ylim(-20,40) +
  ylab("[mm/year]") +
  xlab("") +
  theme_linedraw() #theme_light
b + theme(
  axis.text.x = element_text(angle = 45, hjust = 1),
  panel.grid.major.x = element_blank(),
  panel.grid.minor.x = element_blank()
)

c <- ggplot(dat, aes(x=dates, y=PS.389)) +
  geom_point() +
  geom_line() +
  geom_smooth(se = FALSE, method = lm, size = 0.15, color = "#da0018") +  #cizgi eklemek icin
  scale_x_date(date_breaks = "1 months",date_labels = "%Y-%m",
               limits = as.Date.character(c("01/12/2017","31/12/2018"),
                                          format = "%d/%m/%Y")) +
  ylim(-20,40) +
  ylab("[mm/year]") +
  xlab("") +
  theme_linedraw() #theme_light
c + theme(
  axis.text.x = element_text(angle = 45, hjust = 1),
  panel.grid.major.x = element_blank(),
  panel.grid.minor.x = element_blank()
)

в предоставленной мной ссылке, гораздо лучшая графика была нарисована с меньшим количеством линий. мои коды кажутся немного сложнее, и, честно говоря, я не мог выбраться. a, b и c графики на одном изображении и только на одной оси даты. Как я могу изменить коды для получения результата образца? Спасибо.

1 Ответ

1 голос
/ 07 мая 2020

Спасибо за размещение ваших данных. Как уже упоминалось, первый шаг - организовать набор данных так, чтобы он был в формате Tidy Data . Информация в dat$PS.230, dat$PS.286 и dat$PS.389 должна быть лучше представлена ​​в двух столбцах:

  1. Первый столбец: имя типа данных - Мы ' Я назову этот столбец dat$value_type, и он будет иметь значения, указывающие, исходит ли dat$results из PS.230, PS.286 или PS.389.

  2. Второй столбец : значение данных - мы назовем этот столбец dat$result, и он просто показывает значение. Это будет y= aestheti c для всех графиков.

Предварительная обработка: сбор в формате TidyData

Используйте функцию gather(), чтобы собрать все столбцы в ключ ("тип_значения") и "значение" ("результат"). Мы соберем все столбцы, кроме «дат», поэтому отметим, что нужно исключить этот столбец с помощью -dates:

dat <- dat %>% gather(key='value_type', value='result', -dates)

Plot

Для графика вы применяете x и y эстетика на «дату» и «результат». Вы можете использовать "value_type", чтобы различать по цвету и создавать легенду для точек и линий. Вы также используете "value_type" в качестве столбца для создания фасетов (трех отдельных графиков) с помощью функции facet_grid(). Обратите внимание, что value_type ~ . упорядочивается по "типу_значения" по вертикали, а . ~ value_type - по горизонтали:

ggplot(dat, aes(x=dates, y=result)) +
  geom_line(aes(color=value_type)) +
  geom_point(aes(color=value_type)) +
  scale_x_date(date_breaks = '1 months', date_labels = '%Y-%m') +
  facet_grid(value_type ~ .) +
  theme_bw()

enter image description here

...