在 Python 画图中同时设置中英文字体

前言

  在使用matplotlib.pyplot画图时,默认情况下都是黑体字,很不美观。如果含有中文,可能无法显示;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。

同时设置中英文字体

  我们都知道,按照下面的代码是无法显示中文字体的。

import matplotlib.pyplot as plt
import numpy as npx = np.arange(100)
y = np.sin(x/6)
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.title("正弦函数的图象")
plt.plot(x,y,label='$\sin x$')
plt.legend()
plt.show()

  代码中默认字体缺少对中文的支持,从而画出来是下图(左)这样,原本的中文标题变成了一堆方框。在源代码中加入plt.rcParams['font.family'] = 'KaiTi'可以提供楷体支持(同时加入plt.rc('axes',unicode_minus=False)以正确显示负号),从而画出下图(右),以楷体形式正确显示中文。

  现在有一个问题:我想在正确显示中文的同时,设置英文字体为 Times New Roman。网上很多人都提供下面的办法:

plt.rcParams['font.family'] = ['KaiTi', 'Times New Roman']

  这个办法是错误的,英文字体仍然无法正常显示。正确的做法是在代码中加入以下内容:

plt.rcParams['mathtext.fontset'] = 'stix'
plt.xticks(fontproperties = 'Times New Roman')
plt.yticks(fontproperties = 'Times New Roman')

  从而图中所有的英文、数字都变成了 Times New Roman 字体,如下图(左)所示:

  当然,如果你和我一样更喜欢用 Euclid 字体(Latex 默认风格字体),那么只需要加入下面这些代码,画出来的图如上图(右)所示。

plt.rcParams['mathtext.fontset'] = 'cm'
plt.xticks(fontproperties = 'Euclid')
plt.yticks(fontproperties = 'Euclid')

注意:如果你想实现中英文文本混排,比如将上面的标题改为“正弦函数的 figure”,这是不行的,使用plt.title("正弦函数的图象 figrue")的结果如下(左)所示,英文正文逃脱了字体的控制,还是丑陋的默认黑体。

  这种情况下,可以使用 Latex 公式来表示正文,比如plt.title("正弦函数的图象 $\mathrm{figure}$")的结果如上图(右)所示。因为正文不应该是斜体字,所以使用\mathrm将英文文本变成正体字。

只含英文文本的环境

  这种情况只需要加入下面两行代码就能够使字体全部变为标准的 Euclid 字体。

plt.rcParams['font.family'] = 'Euclid'
plt.rcParams['mathtext.fontset'] = 'cm'

  当然,如果你更喜欢 Times New Roman 字体,那么可以改用以下的代码:

plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['mathtext.fontset'] = 'stix'

关于 seaborn 库的字体设置

  前文提到的都是matplotlib.pyplot画图时的字体设置。Seaborn 其实也是利用该库画图,但是有时候不起作用,比如下面一段代码(你只需注意第 6 6 6 10 10 10 行的代码):

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt# 设置字体、背景(白色)以及图片大小
plt.rcParams['axes.facecolor'] = 'w'
plt.figure(figsize=(10,10))
plt.rcParams['mathtext.fontset'] = 'stix'
plt.xticks(fontproperties = 'Times New Roman')
plt.yticks(fontproperties = 'Times New Roman')# 化学式名字数组
name_list = ['$\mathrm{Na_2O}$','$\mathrm{MgO}$','$\mathrm{K_2O}$','$\mathrm{SiO_2}$','$\mathrm{Al_2O_3}$','$\mathrm{BaO}$','$\mathrm{CuO}$','$\mathrm{SO_2}$','$\mathrm{PbO}$','$\mathrm{SrO}$','$\mathrm{P_2O_5}$','$\mathrm{CaO}$','$\mathrm{Fe_2O_3}$']# 模拟出数据
np.random.seed(114)
data = np.random.rand(13,13) * 2 - 1# 构造 mask 矩阵的形状
mask = np.zeros_like(data)# 将矩阵对角线右上部分置为 True,隐藏
mask[np.triu_indices_from(mask)] = True
for i in range(13):data[i][i] = 1.mask[i][i] = False# 画热图
ax = sns.heatmap(data,annot=True,fmt='.2g',cbar_kws={"orientation": "horizontal","shrink":0.5},square=True,mask=mask,cmap="YlGnBu")
ax.set_yticklabels(name_list,rotation = 0)
for i in range(len(name_list)):plt.text(i + 0.2,i - 0.2,name_list[i],rotation = 45)plt.show()

  该代码画出的图片如下图(左)所示,这张图很明显存在不足,热图上的数字以及热条旁边的刻度都是默认的黑体。这时我们可以尝试使用sns.set方法,直接对 seaborn 进行参数设置,代码如下所示。画出来的图如下图(右)所示,可以看到克服了这些缺点。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt# 设置字体、背景(白色)以及图片大小
