精心總結了 10 個 matplotlib 繪圖技巧,短小精悍,威力無窮!

作者 | 劉早起       責編 | 歐陽姝黎

大家好,我是早起。

在使用 Python 進行數據可視化時,相信不論是什麼工具,你都會發現有些操作 / 代碼段會頻繁的用到,這一點在 matplotlib 上尤爲突出。

本文就向大家分享十個我常用的一些小技巧,大多**一行代碼,**短小精悍,威力無窮。

快速且正確的顯示中文

在 matplotlib 中,默認是沒法顯示中文的,原因很簡單,默認使用的字體文件中不含中文。

當你搜索如何設置中文時,會有很多教程,我曾經也詳細的介紹過 3 種方法,但是在有的電腦上折騰很久也搞不定,所以當你浪費了太多時間也沒法解決,或者在一臺陌生的設備上使用,需要快速的讓 matplotlib 顯示中文可以使用下面的代碼。

import matplotlib as mpl

WRYH = mpl.font_manager.FontProperties(
    fname='/Users/liuzaoqi/Desktop/可視化圖鑑/font/WeiRuanYaHei-1.ttf')  
# 微軟雅黑字體

plt.title('可視化圖鑑'fontproperties=WRYH)

很簡單,既然修改默認的字體搞不定,那麼就準備一箇中文字體的路徑,並在每次需要顯示中文的組件(標題、註釋、圖例等)時,就強制指定使用這個字體。

這個辦法一定可以讓你圖中的中文快速且正確顯示出來,但是如果涉及中文的地方過多,還是需要在以後嘗試一勞永逸的將中文字體添加到默認字體集中。

提高分辨率


如果感覺默認生成的圖形分辨率不夠高,可以嘗試修改 dpi 來提高分辨率,在 matplotlib 中可以一次性通過 plt.rcParams 修改,也可以在創建畫布時爲這一次的繪製修改,例如將分辨率調整至 100

plt.figure(figsize = (7,6),dpi =100)

如果你的設備是配備 Retina 屏幕的 mac,可以在 jupyter notebook 中,使用下面一行代碼有效提高圖像畫質

%config InlineBackend.figure_format = 'retina'

添加數學公式

有時我們在繪圖時需要添加帶有數學符號、公式的文字,如果直接使用默認的方法添加,雖然可以實現,但是不夠美觀,其實在 matplotlib 中也支持輸出數學公式,就像下面的文字註釋一樣

只用在需要出現公式的位置使用 r'你的公式'即可,比如 plt.text(11000,0.45,r'擬合的曲線爲 $f(x) = 1.3x^2-6.54x+0.5$') 注意 $$ 中是 latex 格式的表達方式,如果不熟悉的話需要自行搜索。

當然,也可以使用 plt.rcParams['text.usetex'] = True 設置默認 tex 輸出,異曲同工,此處不多介紹。

一行代碼提高顏值

有時我們會覺得 matplotlib 默認製作出來的圖片太樸素了,不夠高級,其實開發者也內置了幾十種主題讓我們自己選擇,只要使用 plt.style.use('主題名') 指定主題即可,具體的支持主題我也整理出來的在《一行代碼提高顏值,給你的 matplotlib 換個樣式!》這篇文章中。

例如使用 R 語言中經典的 ggplot 主題

plt.style.use('ggplot')

另外一種提高圖形顏值的代碼是借用 seaborn 調色板修改配色,也是一行代碼,通過 sns.set_palette(xxxx) 就能直接調整全局配色方案,下面是我比較喜歡的一種配色

import seaborn as sns
sns.set_palette("pastel", 8)

調整圖例位置

雖然 matplotlib 在生成圖例時,默認會選擇一個最合適的位置,但是有時依舊不能讓人滿意。

相信你知道我們可以使用 loc = xxxx 自己設置圖例位置,但是對於 xxxx 每次都要查,看文字說明左上右下不如一張圖來的快,下面是我們可以選擇的 9 個位置,可以根據自己的需要進行選擇。

獲得當前繪圖區域

在原理篇文章中,我曾經說到如果想要獲得更精細的調整,就需要使用 ax.xxxx 進行調整,但有時我們開始沒有使用 fig,ax=plt.subplots(figsize = (6,4),dpi=100) 來定義 ax,在需要使用時重新開始並定義是不推薦的,這時可以使用

