python數據分析之matplotlib繪圖

  開此博客用於記錄學習和方便複習查看。數組

pyplot

  在matplotlib面向對象的繪圖庫中,pyplot是一個方便的接口。dom

基本繪圖函數

  mp.plot(水平座標數組, 垂直座標數組)ide

1 from __future__ import unicode_literals
2 import numpy as np
3 import matplotlib.pyplot as mp
4 x = np.linspace(-np.pi, np.pi, 1000)
5 cos_y = np.cos(x) / 2
6 sin_y = np.sin(x)
7 mp.plot(x, cos_y)
8 mp.plot(x, sin_y)
9 mp.show()
簡單栗子

np.linspace(...)的意思是從-π到+π均勻的取1000個點函數

爲曲線圖添加屬性

  實現曲線個性化。佈局

  mp.plot(..., linestyle=線型, linewidth=線寬,color=顏色)學習

  

import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
# 添加屬性
mp.plot(x, cos_y, linestyle='--', linewidth=6, color='dodgerblue')
mp.plot(x, sin_y, linestyle=':', linewidth=0.5, color='orangered')

mp.show()
添加屬性

設置xy軸的範圍  

  mp.xlim(左邊界, 右邊界)
  mp.ylim(底邊界, 頂邊界)字體

  

import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
# 限制x的取值範圍
mp.xlim(x.min(), x.max())
# 限制y的取值範圍
mp.ylim(sin_y.min(), sin_y.max())
mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue')
mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered')
mp.show()
設置x,y的顯示範圍

更改刻度文本

  mp.xticks(刻度位置數組, 刻度文本數組)spa

  mp.yticks(刻度位置數組, 刻度文本數組)3d

