Python(四)——SVG 图坐标轴数字和其他文本设置总结
在学术论文中,图像的质量和规范性直接影响文章的专业性和表达效果。尤其是在使用 Python 绘制 SVG 图时,图像的字体选择、大小设置、以及整体样式需要符合期刊或会议的要求。这不仅能提升视觉呈现的清晰度,还能增强论文内容的可读性和说服力。因此,合理设置坐标轴字体(如数字使用“Times New Roman”、文字使用“宋体”)和调整图像细节是学术制图中不可忽视的重要环节。
1. 设置全局字体
from matplotlib import rcParams
# 全局设置字体为 Times New Roman
rcParams['font.family'] = 'Times New Roman'
作用:
- 设置
matplotlib
的默认字体为 Times New Roman,这样坐标轴刻度、图例等元素会使用这个字体。 - 如果其他地方未单独指定字体,默认会采用这里的设置。
这里如果设置了字体但没用,也可以指定字体的路径,去采用自己系统中的字体:
# 动态加载字体文件路径
sim_sun_path = 'path/to/simsun.ttf' # 替换为宋体字体文件的路径
simsun_font = font_manager.FontProperties(fname=sim_sun_path)
这样后面的字体就使用simsun_font,如
ax.set_xlabel('X 轴', fontproperties=simsun_font, fontsize=12)
2. 创建图表
fig, ax = plt.subplots(figsize=(6, 4)) # 设置图表大小
作用:
- 使用
plt.subplots
创建图表,返回两个对象:图形对象 fig 和坐标轴对象 ax-
fig
(Figure 对象):
整个图表的容器,包括所有的坐标轴、标题、图例等内容。它表示整个图形的框架。 -
ax
(Axes 对象):
表示具体的坐标轴,通常包含数据、刻度、标签、标题等元素。一个图形可以包含多个坐标轴(比如子图)。fig, ax = plt.subplots(figsize=(6, 4)) # 创建一个包含 6x4 英寸大小的图表 ax.plot([1, 2, 3], [4, 5, 6]) # 在 ax 中绘制曲线 ax.set_title('标题') # 设置坐标轴标题 fig.suptitle('全局标题') # 设置图表的全局标题 plt.show()
fig.suptitle()
:设置整个图形的标题。ax.set_title()
:设置某个子图的标题。
-
figsize
参数指定图表的宽度和高度(单位为英寸),可以根据需要调整以适应论文或报告格式。
这里注意:
这里fig, ax = plt.subplots(figsize=(6, 4)) 这样定义,也可以直接plt.subplots(figsize=(6, 4)) ,后面代码同样也可以直接
plt.grid
,ax.grid等
主要是因为这里只有一个图,如果是多个图的话就不可以这样。如果是单个子图,
plt.grid
和ax.grid
效果相同。但如果是多子图:
plt.grid
和plt.grid
只作用于当前活动的子图。- 如果需要对特定子图操作,建议使用
ax.grid
和ax.grid
。
3. 绘制曲线
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
ax.plot(x, y, label='曲线示例', color='blue', linewidth=2, marker='o') # 增加颜色、线宽、标记样式
作用:
- 定义曲线数据:
x
为横坐标,y
为纵坐标。 - 绘制曲线,设置以下样式:
label='曲线示例'
:为曲线添加图例说明。color='blue'
:曲线颜色为蓝色。linewidth=2
:曲线宽度为 2。marker='o'
:在数据点处添加圆形标记。
4. 设置坐标轴标签和标题
ax.set_xlabel('X 轴', fontname='SimSun', fontsize=12) # 使用宋体
ax.set_ylabel('Y 轴', fontname='SimSun', fontsize=12) # 使用宋体
ax.set_title('标题示例', fontname='SimSun', fontsize=16) # 使用宋体
ax.set_aspect('equal', adjustable='datalim') # 设置轴比例相等
作用:
- 设置 X 轴和 Y 轴的标签以及图表的标题。
fontname='SimSun'
:设置字体为宋体,适合中文显示。fontsize
:调整字体大小,标题比坐标轴标签略大。ax.set_aspect()
的作用是将图形的 X 轴和 Y 轴的缩放比例设置为相等,确保图形不会失真。其中'equal'
: 设置 X 和 Y 轴的比例为 1:1。adjustable='datalim'
: 允许根据数据范围调整轴的显示。
这里同样需要注意:
如果使用plt来设置,需要修改为以下内容:
plt.xlabel('X 轴', fontname='SimSun', fontsize=12) # 使用宋体设置 X 轴标签 plt.ylabel('Y 轴', fontname='SimSun', fontsize=12) # 使用宋体设置 Y 轴标签 plt.title('标题示例', fontname='SimSun', fontsize=16) # 使用宋体设置标题 plt.gca().set_aspect('equal', adjustable='datalim') # 获取当前轴对象,并设置轴比例相等,或plt.axis("equal")
5. 设置刻度样式
ax.tick_params(axis='both', which='major', labelsize=10, direction='in', length=6)
ax.tick_params(axis='x', rotation=45) # X 轴刻度旋转 45 度
作用:
axis='both'
:同时设置 X 和 Y 轴刻度。which='major'
:调整主刻度的样式。labelsize=10
:设置刻度标签字体大小为 10。direction='in'
:将刻度线向内指。length=6
:设置刻度线的长度。rotation=45
:将 X 轴刻度标签旋转 45 度,防止标签重叠。
6. 设置次刻度线
ax.tick_params(which='minor', length=4, color='red') # 设置次刻度线样式
ax.minorticks_on() # 添加次刻度线
作用:
- 开启次刻度线显示。
which='minor'
:专门调整次刻度线。- 设置次刻度线的长度为 4,并使用红色以区分主刻度线。
7. 添加图例
# 添加图例
legend = ax.legend(
prop={'family': 'SimSun', 'size': 12}, # 图例字体和大小
loc='upper left', # 图例位置
frameon=False , # 去掉图例边框
fancybox=False
)
# 设置透明度
legend.get_frame().set_alpha(0.7) # 设置图例背景透明度
作用:
- 添加曲线图例。
prop={'family': 'SimSun', 'size': 12}
:将图例字体设置为宋体,字体大小为 12。loc='upper left'
:将图例放置在图表的左上角。frameon=False
:完全关闭图例的边框,使其无框显示fancybox=False
:关闭图例边框的圆角效果。如果边框已经关闭,此参数可以忽略。legend.get_frame().set_alpha(0.7)
: 如果想让图例整体透明,可以使用get_frame().set_alpha()
方法手动设置图例的透明度(0 完全透明,1 不透明)
8. 添加网格线
ax.grid(True, linestyle='--', alpha=0.7) # 改成 False 则去掉网格线
作用:
- 设置网格线的显示样式。
True
:显示网格线(设置为False
时隐藏)。linestyle='--'
:网格线为虚线样式。alpha=0.7
:设置网格线的透明度。
9. 隐藏右边和上边框
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
作用:
- 隐藏图表右边和上边的边框,仅保留左边和下边框,使图表更加简洁。
10. 调整边距和布局
plt.tight_layout()
作用:
- 自动调整图表的边距,确保图表内容(如标签、标题)不被裁剪。
11. 保存和显示图表
plt.savefig('output.svg', format='svg') # 保存为 SVG 文件
plt.show() # 显示图表
作用:
- 将图表保存为 SVG 格式,便于高质量编辑或插入论文。
- 使用
plt.show()
显示图表,方便预览效果。
最后,总得代码如下:
import matplotlib.pyplot as plt
from matplotlib import rcParams
# 全局设置字体为 Times New Roman
rcParams['font.family'] = 'Times New Roman'
# 创建图表
fig, ax = plt.subplots(figsize=(6, 4)) # 设置图表大小
# 绘制简单的曲线
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
ax.plot(x, y, label='曲线示例', color='blue', linewidth=2, marker='o') # 增加颜色、线宽、标记样式
# 设置坐标轴标签和标题
ax.set_xlabel('X 轴', fontname='SimSun', fontsize=12) # 使用宋体
ax.set_ylabel('Y 轴', fontname='SimSun', fontsize=12) # 使用宋体
ax.set_title('标题示例', fontname='SimSun', fontsize=16) # 使用宋体
# 设置刻度字体为 Times New Roman,调整刻度方向和旋转
ax.tick_params(axis='both', which='major', labelsize=10, direction='in', length=6)
ax.tick_params(axis='x', rotation=45) # X 轴刻度旋转 45 度
# 设置次刻度线的样式
ax.tick_params(which='minor', length=4, color='red')
ax.minorticks_on() # 添加次刻度线
# 添加图例
legend = ax.legend(
prop={'family': 'SimSun', 'size': 12}, # 图例字体和大小
loc='upper left', # 图例位置
frameon=False , # 去掉图例边框
fancybox=False
)
# 设置透明度
legend.get_frame().set_alpha(0.7) # 设置图例背景透明度
# 添加网格线
ax.grid(True, linestyle='--', alpha=0.7) #改成False则去掉网线格
# 隐藏右边和上边框
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# 调整边距和布局
plt.tight_layout()
# 保存为 SVG 文件
plt.savefig('output.svg', format='svg')
plt.show()