python matplotlib怎么在一张图上画多条曲线?Python处理多个csv文件生成叠加曲线图——综合示例:平滑处理图注图例图题范围缩放
Posted R-G-B
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python matplotlib怎么在一张图上画多条曲线?Python处理多个csv文件生成叠加曲线图——综合示例:平滑处理图注图例图题范围缩放相关的知识,希望对你有一定的参考价值。
文章目录
1 问题描述
当我们使用PyTorch可视化工具-Tensorboard打开训练曲线时,有时希望多条曲线放在一张图像显示、对比。
当我们写论文时,希望多条曲线放在一张图像对比、显示。
直接截图放文档里,可比性差,而且原来的坐标轴的数字太小不能修改,导致看不清。
这是我们需要,将数据导出,用python matplotlib处理多个csv文件,在一张图上画多条曲线
2 下载曲线数据
将曲线数据用表格的形式下载,然后用python自己绘制曲线图;
下载格式 .csv
数据下载好后,重命名
3 用python简单的 绘制曲线
from matplotlib import pyplot as plt
import csv
import glob
from os.path import basename
import numpy as np
files = sorted(glob.glob("D:/python/pltt/train_thres_error/*.csv")) #读取目录下所有以.csv结尾的文件,这里可以添加绝对路径
for file in files:
filename = basename(file).rsplit('.', 1)[0] #用.来分割文件名,取前半部分,例如XX.csv,取XX
print('\\r'+ filename + " ", flush = True)
with open(file) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = []
y = [] #横纵坐标分别建立了两个list
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据
y.append(float(row[2])) #读取数据,放入list
# 可视化图线
plt.plot(x, y)
plt.show()
可以看到上面的曲线震荡的很厉害,不利于观察整体趋势,需要滤波处理;
tensorboard显示的曲线是经过平滑处理过的(其灰黑色的背景就平滑处理前的波形);
4 滤波平滑处理
Savitzky-Golay 滤波器讲解
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
'''
详细实现
from matplotlib import pyplot as plt
import csv
import glob
from os.path import basename
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
files = sorted(glob.glob("D:/python/pltt/train_thres_error/*.csv")) #读取目录下所有以.csv结尾的文件,这里可以添加绝对路径
for file in files:
filename = basename(file).rsplit('.', 1)[0] #用.来分割文件名,取前半部分,例如XX.csv,取XX
print('\\r'+ filename + " ", flush = True)
with open(file) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = []
y = [] #横纵坐标分别建立了两个list
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据
y.append(float(row[2])) #读取数据,放入list
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
'''
y = savgol_filter(y, 99, 3, mode= 'nearest')
# 可视化图线
plt.plot(x, y)
plt.show()
5 设置图题、图例、字体、网格、保存曲线图
from matplotlib import pyplot as plt
import csv
import glob
from os.path import basename
from scipy.interpolate import make_interp_spline
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
#dpi参数指定绘图对象的分辨率,即每英寸多少个像素 ;figsize:指定figure的宽和高,单位为英寸
fig=plt.figure(dpi = 80, figsize=(15,8))
#plt.title("Train_thres_error",fontsize = 16)
plt.xlabel("Iterations", fontsize = 25) #横坐标
plt.ylabel("Train_thres_error (mm)", fontsize = 25) #纵坐标
files = sorted(glob.glob("D:/python/pltt/train_thres_error/*.csv")) #读取目录下所有以.csv结尾的文件,这里可以添加绝对路径
for file in files:
filename = basename(file).rsplit('.', 1)[0] #用.来分割文件名,取前半部分,例如XX.csv,取XX
print('\\r'+ filename + " ", flush = True)
with open(file) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = []
y = [] #横纵坐标分别建立了两个list
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据
y.append(float(row[2])) #读取数据,放入list
# plt.xlim((0,90000)) #横轴范围
# plt.ylim((0,0.9)) #纵轴范围
plt.tick_params(labelsize=20)#设置坐标刻度值的字体大小
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
'''
y = savgol_filter(y, 55, 3, mode= 'nearest')
# 可视化图线
plt.plot(x, y, label = '%s' % filename,linewidth=2.0)
#plt.legend()函数的作用是给图像加图例。
plt.legend(frameon=True,loc="upper right",fontsize=25) #分别为图例有边框、图例放在右上角、图例大小
#plt.grid()#添加网格
plt.savefig('D:/python/pltt/Train_thres_error' + '.png',dpi = 80) #保存了绘制的图像
print("Done processing " + str(len(files)) + " files.")
plt.grid()#添加网格
plt.show()
6 补充
6.1 python 曲线平滑处理——方法总结-详解
python 曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)
6.2 Tensorboard可视化训练曲线导出数据用Python绘制
Tensorboard可视化训练曲线导出数据用Python绘制
6.3 PyTorch可视化工具-Tensorboard在线查看训练曲线、网络结构图等
6.4 PyTorch常用小工具-Tensorboard、Summary、Profiler
PyTorch常用小工具-Tensorboard、Summary、Profiler
7 源码下载、曲线数据下载
在一张图上绘制多条曲线?Python处理多个csv文件生成叠加曲线图-综合示例 下载
python在一张图上画多个线条
python 在一张图上画多个roc ptyon在一张图上添加图例 python将多个roc曲线画到一张图上
说明
我写了一个画图函数,这个函数可以画很多图在一个图上: 可以自由的确定画图个数
调用
## 定义方法
mothed1='xgb'
mothed2='svm'
mothed3='rf'
name = 'mouse'
## 定义数据
.....
plt_roc(name,(mothed1,y_predicted1, y_test1), (mothed2,y_predicted2, y_test2),(mothed3,y_predicted3, y_test3))
# name 是title 也就是标题
# (motehd 图例名字,y_predicted 预测的正scores, y_test 也就是ytrue),
plt_roc画图函数代码
from sklearn import metrics
import pylab as plt
import numpy as np
def ks(name,*args):
Font = {'size': 18, 'family': 'Times New Roman'}
color_list = ['r','k','b','y','c','g','m'] ## 颜色限制 !!!
plt.figure(figsize=(6, 6))
print(int(len(args[0])/2))
for i in range(0,len(args)):
print(i)
label = args[i][2]
y_predicted = args[i][1]
fpr1, tpr1, thres1 = metrics.roc_curve(label, y_predicted)
roc_auc = metrics.auc(fpr1, tpr1)
print(roc_auc)
label = args[i][0] + '=' + '%0.3f' % roc_auc
plt.plot(fpr1, tpr1, 'b', label=label, color=color_list[i])
plt.legend(loc='lower right', prop=Font) # 图例
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate', Font)
plt.xlabel('False Positive Rate', Font)
plt.tick_params(labelsize=15)
plt.title(name.upper())
plt.show()
return 0
结果:
暂时先不发图
以上是关于python matplotlib怎么在一张图上画多条曲线?Python处理多个csv文件生成叠加曲线图——综合示例:平滑处理图注图例图题范围缩放的主要内容,如果未能解决你的问题,请参考以下文章