1. 程式人生 > >Python-matplotlib-入門教程(一)-基礎圖表繪製

Python-matplotlib-入門教程(一)-基礎圖表繪製

0.摘要

本教程主要介紹使用python第三方庫matplotlib繪製各種統計圖表,教程從簡單到複雜,逐步遞進。

本章主要介紹常見圖表的繪製方法,並以儘可能簡單的方式實現,主要以突出函式功能為目的,防止讀者被複雜的引數分散了注意力。鑑於函式的引數的相似性,讀者只需要知道引數的含義並結合help命令即可掌握。常用引數將在後續章節中進行統一介紹,幫助讀者記憶。

附官網教程連結:https://matplotlib.org/

 

1.線形圖

首先繪製一條y = x 的直線,利用numpy.linspace()可以在給定區間上生成一定數量的等距點:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10,10,200)
y = x
plt.plot(x,y)
plt.show()           #顯示影象

x在[-10,10]上均勻地取了200個點,點的數量直接影響曲線的精確度和影象的圓滑程度,這裡用y = x ** 2進行舉例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10,10,5)
y = x ** 2
plt.plot(x,y)
plt.show()

當點陣密度不足的時候,影象會出現明顯的稜角,從而產生失真現象。 

多次呼叫plt.plot()方法即可在一張圖表中繪製出多條曲線。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3,3,100)
y1 = x ** 2 - 1
y2 = x + 1
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()

 

2.條形圖

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
y = np.random.randint(1,10,10)
plt.bar(x,y)
plt.show()

與線形圖一樣,多次呼叫plt.bar()可以在一張圖中繪製出多組資料:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
y1 = np.random.randint(1,10,10)
y2 = np.random.randint(-10,-1,10)
plt.bar(x,y1)
plt.bar(x,y2)
plt.show()

需要注意的是,如果y1,y2共用x軸,那麼就可能出現重合的情況:

這種情況可以通過設定不同的x軸進行分離:

import matplotlib.pyplot as plt
import numpy as np

x1 = np.arange(0,30,3)
x2 = np.arange(1,30,3)
y1 = np.random.randint(1,10,10)
y2 = np.random.randint(1,10,10)
plt.bar(x1,y1)
plt.bar(x2,y2)
plt.show()

 

3.直方圖

先介紹一下直方圖與條形圖的區別:(內容轉自:https://blog.csdn.net/hohaizx/article/details/79101322

首先需要區分清楚概念:直方圖和條形圖。

  • 條形圖:條形圖用長條形表示每一個類別,長條形的長度表示類別的頻數,寬度表示表示類別。
  • 直方圖:直方圖是一種統計報告圖,形式上也是一個個的長條形,但是直方圖用長條形的面積表示頻數,所以長條形的高度表示頻陣列距頻陣列距,寬度表示組距,其長度和寬度均有意義。當寬度相同時,一般就用長條形長度表示頻數。

直方圖一般用來描述等距資料,柱狀圖一般用來描述名稱(類別)資料或順序資料。直觀上,直方圖各個長條形是銜接在一起的,表示資料間的數學關係;條形圖各長條形之間留有空隙,區分不同的類。

 

區別 頻數分佈直方圖 條形圖
橫軸上的資料 連續的,是一個範圍 孤立的,代表一個類別
長條形之間 沒有空隙 有空隙
頻數的表示 一般用長條形面積表示;當寬度相同時,用長度表示 長條形的長度
import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(1000)
plt.hist(data)
plt.show()

 

4.散點圖

import matplotlib.pyplot as plt
import random

x = [random.randint(1,100) for _ in range(100)]
y = [random.randint(1,100) for _ in range(100)]
plt.scatter(x, y)
plt.show()

同樣,多組資料亦可以同時繪製在一張圖中:
 

import matplotlib.pyplot as plt
import random

x1 = [random.randint(1,50) for _ in range(100)]
y1 = [random.randint(1,50) for _ in range(100)]

x2 = [random.randint(50,100) for _ in range(100)]
y2 = [random.randint(50,100) for _ in range(100)]

plt.scatter(x1, y1)
plt.scatter(x2, y2)
plt.show()

 

5.餅狀圖

matplotlib會根據資料自動計算比例,這裡只需要給出資料列表即可:

import matplotlib.pyplot as plt

share = [256, 512, 32, 1024, 512]
plt.pie(share)
plt.show()


由於餅圖比較特殊,這裡詳細介紹一下它的引數:
 

import matplotlib.pyplot as plt

labels = ['Java', 'Python', 'JavaScript', 'C++', 'C#', 'PHP', 'Perl']
users = [68, 46, 38, 31, 27, 15, 14 ]
explode = [0, 0.3, 0, 0, 0, 0, 0]  # 設定Python突出顯示
colors = ['b', 'c', 'g', 'grey', 'm', 'r', 'y']   #設定每一塊的顏色
plt.axes(aspect=1)                 # 設定餅圖形狀為圓形,預設為橢圓形
plt.pie(x=users, labels=labels, explode=explode, autopct='%3.1f %%',colors=colors,
        shadow=True, labeldistance=1.1, startangle=0, pctdistance=0.6)
plt.show()

autopct:設定每一塊百分比資料的顯示格式;

labeldistance:設定label的顯示位置,0代表位於圓心,1代表位於邊線;

startangle:起始的繪圖角度;

pctdistance:百分比的形式位置。

 

6. 等高線圖

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 101)
y = np.linspace(-3, 3, 101)
#構建二維座標點
X, Y = np.meshgrid(x, y)
height = (2 * np.pi) * np.exp((-1)/2 * (X ** 2 + Y ** 2)) + np.abs(X) + np.abs(Y)

#為等高線填充顏色
plt.contourf(X, Y, height)
# 繪製等高線
C = plt.contour(X, Y, height)
# 新增等高線標註
plt.clabel(C, inline=True, fontsize=16)
plt.show()

 

7.立體(3D)資料圖

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = np.linspace(-3, 3, 1001)
y = np.linspace(-3, 3, 1001)
X, Y = np.meshgrid(x, y)
Z = (2 * np.pi) * np.exp((-1)/2 * (X ** 2 + Y ** 2))

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z,cmap=plt.get_cmap('rainbow'))
plt.show()

 

8.二維矩陣以灰度影象顯示

import matplotlib.pyplot as plt

data = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 18, 18, 126, 136, 175, 26, 166, 255, 247, 127, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 30, 36, 94, 154, 170, 253, 253, 253, 253, 253, 225, 172, 253, 242, 195, 64, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 49, 238, 253, 253, 253, 253, 253, 253, 253, 253, 251, 93, 82, 82, 56, 39, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 18, 219, 253, 253, 253, 253, 253, 198, 182, 247, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 80, 156, 107, 253, 253, 205, 11, 0, 43, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 1, 154, 253, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 253, 190, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 190, 253, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 241, 225, 160, 108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 240, 253, 253, 119, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 186, 253, 253, 150, 27, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 93, 252, 253, 187, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 253, 249, 64, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 130, 183, 253, 253, 207, 2, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 148, 229, 253, 253, 253, 250, 182, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 114, 221, 253, 253, 253, 253, 201, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 23, 66, 213, 253, 253, 253, 253, 198, 81, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 18, 171, 219, 253, 253, 253, 253, 195, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 55, 172, 226, 253, 253, 253, 253, 244, 133, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 136, 253, 253, 253, 212, 135, 132, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
plt.imshow(data)
plt.show()