【python】Matplotlib+LaTeX绘图 字符加粗 || 代码合集

news2024/11/24 9:35:49

【start:240814】

文章目录

  • 动机
  • Matplotlib库
    • 调用
    • 报错
  • LaTeX 模式
    • 安装
    • 使用
    • 配置属性:text.latex.preamble
      • 属性简介
      • amsmath
      • textcomp
  • 非LaTeX 模式
    • 配置属性:mpl.rcParams['...']
  • 字符加粗(label)
    • 非LaTeX模式(关闭text.usetex)
      • 函数
      • 案例
    • LaTeX模式(开启text.usetex)
      • 函数
      • 案例
  • 补充材料
    • 字符的基础知识
      • Unicode字符
      • LaTeX字符

动机

在使用Python的Matplotlib库绘图时,在非LaTeX模式下,似乎无法同时对LaTeX变量进行“加粗、加斜体”的操作,于是计划转向使用LaTeX模式。

Matplotlib库

调用

import matplotlib as mpl  
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

报错

这时,如果没有提前安装latex软件,而直接运行

mpl.rcParams['text.usetex'] = True

会报错:

RuntimeError: Failed to process string with tex because latex could not be found

这说明我们还没有安装好latex软件,需要先安装再使用

LaTeX 模式

安装

先下载、安装latex软件

【ref】LaTex安装及使用(一)

然后,在python环境中安装latex库

pip install latex

使用

import matplotlib as mpl  
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = r"""
\usepackage{textcomp}
\usepackage{amsmath}
"""

其中:

mpl.rc('text', usetex=True):这行代码将 Matplotlib 配置为使用 LaTeX 引擎来渲染文本。这使得你可以使用 LaTeX 语法来定义文本的样式和格式。LaTeX 是一个强大的排版系统,特别适合处理复杂的数学公式和符号。

mpl.rcParams['text.latex.preamble']=[r"\usepackage{...}"]:这行代码指定了一个 LaTeX 的前导部分,用于加载额外的 LaTeX 包。在这个例子中,加载了 amsmath 包,它提供了许多增强的数学功能,如更多的数学符号和公式格式选项。

配置属性:text.latex.preamble

属性简介

text.latex.preamble 中,你可以添加许多 LaTeX 包来扩展 Matplotlib 渲染 LaTeX 文本的功能。以下是一些常用的 LaTeX 包及其功能:

  1. amsmath: 提供增强的数学公式支持和环境,例如对齐、分数和矩阵。

    \usepackage{amsmath}
    
  2. amssymb: 提供额外的数学符号,例如黑板粗体字母和额外的符号。

    \usepackage{amssymb}
    
  3. amsfonts: 提供额外的数学字体,例如黑板粗体字母和其他特殊符号。

    \usepackage{amsfonts}
    
  4. mathrsfs: 提供花体数学字体,用于书写特殊的数学符号。

    \usepackage{mathrsfs}
    
  5. siunitx: 用于处理和格式化单位和数值数据。

    \usepackage{siunitx}
    
  6. xcolor: 提供颜色支持,可以为文本和图形添加颜色。

    \usepackage{xcolor}
    
  7. geometry: 控制页面布局和边距设置。

    \usepackage{geometry}
    
  8. graphicx: 提供图像处理功能,例如缩放、旋转图像。

    \usepackage{graphicx}
    
  9. tikz: 提供用于创建图形和图表的强大工具。

    \usepackage{tikz}
    
  10. babel: 提供多语言支持,根据所选语言调整排版规则。

    \usepackage[english]{babel}
    

这些包可以通过在 text.latex.preamble 中添加相关的 \usepackage 命令来加载。例如:

import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = r"""
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xcolor}
"""

你可以根据需要选择并组合这些包,以满足特定的排版和渲染需求。

amsmath

可以搭配:
\boldsymbol{}:斜体,加粗希腊字符和文本

textcomp

可以使用:
\textmu

非LaTeX 模式

配置属性:mpl.rcParams[‘…’]

mpl.rcParams['font.family'] = 'serif'
mpl.rcParams['font.serif'] = ['Times New Roman']
mpl.rcParams['font.weight'] = 'bold'
mpl.rcParams['xtick.labelsize'] = 20
mpl.rcParams['ytick.labelsize'] = 20