ax = plt.gca()

獲得當前 Figure 中的 Axes,並繼續正常使用 ax.xxxx 調整

隱藏座標軸

對於有些圖形我們希望通過隱藏座標軸來顯得更加美觀,這時可以 ax.spines 獲取對應位置的的 Spine 對象,之後便可以任意修改是否顯示與顯示顏色,比如讓右邊和上面的線消失或者修改顏色

ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')

ax.spines['right'].set_color('deeppink')
ax.spines['top'].set_color('blue')
ax.spines['bottom'].set_color('green')
ax.spines['left'].set_color('red')

指定座標軸刻度

如果對於默認生成的座標軸刻度不滿意,我們可以使用 plt.yticks([]) 來自定義刻度,注意需要傳入一個你想要的刻度 list,並且長度需要和刻度對應,例如下方代碼

label = ['2月7日','3月25日','5月13日','7月2日','8月21日','10月10日','11月29日','12月31日']

plt.yticks(range(0,400,50)labels=label,rotation = 40,color = 'black')

當然如果 label 是空的話,可以結合上一個技巧把對應的座標軸幹掉,徹底消失

plt.yticks([])

添加自定義圖片

有時我們希望在對數據可視化後添加一些圖片來豐富元素,雖然可以使用 ps 添加,但其實 matplotlib 也可以獨立完成,總共分兩步:打開圖片——添加圖片

首先導入相關的包並根據圖片路徑導入

from matplotlib.offsetbox import (OffsetImage,AnnotationBbox)
import matplotlib.image as mpimg
arr_img = mpimg.imread('你的圖片位置')

接着就可以根據座標將圖片添加到指定位置,詳細的設置可以參考官方文檔,下面的代碼可以拿走就用,根據效果調整座標即可

imagebox = OffsetImage(arr_img, zoom=0.2)
ab = AnnotationBbox(imagebox, [0.15,0.5],
                    xybox=(170., -50.),
                    xycoords='data',
                    boxcoords="offset points",
                    pad=0.5
                    )
ax.add_artist(ab)

添加表格

有時只用圖片很難傳遞更多的信息,幸運的是,在 matplotlib 中也可以使用 plt.table 來爲圖片添加一張與之對應的表格,只需要將你的數據按照指定格式傳入即可。

下面是我在官方文檔示例的基礎上,添加漸變效果的表格

data = [[ 66386, 174296,  75131, 577908,  32015],
        [ 58230, 381139,  78045,  99308, 160454],
        [ 89135,  80552, 152558, 497981, 603535],
        [ 78415,  81858, 150656, 193263,  69638],
        [139361, 331509, 343164, 781380,  52269]]

columns = ('Freeze''Wind''Flood''Quake''Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
values = np.arange(0, 2500, 500)
value_increment = 1000
colors = plt.cm.BuPu(np.linspace(0, 0.5, len(rows)))
n_rows = len(data)

index = np.arange(len(columns)) + 0.3
bar_width = 0.4

plt.figure(figsize = (8,5),dpi =100)
y_offset = np.zeros(len(columns))
cell_text = []
for row in range(n_rows):
    plt.bar(index, data[row], bar_width, bottom=y_offset, color=colors[row])
    y_offset = y_offset + data[row]
    cell_text.append(['%1.1f' % (x / 1000.0) for x in y_offset])
colors = colors[::-1]
cell_text.reverse()

the_table = plt.table(cellText=cell_text,
                      rowLabels=rows,
                      rowColours=colors,
                      colLabels=columns,
                      loc='bottom'
                     ,cellColours=plt.cm.Blues(x))

plt.subplots_adjust(left=0.2, bottom=0.2)

plt.ylabel("Loss in ${0}'s".format(value_increment))
plt.yticks(values * value_increment, ['%d' % val for val in values])
plt.xticks([])
plt.title('Loss by Disaster')

plt.show()

以上就是本文和大家總結的 10 個 matplotlib 小技巧,在未來的文章中我會繼續分享相關知識,也希望大家可以在使用一些數據可視化工具時可以不斷總結,不斷進步。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/oAws2SXh45mLHUgcp9oTTQ