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

news2024/9/27 17:25:42

前言

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

同时设置中英文字体

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

import matplotlib.pyplot as plt
import numpy as np

x = 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.coloradmin.cn/o/2137660.html

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

相关文章

00898 互联网软件应用与开发自考复习

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 识记:要求考生能够识别和记忆本课程中有关互联网软件开发与应用的概念性内容,并能够根据考核的不同要求,做出正确的表述、选择和判断。领会…

合资油车断崖式崩盘,买车的千万慎重了

文 | AUTO芯球 作者 | 雷慢 合资车,燃油车全体大逃亡的时候来了, 你敢信吗,8月份,国内新能源汽车零售渗透率达到54%, 我给大家讲个冷笑话, 几个月前还有车企老总说什么, “只要传统车企一发…

linux 操作系统下的curl 命令介绍和使用案例

linux 操作系统下的curl 命令介绍和使用案例 1. curl 命令简介 curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,是综合传输工具,但传输的协议主要是 HTTP/HTTPS 和 FTP。curl 还支持很多种类型的服务器认证方式&#…

网络(三)——协议是什么???

文章目录 协议的概念结构化数据网络计算机服务端定制协议客户端代码 协议的概念 计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。 结构化数据 我们知道TCP是面向…

Linux基础---07文件传输(网络和Win文件)

Linux文件传输地图如下,先选取你所需的场景,若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网: 检查网络是否畅通命令:ping www.baidu.com,若有持续的返回值就说明网络畅通。Ctr…

请查收《网安问答秘籍》

在数字化日益普及的今天,网络安全威胁层出不穷,保护个人隐私和数据安全成为每个人的必修课。秘籍精选了最实用的网络安全问答,广大群众及时了解网络安全知识,提升网络安全意识,有效防范网络诈骗,确保个人信…

获取无人机经纬度是否在指定禁飞区内

1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd

【系统规划与管理师】【案例分析】【考点】【答案篇】第7章 IT服务持续改进

【问题篇】☞【系统规划与管理师】【案例分析】【考点】【问题篇】第7章 IT服务持续改进 【移动端浏览】☞【系统规划与管理师】【案例分析】【模拟考题】章节考题汇总&#xff08;第7章&#xff09;&#xff08;答案篇&#xff09;&#xff08;共11个知识点&#xff09; 第7章…

在服务器上开Juypter Lab教程(远程访问)

在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09; 文章目录 在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09;一、安装anaconda1、安装anaconda2、提权限3、运行4、同意协议5、安装6、是否要自动初始化 conda7、结束8、检查 二、Anaconda安装Pytorch…

使用Docker挂载部署JAVA项目

用于需要使用Docker容器部署项目&#xff0c;但可能部署包需多次调整的场景&#xff0c;这种部署方式可以减少镜像制作的过程&#xff1b; 推荐几个使用Docker安装环境的文章&#xff1a; 1.Nocas: https://blog.csdn.net/weixin_44700323/article/details/140995859 2.Mysql: …

学习大数据DAY57 新的接口配置

作业  完成 API 接口和文件的接入, 并部署到生产调度平台, 每个任务最后至少 要有两条 不报错 的日志, 报错就驳回作业  作业不需要复制日志 API Appliation Program Interface 应用程序接口 > JSON 的地址 客户需求: 把 https://zhiyun.pub:9099/site/c-class…

从“看”到“管”:EasyCVR安防监控平台如何推动城市管理模式的转型升级

在21世纪的今天&#xff0c;随着城市化进程的加速推进&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;城市管理面临着前所未有的挑战。从公共安全、交通管理到环境保护、应急响应&#xff0c;每一个领域都对城市的治理能力和效率提出了更高要求。在这…

PowerShell install 一键部署Oracle23ai

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

【LLM多模态】CogVideoX文生视频模型结构和训练过程

note 通过两阶段训练3D VAE&#xff0c;对视频进行压缩编码 第一阶段&#xff1a;在较低分辨率和较少帧数的视频上进行训练&#xff0c;学习压缩和重建视频的基本能力第二阶段&#xff1a;在更长的视频上训练&#xff0c;提高模型处理长视频的能力&#xff0c;同时保持帧与帧之…

JavaEE:文件内容操作练习(三)

文章目录 文件内容操作练习练习1练习2练习3 文件内容操作练习 练习1 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件. package javaEE.fileIO;import java.io.File; import java.util.Scanner;public class O {private…

数据结构基础讲解(八)——树和二叉树专项练习(上)

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解&#xff08;七&#xff09;——数组和广义表专项练习-CSDN博客 个人主页&#x…

【初阶数据结构】详解树和二叉树(一) - 预备知识(我真的很想进步)

文章目录 前言1. 树1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用 2. 二叉树2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树概念和性质的一些习题 前言 初阶数据结构篇马上要迎来了一个新的成员&#xff0c;那就是"二叉…

这才是导师认可的论文 / 开题技术路线图

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 1. 技术路线图的常见框架结构 技术路线图根据研究内容和实验设计的不同&#xff0c;可以采用多种结构。以下是三种常见的技术路线图框架&#xff1a; 1.1 顺序式框架 适用领…

第十一周:机器学习笔记

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

微软发布Windows Agent Arena 为生成式AI代理提供基准测试

使用生成式人工智能和大型语言模型来自动化和简化使用 PC 的人员的任务的情况持续增长。不过&#xff0c;人们也需要了解人工智能在完成任务方面的工作表现。本周微软研究院宣布&#xff0c;它已开发出一种专门用于在 Windows PC 上测试人工智能代理的基准。 微软在 GitHub 页面…