· 

xkcd風のグラフをmatplotlibで描く

(著)山たー

手書き風グラフをmatplotlibで描きます。こんなの(Documentより)。

横軸:時間、縦軸:健康、矢印の先:好きな時にベーコンを焼けると気付いた日

 

使うとすれば、論文・レポート用ではなく、軽い感じの講義用でしょうか。

 

xkcdについて

xkcdはランダル・マンローによるウェブコミックサイトです。手書きの棒人間で描かれているのが特徴です。

『ウィキペディアな抗議者』:要出典(CITATION NEEDED)のボードを掲げている。

 

ウェブサイトの内容をまとめた本としてWHAT IF?が発売されています。馬鹿げた質問を真剣に考えてみるという内容です。翻訳本も発売されています(amazon)ので、ぜひ読んでみてください。

 

使用例1:普通のグラフ

with plt.xkcd(): で描画内容を囲めばok。plt.xkcd()を書くだけだと、直後のコマンドしかxkcd化されない。

import matplotlib.pyplot as plt
import numpy as np

# gaussian function
def gaussian_func(x, mu, sigma):
    return 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2))

x = np.arange(-5, 5, 0.01)
data = gaussian_func(x, 0, 1)

with plt.xkcd():
    fig = plt.figure()
    ax = fig.add_axes((0.1, 0.2, 0.8, 0.7))
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    plt.title("Gaussian Distribution")
    plt.plot(x, data)
    plt.savefig("gaussian.png")
        

統計学図鑑のグラフもこんな感じですね。

 

使用例2:棒グラフ

Documentより。

上:超能力についての主張

左:実験で確認された数、右:実験で否定された数

import matplotlib.pyplot as plt

with plt.xkcd():
    # Based on "The Data So Far" from XKCD by Randall Monroe
    # http://xkcd.com/373/

    fig = plt.figure()
    ax = fig.add_axes((0.1, 0.2, 0.8, 0.7))
    ax.bar([0, 1], [0, 100], 0.25)
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.set_xticks([0, 1])
    ax.set_xlim([-0.5, 1.5])
    ax.set_ylim([0, 110])
    ax.set_xticklabels(['CONFIRMED BY\nEXPERIMENT', 'REFUTED BY\nEXPERIMENT'])
    plt.yticks([])

    plt.title("CLAIMS OF SUPERNATURAL POWERS")

    fig.text(
        0.5, 0.05,
        '"The Data So Far" from xkcd by Randall Monroe',
        ha='center')

    plt.show()
    plt.savefig("barplot.png")
        

使用例3:円グラフ

import matplotlib.pyplot as plt

labels = 'Agree', 'Disagree'
sizes = [3,97]
explode = (0,0) 

with plt.xkcd():
    plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
            shadow=True, startangle=90)
    plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    plt.text(
        0, -1.3,
        'Medical Students are Popular with Girls',
        ha='center')
    
    plt.savefig("pi.png")
    plt.show()
        

作ってて悲しくなりました。

 

Matplotlib-Documentのxkcd版

URLの末尾に/xkcd/とつければ、xkcd版のDocumentが読めます。

https://matplotlib.org/xkcd/

例が全てxkcd風になっています。

 

Thumbnail Galleryを見るのが一番早いです。

 

参考にしたサイト

XKCD — Matplotlib 2.2.2 documentation

 

書いた後に検索かけたら結構な数の日本語サイトがヒットしました…この記事書いた意味なくね。