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")

更多阅读

参考

相关推荐
思则变2 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find4 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取5 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector6 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习7 小时前
Python入门Day2
开发语言·python
Vertira7 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉7 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗7 小时前
黑马python(二十四)
开发语言·python
晓13138 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr