python資料視覺化學習-3
阿新 • • 發佈:2020-07-06
第4章 學習更多圖表和定製化
4.4 向圖表新增資料表
當前的圖表和子圖可以使用plt.gcf()和plt.gca()獲得,分別表示"Get Current Figure"和"Get Current Axes"。
列出資料集的總結性的或者突出強調的值。
import matplotlib.pyplot as plt import numpy as np plt.figure() ax = plt.gca() y = np.random.randn(9) col_labels = ['c1', 'c2', 'c3'] row_labels = ['r1', 'r2', 'r3'] table_vals= [[11, 12, 13], [21, 22, 23], [31, 32, 33]] row_colors = ['r', 'b', 'g'] # 建立一個帶單元格的表格,並新增到當前座標軸中 my_table = plt.table(cellText=table_vals, colWidths=[0.1] * 3, rowLabels=row_labels, colLabels=col_labels, rowColours=row_colors, loc='upper right') plt.plot(y) plt.show()
4.5 使用subplots(子區)
subplot派生自axes,位於subplot例項的規則網格中。
matplotlib.pyplot.subplots用來建立普通佈局的子區,可以用來建立子區的行數和列數,並可以使用關鍵字引數sharex和sharey來建立共享x或共享y的子區(sharex = True)。
matplotlib.pyplot.subplots方法返回一個(fig,ax)元組。其中ax可以是一個座標軸例項,當多個子區時,ax是一個座標軸例項的陣列。
import matplotlib.pyplot as plt plt.figure(0) # 向subplot2grid方法傳入形狀引數、位置引數loc和可選的colspan、rowspan引數 # colspan和rowspan引數讓子區跨越給定網格中的多個行和列 # 子圖的分割規劃,位置基於0,而不是像pyplot.subplot()那樣基於1 a1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) a2 = plt.subplot2grid((3, 3), (1, 0), colspan=2) a3 = plt.subplot2grid((3, 3), (1, 2), colspan=1) a4 = plt.subplot2grid((3, 3), (2, 0), colspan=1) a5 = plt.subplot2grid((3, 3), (2, 1), colspan=2) # 整理刻度標籤的大小 all_axex = plt.gcf().axes for ax in all_axex: for ticklabel in ax.get_xticklabels() + ax.get_yticklabels(): ticklabel.set_fontsize(9) plt.suptitle("Demo") plt.show()
也可以用標籤引數方法設定字型大小和標籤等:
# 讓標籤顯示在內部 a1.tick_params(direction='in') # 設定刻度標籤的大小 a1.tick_params(labelsize=10) # 引數bottom, top, left, right的值為布林值, 設定繪圖區四個邊框的刻度線是否顯示 a1.tick_params(top=True,right=True) # 引數labelbottom, labeltop, labelleft, labelright的值為布林值,分別代表設定繪圖區四個邊框線上的刻度線標籤是否顯示 a1.tick_params(labeltop=True,labelright=True)
4.6 定製化網格
matplotlib.pyplot.grid函式
函式引數which可以是'major','minor'或'both',表示僅通過主刻度或者次刻度,或者同時通過兩個刻度來操縱網格。
舉例:
ax.grid(color='g', linestyle='--', linewidth=1)
4.7 建立等高線圖
矩陣中數值相等的點連成的曲線。
contour()函式繪製等高線,contourf()函式繪製填充的等高線。
import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl # 生成一些線性訊號資料 def process_signals(x, y): return (1 - (x ** 2 + y ** 2)) * np.exp(-y ** 3 / 3) # numpy.arange([start, ]stop, [step, ]dtype=None) # 和range函式類似,但返回值時一個數組而不是一個列表 x = np.arange(-1.5, 1.5, 0.1) y = np.arange(-1.5, 1.5, 0.1) # np.meshgrid生成網格點座標矩陣 X, Y = np.meshgrid(x, y) Z = process_signals(X, Y) N = np.arange(-1, 1.5, 0.3) # 作為等值線的間隔 # 繪製等高線,水平數由N決定 CS = plt.contour(Z, N, linewidths=2, cmap=mpl.cm.jet) plt.clabel(CS, inline=True, fmt='%1.1f', fontsize=10) # 等值線標籤 plt.colorbar(CS) # 新增顏色對映表
plt.show()
4.8 填充圖表底層區域
np.ma.masked_greater函式可以遮蔽陣列中大於給定值的所有值,用來處理護理缺失或者無效的值。相似的函式:
# masked_array(元資料,條件)利用引數2的條件製作一個掩膜,去除背景值資料 # im_data > 100時出現警告UserWarning: Warning: converting a masked element to nan. im_data = np.ma.masked_array(im_data, im_data > int(100))
from matplotlib.pyplot import * import numpy as np x = np.arange(0, 2, 0.01) # 建立兩個不同的訊號 y1 = np.sin(2 * np.pi * x) y2 = 1.2 * np.sin(4 * np.pi * x) fig = figure() # ax = gca() # 繪圖 axes1 = fig.add_subplot(211) axes1.plot(x, y1, x, y2, color='b') # 填充兩條輪廓線中間的區域 axes1.fill_between(x, y1, y2, where=y2 > y1, facecolor='g', interpolate=True) axes1.fill_between(x, y1, y2, where=y2 < y1, facecolor='darkblue', interpolate=True) axes1.set_xlim(0, 2) axes1.set_title('filled between') axes2 = fig.add_subplot(212) # np.ma.masked_greater用來處理缺失或者無效的值 y2 = np.ma.masked_greater(y2, 1.0) # 遮蔽y2中大於1.0的值的所有制 axes2.plot(x, y1, x, y2, color='black') axes2.fill_between(x, y1, y2, where=y2 > y1, facecolor='g', interpolate=True) axes2.fill_between(x, y1, y2, where=y2 < y1, facecolor='darkblue', interpolate=True) show()
masked_greater()處理缺失或無效的值。
from matplotlib.pyplot import * import numpy as np x = np.arange(0, 2, 0.01) # 建立兩個不同的訊號 y1 = np.sin(2 * np.pi * x) y2 = 1.2 * np.sin(4 * np.pi * x) fig = figure() # ax = gca() # 繪圖 axes1 = fig.add_subplot(211) axes1.plot(x, y1, x, y2, color='b') # 填充兩條輪廓線中間的區域 axes1.fill_between(x, y1, y2, where=y2 > y1, facecolor='g', interpolate=True) axes1.fill_between(x, y1, y2, where=y2 < y1, facecolor='darkblue', interpolate=True) axes1.set_xlim(0, 2) axes1.set_title('filled between') axes2 = fig.add_subplot(212) # np.ma.masked_greater用來處理缺失或者無效的值 y2 = np.ma.masked_greater(y2, 1.0) # 遮蔽y2中大於1.0的值的所有制 axes2.plot(x, y1, x, y2, color='black') axes2.fill_between(x, y1, y2, where=y2 > y1, facecolor='g', interpolate=True) axes2.fill_between(x, y1, y2, where=y2 < y1, facecolor='darkblue', interpolate=True) yticks([-1, 0, +1]) # 設定y軸刻度標籤 show()
4.9 繪製極限圖
通常用來表示本質上是射線的資訊。
(暫時用不到啦)