import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.xlim(x.min() * 1.1, x.max() * 1.1)
mp.ylim(sin_y.min(), sin_y.max())
# 設置x軸和y周的刻度文本
mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, np.pi], [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', r'$\pi$'])
mp.yticks([-1, -0.5, -0.5, 1])
mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue')
mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered')
mp.show()

移動座標軸

  ax = mp.gca() # 獲取當前座標軸
  ax.spines['left'].set_position(('data', 0))
  ax.spines['left'].set_color(顏色)code

import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.xlim(x.min() * 1.1, x.max() * 1.1)
mp.ylim(sin_y.min(), sin_y.max())
mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, np.pi], [r'$-\pi$',r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', r'$\pi$'])
mp.yticks([-1, -0.5, -0.5, 1])
# 獲取當前座標軸
ax = mp.gca()
# 移動座標軸
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
# 將右邊和上面的線條影藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue')
mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered')
mp.show()
移動x,y軸

添加圖例文本

  mp.plot(..., label=圖例文本)

  mp.legend(loc='upper left')

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 x=np.linspace(-np.pi,np.pi,1000)
 4 cos_y=np.cos(x)/2
 5 sin_y=np.sin(x)
 6 mp.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi*3/4,np.pi],[r'$-\pi$',r'$-\frac{\pi}{2}$',r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$'])
 7 mp.yticks([-1,-0.5,0.5,1])
 8 ax = mp.gca()
 9 ax.spines['left'].set_position(('data',0))
10 ax.spines['bottom'].set_position(('data',0))
11 ax.spines['right'].set_color('none')
12 ax.spines['top'].set_color('none')
13 mp.xlim(x.min()*1.1,x.max()*1.1)
14 mp.ylim(sin_y.min()*1.1, sin_y.max()*1.1)
15 #添加圖例文本屬性
16 mp.plot(x,cos_y,linestyle='-',linewidth=2,color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$')
17 mp.plot(x,sin_y,linestyle='-',linewidth=2,color='orangered', label=r'$y=sin(x)$')
18 #設置圖例文本位置
19 mp.legend(loc='upper left')
20 mp.show()
添加圖例文本

在曲線上取點

  mp.scatter(水平座標數組, 垂直座標數組,marker=點型, s=大小, edgecolor=勾邊色,facecolor=填充色, zorder=Z序)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 x = np.linspace(-np.pi, np.pi, 1000)
 4 cos_y = np.cos(x) / 2
 5 sin_y = np.sin(x)
 6 
 7 # 取點
 8 xo = np.pi * 3 / 4
 9 yo_cos = np.cos(xo) / 2
10 yo_sin = np.sin(xo)
11 
12 mp.xlim(x.min() * 1.1, x.max() * 1.1)
13 mp.ylim(sin_y.min() * 1.1, sin_y.max() * 1.1)
14 mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4,
15            np.pi],
16           [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$',
17            r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$',
18            r'$\pi$'])
19 mp.yticks([-1, -0.5, 0.5, 1])
20 ax = mp.gca()
21 ax.spines['left'].set_position(('data', 0))
22 ax.spines['bottom'].set_position(('data', 0))
23 ax.spines['right'].set_color('none')
24 ax.spines['top'].set_color('none')
25 mp.plot(x, cos_y, linestyle='-', linewidth=2,
26         color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$')
27 mp.plot(x, sin_y, linestyle='-', linewidth=2,
28         color='orangered', label=r'$y=sin(x)$')
29 # 繪製兩點連線
30 mp.plot([xo, xo], [yo_cos, yo_sin], linestyle='--',
31         linewidth=1, color='limegreen')
32 # 繪製點
33 mp.scatter([xo, xo], [yo_cos, yo_sin], s=60,
34            edgecolor='limegreen', facecolor='white',
35            zorder=3)
36 mp.legend(loc='upper left')
37 mp.show()
在曲線上取點

備註文本

  mp.annotate(
    備註文本,
    xy=目標位置,
    xycoords=目標座標系,
    xytext=文本位置,
    textcoords=文本座標系,
    fontsize=字體大小,
    arrowprops=箭頭屬性)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 x = np.linspace(-np.pi, np.pi, 1000)
 4 cos_y = np.cos(x) / 2
 5 sin_y = np.sin(x)
 6 xo = np.pi * 3 / 4
 7 yo_cos = np.cos(xo) / 2
 8 yo_sin = np.sin(xo)
 9 mp.xlim(x.min() * 1.1, x.max() * 1.1)
10 mp.ylim(sin_y.min() * 1.1, sin_y.max() * 1.1)
11 mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4,
12            np.pi],
13           [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$',
14            r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$',
15            r'$\pi$'])
16 mp.yticks([-1, -0.5, 0.5, 1])
17 ax = mp.gca()
18 ax.spines['left'].set_position(('data', 0))
19 ax.spines['bottom'].set_position(('data', 0))
20 ax.spines['right'].set_color('none')
21 ax.spines['top'].set_color('none')
22 mp.plot(x, cos_y, linestyle='-', linewidth=2,
23         color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$')
24 mp.plot(x, sin_y, linestyle='-', linewidth=2,
25         color='orangered', label=r'$y=sin(x)$')
26 mp.plot([xo, xo], [yo_cos, yo_sin], linestyle='--',
27         linewidth=1, color='limegreen')
28 mp.scatter([xo, xo], [yo_cos, yo_sin], s=60,
29            edgecolor='limegreen', facecolor='white',
30            zorder=3)
31 # 添加備註1
32 mp.annotate(
33     r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$',
34     xy=(xo, yo_cos), xycoords='data',
35     xytext=(-90, -40), textcoords='offset points',
36     fontsize=14,
37     arrowprops=dict(arrowstyle='->',
38                     connectionstyle='arc3, rad=.2'))
39 # 添加備註2
40 mp.annotate(
41     r'$sin(\frac{3\pi}{4})=\frac{\sqrt{2}}{2}$',
42     xy=(xo, yo_sin), xycoords='data',
43     xytext=(20, 20), textcoords='offset points',
44     fontsize=14,
45     arrowprops=dict(arrowstyle='->',
46                     connectionstyle='arc3, rad=.2'))
47 mp.legend(loc='upper left')
48 mp.show()
備註文本

建立圖像對象

  mp.figure(圖形對象名, figsize=窗口大小,dpi=分辨率,facecolor=顏色)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 x = np.linspace(-np.pi, np.pi, 1000)
 4 cos_y = np.cos(x) / 2
 5 sin_y = np.sin(x)
 6 # 建立了第一個圖形對象
 7 mp.figure('Figure Object 1', figsize=(6, 4), dpi=120, facecolor='lightgray')
 8 # 定義標題名字
 9 mp.title('Figure Object title 1', fontsize=16)
10 # 設置x,y軸的名字及字體大小
11 mp.xlabel('x', fontsize=12)
12 mp.ylabel('y', fontsize=12)
13 # 設置刻度字體大小
14 mp.tick_params(labelsize=10)
15 # 設置網格
16 mp.grid(linestyle=':')
17 
18 # 建立了第二個圖形對象
19 mp.figure('Figure Object 2', figsize=(6, 4), dpi=120, facecolor='lightgray')
20 mp.title('Figure Object title 2', fontsize=16)
21 mp.xlabel('x', fontsize=12)
22 mp.ylabel('y', fontsize=12)
23 mp.tick_params(labelsize=10)
24 mp.grid(linestyle=':')
25 # 將圖形切換到圖形1,進行操做
26 mp.figure('Figure Object 1')
27 mp.plot(x, cos_y, label=r'$y=\frac{1}{2}cos(x)$')
28 mp.legend()
29 
30 # 將圖形切換到圖形2,進行操做
31 mp.figure('Figure Object 2')
32 mp.plot(x, sin_y, label=r'$y=sin(x)$')
33 mp.legend()
34 
35 mp.show()
建立圖形對象

注意:對圖形進行操做的時候,要將須要操做的圖形切換到當前

 子圖

缺省佈局

  mp.subplot(行數, 列數, 圖號)
  mp.subplot(2, 3, 1)
  mp.subplot(231)

 1 import matplotlib.pyplot as mp
 2 # 建立圖形對象
 3 mp.figure(facecolor='lightgray')
 4 # 循環插入圖形
 5 for i in range(2):
 6     for j in range(3):
 7         k = i * 3 + j + 1
 8         # 在2行3列大畫布上繪出每個圖形,用k區別
 9         mp.subplot(2, 3, k)
10         mp.xticks(())
11         mp.yticks(())
12         # 在圖形裏添加文字
13         mp.text(0.5, 0.5, str(k), ha='center', va='center', size=36, alpha=0.5)
14 # 使圖形緊湊
15 mp.tight_layout()
16 mp.show()
缺省模式畫子圖

柵格佈局 

  import matplotlib.gridspec as mg
  gs = mg.GridSpec(行數, 列數) # 柵格佈局器
  mp.subplot(gs[行, 列])

 1 import matplotlib.pyplot as mp
 2 import matplotlib.gridspec as mg
 3 mp.figure(facecolor='lightgray')
 4 # 刪格佈局器,三行三列
 5 gs = mg.GridSpec(3, 3)
 6 # 建立第一行佔1,2兩列位置的圖形
 7 mp.subplot(gs[0, :2])
 8 mp.xticks(())
 9 mp.yticks(())
10 mp.text(0.5, 0.5, '1', ha='center', va='center', size=36, alpha=0.5)
11 
12 # 建立第一列佔2,3兩行位置的圖形
13 mp.subplot(gs[1:, 0])
14 mp.xticks(())
15 mp.yticks(())
16 mp.text(0.5, 0.5, '2', ha='center', va='center', size=36, alpha=0.5)
17 
18 mp.subplot(gs[2, 1:])
19 mp.xticks(())
20 mp.yticks(())
21 mp.text(0.5, 0.5, '3', ha='center', va='center',
22         size=36, alpha=0.5)
23 mp.subplot(gs[:2, 2])
24 mp.xticks(())
25 mp.yticks(())
26 mp.text(0.5, 0.5, '4', ha='center', va='center',
27         size=36, alpha=0.5)
28 mp.subplot(gs[1, 1])
29 mp.xticks(())
30 mp.yticks(())
31 mp.text(0.5, 0.5, '5', ha='center', va='center',
32         size=36, alpha=0.5)
33 
34 mp.tight_layout()
35 mp.show()
刪格畫子圖形

自由佈局

  mp.axes([左下角水平座標, 左下角垂直座標, 寬度, 高度])
  其中全部的尺寸參數都是相對比例。

 1 import matplotlib.pyplot as mp
 2 mp.figure(facecolor='lightgray')
 3 # 自由佈局,定義位置和大小
 4 mp.axes([0.03, 0.038, 0.94, 0.924])
 5 mp.xticks(())
 6 mp.yticks(())
 7 mp.text(0.5, 0.5, '1', ha='center', va='center', size=36, alpha=0.5)
 8 # 自由佈局,定義位置和大小
 9 mp.axes([0.63, 0.076, 0.31, 0.308])
10 mp.xticks(())
11 mp.yticks(())
12 mp.text(0.5, 0.5, '2', ha='center', va='center',
13         size=36, alpha=0.5)
14 mp.show()
自由佈局

座標刻度定位器

  定位器對象 = mp.xxxLocator(...)
  ax = mp.gca()
  ax.xaxis.set_major_locator(定位器對象) # 主刻度
  ax.xaxis.set_minor_locator(定位器對象) # 次刻度

 

 1 import matplotlib.pyplot as mp
 2 import numpy as np
 3 mp.figure()
 4 
 5 # 設置各類座標刻度定位器
 6 locators = [
 7     'mp.NullLocator()',
 8     'mp.MaxNLocator(nbins=3,step=[1,3,5,7,9])',
 9     'mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])',
10 
11     'mp.AutoLocator()',
12     'mp.IndexLocator(offset=0.5, base=1.5)',
13     'mp.MultipleLocator()',
14     'mp.LinearLocator(numticks=21)',
15     'mp.LogLocator(base=2, subs=[1.0])'
16 ]
17 n_locators = len(locators)
18 
19 for i, locator in enumerate(locators):
20     mp.subplot(n_locators, 1, i + 1)
21     mp.xlim(0, 10)
22     mp.ylim(-1, 1)
23     mp.yticks(())
24     ax = mp.gca()
25     ax.spines['left'].set_color('none')
26     ax.spines['top'].set_color('none')
27     ax.spines['right'].set_color('none')
28     ax.spines['bottom'].set_position(('data', 0))
29     ax.xaxis.set_major_locator(eval(locator))
30     ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
31     mp.plot(np.arange(11), np.zeros(11), c='none')
32     mp.text(5, 0.3, locator[3:], ha='center', size=12)
33 
34 mp.tight_layout()
35 mp.show()
座標刻度定位器

散點圖

  mp.scatter(水平座標數組, 垂直座標數組,s=大小, c=顏色, cmap=顏色映射, alpha=透明度)

 1 import matplotlib.pyplot as mp
 2 import numpy as np
 3 n = 1000
 4 # 高斯分佈隨機數
 5 # API: normal(loc=0.0, scale=1.0, size=None)
 6 # loc:均值,scale:標準差,size:抽取樣本的size
 7 x = np.random.normal(0, 1, n)
 8 y = np.random.normal(0, 1, n)
 9 d = np.sqrt(x**2 + y**2)
10 
11 mp.figure('Scatter', facecolor='lightgray')
12 mp.title('Scatter', fontsize=20)
13 mp.xlabel('x', fontsize=14)
14 mp.ylabel('x', fontsize=14)
15 mp.tick_params(labelsize=10)
16 mp.grid(linestyle=':')
17 # 畫點散圖
18 mp.scatter(x, y, s=60, c=d, cmap='jet_r', alpha=0.5, marker='o')
19 mp.show()
散點圖

區域填充

  mp.fill_between(水平座標數組, 垂直座標起點數組, 垂直座標終點數組, 條件, color=顏色,alpha=透明度)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 n = 1000
 4 x = np.linspace(0, 8 * np.pi, n)
 5 sin_y = np.sin(x)
 6 cos_y = np.cos(x / 2) / 2
 7 mp.figure('Fill', facecolor='lightgray')
 8 mp.title('Fill', fontsize=20)
 9 mp.xlabel('x', fontsize=14)
10 mp.ylabel('y', fontsize=14)
11 mp.tick_params(labelsize=10)
12 mp.grid(linestyle=':')
13 mp.plot(x, sin_y, c='dodgerblue',
14         label=r'$y=sin(x)$')
15 mp.plot(x, cos_y, c='orangered',
16         label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
17 # 區域填充函數,由cos_y到sin_y之間的區域,塗成藍色
18 mp.fill_between(x, cos_y, sin_y, cos_y < sin_y,
19                 color='dodgerblue', alpha=0.5)
20 # 區域填充函數,由cos_y到sin_y之間的區域,塗成橘紅色
21 mp.fill_between(x, cos_y, sin_y, cos_y > sin_y,
22                 color='orangered', alpha=0.5)
23 mp.legend()
24 mp.show()
區域填充

柱狀圖

mp.bar(水平座標數組, 高度數組, ec=邊緣顏色,fc=填充顏色, label=標籤文本,alpha=透明度)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 n = 12
 4 x = np.arange(n)
 5 # numpy.random.uniform(low,high,size)
 6 # 從一個均勻分佈[low,high)中隨機採樣,注意定義域是左閉右開,即包含low,不包含high.
 7 y1 = (1 - x / n) * np.random.uniform(0.5, 1.0, n)
 8 y2 = (1 - x / n) * np.random.uniform(0.5, 1.0, n)
 9 
10 mp.figure('Bar', facecolor='lightgray')
11 mp.title('Bar', fontsize=20)
12 mp.ylim(-1.25, 1.25)
13 mp.xlabel('x', fontsize=14)
14 mp.ylabel('y', fontsize=14)
15 mp.xticks(x, x + 1)
16 mp.tick_params(labelsize=10)
17 mp.grid(axis='y', linestyle=':')
18 # 柱狀圖
19 mp.bar(x, y1, ec='white', fc='dodgerblue',
20        label='Sample 1')
21 for _x, _y in zip(x, y1):
22     mp.text(_x, _y, '%.2f' % _y, ha='center',
23             va='bottom', size=8)
24 mp.bar(x, -y2, ec='white', fc='dodgerblue',
25        alpha=0.5, label='Sample 2')
26 for _x, _y in zip(x, y2):
27     mp.text(_x, -_y - 0.015, '%.2f' % _y, ha='center',
28             va='top', size=8)
29 mp.legend()
30 mp.show()
柱狀圖

等高線圖

  mp.contour(x, y, z, 線數, colors=顏色,linewidths=線寬)  mp.contourf(x, y, z, 線數, cmap=顏色映射)

相關文章
相關標籤/搜索