Python matplotlib绘制xkcd动漫风格的图表
本文介绍如何使用Python matplotlib库绘制xkcd风格的漫画图表。通过调用plt.xkcd()函数,利用上下文管理器可快速应用手绘风格。针对中文显示问题,需安装特定字体(如方正卡通简体),并解决字体缓存未更新导致的找不到字体错误。文章详细讲解了重建字体缓存的具体步骤和代码实现,确保中英文均能正常显示。
XKCD
xkcd是兰道尔·门罗(Randall Munroe)的网名,也是其创作的漫画名称。该作品被定义为“关于浪漫、讽刺、数学和语言的网络漫画”,深受网友喜爱,被誉为深度宅向网络漫画。XKCD官方网站为https://xkcd.com/。

matplotlib对XKCD风格的支持
matplotlib.pyplot.xkcd函数可用于绘制具有XKCD风格的图表。
其原理较为简单:调用该函数时会保存原有的rcParams设置,随后更新rcParams以应用预置的XKCD风格参数,并在退出时还原这些设置。xkcd相关定义如下:
def xkcd(scale=1, length=100, randomness=2):
return _xkcd(scale, length, randomness)
class _xkcd:
# This cannot be implemented in terms of rc_context() because this needs to
# work as a non-contextmanager too.
def __init__(self, scale, length, randomness):
self._orig = rcParams.copy()
if rcParams['text.usetex']:
raise RuntimeError(
"xkcd mode is not compatible with text.usetex = True")
from matplotlib import patheffects
rcParams.update({
'font.family': ['xkcd', 'xkcd Script', 'Humor Sans', 'Comic Neue',
'Comic Sans MS'],
'font.size': 14.0,
'path.sketch': (scale, length, randomness),
'path.effects': [
patheffects.withStroke(linewidth=4, foreground="w")],
'axes.linewidth': 1.5,
'lines.linewidth': 2.0,
'figure.facecolor': 'white',
'grid.linewidth': 0.0,
'axes.grid': False,
'axes.unicode_minus': False,
'axes.edgecolor': 'black',
'xtick.major.size': 8,
'xtick.major.width': 3,
'ytick.major.size': 8,
'ytick.major.width': 3,
})
def __enter__(self):
return self
def __exit__(self, *args):
dict.update(rcParams, self._orig)
创建XKCD风格的图表
官方建议使用上下文管理器来调用xkcd函数。
import matplotlib.pyplot as plt
with plt.xkcd():
plt.bar([1,2,3],[1,2,3])
plt.title('test')
plt.show()

使用中文字体创建XKCD风格的图表
官方文档建议下载Humor Sans字体。根据源码分析,'font.family'配置为['xkcd', 'xkcd Script', 'Humor Sans', 'Comic Neue', 'Comic Sans MS']。只要计算机安装了这些字体之一,英文即可显示为XKCD风格。由于Windows系统通常预装Comic Sans MS字体,因此无需额外下载即可显示英文。
xkcd默认配置的几种字体均不支持中文。若希望在XKCD风格图表中使用类似漫画风格的中文,需下载中文字体。一般推荐试用方正卡通简体字体。安装该字体后,只需重载字体缓存,并修改rcParams['font.family']使中文字体生效即可。
1.安装字体
下载方正卡通简体字体,并进行安装。
2.更新中文字体
获取方正卡通简体字体的系统名称
方正卡通简体字体在系统中的名称为FZKaTong-M19S。
设置方正卡通简体字体为中文默认字体
import matplotlib.pyplot as plt
plt.xkcd()
plt.rcParams.update({'font.family': "FZKaTong-M19S"})
plt.bar([1,2,3],[1,2,3])
plt.title("测试")
plt.show()
运行后,标题中文不能正常显示,调试信息显示找不到'FZKaTong-M19S',因此回退使用默认的DejaVu Sans字体。
findfont: Font family ['FZKaTong-M19S'] not found. Falling back to DejaVu Sans.
通过以下代码验证,可知'FZKaTong-M19S'即方正卡通简体字体没有出现在ttflist当中,因此找不到该字体。而ttflist是读取字体缓存而构建的,因此,重建字体缓存可能解决这个问题。
from matplotlib.font_manager import fontManager
print([i.name for i in fontManager.ttflist if 'FZKaTong-M19S' in i.name])
解决问题
默认findfont函数是从字体缓存中查找的,新安装的字体缓存中没有,因此,需要重新创建缓存,并加载。
# 重建字体缓存
from matplotlib.font_manager import _rebuild
_rebuild()
import matplotlib.pyplot as plt
plt.xkcd()
plt.rcParams.update({'font.family': "FZKaTong-M19S"})
# plt.rcParams['font.family'] ='FZKaTong-M19S'
# plt.rc('font', **{'family' : 'FZKaTong-M19S'})
plt.bar([1,2,3],[1,2,3])
plt.title("测试")
plt.show()

到此这篇关于Python matplotlib绘制xkcd动漫风格的图表的文章就介绍到这了,更多相关Python matplotlib动漫图表内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













