python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置

Posted R-G-B

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置相关的知识,希望对你有一定的参考价值。

文章目录

1 导出曲线数据

训练损失曲线数据,用.csv格式导出,数据如下表所示。用python绘制出 step和Value的关系曲线

2 python简单的 绘制曲线

from matplotlib import pyplot as plt
import csv
import numpy as np

filename = "D:/python/pltt/train_loss.csv"  #.csv文件路径,可以添加绝对路径                                          
with open(filename) as f:                                                                                
    csvreader = csv.reader(f, delimiter = ",", quotechar='"')                                       
    for line in range(1):  #1代表从文件第2行开始读取
        next (csvreader)  
    print("lines: ",line) #打印行数

    x = []   #横纵坐标分别建立了两个list                                                                                  
    y = []   
    for row in csvreader:
        x.append(float(row[1]))   #读取第23列数据,放入list                                                            
        y.append(float(row[2]))  
    
    # 可视化图线                                                               
    plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
                                            
plt.show()      

可以看到上面的曲线震荡的很厉害,不利于观察整体趋势,需要滤波处理

3 Savitzky-Golay 滤波器–平滑曲线

对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。

from matplotlib import pyplot as plt
import csv
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线

from scipy.signal import savgol_filter

filename = "D:/python/pltt/train_loss.csv"  #.csv文件路径,这里可以添加绝对路径                                          
with open(filename) as f:                                                                                
    csvreader = csv.reader(f, delimiter = ",", quotechar='"')                                       
    for line in range(1):  #1代表从文件第2行开始读取
        next (csvreader)  
    print("lines: ",line) #打印行数

    x = []   #横纵坐标分别建立了两个list                                                                                  
    y = []   
    for row in csvreader:
        x.append(float(row[1]))   #读取第23列数据,放入list                                                            
        y.append(float(row[2]))  

     #Savitzky-Golay 滤波器实现曲线平滑
        '''
        scipy.signal.savgol_filter(y, window_length, polyorder)
            y--代表曲线点坐标(x,y)中的y值,为要滤波的信号
            window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
            polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
            mode--滤波器的填充信号的扩展类型
        '''
    y = savgol_filter(y, 99, 1, mode= 'nearest')
    
    # 可视化图线                                                                  
    plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
                                            
plt.show()  
   y = savgol_filter(y, 99, 1, mode= 'nearest')

4 对y轴数值缩放处理

对x,y值进行缩放,有两种方法

# 方法① list转array,在再缩放
y=np.array(y)/500 #list转array,再缩放

# 方法② 直接在plt.plot(x,y/500)中缩放
plt.plot(x, y,'g')

错误方法

y = savgol_filter(y/500, 99, 1, mode= 'nearest')
TypeError: unsupported operand type(s) for /: 'list' and 'int'


y.append(float(row[2]/500))   #读取数据,放入list
TypeError: unsupported operand type(s) for /: 'str' and 'int'

y = y /500
TypeError: unsupported operand type(s) for /: 'list' and 'int'

完整代码

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_loss.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]))   #读取第23列数据                                                            
            y.append(float(row[2]))   #读取数据,放入list                                                             
        
       
        y=np.array(y)/500 #list转array,在缩放

        #Savitzky-Golay 滤波器实现曲线平滑
        '''
        scipy.signal.savgol_filter(y, window_length, polyorder)
            y--为要滤波的信号
            window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
            polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
        '''

        y= savgol_filter(y, 55, 1, mode= 'nearest')
        # 可视化图线
        plt.plot(x, y,'g')
        
plt.show()                       

5 设置图题、图例、字体、网格、保存曲线图

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

#dpi参数指定绘图对象的分辨率,即每英寸多少个像素 ;figsize:指定figure的宽和高,单位为英寸 
fig=plt.figure(dpi = 80, figsize=(15,8))

#设置标题                      
plt.title("Train_loss",fontsize = 25)    #标题
plt.xlabel("Iterations", fontsize = 25)  #横坐标
plt.ylabel("Loss", fontsize = 25)        #纵坐标

files = sorted(glob.glob("D:/python/pltt/train_loss.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]))   #读取第23列数据                                                            
            y.append(float(row[2]))   #读取数据,放入list                                                             
        
        #设置横纵坐标显示范围
        # plt.xlim((0,90000))#横轴范围
        # plt.ylim((0,200)) #纵轴范围
        plt.tick_params(labelsize=20)#设置坐标刻度值的字体大小

 
        y=np.array(y)/500  #list转array,再缩放,否则报错

        #Savitzky-Golay 滤波器实现曲线平滑
        '''
        scipy.signal.savgol_filter(y, window_length, polyorder)
            y--为要滤波的信号
            window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
            polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
        '''

        y_smooth = savgol_filter(y, 55, 1, mode= 'nearest')
        # 可视化图线
        plt.plot(x, y_smooth,'g', label = '%s' % filename, linewidth=3.0)
        
        #plt.legend()函数的作用是给图像加图例。
        plt.legend(frameon=True,loc="upper right",fontsize=25) #分别为图例有边框、图例放在右上角、图例大小
        #plt.grid()#添加网格
        plt.savefig('D:/python/pltt/Train_loss' + '.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在线查看训练曲线、网络结构图等

Tensorboard在线查看训练曲线、网络结构图等

6.4 PyTorch常用小工具-Tensorboard、Summary、Profiler

PyTorch常用小工具-Tensorboard、Summary、Profiler

7 源码下载、曲线数据下载

曲线数据表、源代码、曲线图 下载

Python使用matplotlib绘制三维曲线

  本文主要演示如何使用matplotlib绘制三维图形

  代码如下:

  

# -*- coding: UTF-8 -*-
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams[legend.fontsize] = 10
fig = plt.figure()

# 设置三维图形模式
ax = fig.gca(projection=3d)

# 测试数据
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-4, 4, 100) / 4
r = z**3 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

# 绘制图形
ax.plot(x, y, z, label=parametric curve)

# 显示图例
ax.legend()

# 显示图形
plt.show()

  运行效果

技术分享

 

以上是关于python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置的主要内容,如果未能解决你的问题,请参考以下文章

使用matplotlib绘制范围波动曲线图

Python使用matplotlib绘制三维曲线

使用matplotlib在python中绘制曲线决策边界

绘制阈值(precision_recall 曲线)matplotlib/sklearn.metrics

绘制/计算指数曲线的问题(python、matplotlib、pandas)

在 matplotlib 图中绘制平滑曲线