查看原文
其他

R绘图案例|基于分面的折线图绘制

庄闪闪 庄闪闪的R语言手册 2023-09-04

点击下方公众号,回复资料分享,收获惊喜

简介

最近撰写论文中需要通过可视化说明不同模型(Method)的结果在三种评价指标(MAE、MAPE、RMSE)下的估计性能。并且这个估计结果是预测未来 1-7 天的预测值。

最终,小编选择使用折线来刻画,并按照评价指标进行分面。每个分面中用不同的颜色和形状表示不同的方法。具体图如下:

注意:本文主要分享这幅图的绘制过程,将提供示例数据(经过处理)和代码,大家可以根据自己科研需求进行改变。在公众号后台回复[分面折线图]即可免费获取。

数据处理

加载所需 R 包,并导入数据,修改列名。此时,数据预览如下:

# library
library(ggplot2)
library(viridis) #配色所需
library(tidyverse)

dat = read.csv("data_city.csv",header = F#导入数据
colnames(dat) = c("Method","Cri",1:7#修改列名
head(dat)

使用 Tidyverse 包中的 pivot_longer() 将宽表转化为长表,具体教程可见:《R语言教程》。

之后,加入两列数据:

1.三种指标数据(Cri);

2.不同方法(Method)并将其转化为因子形式。

数据预览如下:

data = dat[,3:9] %>% pivot_longer(1:7,
                      names_to = "time",
                      values_to = "value",
                      names_transform = list(time = as.integer)
)
data["Cri"] = rep(rep(c("RMSE","MAE","MAPE"),each = 7),5)
data["Method"] = rep(c("FNN","RNN","LSTM","Bi-LSTM","ENDC-LSTM"),each= 21)
factor(data["Method"], levels = c("FNN""RNN""LSTM""Bi-LSTM""ENDC-LSTM"))

head(data)

这里小编直接用基础包的写法了,当然读者也可以试试 Tidyverse 的语法~

绘图

根据上述数据进行可视化,其中将 color 和 shape 都you Method 决定。并加入两个几何对象(geom_point()geom_line())。最后,利用 facet_wrap() 按照 Cri 进行分面。结果如下:

ggplot(data, aes(x=time, y=value, color = Method,shape = Method)) + 
  geom_point() +
  geom_line() + 
  facet_wrap(vars(Cri), nrow =1,strip.position = "top"

最后,对图形进行稍微的修饰。修改了图形主题,坐标轴,配色等。

ggplot(data, aes(x=time, y=value, color = Method,shape = Method)) + 
  geom_point() +
  geom_line() + 
  facet_wrap(vars(Cri), nrow =1,strip.position = "top"
ggplot(data, aes(x=time, y=value, color = Method,shape = Method)) + 
  geom_point() +
  geom_line() + 
  scale_color_viridis(discrete = T,option = "G", direction = -1) +
  scale_x_continuous(expand = c(0.1,0.1),
                     breaks = c(1:7),
                     limits = c(1,7)) +
  facet_wrap(vars(Cri), nrow =1,strip.position = "top") +
  theme_bw() +  
  theme(panel.grid = element_blank(), legend.position="right") +
  xlab("Time") +
  ylab("Value")

注意:如果读者想掌握 ggplot2 包的基础语法,可以去小编的 B 站【庄闪闪】搜索可视化教程。其他相关推文如:常用 7 大类图形可视化汇总——ggplot2包可视化设计没灵感?快来看看这些宝藏学习网站吧~

小编有话说

  1. 分面内有很多细节可以修改(修改颜色,字体大小,位置等),如果对此感兴趣,可阅读以前的推文:如何在分面中添加数学表达式标签?ggplot 分面的细节调整汇总R可视乎|分面一页多图

  2. 读者可以根据本文的原始数据和源代码进行修改。在公众号后台回复[分面折线图]即可免费获取,当然也欢迎大家帮我宣传下公众号~

完整代码

# library
library(ggplot2)
library(viridis)
library(tidyverse)
# data reprocess
dat = read.csv("data_city.csv",header = F)
colnames(dat) = c("Method","Cri",1:7)

data = dat[,3:9] %>% pivot_longer(1:7,
                      names_to = "time",
                      values_to = "value",
                      names_transform = list(time = as.integer)
                      )
data["Cri"] = rep(rep(c("RMSE","MAE","MAPE"),each = 7),5)
data["Method"] = rep(c("FNN","RNN","LSTM","Bi-LSTM","ENDC-LSTM"),each= 21)
factor(data["Method"], levels = c("FNN""RNN""LSTM""Bi-LSTM""ENDC-LSTM"))

head(data)

# plot
ggplot(data, aes(x=time, y=value, color = Method,shape = Method)) + 
  geom_point() +
  geom_line() + 
  scale_color_viridis(discrete = T,option = "G", direction = -1) +
  scale_x_continuous(expand = c(0.1,0.1),
                     breaks = c(1:7),
                     limits = c(1,7)) +
  facet_wrap(vars(Cri), nrow =1,strip.position = "top") +
  theme_bw() +  
  theme(panel.grid = element_blank(), legend.position="right") +
  xlab("Time") +
  ylab("Value")


推荐: 可以保存以下照片,在b站扫该二维码,或者b站搜索【庄闪闪】观看Rmarkdown系列的视频教程。Rmarkdown视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown


R沟通|Rmarkdown教程(4)


R沟通|Rmarkdown教程(3)


R沟通|Rmarkdown教程(2)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存