【问题标题】:How to generate multible plots from one dataframe in a row in r?如何从 r 中的一个数据帧连续生成多个图?
【发布时间】:2023-01-27 01:01:01
【问题描述】:

我是 R 的新手,并且正在尝试简化我的代码,因为我经常从一个数据帧创建不同的图。我已经尝试过循环,但还没有取得任何成就。 需要的图书馆:

library(dplyr)
library(ggplot2)
library(lubridate)

我有一个数据集,在一段时间内分几批进行不同的测量,与此类似:

x<-rbind(as.data.frame(cbind(batch = "A", datetime = format(seq(as.POSIXct("2023-01-01 06:00:00", tz="UTC"), by="min", length.out=50), "%Y/%m/%d %H:%M:%OS"),
                            rbind(
                                  as.data.frame(cbind(measurement = "ref_Flow",values = rnorm(50, mean = 1.6, sd = 0.005e+01))),
                                  as.data.frame(cbind( measurement = "Flow" ,values = rnorm(50, mean = 1.6, sd = 0.008))),
                                  as.data.frame(cbind(measurement = "ref_Temp",values = rnorm(50, mean = 23, sd = 0.5e+01))),
                                  as.data.frame(cbind(measurement = "Temp",values = rnorm(50, mean = 23, sd = 1))),
                                  as.data.frame(cbind(measurement = "ref_Hum",values = rnorm(50, mean = 50, sd = 1e+01))),
                                  as.data.frame(cbind(measurement = "Hum", values = rnorm(50, mean = 50, sd = 5)))
                                   ))),
         as.data.frame(cbind(batch = "B", datetime = format(seq(as.POSIXct("2023-01-05 08:43:00", tz="UTC"), by="min", length.out=50), "%Y/%m/%d %H:%M:%OS"),
                             rbind(
                               as.data.frame(cbind(measurement = "ref_Flow",values = rnorm(50, mean = 0.16, sd = 0.005e+01))),
                               as.data.frame(cbind( measurement = "Flow" ,values = rnorm(50, mean = 0.16, sd = 0.01))),
                               as.data.frame(cbind(measurement = "ref_Temp",values = rnorm(50, mean = 23, sd = 0.5e+01))),
                               as.data.frame(cbind(measurement = "Temp",values = rnorm(50, mean = 23, sd = 0.8))),
                               as.data.frame(cbind(measurement = "ref_Hum",values = rnorm(50, mean = 50, sd = 1e+01))),
                               as.data.frame(cbind(measurement = "Hum", values = rnorm(50, mean = 50, sd = 2)))
                             ))),
         as.data.frame(cbind(batch = "C", datetime = format(seq(as.POSIXct("2023-01-20 07:33:00", tz="UTC"), by="min", length.out=50), "%Y/%m/%d %H:%M:%OS"),
                             rbind(
                               as.data.frame(cbind(measurement = "ref_Flow",values = rnorm(50, mean = 0.16, sd = 0.005e+01))),
                               as.data.frame(cbind( measurement = "Flow" ,values = rnorm(50, mean = 0.16, sd = 0.002))),
                               as.data.frame(cbind(measurement = "ref_Temp",values = rnorm(50, mean = 23, sd = 0.5e+01))),
                               as.data.frame(cbind(measurement = "Temp",values = rnorm(50, mean = 23, sd = 1.3))),
                               as.data.frame(cbind(measurement = "ref_Hum",values = rnorm(50, mean = 50, sd = 1e+01))),
                               as.data.frame(cbind(measurement = "Hum", values = rnorm(50, mean = 50, sd = 10)))
                             ))))
x$values<-as.numeric(x$values)
x$datetime<-as.POSIXct(x$datetime)

我想绘制每批次的测量值和 ref_measurements。我会为每个批次和测量执行此操作:

ggplot(subset(x, batch == "A") %>% 
         filter(measurement %in% c("Flow", "ref_Flow")))+
  aes(x = datetime, y = values, color = measurement)+
  geom_line()+
  labs(title = "Batch: A",
       subtitle = "Measurement: Flow")

我怎样才能集成一个循环(或类似的)来不重复代码 x 次?

【问题讨论】:

  • 它需要是一个循环吗?一种选择是使用+ facet_wrap(~batch, scales = "free"),您只需要在 y 轴规格方面发挥创意。

标签: r loops ggplot2


【解决方案1】:

使用 for 循环,将绘图存储在列表中

pl <- list()
for(i in unique(x$batch)){
pl[[i]] <- ggplot(subset(x, batch == i) %>% 
               filter(measurement %in% c("Flow", "ref_Flow"))) +
             aes(x = datetime, y = values, color = measurement) +
             geom_line() +
             labs(title = paste("Batch:", i), subtitle = "Measurement: Flow")}

稍后绘制或保存

pl$A

<<plot>>

pdf("file.pdf")

pl$A

dev.off()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多