在R中一图多用

问题描述 投票:0回答:1

我有三个小区,我想用下面的图来显示它们。

联系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图在一个图像中,只有一个日期轴。我如何修改代码来实现样本结果?谢谢你。

r ggplot2 plot figure
1个回答
1
投票

谢谢你发布你的数据。 如前所述,第一步是安排好你的数据集,使其处于 整洁数据格式. 中的信息。dat$PS.230, dat$PS.286dat$PS.389 应该用两列来表示比较好。

  1. 第一栏:数据类型名称 - 我们称这一栏为 dat$value_type 并且它将有一些值来表示是否 dat$results 来自PS.230、PS.286或PS.389。

  2. 第二列:数据的值 - 我们称这一栏为 dat$result 而它只是显示了这个值。 这将是 y= 美学的所有情节。

预处理。收集成TidyData格式

使用 gather() 函数来收集所有列到一个键("value_type")和一个 "值"("result")中。 我们将收集除了 "dates "以外的所有列,所以我们只需通过 -dates:

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

情节

对于绘图,你对 "日期 "和 "结果 "应用x和y美学。 您可以使用 "value_type "根据颜色进行区分,并为点和线创建您的图例。 您还可以使用 "value_type "作为创建面(三个独立的图)的列,通过使用 facet_grid() 功能。 请注意 value_type ~ . 按 "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

© www.soinside.com 2019 - 2024. All rights reserved.