mpl.rcParams[‘font.family’] = ‘serif’:确保字体是衬线字体,有时加粗效果会更明显

字符加粗(label)

非LaTeX模式(关闭text.usetex)

函数

用到的函数:
\textbf{}
\textnormal {}
\text{}

\bm{}

案例

在非LaTeX模式下,可以设置全局加粗,但是只能加粗“钱字号外、表示单位”的普通字符,无法加粗“钱字号内的、表示变量”的latex字符

效果:

在这里插入图片描述

代码:

import matplotlib as mpl  
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置全局字体属性
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Times New Roman']
plt.rcParams['mathtext.fontset'] = 'stix'
plt.rcParams['mathtext.rm'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False

label_font = FontProperties(family='serif', weight='bold', size=30)
label_font.set_name('Times New Roman')
tick_font = FontProperties(family='serif', weight='bold', size=20)
tick_font.set_name('Times New Roman')
legend_font = FontProperties(family='serif', weight='bold', size=15)
legend_font.set_name('Times New Roman')

# 创建一些数据进行绘图
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]

# 绘制图形
plt.plot(x, y, marker='o', ms=10, mew=2, mec='blue', mfc='blue', linestyle='--', color='green')

# 设置坐标轴刻度标签的字体
ax = plt.gca()
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontproperties(tick_font)  # 设置刻度标签字体属性

# 设置坐标轴的标签和标题
plt.xlabel(r'$d$($\mathbf{\mu}$m)', fontproperties=label_font)
plt.ylabel(r'$J_{net}$(Acm$^{-2}$)', fontproperties=label_font)

# 设置图例字体
plt.legend(['Test Data'], prop=legend_font)

# 显示图形
plt.show()

LaTeX模式(开启text.usetex)

函数

用到的函数:
\boldsymbol{}:斜体,加粗希腊字符和文本
\mathbf{}:斜体,加粗文本
\mathrm{}:斜体,新罗马字体,不加粗文本
\mathdefault{},斜体,不加粗文本
\mathit{},不协体

案例

在LaTeX模式下,latex字符默认斜体,但需要手动加粗

在科研绘图时,变量中的字符应该是斜体的,latex字符加粗用\boldsymbol{},普通text加粗用\mathbf{}

