首頁 > 軟體

Python matplotlib繪製xkcd動漫風格的圖表

2022-03-08 16:01:30

XKCD

xkcd是蘭道爾·門羅(Randall Munroe)的網名,又是他所創作的漫畫的名稱。作者蘭道爾·門羅(Randall Munroe)給作品的定義是一部“關於浪漫、諷刺、數學和語言的網路漫畫”(A webcomic of romance,sarcasm, math, and language),被網友譽為深度宅向網路漫畫。XKCD官方網站https://xkcd.com/。

matplotlib對XKCD風格的支援

matplotlib.pyplot.xkcd函數可繪製XKCD風格的圖表。

原理非常簡單,呼叫函數時儲存原有rcParams設定,再更新rcParams使預置的XKCD風格的生效,退出時還原rcParams設定。
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動漫圖表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com