【Python】绘图技巧:目标检测领域常见的折线图和散点图

直接上图

在这里插入图片描述
在这里插入图片描述
 

要点解析

  • 绘图工具包:matplotlib
  • 英文及数学公式字体格式:Times New Roman
  • 中文字体格式:宋体(SimSun
  • 其他的直接看代码吧

折线对比图

import matplotlib.pyplot as plt
# 设置字体格式
from matplotlib import rcParams
from matplotlib.ticker import MultipleLocator

size = 14  # 全局字体大小
# 设置英文字体
config = {
    
    
    "font.family": 'serif',
    "font.size": size,
    "mathtext.fontset": 'stix',
    "font.serif": ['Times New Roman'],
}
rcParams.update(config)
# 设置中文宋体
fontcn = {
    
    'family': 'SimSun', 'size': size}
label_size = size
text_size = size

# 数据1
baseline_mAP = [36.4, 45.4, 53.9, 57.2, 58.0]
baseline_param = [1.79, 7.07, 20.95, 46.2, 86.2]

# 数据2
my_mAP = [39.9, 50.6, 56.2, 58.9, 59.8]
my_param = [1.55, 6.09, 18.8, 42.7, 81.1]

# 参数设置
lw = 2
ms = 8
my_text = ['N', 'S', 'M', 'L', 'X']
# 绘制 mAP-Param
plt.figure(figsize=(6.4, 4.8))
plt.plot(my_param, my_mAP, label='红色',
         c='r',
         lw=lw,
         marker='o',
         markersize=ms,
         ls='-')
plt.plot(baseline_param, baseline_mAP, label='蓝色',
         c='b',
         lw=lw,
         marker='*',
         markersize=ms,
         ls='--')
plt.legend(loc='lower right', prop=fontcn)
plt.ylabel('$M_\mathrm{mAP}$ (%)', fontsize=label_size)
plt.xlabel('$N_\mathrm{Param}$ (M)', fontsize=label_size)
# 设置坐标轴间隔
x_major_locator = MultipleLocator(10)
y_major_locator = MultipleLocator(3.5)
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
ax.yaxis.set_major_locator(y_major_locator)
plt.xlim([-3, 90])
plt.ylim([35, 62])
plt.text(my_param[0] - 3.5, my_mAP[0] + 0.8, my_text[0], color="k", fontsize=text_size)
plt.text(my_param[1] - 2, my_mAP[1] + 0.8, my_text[1], color="k", fontsize=text_size)
plt.text(my_param[2] - 2, my_mAP[2] + 0.8, my_text[2], color="k", fontsize=text_size)
plt.text(my_param[3] - 3, my_mAP[3] + 1.0, my_text[3], color="k", fontsize=text_size)
plt.text(my_param[4] - 2, my_mAP[4] + 0.8, my_text[4], color="k", fontsize=text_size)
plt.grid(linestyle='--')
plt.show()

散点对比图

import matplotlib.pyplot as plt
# 设置字体格式
from matplotlib import rcParams
import matplotlib.patches as patches

size = 12  # 全局字体大小
# 设置英文字体
config = {
    
    
    "font.family": 'serif',
    "font.size": size,
    "mathtext.fontset": 'stix',
    "font.serif": ['Times New Roman'],
}
rcParams.update(config)
# 设置中文宋体
fontcn = {
    
    'family': 'SimSun', 'size': size}  
label_size = size
text_size = size
# 数据
mAP = [36.9, 41.6, 38.5, 41.9, 45.9, 43.5, 45.4, 50.6]
param = [9.36, 9.62, 27.2, 41.2, 69.0, 36.5, 7.07, 6.09]
param2 = [i * 30 for i in param]
FPS = [169.5, 61.0, 43.3, 9.5, 3.7, 15.0, 82.0, 53.8]

# 绘制参数量标准
param_legend = [5, 15, 30, 50, 70]
param_legend = [i * 30 for i in param_legend]
param_x = [-10, 2.3, 20, 43, 71]
param_y = [32.5, 32.5, 32.5, 32.5, 32.5]
param_color = [(0.45, 0.45, 0.45)] * 5
param_text = ['5M', '15M', '30M', '50M', '70M']

# 参数设置
lw = 2
ms = 15
my_text = ['Demo1', 'Demo2', 'Demo3',
           'Demo4', 'Demo5', 'Demo6', '蓝色', '红色']
my_text2 = '-S'
color = ['C8', 'C1', 'C0', 'C6', 'C4', 'C9', 'b', 'r']

# 绘制 mAP-Param
plt.figure()
plt.scatter(FPS, mAP, s=param2, color=color, alpha=0.6)
plt.scatter(param_x, param_y, s=param_legend, color=param_color, alpha=0.2)

# 绘制矩形框
ax = plt.gca()
rect = patches.Rectangle(xy=(-16, 30.3), width=103, height=5.8,
                         linewidth=0.5, linestyle='-', fill=False, edgecolor='gray')
ax.add_patch(rect)

# 添加数学公式标签
plt.ylabel('$M_\mathrm{mAP}$ (%)', fontsize=label_size)
plt.xlabel('$N_\mathrm{FPS}$ (Frame/s)', fontsize=label_size)
plt.xlim([-20, 200])
plt.ylim([30, 52.5])

# 添加方法名
plt.text(FPS[0] - 9, mAP[0] + 0.9, my_text[0], color="k", fontsize=text_size)
plt.text(FPS[1] - 10, mAP[1] + 0.8, my_text[1], color="k", fontsize=text_size)
plt.text(FPS[2] - 11, mAP[2] + 1.4, my_text[2], color="k", fontsize=text_size)
plt.text(FPS[3] - 11, mAP[3] - 2.2, my_text[3], color="k", fontsize=text_size)
plt.text(FPS[4] - 11, mAP[4] + 2, my_text[4], color="k", fontsize=text_size)
plt.text(FPS[5] - 6, mAP[5] + 1.5, my_text[5], color="k", fontsize=text_size)

plt.text(FPS[6] - 9, mAP[6] + 0.8, my_text[6], color="k", fontdict=fontcn)
plt.text(FPS[6] + 4.5, mAP[6] + 0.8, my_text2, color="k", fontsize=text_size)

plt.text(FPS[7] - 9, mAP[7] + 0.8, my_text[7], color="k", fontdict=fontcn)
plt.text(FPS[7] + 4.5, mAP[7] + 0.8, my_text2, color="k", fontsize=text_size)

# 添加参数量标准大小
plt.text(param_x[0] - 5, 35, param_text[0], color="k", fontsize=text_size)
plt.text(param_x[1] - 6, 35, param_text[1], color="k", fontsize=text_size)
plt.text(param_x[2] - 7, 35, param_text[2], color="k", fontsize=text_size)
plt.text(param_x[3] - 7, 35, param_text[3], color="k", fontsize=text_size)
plt.text(param_x[4] - 7, 35, param_text[4], color="k", fontsize=text_size)
plt.grid(linestyle='--')
plt.show()

猜你喜欢

转载自blog.csdn.net/weixin_43799388/article/details/124697340