1. 程式人生 > 實用技巧 >python資料視覺化學習-3

python資料視覺化學習-3

第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 繪製極限圖

通常用來表示本質上是射線的資訊。

(暫時用不到啦)