而单位中的字符应该是非斜体的,为了取消latex字符的斜体,可以使用文本类latex字符:\textxx(如\textmu

效果:

在这里插入图片描述

代码:

from matplotlib.ticker import LogFormatterMathtext, ScalarFormatter
class BoldLogFormatter_Log(LogFormatterMathtext):
      def __call__(self, x: float, pos: int = ...):
            return super().__call__(x, pos).replace('mathdefault', 'mathbf') 
class BoldLogFormatter_Sca(ScalarFormatter):
      def __call__(self, x: float, pos: int = ...):
            return super().__call__(x, pos).replace('mathdefault', 'mathbf') 

import re
def format_label(text):
    def format_inner(match):
        return r'$\boldsymbol{' + match.group(1) + r'}$'

    # 检查是否有 $...$ 的部分
    text = re.sub(r'\$([^\$]+)\$', format_inner, text)
    
    # 对剩余的文本进行 \textbf{} 包裹
    # 需要处理特殊情况,比如 $...$ 中已经包含 \textbf{} 的文本
    parts = re.split(r'(\$[^\$]+\$)', text)
    formatted_text = ''
    
    for part in parts:
        if part.startswith('$') and part.endswith('$'):
            formatted_text += part  # 保持 $...$ 不变
        else:
            formatted_text += r'\textbf{' + part + '}'
    
    return formatted_text
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import matplotlib as mpl

mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = r"""
\usepackage{textcomp}
\usepackage{amsmath}
"""

mpl.rcParams['font.family'] = 'serif'
mpl.rcParams['font.serif'] = ['Times New Roman']
mpl.rcParams['font.weight'] = 'bold'
plt.rcParams['xtick.labelsize'] = 20
plt.rcParams['ytick.labelsize'] = 20

# 定义字体属性
label_font = FontProperties(family='serif', weight='bold', size=30)
label_font.set_name('Times New Roman')
legend_font = FontProperties(family='serif', weight='bold', size=15)
legend_font.set_name('Times New Roman')

# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(8,6))

# 创建一些数据进行绘图
x = [1, 2, 3, 4, 5, 6]
y = [1e1, 2e2, 3e3, 4e4, 5e5, 6e6]

# 绘制图形
ax.plot(x, y, marker='o', ms=10, mew=2, mec='blue', mfc='blue', linestyle='--', color='green')

# 设置坐标轴的标签和标题
ax.set_xlabel(r'$\boldsymbol{d} \textbf{(\textmu m)}$', fontproperties=label_font)
ax.set_ylabel(r'$\boldsymbol{J_{net}} \textbf{(Acm}^\mathbf{{-2}}\textbf{)}$', fontproperties=label_font)

# 设置图例
legend_text = 'Test Data; $T_C$=500K'
ax.legend(labels=[format_label(legend_text)], prop=legend_font, loc='upper left', bbox_to_anchor=(0.05, 0.95))

# 设置刻度
ax.set_yscale('log')
ax.get_xaxis().set_major_formatter(BoldLogFormatter_Sca())
ax.get_yaxis().set_major_formatter(BoldLogFormatter_Log())

# ax.set_xticks(ax.get_xticks(), [tick._text.replace('mathdefault', 'mathbf') for tick in ax.get_xticklabels()])
# ax.set_yticks(ax.get_yticks(), [tick._text.replace('mathdefault', 'mathbf') for tick in ax.get_yticklabels()])
# print(ax.get_yticks())

# 显示图形
plt.show()

补充材料

字符的基础知识

在使用latex前,还需要先了解一些字符的基础知识

Unicode字符

  • 定义: Unicode是一个字符编码标准,为几乎所有的书写系统中的字符分配唯一的代码点

  • 'μ': 在Python中,Unicode字符可以直接插入字符串中。例如,'μ' 是直接表示希腊字母μ的Unicode字符。

  • \u03bc: 这种表示方式也可以用于表示 Unicode 字符。\u 后跟四个十六进制数字表示一个 Unicode 字符。

  • Python中的使用: Python 3中的字符串默认是Unicode编码,可以直接操作和处理Unicode字符。

greek_letter = 'μ'
print(greek_letter)  # 输出: μ

LaTeX字符

  • 定义: LaTeX是一个排版系统,提供了命令来生成字符和符号。例如,\mu 在LaTeX中表示希腊字母μ。
  • Python中的使用: LaTeX字符通常不是直接在Python中使用的。它们主要用于生成LaTeX文档和数学公式。如果要在Python中使用LaTeX字符,通常是通过绘图库(如Matplotlib)来显示LaTeX格式的文本。
import matplotlib.pyplot as plt

plt.text(0.5, 0.5, r'$\mu$', fontsize=50)
plt.show()

注意:在latex模式下,\textmu这种字符在搭配\mathbf{}时是显示不出来的,需要搭配\textbf{}才能显示出来

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

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

相关文章

英飞凌高压侧智能电源开关:BSP762T中文资料书

描述: 集成垂直功率FET的高压侧电源开关,提供嵌入式保护和诊断功能。 特性 - 过载保护 - 电流限制 - 短路保护 - 带重启功能的热关断 - 过压保护(包括负载转储) - 电感负载快速消磁 - 电池反向保护,带外部电阻 - CMOS兼…

【手撕数据结构】Topk问题

目录 题目思路代码 题目 TOP-K问题:即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。 ⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 对于Top-K问题,能想到的最简单直接的⽅式就是排序…

智联云采 SRM2.0 runtimeLog/download 任意文件读取漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮…

Python 中的 SHAP 简介

本文中有多篇计划文章,后期会补充相关链接。鉴于公众号内无法后期修改文章,请关注原文链接。 如何创建和解释 SHAP 图:瀑布图、力图、平均 SHAP 图、蜂群图和依赖图 可直接在橱窗里购买,或者到文末领取优惠后购买: SHA…

iOS替代商店AltStore PAL获得EPIC的资助 即日起取消1.5欧元的年度订阅费

知名游戏开发商 EPIC 日前宣布通过 EPIC MegaGrant 计划向 iOS 替代商店 AltStore PAL 进行捐赠,该商店是在欧盟市场经过苹果批准的合规的第三方应用商店。 按苹果规定第三方替代商店需要缴纳核心技术费并且没有豁免条款,因此该商店每被一名用户安装&am…

RIP学习笔记

1.RIP简介 Rip:routing information protocol,路由信息协议。属于动态路由协议的一种。 RIP是应用较早、使用较普遍的内部网关协议(InteriorGatewayProtocol,简称IGP),适用于小型同类网络,是典型的距离向量(distance-vector)协议…

OKR 与 KPI 的区别

OKR出现后,大家经常会拿KPI与之一起比较,结果两级分化:爱KPI的一如既往KPI,把OKR说的一无是处。爱OKR的,搞起了“去KPI”化。Tita作为OKR应用软件的服务商,我们也必须对OKR和KPI有充分的理解。对此我认真做…

Ubuntu离线安装docker

查看操作系统版本: rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制&#xff08…

重塑商业生态:技术驱动下的批发供应系统开发与革新

在当今这个快速变化的商业环境中,批发供应系统作为连接生产商、分销商与零售商的关键纽带,其效率与智能化水平直接影响着整个供应链的运作效率与市场竞争力。随着信息技术的飞速发展,特别是大数据、云计算、人工智能(AI&#xff0…

D. 二进制

1.题意:给出2中操作 1):将段排序 2):将段输出为十进制数 思路: 1.考虑第一种操作。只需要查询l-r中1的个数即可。如果递增,则中为1,否则中为1,需要一个覆盖tag 2.考虑如何维护十进制的值。…

基于Java的美妆购物网站的设计与实现

TOC springboot323基于Java的美妆购物网站的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和…

在 S7-1200/S7-1500 中,如何测量一个完整程序、子程序或特定组织块的运行时间?

RUNTIME"指令的第一次调用用来设置测量时间的起点,并将其保存在DB变量 "Memory"中来为第二次调用做参考。然后调用 "TestBlock" 程序块。当程序块被执行后,"RUNTIME" 指令第二次调用,第二次调用来计算 "TestBlock"程序块的运行…

电影《白蛇:浮生》观后感

上周看了电影《白蛇:浮生》,动画的特效方面,中国动画这几年确实做的非常不错了,不过整个故事,还是老的那套,并没有感觉特别新意。 (1)老套故事 《白娘子传奇》的故事,几…

NCBI批量下载序列

根据提供的accession编号批量下载 下载地址 NCBI_batch 点击选择文件,导入需要下载的accession编号文件,点击Retrieveji下载

eNSP 华为划分VLAN

SW1&#xff1a; <Huawei>system-view [Huawei]sysname SW1 [SW1]VLAN batch 10 20 //批量划分vlan [SW1]interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1]port link-type access //设置为access口&#xff0c;access口允许单个vlan通过 [SW1-GigabitEth…

数据结构day02(链表)

【1】链表 Link list 链表又称单链表/链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据 和顺序表不同&#xff0c;使用链表存储数据&#xff0c;不强制要求在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 所以在链表中&#xff0c;每个数据元素可以配…

K7系列FPGA多重启动(Multiboot)

Xilinx 家的 FPGA 支持多重启动功能&#xff08;Multiboot&#xff09;&#xff0c;即可以从多个 bin 文件中进行选择性加载&#xff0c;从而实现对系统的动态更新&#xff0c;或系统功能的动态调整。 这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而…

计算机网络体系结构【★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、计算机网络概述 1. 计算机网络的性能指标&#xff08;★★&#xff09; 1&#xff09;速率&#xff08;speed&#xff09; 指连接到计算机网络上的节点在数…

用爬虫玩转石墨文档详细操作步骤

石墨文档是一款强大的在线文档编辑和协作工具&#xff0c;它支持文字处理、表格制作、演示文稿等多种功能&#xff0c;适用于个人和团队的办公需求。以下是一些玩转石墨文档的详细步骤和技巧&#xff1a; 1. 注册和登录 注册&#xff1a;访问石墨文档官网&#xff0c;点击“注…