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

使用matplotlib绘制范围波动曲线

  论文在做数据分析时,经常需要绘制曲线图,例如对不同的超参数对应的实验性能变化。由于实际实验需要重复执行多次并获取均值和波动范围,需要同时在曲线图中展示。本文介绍并提供使用基于matplotlib绘制简单精美的曲线图。

  展示预期效果,例如给出两个方法在不同训练样本数量条件下的准确率变化情况:

图像特点:

  • 可对比多个不同的方法,不同方法的使用不同颜色、类型的曲线进行绘制;
  • 可展示每个方法对应的极差波动范围,以展示不同方法的稳定程度;
  • 横坐标部分为2倍指数递增;

对应代码:

import numpy as np
import sys
import sklearn
from sklearn import metrics
import matplotlib
matplotlib.use('agg')
from matplotlib import pyplot as plt

plt.figure(figsize=(6, 5)) # 设置整个图像的尺寸(长高分别为6、5个单位)
plt.title("Dataset", size = 24) # 设置标题以及大小
models = ['Baseline', 'Our Proposal'] # 定义好所有模型名称
cnt = 0
maker = ['^','s'] # 曲线标记
x = [16, 32, 64, 128, 256, 512] # 作为横轴
x_names = ['16', '32', '64', '128', '256', '512'] # 横轴展示的值
results = {
    
     # 用于展示每个方法的曲线
    'Baseline': [81.42, 88.19, 90.94, 92.55, 93.58, 94.27],
    'Our Proposal': [93.46, 92.55, 92.67, 94.50, 95.07, 95.18]
}
ranges_top = {
    
     # 用于展示每个方法的上界
    'Baseline': [85.32, 89.65, 91.66, 92.89, 93.92, 94.61],
    'Our Proposal': [93.98, 93.46, 93.00, 94.84, 95.30, 95.30]
}
ranges_bottom = {
    
     # 用于展示每个方法的下界
    'Baseline': [76.26, 86.50, 90.13, 92.20, 93.35, 94.04],
    'Our Proposal': [92.89, 91.98, 92.32, 94.21, 94.95, 95.07]
}
for model_name in models:
    y = np.array(results[model_name]).astype(np.float) # 每个方法的值
    y1 = np.array(ranges_top[model_name]).astype(np.float) # 每个方法的上界
    y2 = np.array(ranges_bottom[model_name]).astype(np.float) # 每个方法的下界
    makevery =1
    plt.xscale("log", base=2) # 设置横轴为2倍指数递增
    plt.plot(x, y, label=model_name, linewidth=2, marker=maker[cnt], markevery=makevery, markersize=6) # 绘制当前模型的曲线
    # 填充上下界区域内,设置边界、填充部分颜色,以及透明度
    plt.fill_between(x, y1, y2, #上限,下限
        # facecolor='green', #填充颜色
        # edgecolor='red', #边界颜色
        alpha=0.3
    ) #透明度
    plt.xlabel("#Training (K)",fontsize=18)
    plt.ylabel("Accuracy (%)",fontsize=18)
    plt.ylim([70.0, 100.0]) # 设置纵轴大小范围
    plt.xticks(x, x_names, rotation=0, size = 20) # 设置横轴坐标轴刻度,文字大小为20
    plt.yticks(np.arange(70, 100, 5), rotation=0, size = 20) # 设置纵轴坐标轴刻度(70-100,每隔5个单位绘制刻度),文字大小为20
    cnt+=1
font1 = {
    
    
    'weight' : 'normal',
    'size'   : 22,
}
plt.legend(loc = "lower right", prop=font1) # 设置信息框
plt.grid(False) # 不显示网格线
ax=plt.gca()  #gca:get current axis得到当前轴
# 设置图像的边框颜色
ax.spines['right'].set_color('#ccc')
ax.spines['top'].set_color('#ccc')
ax.spines['left'].set_color('#ccc')
ax.spines['bottom'].set_color('#ccc')
# 设置图像的边框粗细程度
ax.spines['right'].set_linewidth('2.0')
ax.spines['top'].set_linewidth('2.0')
ax.spines['left'].set_linewidth('2.0')
ax.spines['bottom'].set_linewidth('2.0')
# 保存图像
plt.savefig("./"+'show.png', dpi=120, bbox_inches='tight')

猜你喜欢

转载自blog.csdn.net/qq_36426650/article/details/121595307