sns.set(rc={'font.sans-serif': ['Times New Roman'],'mathtext.fontset':'stix'})
plt.rcParams['axes.facecolor'] = 'w'
plt.figure(figsize=(10,10))# 化学式名字数组
name_list = ['$\mathrm{Na_2O}$','$\mathrm{MgO}$','$\mathrm{K_2O}$','$\mathrm{SiO_2}$','$\mathrm{Al_2O_3}$','$\mathrm{BaO}$','$\mathrm{CuO}$','$\mathrm{SO_2}$','$\mathrm{PbO}$','$\mathrm{SrO}$','$\mathrm{P_2O_5}$','$\mathrm{CaO}$','$\mathrm{Fe_2O_3}$']# 模拟出数据
np.random.seed(114)
data = np.random.rand(13,13) * 2 - 1# 构造 mask 矩阵的形状
mask = np.zeros_like(data)# 将矩阵对角线右上部分置为 True,隐藏
mask[np.triu_indices_from(mask)] = True
for i in range(13):data[i][i] = 1.mask[i][i] = False# 画热图
ax = sns.heatmap(data,annot=True,fmt='.2g',cbar_kws={"orientation": "horizontal","shrink":0.5},square=True,mask=mask,cmap="YlGnBu")
ax.set_yticklabels(name_list,rotation = 0)
for i in range(len(name_list)):plt.text(i + 0.2,i - 0.2,name_list[i],rotation = 45)plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

8路模拟量采集模块,4~20mA 0~10V电流电压高速采集——DAM-3054P

阿尔泰科技 DAM-3054P为8路差分模拟量采集模块,高速采集,每通道采集速率为500sps,16位AD,支持RS485通讯接口,带有标准ModbusRTU协议。配备良好的人机交互界面,使用方便,性能稳定。 指标参数&…

Spring Boot母婴商城:安全、便捷、高效

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架…

PSINS工具箱函数介绍——kfplot

关于工具箱 kfplot是图像绘制的函数,用于绘制关于滤波(前/后)的误差图像。 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导:https://blog.csdn.net/callmeup/article/details/137087932使用方法 函数形式为: k f p l o t ( x k p k , v a r a r g i…

利用AI增强现实开发:基于CoreML的深度学习图像场景识别实战教程

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值

指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值 指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值 文章目录 指针求函数的最大值,传递的只有一个参数如何比较两个整数的最大值指针求函数的最大值&#xff0…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V,推荐是3V,所以如果我们的MCU是5V的,那么就得转个电压才能用了。 IIC常见的速率有100k,400k,而SHT20是支持400k的&#xff08…

yolo-word复现

github下载代码:https://github.com/AILab-CVC/YOLO-World 配置环境: 官方的方式 当然也可以按照官方给的配置方式去安装库,我也试了,出现小问题了。 我这边是从我本身的yolov8的环境克隆过来的,然后安装我环境里没有…

MyBatis 数据处理:主键获取、批量删除与动态表名

MyBatis 数据处理:主键获取、批量删除与动态表名 1.主键获取 XML配置中使用了useGeneratedKeys"true"和keyProperty"id"来自动获取并设置插入后的自增主键。这是一个标准的做法。 1)mapper接口 /*** 添加数据时获取自增id*/ int a…

大数据处理技术:MapReduce综合实训

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 WordCount词频统计 5.2 HDFS文件读写 5.3 倒排索引 5.4 网页排序——PageRank算法 6 实验结果 6.1 WordCount词频统计 6.2 HDFS文件读写 6.3 倒排索引 6.4 网页排序——PageRank算法 1…

Spring Event 业务解耦神器(泛型喔!)

一.前言 又与我一直负责Cocos Creator的开发,我发现在TS领域,是可以自定义事件(有兴趣的大宝可以坐飞机直达:[CocosCreator]自定义事件(订阅/发布)管理器),这样做有什么好处呢?回答:解耦! 于是乎,我就觉得前端能干的事,后端也一样能干!当然,如果后端是TS或JS写的,比如nodeJS,…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目, 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名(父物体是按钮Button,子物体Image即可) 创建一个Image 设计一下布局 复制三…

[进阶]面向对象之 包 final

文章目录 包什么是包包名的规则:什么时候需要导包 final常量 包 什么是包 包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。 包名的规则: 公司域名反写包的作用,需要全部英文小写,见名知意。使用其他类时,需要…

上传头像,访问本地图片

文件大坑: web项目:首先不能直接访问本地资源,只能够访问服务器上的资源。 所以我想就储存数据到服务器,但是这样有个问题就是,当重新启动程序时,服务器上的所有文件会被重新编译,导致之前的文…

[数据集][图像分类]痤疮严重程度分级分类数据集999张3类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):999 分类类别数:3 类别名称:["Level_0","Level_…

[论文精读]Graph Neural Network-Based Anomaly Detection in Multivariate Time Series

论文网址:[2106.06947] Graph Neural Network-Based Anomaly Detection in Multivariate Time Series (arxiv.org) 论文代码:https://github.com/d-ailin/GDN 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的…

java的内存分配和回收机制

Java 与 C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述 垃圾收集(GC)需要完成的三件事情: 哪些内存需要回收?什么时候回收?如何回收&am…

4个方法教你图片转PDF怎么弄。

我们有时候会接触了一些重要的图片文件或者资料,想要装换成可编辑的PDF格式,更方便自己管理。这时候就会需要转换的工具,我这里就有4款可以完成这种转换的高效工具可以分享给大家。 1、365PDF转换软件 直通车:www.pdf…

速通LLaMA1:《LLaMA: Open and Efficient Foundation Language Models》全文解读

文章目录 论文总览1. 创新点和突破点2. 技术实现与算法创新3. 架构升级4. 概念补充SwiGLU激活函数AdamW 5. 总结 AbstractIntroductionApproachPre-training DataArchitecture(架构)Optimizer(优化器)Efficient implementation&am…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

循环练习 案例

swich新特性 jdk12 穿透 逢七过 //含有七和被七整除舍去 public class test1 {public static void main(String[] args){for (int i 1; i <100 ; i) {if(i%70||i%107||i/107){continue;}System.out.println(i);}} } 求平方根 //输入大于2的整数&#xff0c;求平方根&…