当前位置: 首页 > article >正文

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.gridax.grid 效果相同。但如果是多子图:

  • plt.gridplt.grid 只作用于当前活动的子图。
  • 如果需要对特定子图操作,建议使用 ax.gridax.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()


http://www.kler.cn/a/466148.html

相关文章:

  • 【机器学习:一、机器学习简介】
  • 《Rust权威指南》学习笔记(二)
  • 【工具类】RedisUtil 操作相关
  • python.exe无法找到程序入口 无法定位程序输入点(Anaconda Prompt报错)
  • Jenkins 中自动化部署 Spring Boot 项目
  • 51单片机——LED模块
  • Mac设置默认打开程序
  • 学生心理咨询评估系统(源码+数据库+文档)
  • 【LC】191. 位1的个数
  • Python Notes 1 - introduction with the OpenAI API Development
  • PyTorch快速入门教程【小土堆】之完整模型训练套路
  • gin集成Swagger
  • DjangoORM字段参数、常用字段类型及参数、模型和表单验证器详解
  • 三格电子新品上市——IEC103 转 ModbusTCP 网关
  • Redis - 7 ( 11000 字 Redis 入门级教程 )
  • springBoot集成netty中登录鉴权、在pieline消息传递
  • df.groupby(pd.Grouper(level=1)).sum()
  • 解决 `pnpm install` 出现 `ERR_PNPM_ENOENT` 错误的方法
  • 【前端】掌握 JavaScript Map:从入门到精通
  • “善弈者”也需妙手,Oclean欧可林:差异化不是说说而已
  • 适用于小白的程序报错提问 AI 模板
  • scala概念
  • Linux实验报告14-Linux内存管理实验
  • Cpp::哈希表的两种模拟实现方式(27)
  • 肉鸽游戏的魅力
  • 1.2[hardware][day2]