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 设置字体的三种方式

临时修改 rcParams 或 rc 方法

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

更多阅读

参考

相关推荐
破茧蝴蝶1 小时前
Python分布式爬虫完整教程
开发语言·python
benchmark_cc1 小时前
量化系统架构设计:为什么应该将数据获取与策略逻辑解耦?
python·数据分析·pandas·量化交易·股票数据·quantdash
凤山老林1 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
小白快快跑哦2 小时前
python-字符串全解(六):正则表达式-逻辑运算或
python·正则表达式·字符串·逻辑运算
Thinker QAQ2 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
道满科技2 小时前
Function Calling 参数总出错?只修参数就行
linux·windows·python
霸道流氓气质3 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
ch6235 小时前
《AI 辅助编程实战:从零跑通一个 Excel 报表生成脚本的踩坑与复盘》
人工智能·python
import_random5 小时前
[python]conda和pip(区别和联系2)
python
Aurorar0rua6 小时前
CS50 x 2024 Notes Python - 01
开发语言·python·学习方法