用matplotlib繪制漫畫風格的圖表


自從有了計算機,便很少有人手工繪制圖表了。計算機繪制出的圖表橫平豎直,可以隨意使用各種顏色,也完全不用擔心畫錯需要重來的問題。

但有沒有一種感覺,看多了工整的圖表,變得有些審美疲勞。在各行各業逐漸過渡到計算機繪圖的時候,有些人開始懷念起手繪來,只不過用全新的方式——觸控板來進行手繪。

1 用Python的maplotlib包繪圖

平時喜歡倒騰一些數據,沒少畫各種圖,最常用的是PythonMatplotlib包,簡單的幾行代碼,便可以繪出精美的圖來。matplotlib包模仿了MATLAB的繪圖接口,想必用過MATLAB的人會很熟悉,本文並不會詳細介紹各種繪圖的命令,只是展示一種可能性——在圖表里增添一點塗鴉的美感。

比如,我想知道籃球比賽里,得分的分布是什么樣的。於是我就爬了美國大學體育協會籃球比賽的得分數據,加上幾行代碼

mean = sum(data)/len(data)
std = stdev(data)
data_range = (min(data), max(data))
x = np.linspace(data_range[0], data_range[1], 100)
norm = stats.norm(mean, std)

plt.hist(data, normed=True ,bins=max(data)+1, range=(-0.5,max(data)+0.5), color='green', label='實際分布', histtype='stepfilled')
plt.axvline(x=mean, color='yellow', linewidth=2)
plt.plot(x, norm.pdf(x), '--', label='標准正態分布', color='red', linewidth=2)
plt.xlabel('一場比賽的得分數目')
plt.title('NCAA籃球賽得分條形圖')
plt.legend()

 就有了下面的這個條形圖

沒有意料到是一個完美的正態分布,再也沒有比這更完美的了,這就是數據可視化的魅力。

 

2 xkcd模式

xkcd是一個關於浪漫、諷刺、數學和語言的網絡漫畫,畫的往往是geek的幽默,我表示很難看出笑點在哪。xkcd在geek圈的影響力可謂不小,當年xkcd畫了一幅Python的漫話,說用Python編程,就像在雲端漫步一樣,比喻利用Python提供的各種各樣的包,可以實現快速地開發。

Python

漫畫里寫着I JUST JTYPED import antigratity,過后沒多久Python的開團隊就在Python的發行版本里,添加了一個antigravity包,import這個包會直接打開這幅漫畫。這是真的,查了一番資料我才確定是先有的這幅漫畫,再有的antigratity包。

覺得這種手繪的漫話是不是有一種莫名的美感。Matplotlib就能畫出這種風格的圖表來!!當然不是那些小人什么的。

你需要做的就是在畫圖之前加上一行代碼plt.xkcd(),比如畫一個正弦曲線:

from numpy import linspace, sin
import matplotlib.pyplot as plt
 
plt.xkcd()
plt.plot(sin(linspace(0, 10)))
plt.title('Whoo Hoo!!!')

 效果會是這樣:

原本平整的圖紙,像是被水浸泡過一樣,變得扭曲。除此之外,它們還使用了,另外一種字體,叫做Humor Sans。

下面是干貨時間到,如果你在標題里寫入中文,你會發現中文的字體,還是你原來設置的,並沒有配合圖表進行改變,這也可以意料到,因為他們不可能為每一種文字找一種融洽的字體。

經過一番搜尋,發現方正卡通簡體挺配的,於是安裝到了系統里,卻發現怎么也沒法用這種字體。經過一番折騰發現,字體的名稱只能是英文的,卻不知道安裝字體的英文名是什么,最后通過列出matplotlib所有支持的字體

sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

 反過來才找到,方正卡通簡體正確的英文名字是FZKaTong-M19S。添加一行代碼matplotlib.rc('font', **{'family' : 'FZKaTong-M19S'})設置使用方正卡通簡體就可以啦。

一切就緒,就等開畫了,仍然是體育比賽的得分,這次是足球的

mean = sum(data)/len(data)
data_range = (min(data), max(data))

poisson = stats.poisson(mean)
x = range(data_range[0], data_range[1]+1)
poisson_distri = poisson.pmf(x)

plt.xkcd()
plt.hist(data, normed=True ,bins=max(data)+1, range=(-0.5,max(data)+0.5), color='green', label='實際分布')
matplotlib.rc('font', **{'family' : 'FZKaTong-M19S'}) plt.plot(poisson_distri, 'o-', label='標准泊松分布') plt.xlabel('一場比賽的進球數目') plt.title('1998-2014年世界杯初賽進球數目的分布') plt.legend()

 足球比賽的得分,近似服從泊松分布

是不是很贊。除此之外,在xkcd模式下,箭頭等其他的一些部件也有所改變

快去探索一番吧!Matplotlib還專門為xkcd模式准備了一個官網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM