Python matplotlib繪制xkcd動(dòng)漫風(fēng)格的圖表
XKCD
xkcd是蘭道爾·門羅(Randall Munroe)的網(wǎng)名,又是他所創(chuàng)作的漫畫的名稱。作者蘭道爾·門羅(Randall Munroe)給作品的定義是一部“關(guān)于浪漫、諷刺、數(shù)學(xué)和語言的網(wǎng)絡(luò)漫畫”(A webcomic of romance,sarcasm, math, and language),被網(wǎng)友譽(yù)為深度宅向網(wǎng)絡(luò)漫畫。XKCD官方網(wǎng)站https://xkcd.com/。

matplotlib對(duì)XKCD風(fēng)格的支持
matplotlib.pyplot.xkcd函數(shù)可繪制XKCD風(fēng)格的圖表。
原理非常簡單,調(diào)用函數(shù)時(shí)保存原有rcParams設(shè)置,再更新rcParams使預(yù)置的XKCD風(fēng)格的生效,退出時(shí)還原rcParams設(shè)置。
xkcd相關(guān)定義如下:
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)
創(chuàng)建XKCD風(fēng)格的圖表
官方建議使用上下文管理器調(diào)用xkcd函數(shù)。
import matplotlib.pyplot as plt
with plt.xkcd():
plt.bar([1,2,3],[1,2,3])
plt.title('test')
plt.show()

使用中文字體創(chuàng)建XKCD風(fēng)格的圖表
官方文檔建議下載Humor Sans字體,根據(jù)源碼可知,'font.family': ['xkcd', 'xkcd Script', 'Humor Sans', 'Comic Neue', 'Comic Sans MS'],只要計(jì)算機(jī)上安裝這幾個(gè)字體,英文都可以顯示為XKCD風(fēng)格,現(xiàn)在Windows操作系統(tǒng)中基本都預(yù)裝有Comic Sans MS字體,因此,不用下載字體即可顯示英文。
xkcd默認(rèn)配置的幾個(gè)字體都不支持中文,如果像在XKCD風(fēng)格圖表中使用類似漫畫風(fēng)格的中文就需要下載中文字體,一般大家都推薦試用方正卡通簡體字體。下載安裝該字體后,只用重載字體緩存,修改rcParams['font.family']使中文字體生效即可。
1.安裝字體
下載方正卡通簡體字體,并進(jìn)行安裝。
2.更新中文字體
獲取方正卡通簡體字體的系統(tǒng)名稱
方正卡通簡體字體在系統(tǒng)中的名稱為FZKaTong-M19S。
設(shè)置方正卡通簡體字體為中文默認(rèn)字體
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()
運(yùn)行后,標(biāo)題中文不能正常顯示,調(diào)試信息顯示找不到'FZKaTong-M19S',所以使用默認(rèn)的DejaVu Sans的字體。
findfont: Font family ['FZKaTong-M19S'] not found. Falling back to DejaVu Sans.
通過以下代碼驗(yàn)證,可知'FZKaTong-M19S'即方正卡通簡體字體沒有出現(xiàn)在ttflist當(dāng)中,所以找不到該字體。而ttflist是讀取字體緩存而構(gòu)建的,因此,重建字體緩存可能解決這個(gè)問題。
from matplotlib.font_manager import fontManager print([i.name for i in fontManager.ttflist if 'FZKaTong-M19S' in i.name])
解決問題
默認(rèn)findfont函數(shù)是從字體緩存中查找的,新安裝的字體緩存中沒有,因此,需要重新創(chuàng)建緩存,并加載。
# 重建字體緩存 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()

到此這篇關(guān)于Python matplotlib繪制xkcd動(dòng)漫風(fēng)格的圖表的文章就介紹到這了,更多相關(guān)Python matplotlib動(dòng)漫圖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python??處理?Pandas?DataFrame?中的行和列
這篇文章主要介紹了Python處理Pandas?DataFrame中的行和列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
解決Keyerror ''''acc'''' KeyError: ''''val_acc''''問題
這篇文章主要介紹了解決Keyerror 'acc' KeyError: 'val_acc'問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python Pandas list列表數(shù)據(jù)列拆分成多行的方法實(shí)現(xiàn)
這篇文章主要介紹了Python Pandas list(列表)數(shù)據(jù)列拆分成多行的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境
這篇文章主要介紹了在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境的教程,值得一提的是這里的方案用Nginx作反向代理而使用Gunicorn作wsgi服務(wù)器,需要的朋友可以參考下2016-06-06
使用python實(shí)現(xiàn)抓取中國銀行外匯牌價(jià)首頁數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要為大家介紹了如何使用python實(shí)現(xiàn)抓取中國銀行外匯牌價(jià)首頁數(shù)據(jù)的實(shí)現(xiàn)示例,有需要的同學(xué)可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10

