數據分析之-matplotlib概述

matplotlib概述

matplotlib是python的一個繪圖庫.使用它可以很方便的繪製出版質量級別的圖形.

matplotlib的基本功能

  1. 基本繪圖
    1. 繪製折線, 設置線型/線寬/顏色等.
    2. 設置座標軸範圍
    3. 設置座標刻度
    4. 設置座標軸位置/顏色
    5. 圖例
    6. 特殊點
    7. 備註
  2. 高級圖形操作
    1. 子圖
    2. 操作刻度定位器/刻度網格線
    3. 半對數座標
    4. 散點圖
    5. 圖像填充
    6. 條形圖/餅狀圖
    7. 等高線圖/熱成像圖
    8. 3D圖形
    9. 簡單動畫
    10. 極座標系

matplotlib功能詳解

基本繪圖

繪圖核心API

import matplotlib.pyplot as mp
# 把多個點連起來繪製一條折線
# xarray: 所有點的x座標
# yarray: 所有點的y座標
mp.plot(xarray, yarray)
mp.show()

繪製水平線/垂直線

# 繪製垂直線
mp.vlines(val, ymin, ymax)
# 繪製水平線
mp.hlines(val, xmin, xmax)

案例:繪製一條正弦曲線 [-π, π]

"""
demo02_plot.py  繪製一條正弦曲線
"""
import numpy as np
import matplotlib.pyplot as mp

# [-π,π] 拆1000個點
x = np.linspace(-np.pi, np.pi, 1000)
sin_x = np.sin(x)
# 繪製餘弦曲線 y=1/2 * cos(x)
cos_x = np.cos(x) / 2
# 繪圖
mp.plot(x, sin_x)
mp.plot(x, cos_x)
mp.show()

線型、線寬和顏色

# color:
#   英文顏色單詞 或 常見顏色單詞首字母   
#   #ABC23E
#   (0.5, 0.3, 0.8) 或 (0.5, 0.3, 0.8, 0.4)
mp.plot(
    x, y, 			# 點的座標數組
	linestyle='',	# 線型:  ':'  '-'  '--'
    linewidth=3,	# 線寬:  3倍線寬
    color='',		# 顏色
    alpha=0.3		# 透明度
)

設置座標軸範圍

# 設置x軸的可視範圍   [x_min, x_max]
mp.xlim(x_min, x_max)
# 設置y軸的可視範圍   [y_min, y_max]
mp.ylim(y_min, y_max)

設置座標刻度

# 設置x軸的座標刻度
# x_val_list:  x軸刻度值序列
# x_text_list: x軸刻度值的文本序列(可選)
mp.xticks(x_val_list, x_text_list)
# 設置y軸的座標刻度
# y_val_list:  y軸刻度值序列
# y_text_list: y軸刻度值的文本序列(可選)
mp.yticks(y_val_list, y_text_list)

刻度文本的特殊語法 - latex語法
a2+b2=c2π2523 a^2 + b^2 = c^2 \quad\quad\quad -\frac{\pi}{2} \quad\quad\quad \sqrt[3]{\frac{5}{2}}

設置座標軸

# 獲取當前座標軸
ax = mp.gca()
axis = ax.spines['left']
axis = ax.spines['right']
axis = ax.spines['top']
axis = ax.spines['bottom']
# 修改座標軸的顏色  
axis.set_color('none')
# 移動座標軸的位置  
# data: 基於數據座標系進行定位   0: 把座標軸移動到0的位置
axis.set_position(('data', 0))

案例:

# 設置座標軸
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))

圖例

# label: 定義當前曲線的標籤名 該標籤名將會在圖例中顯示
mp.plot(x, y, label='sin(x)')
# 顯示圖例  loc:圖例的位置  (參照legend()文檔字符串)
mp.legend(loc='best')

特殊點

mp.scatter(
	xarray, yarray,  # 給出點的座標
    marker='',		 # 點型  'D'  's'  'o' ...
    s = 60,			 # 點的大小
    edgecolor='',	 # 邊緣色
    facecolor='',	 # 填充色
    zorder=3		 # 繪製圖層編號 (編號越大,圖層越靠上)
)

備註

mp.annotate(
	r'$[x, y]$', 		# 備註的文本內容
    xycoords='data',	# 目標點的座標系
    xy=(1, 2),			# 目標點的座標
    # 定位備註文本位置所使用的座標系
    textcoords='offset points',	
    xytext=(-10, -10),	# 備註文本的座標
    fontsize=12,		# 字體大小
    # 箭頭屬性字典
    arrowprops=dict(
    	arrowstyle : '->',			# 箭頭樣式
        connectionstyle='angle3'	# 連接線的樣式
    )
)

高級圖形操作

案例:繪製兩個窗口,一起顯示。

# 手動創建一個窗口,窗口的標題titleA
mp.figure('titleA', facecolor='填充色')
# 手動創建第二個窗口,窗口的標題titleB
mp.figure('titleB', facecolor='填充色')
# 由於titleA已經創建過,將會把titleA窗口置爲當前窗口
mp.figure('titleA')
mp.show()

設置當前窗口的常用參數

# 設置圖表的標題
mp.title(' ', fontsize=12)
# 設置水平軸的標籤
mp.xlabel('time', fontsize=12)
# 設置垂直軸的標籤
mp.ylabel('v', fontsize=12)
# 設置刻度參數
mp.tick_params(labelsize=8)
# 設置圖表網格線
mp.grid(linestyle=':')
# 緊湊佈局
mp.tight_layout()

