一、背景
在最近的實驗中需要使用到bar圖用於數據的直觀展示,這里記錄一下內容。首先個人覺得雖然seaborn等工具會對這些工具進行二次封裝,又時候使用起來是比較簡潔,但是在做細節的設計沒有這種原生的程序好,就像pip和conda、kersa和TensorFlow一樣。
二、基礎用法
bar圖就是一個柱狀圖,需要引入的工具包如下
import matplotlib.pyplot as plt
引入工具包后,就可以開始創建畫板、繪圖、以及優化結果。
2.1 基礎概念
下面介紹一些基礎概念方便理解繪圖過程。
- 刻度:用於標記數據的單位長度。
- 坐標:用於呈現圖的位置,包括橫坐標、縱坐標,如果是三維的話就是x,y,z這三個軸。
- 坐標軸:用於表示數據的含義。
- 寬度:用於衡量數據展示的大小。
- label:用於描述坐標軸的含義。
上面的內容是最基本的概念,在畫圖中會遇到的問題:
1. 刻度 != 坐標:在畫圖的時候,很多代碼寫的時候刻度就是數據坐標,其實不然,這樣的圖調整起細節來很麻煩,因此畫圖的
時候,最好將刻度和坐標的設置分離。坐標就是數據的點,與刻度無關。這樣就可以調整出不同刻度下的圖片。
2. 寬度:寬度是數據的大小,有些作者畫的分布圖很好看,其實就是用width+數據量實現,通過緊密的數據+無限小的width就
可以實現這種圖。如果無法實現,第一個是寬度太大,另一個是數據不夠緊密,很分散。
3. 坐標軸:坐標軸一般會遇到的問題包括:
1. 設置范圍,比如數據都是0.9+就沒必要從0開始。
2. 需要科學技術法,以為數據過大的時候,科學技術法占位少。
4. label != 坐標軸:在實際過程中需要新的指定軸的label。
2.2 實現例子
官網給的例子
import matplotlib.pyplot as plt
import numpy as np
labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]
x = np.arange(len(labels)) # the label locations
width = 0.35 # the width of the bars
fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='Men')
rects2 = ax.bar(x + width/2, women_means, width, label='Women')
rects3 = ax.bar(x + width / 2, women_means, width, label='after-adv', hatch="--", color="Silver", ec="black")
# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
ax.bar_label(rects1, padding=3)
ax.bar_label(rects2, padding=3)
fig.tight_layout()
plt.show()
這個關鍵的地方是多個bar並排在一起的問題。bar圖繪制的過程如下:
選取width的中點作為刻度的中心,在左右繪制,因此繪制的結果就是刻度的中心作為數據的中心位置,左右兩邊都是半個width
因此如果需要繪制多個圖時,另一個的圖的坐標位置相對於刻度是1個width的寬度。
舉例:
三、技巧
3.1 其余參數設計
可以設置的參數很多,可以查看官網的源碼查看
plt.xlim(0, 0.6) # 控制左邊顯示,y和x對應ylim和xlim
# 科學計數法,需要scilimits的參數才可以實現,axis=('x', 'y')
plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
bar(hatch="||||") # 其中hatch多寫個會加重圖形的展示。
3.2 參數獲取
可以通過matplotlib輸入參數名稱,獲取所有的參數,比如條形圖中的marker,bar中的hatch等。