Matplolib Tips

SpikeKing發表於2018-04-16

Matplolib是最常用的Python資料繪圖工具庫,支援不同樣式資料的影像繪製。本文介紹一些使用Matplotlib庫的注意事項,主要包括:

  • subplots
  • 佈局調整
  • specgram(光譜圖)
  • pcolormesh
  • 樣式增強

其他:

  • 顏色集
  • 直方圖Hist

subplots

subplots()是繪圖的開始,建立不同子圖的排列結構。

如下:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()
複製程式碼

最終的影像展示使用plt.show()方法。

返回:

  • fig:繪圖的底版,用於顯示整個背景輪廓,等同於plt.gcf();
  • axes:子圖的集合,通過下標選中單個子圖,如axes[0][0]

引數:

  • nrowsncols:子圖排列的行和列;

非規則的排列,使用subplot2grid(),通過結構shape位置loc排列子圖,如,排列5個子圖,上三下二結構:

ax1 = plt.subplot2grid(shape=(2, 6), loc=(0, 0), colspan=2)
ax2 = plt.subplot2grid((2, 6), (0, 2), colspan=2)
ax3 = plt.subplot2grid((2, 6), (0, 4), colspan=2)
ax4 = plt.subplot2grid((2, 6), (1, 1), colspan=2)
ax5 = plt.subplot2grid((2, 6), (1, 3), colspan=2)
複製程式碼

佈局調整

在排列子圖的過程中,可能出現:

  • 座標軸遮擋:使用tight_layout()設定間距,其中pad表示整體輪廓間距,w_pad表示子圖水平間距,h_pad表示子圖豎直間距;
  • 影像密集:使用set_size_inches()設定影像長寬的具體尺寸(英寸);

即:

plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
fig = plt.gcf()
fig.set_size_inches(10, 8)
複製程式碼

這樣,子圖就可以優雅地排列在一起了。


specgram

連續訊號推薦使用specgram()展示,即光譜圖(spectrogram)。

引數:

  • x:訊號連續值列表;
  • Fs:訊號幀率;

即:

axes[0, 0].specgram(x=y, Fs=sr)  # 光譜圖
axes[0, 0].set_title('std')
複製程式碼

set_title()用於設定影像的標題。

光譜圖

連續訊號不推薦使用線圖展示,因為在訊號中,一般含有幀率,即每秒訊號數,而使用線圖展示,就會忽略幀率資訊,無法體現波形的相似性。


pcolormesh

二維特徵推薦使用pcolormesh()展示。除此之外,相似的展示形式:

  • contourf:等高線,與pcolormesh類似,邊界較為模糊;
  • imshow:影像模式,支援模糊處理,自適應寬高需要設定aspect的“auto”屬性;

axes[0, 0].pcolormesh(df1)
axes[0, 1].contourf(df2)
axes[1, 0].imshow(df2, interpolation='bicubic', aspect='auto')
axes[1, 1].axis('off')
複製程式碼

axis('off')用於關閉子圖。

pcolormesh

二維特徵不推薦使用散點圖,因為散點圖的展示區域較小,對比效果較差。


樣式增強

seaborn是Matplotlib的顏色和樣式擴充套件。

使用方式:在plt繪製之前,通過seaborn宣告其他的展示樣式。

import seaborn as sns

sns.set(style='ticks', palette='Set2')
複製程式碼

顏色集

Matplotlibcolors,參考


直方圖

標準直方圖的繪製,輸入資料hist_data是列表資料。

def plot_hist(hist_data):
    """
    繪製直方圖
    :param hist_data: 直方圖資料
    :return: 展示圖
    """
    hist_data = np.asarray(hist_data)
    sns.set(style='ticks', palette='Set2')
    fig, aux = plot.subplots(ncols=1, nrows=1)
    aux.hist(hist_data, bins=50, facecolor='magenta', alpha=0.75)
    plot.show()
複製程式碼

對於座標軸X(或Y):

  • set_xlabel設定標籤;
  • set_xlim設定座標值的範圍
  • set_xticks設定座標值的粒度;

注意:座標值的範圍(lim)與粒度(ticks)儘量統一。

aux.set_xlabel("sec")
aux.set_ylabel("num")
min_x, max_x = 8, 22
aux.set_xlim([min_x, max_x])
aux.set_xticks(range(min_x, max_x, 1))
複製程式碼

Hist


歡迎Follow我的GitHub:https://github.com/SpikeKing

By C. L. Wang @ 美圖雲事業部

OK, that's all!