Python matplotlib 如何**同时**展示正文和 emoji

图片来自参考文档

我们可以支持中文展示或者 emoji 展示但是同时支持目前还没看到互联网有文章说明,故记录之。

TLDR:

py 复制代码
plt.rc("font", family="YouYuan, Segoe UI Emoji")

py 复制代码
plt.rcParams["font.family"] = "Segoe UI Emoji, YouYuan"

重点是将支持中文和 emoji 的 font-family 用, 分隔,顺序不要紧,这样如果遇到中文就使用中文字体,如果遇到不认识的 emoji 就回退到 emoji 支持的字体。

如果改成

py 复制代码
plt.rcParams["font.sans-serif"].insert(0, "YouYuan")
plt.rcParams["font.sans-serif"].insert(0, "Segoe UI Emoji")

则只能支持中文或 emoji一种,因为仅会使用数组第一项。

试一试

py 复制代码
import numpy as np
import matplotlib.pyplot as plt


plt.rc("font", family="YouYuan, Segoe UI Emoji")
# plt.rcParams["font.family"] = "Segoe UI Emoji, YouYuan"

data = np.random.randint(100, 500, 7)
labels = [
    "🍎 苹果",
    "🍌 香蕉",
    "🍑 桃子",
    "🍒 樱桃",
    "🍇 葡萄",
    "🥭 芒果",
    "🍍 菠萝",
]

plt.figure(figsize=[5, 5], dpi=120)

plt.pie(
    data,
    autopct="%.1f%%",
    radius=1,
    pctdistance=0.8,
    colors=np.random.rand(7, 3),
    # explode=[0.05, 0, 0.1, 0, 0, 0, 0],
    # shadow=True,
    textprops=dict(fontsize=8, color="black"),
    wedgeprops=dict(linewidth=1, width=0.35),
    labels=labels,
)

plt.title("水果销售占比")
plt.show()

代码来自 Python-100-Days/Day66-80/78.数据可视化-1.md,稍加修改。

matplotlib 设置字体的三种方式

临时修改 rcParamsrc 方法

rcParams 里面是 matplotlib 运行时的所有配置。

diff 复制代码
import matplotlib.pyplot as plt
import numpy as np

# Set the font family to support Chinese
+ plt.rcParams['font.family'] = 'SimHei'
+ # plt.rc("font", family="SimHei")

# Generate some data
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('正弦函数')
plt.xlabel('角度 (弧度)')
plt.ylabel('正弦值')
plt.show()

一次性解决 matplotlibrc

py 复制代码
import matplotlib
print(matplotlib.get_configdir())

拿到目录如果没有 matplotlibrc 则新建一个配置文件,增加:

css 复制代码
font.family         : SimHei

设置不在范围内的字体文件 matplotlib.font_manager.FontProperties

py 复制代码
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties

# Generate some data
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

# Load a specific font
font_path = 'path/to/your/font.ttf'
font_prop = FontProperties(fname=font_path)

plt.plot(x, y)
plt.title('正弦函数', fontproperties=font_prop)
plt.xlabel('角度 (弧度)', fontproperties=font_prop)
plt.ylabel('正弦值', fontproperties=font_prop)
plt.show()

除了 YouYuan 还有哪些中文字体

除了常见的 Microsoft Yahei Microsoft JhengHei SimHei,还有哪些?

查询当前系统所有字体

py 复制代码
# font.py
from matplotlib.font_manager import FontManager


mpl_fonts = set(f.name for f in FontManager().ttflist)

print(f"all font list get from matplotlib.font_manager ({len(mpl_fonts)}):")
for f in sorted(mpl_fonts):
    print("  ", f)

print("字体数量:", len(mpl_fonts))

如果发现有些是中文拼音的就可以,比如 YouYuan

复制代码
DengXian
FangSong
KaiTi
LiSu
YouYuan
Adobe Fan Heiti Std
Adobe Fangsong Std
Adobe Heiti Std
Adobe Kaiti Std

除了 Segoe UI Emoji 还有哪些 emoji 字体

sh 复制代码
❯ uv run font.py | grep emoji -i
Segoe UI Emoji

目前我的系统仅有一枚,即 Segoe UI Emoji

其他解决方案

中文解决方案

这个库可以 Zh-Plot: 一行代码搞定 Python 图表中文展示,使用很简单,为什么很简单,其实就是在 install 这个库的时候源文件里面已经包含了支持中文的字体文件。

diff 复制代码
+ import zhplot
import matplotlib.pyplot as plt

我的看法这个解法太重了,一个字体文件 10M,故还是使用系统自带中文字体比较合适。

github.com/shenxiangzh...

emoji 解决方案

pypi.org/project/imo... 没尝试。

我们的简单方案有存在一个小问题,颜色没有丰富多样。下面这个貌似能解决颜色的问题,nfraprado.net/post/using-... 使用 github.com/matplotlib/... 感兴趣可以试试。

py 复制代码
matplotlib.use("module://mplcairo.gtk")

更多阅读

参考

相关推荐
毛飞龙3 小时前
Python类(class)参数self的理解
python··self
魔尔助理顾问3 小时前
系统整理Python的循环语句和常用方法
开发语言·后端·python
颜颜yan_5 小时前
Python面向对象编程详解:从零开始掌握类的声明与使用
开发语言·redis·python
我的ID配享太庙呀6 小时前
Django 科普介绍:从入门到了解其核心魅力
数据库·后端·python·mysql·django·sqlite
@蓝莓果粒茶7 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
FinAnalyzer7 小时前
如何在 InsCodeAI 上搭建并使用 Jupyter Notebook 环境?
ide·python·jupyter
java1234_小锋7 小时前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-文章分类下拉框实现
python·自然语言处理·flask
檀越剑指大厂7 小时前
【Python系列】Flask 应用中的主动垃圾回收
开发语言·python·flask
檀越剑指大厂7 小时前
【Python系列】使用 memory_profiler 诊断 Flask 应用内存问题
开发语言·python·flask
WXX_s8 小时前
【OpenCV篇】OpenCV——03day.图像预处理(2)
人工智能·python·opencv·学习·计算机视觉