import matplotlib.pyplot as plt
import numpy as np
import matplotlib.font_manager as fm # 导入字体管理模块
# ---------------------- 1. 数据准备 ----------------------
NT = [2, 3, 4, 5, 6, 7, 8] # x轴:专家数量 (NT)
ATE = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6 0.7] # 左y轴:平均轨迹误差(ATE,值越小越好)
Param = [1, 2, 3, 4, 5, 6, 7] # 右y轴:参数数量 (M,值越小越好)
# ---------------------- 2. 绘图配置 ----------------------
# 替换为你的SimHei.ttf实际路径(根据之前的路径设置)
simhei_path = "/home/lbw/anaconda3/envs/uniad/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf"
# 配置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 1. 定义图片尺寸(可任意调整,字体大小会自动适配)
fig_width = 10 # 图片宽度(英寸)
fig_height = 8 # 图片高度(英寸)
# fig, ax = plt.subplots(figsize=(fig_width, fig_height))
# 2. 定义相对比例系数(根据需求调整,控制字体与图片的比例)
title_ratio = 0.03 # 标题字体占宽度的比例
label_ratio = 0.03 # 坐标轴标签占宽度的比例
tick_ratio = 0.03 # 刻度标签占宽度的比例
annot_ratio = 0.03 # 热图注释占宽度的比例
cbar_ratio = 0.03 # 颜色条刻度占宽度的比例
legend_ratio=0.03 # 题注占宽度的比例
line_width_ratio=0.004 #线宽
mark_ratio=0.015
# 3. 计算相对字号(转换为pt单位:1英寸=72pt)
title_size = fig_width * title_ratio * 72
label_size = fig_width * label_ratio * 72
tick_size = fig_width * tick_ratio * 72
annot_size = fig_width * annot_ratio * 72
cbar_size = fig_width * cbar_ratio * 72
legend_size = fig_width * legend_ratio * 72
line_width = fig_width*line_width_ratio*72
mark_width=fig_width * mark_ratio * 72
# 创建图形和轴
# fig, ax1 = plt.subplots(figsize=(10, 8), dpi=300) # 学术论文级别的图尺寸和分辨率
fig, ax1 = plt.subplots(figsize=(fig_width, fig_height),dpi=300)
ax2 = ax1.twinx() # 创建右侧y轴
# ---------------------- 3. 绘制曲线 ----------------------
# 左y轴:ATE(蓝色,圆形标记,实线)
line_ate, = ax1.plot(NT, ATE,
color='tab:blue',
marker='o',
linestyle='-',
label='ATE', # 图例改为中文
linewidth=line_width)
# 右y轴:参数数量(红色,方形标记,虚线)
line_param, = ax2.plot(NT, Param,
color='tab:red',
marker='s',
linestyle='--',
label='参数数量 (M)', # 图例改为中文
linewidth=line_width)
# ---------------------- 4. 坐标轴设置 ----------------------
# x轴:显示所有NT值
ax1.set_xticks(NT)
ax1.set_xlabel('专家数量 ($N_T$)', fontsize=label_size, fontweight='bold') # x轴标签改为中文
# 左y轴:ATE(蓝色,保留4位小数)
ax1.set_ylabel('ATE(°)', color='tab:blue', fontsize=label_size, fontweight='bold') # 左y轴标签改为中文
ax1.tick_params(axis='y', labelcolor='tab:blue', labelsize=tick_size)
ax1.yaxis.set_major_formatter('{:.4f}'.format) # 格式:0.1234
# 右y轴:参数数量(红色,保留3位小数)
ax2.set_ylabel('模型参数 (M)', color='tab:red', fontsize=tick_size, fontweight='bold') # 右y轴标签改为中文
ax2.tick_params(axis='y', labelcolor='red', labelsize=tick_size)
ax2.yaxis.set_major_formatter('{:.3f}'.format) # 格式:11.659
# ---------------------- 5. 图例和美观设置 ----------------------
# 合并两侧图例,避免重叠
handles = [line_ate, line_param]
labels = [h.get_label() for h in handles]
# ax1.legend(handles, labels, loc='upper left', fontsize=10, framealpha=0.8)
ax1.legend(handles, labels,
loc='upper left', # 图例的锚点为左上角
bbox_to_anchor=(0.1, 1), # x=0.2(向右挪),y=1(保持顶部对齐)
fontsize=legend_size,
framealpha=0.8)
ax1.tick_params(axis='x', labelsize=tick_size) # 新增语句
# 网格线(仅左y轴,避免杂乱)
ax1.grid(linestyle='--', alpha=0.4, color='gray')
# 标题(根据论文场景调整)
# plt.title('不同$N_T$下平均轨迹误差(ATE)与模型参数的对比',
# fontsize=14, fontweight='bold', pad=15) # 标题改为中文
# 紧凑布局,防止标签被截断
plt.tight_layout()
# ---------------------- 6. 保存/显示 ----------------------
plt.savefig('NT_ATE_Param.png', format='png',bbox_inches='tight')
# plt.show()
python绘图参数
于 2025-10-26 20:55:24 首次发布

1067

被折叠的 条评论
为什么被折叠?



