【问题标题】:Multiple plots in one figure in RR中一个图中的多个图
【发布时间】:2020-05-07 12:25:15
【问题描述】:

我有三个图,我想用如下图显示它们

link

我做了几次尝试,但没有成功。我的代码如下:

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 绘制在一张图像中,并且只有一个日期轴。如何修改代码以实现示例结果?谢谢。

【问题讨论】:

  • 你能在这里分享你的数据框吗?为此,请发布dput(dat) 的输出。从它的外观来看,你有“宽”数据,它应该是整齐的格式。换句话说,dat$PS.230dat$PS.286dat$389 应该被聚集到列中:一个键和一个值。这可以通过dplyr 中的gather() 函数来完成。然后您可以使用x=datesy=value 进行绘图,并使用face_grid() 构建多重绘图。如果你分享你的数据,我可以帮忙写一些代码。
  • *抱歉 - 那是facet_grid(),不是face_grid()
  • 谢谢@chemdork123。我运行了 dput(dat) 命令,输出为:justpaste.it/3fwsf
  • 我有话要说清楚。例如,图表中有 3 个数据。但我想在图表中显示 1 条数据。也就是第一张图只有ps230,第二张图是ps286,第三张图只有ps389。我认为当我看这个图时更容易理解。 ibb.co/rdL1fZK

标签: r ggplot2 plot figure


【解决方案1】:

感谢您发布您的数据。如前所述,第一步是整理您的数据集,使其位于Tidy Data format 中。 dat$PS.230dat$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 排除该列:

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()

【讨论】:

  • 非常感谢。
  • 如果您有空请再问一个问题... 如果我想在 PS.230 和其他中绘制多条线,我该如何设置代码和数据结构?比如这个数据gofile.io/d/vHxJsE
  • 抱歉,我无法点击 gofile 链接,但总体思路是遵循与组合(收集)数据集相同的结构。我建议添加一个列来区分 PS.230 中的两行 - 就像 dat$replicate &lt;- 1 使所有内容都具有 1,然后您将添加新数据集,其中 dat$replicate 为 2(或其他)。代码保持不变,只是您需要将group=replicate 包含在ggplot() 中的aes() 中,以便geom_linegeom_point 知道这两个应该被视为单独的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2013-06-12
  • 2016-02-28
  • 2010-12-05
  • 2015-12-06
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多