使用python的头文件Matplotlib时plt.show【标题字体过小】问题根源与解决方案

  • 1. 问题复现
  • 2. 问题分析
  • 3. 解决方案
    • 方案一(`推荐`):使用 `fig.suptitle` 结合 `subplots_adjust`
    • 方案二:以保存文件函数`plt.savefig`为准
    • 方案三:不使用 `tight_layout` ,完全手动布局
  • 4. 总结与建议

1. 问题复现

我们使用python的matplotlib头文件时可能会遇到一个现象:在代码中将**标题-**的fontsize设置为一个较大的值,但在plt.show()弹出的交互式窗口中,标题的显示却非常小。

比如以下代码尝试为一个简单的条形图设置一个fontsize=40的标题。

import matplotlib.pyplot as plt
import pandas as pd
import os
from matplotlib.font_manager import FontPropertiesdef get_chinese_font():"""一个辅助函数,用于获取系统中可用的中文字体。"""font_path_msyh = r'C:\Windows\Fonts\msyh.ttc'font_path_deng = r'C:\Windows\Fonts\Deng.ttf'if os.path.exists(font_path_msyh):print("成功加载字体:微软雅黑 (msyh.ttc)")return FontProperties(fname=font_path_msyh)elif os.path.exists(font_path_deng):print("注意: 未找到微软雅黑,已加载备用字体:等线 (Deng.ttf)")return FontProperties(fname=font_path_deng)else:print("\033[91m错误: 微软雅黑和等线字体均未找到!\033[0m")return FontProperties()# 获取中文字体并准备数据
my_font = get_chinese_font()
data = {'类别': ['A', 'B', 'C', 'D'], '数值': [10, 25, 18, 32]}
df = pd.DataFrame(data)# --- 问题复现代码 ---
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(df['类别'], df['数值'])# 尝试设置一个非常大的标题字体
ax.set_title('这是一个标题(fontsize=40)', fontsize=40, fontproperties=my_font)
ax.set_xlabel('类别', fontproperties=my_font, fontsize=12)
ax.set_ylabel('数值', fontproperties=my_font, fontsize=12)# 使用自动紧凑布局
plt.tight_layout()
plt.show()

在这里插入图片描述

  • 预期结果:标题的字体设置为40,本应是一个标题占据图表显著高度、字体极大的图像。
  • 实际结果:在 plt.show() 窗口中,其视觉大小远未达到 fontsize=40 应有的效果,甚至很小。

2. 问题分析

这是matplotlib头文件的布局与渲染机制交互作用的结果。其核心原因可归结为以下三点:

  1. 绝对字体大小fontsize 参数的单位是 points,是一个绝对度量单位。Matplotlib会根据该值计算标题所需的物理空间。
  2. plt.tight_layout() 的动态调整:当tight_layout()检测到大尺寸标题时,为防止其与图表主体(Axes)重叠,它会增加整个画布(Figure)的理论高度,为标题分配空间。
  3. plt.show() 窗口的缩放行为plt.show()打开的交互式窗口大小受限于当前屏幕分辨率。当它需要展示一个被tight_layout()“撑高”的画布时,为将整个画布完整地放入窗口内,它必须对整个图像进行等比例缩小

结论:预览窗口的整体缩放,抵消了原始设置的巨大字体尺寸。虽然标题相对于图表主体的比例确实变大了,但由于整体图像被缩小,其在屏幕上的绝对视觉大小并未显著增加。

3. 解决方案

方案一(推荐):使用 fig.suptitle 结合 subplots_adjust

通过将标题从“子图级别”(Axes)提升到“画布级别”(Figure),并手动为其预留空间,从而绕开 tight_layout 的过度调整问题。

首先要明白 Matplotlib 的两个核心层级:

  1. 画布 (Figure):整个绘图窗口,就像一张画纸。
  2. 子图 (Axes):画纸上用来画具体图表(如条形图)的矩形区域。

我们的策略分为两步:

  1. 使用 fig.suptitle():与 ax.set_title() 创建的是子图内部的标题元素不同,fig.suptitle() 创建的是整个画布(Figure)的全局标题
  2. 使用 tight_layout() 让子图内部的元素(坐标轴标签等)自动排列整齐。
  3. 再用 fig.subplots_adjust(top=0.9) 手动将整个子图区域在画布内向下移动。比如top=0.90 的意思是“将所有子图的顶部边界向下移动,使其不超过画布总高度的90%”。这就在画布的顶部强制留出了10%的空白区域,专门用于容纳 suptitle

