1. 程式人生 > 其它 >[Python]Matplotlib繪圖基礎

[Python]Matplotlib繪圖基礎

1.簡介

Matplotlib 是一個 Python 的 2D繪相簿,它以各種硬拷貝格式和跨平臺的互動式環境生成出版質量級別的圖形。


2.繪圖基礎

2.1 圖表基本元素

  • 圖例和標題
  • x軸和y軸、刻度、刻度標籤
  • 繪圖區域及邊框
  • 網格線

2.2 圖表基本屬性

  • 多重繪圖屬性: 是否在同一個圖上繪製多個系列的線
  • 多重子圖屬性: 是否生成多個子圖,並在每個子圖上繪製多個系列的線

3.繪圖方式

3.1 Pyplot API[1]

3.1.1 屬性設定函式

  • 繪製圖邊框: box
  • 為圖表新增圖例: figlegend
  • 為軸系列新增圖例:legend
  • 為圖新增標題:title
  • 在圖上新增文字: figtext
  • 在軸系列上新增文字:text
  • 設定網格: grid
  • 設定多重繪圖:hold
  • 使用緊密佈局:tight_layout
  • 改變刻度和刻度標籤的樣式:tick_params / ticklabel_format
  • 設定最小刻度:minorticks_off / minorticks_on
  • 在多個子圖上方繪製超級標題:suptitle
  • 為圖表新增資料表:table
  • 共享x軸或y軸:twinx / twiny
  • 設定x/y標籤:xlabel / ylabel
  • 設定x/y極限:xlim / ylim
  • 設定x/y刻度:xticks / yticks

3.1.2 屬性獲取函式

  • 獲取系列軸:gca
  • 獲取圖表:gcf
  • 獲取圖表標籤:get_figlabels
  • 獲取圖表數目:get_fignums

3.1.3 輔助線函式

  • 水平豎直線:axhline / axvline
  • 水平豎直域:axhspan / axvspan
  • 誤差棒:errorbar
  • 豎直線:vlines

3.1.4 繪圖函式

  • 條形圖:bar / barh / broken_barh
  • 箱線圖:boxplot
  • 六邊形圖:hexbin
  • 直方圖:hist / hist2d
  • 矩陣圖:matshow
  • 餅狀圖:pie
  • 顏色棒圖:colorbar
  • 極座標圖:polar
  • 散點圖:scatter
  • 樹幹圖:stem
  • 階梯圖:step
  • 對數圖:loglog / semilogx /  semilogy
  • 小提琴圖:violinplot
  • 重新繪製:draw
  • 生成一個新的圖:figure
  • 生成子圖:subplot / subplots
  • 填充區域: fill / fill_between / fill_betweenx
  • 在軸系列上繪製線或者標記:plot
  • 繪製時間資料:plot_date
  • 顯示圖表:show

3.1.5 清除函式

  • 清除特定系列的軸物件: cla
  • 從當前圖中清除特定系列的軸物件:delaxes
  • 清除當前圖:clf
  • 關閉圖視窗:close 
  • 儲存圖表:savefig

3.2 Object-Oriented API[2]

Axes類

將pyplot API封裝成物件的成員函式,建議使用這些成員函式,更加利於理解繪圖過程


4.Example

import re
import numpy as np
import matplotlib.pyplot as plt

def extract_time(filename):
    handle = open(filename)
    handle.readline()
    handle.readline()
    handle.readline()
    line = handle.readline()
    all_time = []
    while line:
        cqe_time_stamp_tuple = re.findall(r'd+', line)
        all_time.append(int(cqe_time_stamp_tuple[-1]))
        line = handle.readline()
    all_time.sort()
    return all_time

def heterogeneous_plot(h_time, i_time):
    pct_axis = 1. * np.arange(len(h_time)) / (len(h_time) - 1)
   #繪製第一條線並設定圖例
    plt.plot(h_time, pct_axis, label="with_bg_flow")
   #繪製第二條線並設定圖例
    plt.plot(i_time, pct_axis, label="without_bg_flow")
   #設定圖例顯示屬性
    plt.legend(loc='center right', fontsize='large')
   #設定圖表標題
    plt.title("CDF of Small Flow")
   #設定x/y軸標題
    plt.xlabel("Latency(us)")
    plt.ylabel("CDF(%)")
    plt.show()

if __name__ == "__main__":
    h_time_data = extract_time("1_tmp_data/100000_OUTPUT")
    i_time_data = extract_time("2_tmp_data/100000_OUTPUT")
    heterogeneous_plot(h_time_data, i_time_data)
    individual_plot(h_time_data, i_time_data)

5.參考資料:

[1] matplot.pyplot api documents[https://matplotlib.org/api/pyplot_summary.html]

[2] matplot.axes[https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes]