社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】matplotlib可视化必知必会富文本绘制方法

机器学习初学者 • 4 年前 • 480 次点击  

本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

长久以来,在使用matplotlib进行绘图时,一直都没有比较方便的办法像R中的ggtext那样,向图像中插入整段的混合风格富文本内容,譬如下面的例子:

而几天前我在逛github的时候偶然发现了一个叫做flexitext的第三方库,它设计了一套类似ggtext的语法方式,使得我们可以用一种特殊的语法在matplotlib中构建整段富文本,下面我们就来get它吧~🧐

2 使用flexitext在matplotlib中创建富文本

在使用pip install flexitext完成安装之后,我们使用下列语句导入所需模块:

from flexitext import flexitext

2.1 基础用法

flexitext中定义富文本的语法有些类似html标签,我们需要将施加了特殊样式设置的内容包裹在成对的<>>中,并在<>中以属性名:属性值的方式完成各种样式属性的设置,譬如我们想要插入一段混合了不同粗细、色彩以及字体效果的富文本:

from flexitext import flexitext
import matplotlib.pyplot as plt

# 将幼圆与楷体插入到matplotlib字体库中
plt.rcParams['font.sans-serif'] = ['YouYuan''KaiTi'] + plt.rcParams['font.sans-serif']

fig, ax = plt.subplots(figsize=(96))

flexitext(0.5
          0.5
          '''<30>这是>一段flexitext>富文本>测试>'''30>
          ha="center");

很舒服!我们使用flexitext()来替换ax.text()方法,它在兼容了ax.text()关于文字坐标以及对齐方式等常规参数的同时,帮助我们以特殊的格式定义文本内容及样式风格,下面我们就来进一步学习flexitext中支持的各种参数设置。

2.2 flexitext标签中的常用属性参数

在前面的例子中我们在标签中使用到了sizecolorweight以及name等属性参数,而flexitext中标签支持的常用属性参数如下:

2.2.1 利用size设置文本像素大小

size属性非常简单,其用于定义标签所包裹文本内容的像素尺寸:

fig, ax = plt.subplots(figsize=(96))

flexitext(0.5
          0.5
          '<20>size=20><30>size=30><40>size=40><50>size=50>'50>40>30>20>
          ha="center")

plt.savefig('图3.png', dpi=300)

2.2.2 利用name设置字体

name属性可以用来设置具体的字体名称,关于matplotlib中的字体设置相关知识你可以参考我以前写过的「搞定matplotlib中的字体设置」https://www.cnblogs.com/feffery/p/14122415.html,下面分别演示系统自带的字体,以及自行注册导入的自定义字体是如何在flexitext中使用的(其中每种字体的name你可以通过font_manager.fontManager.ttflist查看):

from matplotlib import font_manager

# 从本地文件中注册新字体
font_manager.fontManager.addfont('Dark Twenty.otf')
font_manager.fontManager.addfont('Yozai-Regular.ttf')
font_manager.fontManager.addfont('LXGWWenKai-Regular.ttf')

fig, ax = plt.subplots(figsize=(96))

flexitext(0.5
          0.5
          '<60>Dark Twenty>\n<60>悠哉字体>\n<60>霞鹜文楷>'60>60>60>
          ha="center")

plt.savefig('图4.png', dpi=300)

2.2.3 利用weight设置文本字体粗细

weight 属性用于设置文本的粗细程度,可传入0到1000之间的数值,或是ultralightlightnormalregularbookmediumromansemibolddemibolddemiboldheavyextra boldblack中的选项,不过这个属性依赖具体的字体族(flexitext中使用family属性来定义)是否包含对应的粗细版本,所以有时候设置无效是正常的,譬如下面的例子中Times New Roman是完整的字体族,因此可以设置粗细:

fig, ax = plt.subplots(figsize=(96))

flexitext(0.5
          0.5
          (
              '<50>weight:regular>\n'50>
              'weight:bold>\n'
              '霞鹜文楷bold无效>'
          ), 
          ha="center",
          ma='center')

plt.savefig('图5.png', dpi=300)

2.2.4 利用color、backgroundcolor设置文本颜色及背景色

colorbackgroundcolor属性接受matplotlib中合法的颜色值输入,可用于对标签所囊括文本的色彩及背景色进行设置,譬如下面我们配合调色库palettable来制作一些花里胡哨的文字:

from palettable.colorbrewer.diverging import Spectral_6

fig, ax = plt.subplots(figsize=(96))

text = ''
for i, s in enumerate(list('制造一场彩虹')):
    text += '<50>{}>'50>.format(Spectral_6.hex_colors[i], s)
    
flexitext(0.5
          0.6
          text, 
          ha="center",
          ma='center')

flexitext(0.5
          0.4
          '制造一场彩虹>'.format(Spectral_6.hex_colors[2]), 
          ha="center",
          ma='center')

plt.savefig('图6.png', dpi=300)

2.2.5 利用alpha调节文字透明度

alpha参数则用于设置文字的透明度,取值在0到1之间,来看一个简单的例子:

import numpy as np

fig, ax = plt.subplots(figsize=(96))

flexitext(0.5
          0.4
          ('绘>'*9).format(
              *np.linspace(109).tolist()
          ), 
          ha="center",
          ma='center')

plt.savefig('图7.png', dpi=300)

关于flexitext的其余可用参数等信息,感兴趣的朋友可以自行前往官方仓库进行查看:https://github.com/tomicapretto/flexitext


以上就是本文的全部内容,欢迎在评论区与我进行讨论~

往期精彩回顾




本站qq群851320808,加入微信群请扫码:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/120627