通过这个组合,我们既利用了 tight_layout 自动调整子图内部元素的便利,又通过 subplots_adjust 精确地为全局标题提供了稳定、独立的显示空间,避免了整个画布因标题过大而被缩放的问题。

  • 解决方案代码

import matplotlib.pyplot as plt
import pandas as pd
import os
from matplotlib.font_manager import FontPropertiesdef get_chinese_font():"""一个辅助函数,用于获取系统中可用的中文字体。"""font_path_msyh = r'C:\Windows\Fonts\msyh.ttc'font_path_deng = r'C:\Windows\Fonts\Deng.ttf'if os.path.exists(font_path_msyh):print("成功加载字体:微软雅黑 (msyh.ttc)")return FontProperties(fname=font_path_msyh)elif os.path.exists(font_path_deng):print("注意: 未找到微软雅黑,已加载备用字体:等线 (Deng.ttf)")return FontProperties(fname=font_path_deng)else:print("\033[91m错误: 微软雅黑和等线字体均未找到!\033[0m")return FontProperties()# 获取中文字体
my_font = get_chinese_font()# 准备数据
data = {'类别': ['A', 'B', 'C', 'D'], '数值': [10, 25, 18, 32]}
df = pd.DataFrame(data)
# ... (前面的数据准备和字体获取代码相同) ...# --- 推荐解决方案代码 ---
fig, ax = plt.subplots(figsize=(10, 6))ax.bar(df['类别'], df['数值'])# 1. 使用 fig.suptitle() 设置Figure级标题
fig.suptitle('这是一个正确的标题(fontsize=24)', fontsize=24,  # 使用一个更合理的字体大小fontweight='bold', fontproperties=my_font)ax.set_xlabel('类别', fontproperties=my_font, fontsize=12)
ax.set_ylabel('数值', fontproperties=my_font, fontsize=12)# 2. 调用 tight_layout() 进行初步布局
plt.tight_layout()# 3. 使用 subplots_adjust() 为 suptitle 预留空间,防止重叠
#    top=0.9 表示将子图的顶部边界设置在画布高度的90%处
fig.subplots_adjust(top=0.90)plt.show()

在这里插入图片描述

  • 优点
    • 职责分离fig.suptitle()负责全局标题,ax.set_title()负责子图标题,逻辑清晰。
    • 布局稳定:通过subplots_adjust()为标题提供固定的、不受tight_layout()过度干预的空间,避免了意外的画布缩放。
    • 所见即所得plt.show()预览窗口中的标题大小将更接近最终保存文件的效果。

方案二:以保存文件函数plt.savefig为准

plt.show()本质上是快速预览工具,其渲染可能受GUI后端和屏幕尺寸影响。在学术或报告场景下,最终交付物是静态图像文件。可以尝试使用一下plt.savefig函数

  • 实践
    1. 在代码中设置合理的字体大小(如22-26)。
    2. 执行代码后,调用 plt.savefig('figure.png', dpi=300, bbox_inches='tight')
    3. 检查生成的图像文件,看生成的文件是否符合我们的最终效果。
  • 优点:无需修改绘图逻辑,简单直接;确保了最终输出文件的质量。
  • 缺点:未改善交互式预览的体验。(而且有的时候我尝试可能不起作用

方案三:不使用 tight_layout ,完全手动布局

对于需要精确控制的复杂布局,可以不使用自动布局,转而手动设置所有边距。

  • 实践代码
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(df['类别'], df['数值'])
ax.set_title('手动布局下的标题(fontsize=24)', fontsize=24, fontproperties=my_font)
ax.set_xlabel('类别', fontproperties=my_font, fontsize=12)
ax.set_ylabel('数值', fontproperties=my_font, fontsize=12)# 不调用 plt.tight_layout()
# 手动设置所有边距
fig.subplots_adjust(left=0.1, right=0.95, top=0.88,  # 为大标题留出足够空间bottom=0.1
)plt.show()
  • 优点:提供对布局的完全、精确的控制。
  • 缺点:过程繁琐,需要为每个图表手动调整参数,通用性差。通常只在tight_layout失效的极端情况下使用。

4. 总结与建议

plt.show()中标题字体过小的问题,源于ax.set_title()plt.tight_layout()及预览窗口缩放机制的交互。

解决方案优点缺点推荐指数
1. fig.suptitle + subplots_adjust逻辑清晰,布局稳定,预览效果好需额外代码★★★★★
2. 以保存文件为准简单,保证最终输出质量无法直接预览,有时不起作用★★★☆☆
3. 手动布局完全控制,精度高繁琐★★☆☆☆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916235.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916235.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916235.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面解析MySQL(3)——CRUD进阶与数据库约束:构建健壮数据系统的基石

> 本文将带你深入探索MySQL的进阶CRUD操作与核心约束机制,用设计原则的视角揭示数据库如何保障数据世界的秩序。 ### 一、进阶CRUD:数据操作的精密工具 #### 1. 精准筛选:WHERE子句的深度运用 ```sql -- 基础筛选:价格大于50的菜品 SELECT * FROM dishes WHERE pric…

使用Redis实现MySQL的数据缓存

使用Redis来实现/mySQL的数据缓存的架构1:目标数据从mySQL读取数据或者从Redis读取数据 2:使用cannal监控mySQL:canal-server可以对mysql的blog实行拉取,可以拉去blog里面的(增,删,改等操作,查询…

linux配置ntp时间同步

目录 1.设置时区 2.安装chrony时间同步工具 3.修改chrony配置文件,添加阿里云NTP服务器作为时钟源 4.重启chrony服务,并查看同步结果 1.设置时区 timedatectl set-timezone Asia/Shanghai 2.安装chrony时间同步工具 apt install chrony -y(dnf ins…

powershell 实现批量把文件夹下的bmp文件转换为jpg

以下是一个使用PowerShell将BMP图像批量转换为JPG&#xff08;质量85&#xff09;的脚本&#xff1a; <# .SYNOPSIS批量将BMP图像转换为JPG格式&#xff08;质量85&#xff09; .DESCRIPTION此脚本会遍历指定文件夹中的所有BMP文件&#xff0c;并将它们转换为JPG格式&#x…

星图云开发者平台新功能速递 | 页面编辑器:全场景编辑器,提供系统全面的解决方案

在数字化转型的浪潮下&#xff0c;高效的低代码开发工具成为企业和开发者的刚需&#xff0c;其需要针对Web、APP、H5等不同终端快速构建应用。但不同场景的开发往往需要不同的工具和技术栈&#xff0c;导致开发效率低、协作成本高。星图云开发者平台创新推出多类型页面专用编辑…

激活函数Focal Loss 详解​

Focal Loss 详解​1. 背景​Focal Loss 是由 Lin et al. (2017) 在论文 《Focal Loss for Dense Object Detection》 中提出的一种损失函数&#xff0c;主要用于解决 目标检测&#xff08;Object Detection&#xff09; 中的 类别不平衡问题&#xff0c;特别是在 One-Stage 检测…

Python 链接各种中间件[Mysql\redis\mssql\tdengine]

文章目录链接参数设置logger 日志redis 链接mysql 链接emqx 链接mssql 链接tdengine 链接采集OPCUA的点表的配置信息设备点表OPCUA 采集 数据程序数据采集逻辑链接参数 import randomtdengine_connection_params {username: root,password: taosdata,host: 127.0.0.1,port: 6…

C Primer Plus 第6版 编程练习——第11章(上)

本章共16题&#xff0c;分上中下三篇1.设计并测试一个函数&#xff0c;从输入中获取n个字符&#xff08;包括空白、制表符、换行符)&#xff0c;把结果存储在一个数组里&#xff0c;它的地址被传递作为一个参数。int get_n_char(char arr[], int n) {int i 0;char ch;while (i…

Java开发岗面试记录合集

一、Java 核心1. 基础语法final关键字的作用修饰类&#xff1a;类不可被继承&#xff08;如String类&#xff09;&#xff0c;保证类的稳定性和安全性。修饰方法&#xff1a;方法不可被重写&#xff08;防止子类篡改父类核心逻辑&#xff0c;如工具类方法&#xff09;。修饰变量…

Linux 系统时间设置(date 和 ntpdate)-linux028

date 命令&#xff1a;查看或设置系统时间1. 查看当前时间date示例输出&#xff1a;Tue Mar 4 01:36:45 CST 20142. 设置时间&#xff08;不设置日期&#xff09;date -s 09:38:40设置后输出&#xff1a;Tue Mar 4 09:38:40 CST 20143. 设置完整日期和时间&#xff08;推荐格…

iOS上使用WebRTC推拉流的案例

一、库集成 首先&#xff0c;确保在你的 Podfile 中添加依赖&#xff1a; pod GoogleWebRTC然后执行 pod install 安装库。 二、代码示例 2.1、权限配置&#xff1a;在 Info.plist 中添加摄像头、麦克风权限 <!-- 需要在 Info.plist 中添加以下权限 --> <key>NSCam…

API: return response as HTML table

想要把response table变成HTML的table&#xff0c;即想达到下面这种的话<table boarder"1" style"width:100%; boarder-collapse: collapse; text-align:left"><tr><th>Customer</th><th>Date</th><th>Debit Am…

OneNote 当前无法同步笔记。将继续尝试。 (错误代码: 0xE00009C8 bb0ur)问题解决

之前因为同步错误&#xff0c;导致OneNote一个笔记本内容全部消失&#xff0c;笔记本内容如下图同步状态和错误如下&#xff1a;提醒错误为&#xff1a;OneNote 当前无法同步笔记。将继续尝试。 (错误代码: 0xE00009C8 bb0ur)当时心态有点崩&#xff0c;也是查了好些资料&#…

OneCode3.0 Gallery 组件前后端映射机制:从注解配置到前端渲染的完整链路

一、注解体系与前端组件的映射基础 ​ OneCode Gallery 组件实现了 Java 注解与前端 UI 组件的深度绑定&#xff0c;通过GalleryAnnotation、GalleryItemAnnotation和GalleryViewAnnotation三个核心注解&#xff0c;构建了从后端配置到前端渲染的完整链路。这种映射机制的核心价…

规则分配脚本

需求&#xff1a; 1.根据用户编写的要报规则,去mysql库里SysManage_Rule表获取已经启用的规则作为条件&#xff08;例如[{“field”: “关键词”, “logic”: “AND”, “value”: “阿尔法”, “operator”: “”&#xff0c;, “assign_user”: “user222”}]&#xff09;条…

SEO实战派白杨SEO:SEO中说的框计算、知心搜索(知识图谱)是什么?有什么用处?

SEO里框计算是什么&#xff1f;有什么用处&#xff1f;SEO里框计划算是百度2010年提出的&#xff0c;指当用户搜索某些关键词查询时&#xff0c;搜索引擎在结果页直接展示答案的技术&#xff08;如天气、汇率等&#xff09;&#xff0c;用户无需点击网站即可获取信息&#xff0…

软件工程:软件需求

简介本篇博客记录了我在软件工程学习过程中关于软件需求与面向对象基础知识的学习体会和要点总结。博客共分为三个关卡内容&#xff1a;第1关围绕“软件需求”的定义、分类及分析过程展开&#xff0c;让我清晰地理解了功能性需求、非功能性需求与约束条件的区别&#xff1b;第2…

MES系统是什么,有哪些特性?

MES系统是一套面向制造企业车间执行层的生产信息化管理系统。它能够为操作人员和管理人员提供计划的执行、跟踪以及所有资源&#xff08;包括人、设备、物料、客户需求等&#xff09;的当前状态。通过MES系统可以对从订单下达到产品完成的整个生产过程进行优化管理。当工厂发生…

Vue2下

六&#xff1a;vue-router &#xff08;重要&#xff09; &#xff08;一&#xff09;. 对路由的理解 1.什么是路由 路由&#xff08;Router&#xff09; 是管理页面跳转和 URL 与视图映射关系的机制&#xff0c;核心作用是&#xff1a;根据不同的 URL 路径&#xff0c;展示对…

在 Windows 上安装设置 MongoDB及常见问题

介绍 MongoDB 是一个开源的 NoSQL 数据库系统&#xff0c;它以一种灵活的类似 JSON 的格式&#xff08;称为 BSON&#xff08;二进制 JSON&#xff09;&#xff09;存储数据。它使用动态模式&#xff0c;这意味着与关系型数据库不同&#xff0c;MongoDB 不需要在向数据库添加数…