子圖

子圖可以在一個窗口中顯示多張圖表.

矩陣式佈局

矩陣式佈局相關API:


案例:

mp.figure('Subplot A', facecolor='lightgray')

for i in range(9):
	mp.subplot(3,3,i+1)
	mp.xticks([])
	mp.yticks([])
	mp.text(0.5, 0.5, i+1, ha='center', 
		    va='center', size=36, alpha=0.5)
	mp.tight_layout()
mp.show()

網格式佈局

網格式佈局支持單元格的合併.

import matplotlib.gridspec as mg
mp.figure(...)
# 構建3*3的網格佈局結構
gs = mg.GridSpec(3, 3)
mp.subplot(gs[0, :2])
mp.show()

案例:

"""
demo05_subplot.py 網格式佈局
"""
import matplotlib.pyplot as mp
import matplotlib.gridspec as mg

mp.figure('Grid Layout', facecolor='lightgray')
gs = mg.GridSpec(3, 3)

mp.subplot(gs[0, :2])
mp.text(0.5, 0.5, '1', ha='center',
	    va='center', size=36)
mp.xticks([])
mp.yticks([])

mp.subplot(gs[:2, 2])
mp.text(0.5, 0.5, '2', ha='center',
	    va='center', size=36)
mp.xticks([])
mp.yticks([])

mp.subplot(gs[1, 1])
mp.text(0.5, 0.5, '3', ha='center',
	    va='center', size=36)
mp.xticks([])
mp.yticks([])

mp.subplot(gs[1:, 0])
mp.text(0.5, 0.5, '4', ha='center',
	    va='center', size=36)
mp.xticks([])
mp.yticks([])

mp.subplot(gs[2, 1:])
mp.text(0.5, 0.5, '5', ha='center',
	    va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()

自由佈局

mp.figure()
# 0.1, 0.2: 子圖左下角定點座標
# 0.5: 子圖的寬度   0.3:子圖的高度
mp.axes([0.1, 0.2, 0.5, 0.3])
mp.text(...)
mp.show()

刻度定位器

# 獲取當前座標軸
ax = mp.gca()
# 設置x軸的主刻度定位器
locator1 = mp.NullLocator()
ax.xaxis.set_major_locator(locator1)
# 設置x軸的次刻度定位器
locator2 = mp.MultipleLocator(0.1)
ax.xaxis.set_minor_locator(locator2)

案例: 繪製一個數軸.

"""
demo07_locator.py 刻度定位器
"""
import matplotlib.pyplot as mp

locators = ['mp.NullLocator()', 
			'mp.MultipleLocator(2)', 
			'mp.MaxNLocator(nbins=6)',
			'mp.AutoLocator()',
			'mp.FixedLocator(locs=[0, 5, 10])']

mp.figure('Locator', facecolor='lightgray')

for i, locator in enumerate(locators):
	mp.subplot(len(locators), 1, i+1)
	ax = mp.gca()
	ax.spines['left'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.spines['right'].set_color('none')
	mp.ylim(-1, 1)
	mp.xlim(0, 10)
	mp.yticks([])
	ax.spines['bottom'].set_position(('data', 0))
	# 設置水平軸的刻度定位器
ax.xaxis.set_major_locator(eval(locator))

	l2 = mp.MultipleLocator(0.1)
	ax.xaxis.set_minor_locator(l2)

mp.show()

刻度網格線

ax = mp.gca()
ax.grid(
	which='', # 'major'|'minor'|'both'
    axis='',  # 'x'|'y'|'both'
    linewidth=1,
    linestyle=':',
    color='',
    alpha=0.5
)

案例:

"""
demo08_grid.py  刻度網格線
"""
import matplotlib.pyplot as mp

mp.figure('Grid Line', facecolor='lightgray')
mp.title('Grid Line', fontsize=16)
mp.xlabel('X', fontsize=12)
mp.ylabel('Y', fontsize=12)
mp.tick_params(labelsize=10)
# 繪製刻度網格線
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator())
ax.xaxis.set_minor_locator(
		mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(
		mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(
		mp.MultipleLocator(50))
ax.grid(which='major', axis='both', 
	    linewidth=0.75, linestyle='-', 
	    color='orange')
ax.grid(which='minor', axis='both', 
	    linewidth=0.25, linestyle='-', 
	    color='orange')


y = [1, 10, 100, 1000, 100, 10, 1]
mp.plot(y, color='dodgerblue')
mp.show()

半對數座標

y軸將會以指數方式遞增. 基於半對數座標系表示上述曲線可以更好的觀察底部數據細節.

# plot改爲semilogy, 座標系將會改爲半對數座標系
mp.semilogy()

散點圖

身高 體重 性別 年齡 民族
180 75 0 18 0
175 60 1 20 1

繪製散點圖相關API:

mp.scatter(
	xarray, yarray,  # 給出點的座標
    marker='',		 # 點型
    s = 60,			 # 點的大小
    edgecolor='',	 # 邊緣色
    facecolor='',	 # 填充色
    zorder=3,		 # 繪製圖層編號 
    c=d,			 # 設置過渡性顏色
    cmap='jet'		 # 顏色映射
)

隨機生成符合 正態分佈 的隨機數:

n = 500
# 隨機生成n個數
# 172: 數學期望
# 20:  標準差
x = np.random.normal(172, 20, n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章