简介
最近撰写论文中需要通过可视化说明不同模型(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包;可视化设计没灵感?快来看看这些宝藏学习网站吧~
小编有话说
- 分面内有很多细节可以修改(修改颜色,字体大小,位置等),如果对此感兴趣,可阅读以前的推文:如何在分面中添加数学表达式标签?;ggplot 分面的细节调整汇总;R可视乎|分面一页多图。
- 读者可以根据本文的原始数据和源代码进行修改。在公众号后台回复[
分面折线图
]即可免费获取,当然也欢迎大家帮我宣传下公众号~
完整代码
# 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")