首頁 > 軟體

Matplotlib實現各種條形圖繪製

2022-03-22 13:01:06

1. 條形圖的繪製

plt.bar 方法有以下常用引數:

  • x :一個陣列或者列表,代表需要繪製的條形圖的x軸的座標點。
  • height :一個陣列或者列表,代表需要繪製的條形圖y軸的座標點。
  • width :每一個條形圖的寬度,預設是0.8的寬度。
  • bottom : y 軸的基線,預設是0,也就是距離底部為0.
  • align :對齊方式,預設是 center ,也就是跟指定的 x 座標居中對齊,還有為 edge ,靠
  • 邊對齊,具體靠右邊還是靠左邊,看 width 的正負。
  •  color :條形圖的顏色。

返回值為 BarContainer ,是一個儲存了條形圖的容器,而條形圖實際上的型別
是 matplotlib.patches.Rectangle 物件。
更多參考

比如現在有 2019 年賀歲片票房的資料(資料來源

#票房單位億元
movies = {
 "流浪地球":40.78,
 "飛馳人生":15.77,
 "瘋狂的外星人":20.83,
 "新喜劇之王":6.10,
 "廉政風雲":1.10,
 "神探蒲松齡":1.49,
 "小豬佩奇過大年":1.22,
 "熊出沒·原始時代":6.71
}

用條形圖繪製每部電影及其票房的程式碼如下:

movies = {
    "流浪地球":40.78,
    "飛馳人生":15.77,
    "瘋狂的外星人":20.83,
    "新喜劇之王":6.10,
    "廉政風雲":1.10,
    "神探蒲松齡":1.49,
    "小豬佩奇過大年":1.22,
    "熊出沒·原始時代":6.71
}
x = list(movies.keys())
y = list(movies.values())
plt.figure(figsize=(15,5))
# plt.bar(x,y,width=-0.3,align="edge",color='r',edgecolor='k')
movie_df = pd.DataFrame(data={"names":list(movies.keys()),"tickets":list(movies.values())})
plt.bar("names","tickets",data=movie_df)
plt.xticks(fontproperties=font,size=12)
plt.yticks(range(0,45,5),["%d億"%x for x in range(0,45,5)],fontproperties=font,size=12)
plt.grid()

其中 xticks yticks 的用法跟之前的折線圖一樣。這裡新出現的方法是 bar , bar 常用的有3個引數,分別是 x (x軸的座標點), y (y軸的座標點)以及 width (條形的寬度)。

2. 橫向條形圖

橫向條形圖需要使用plt.barh 這個方法跟 bar 非常的類似,只不過把方向進行旋轉。引數
跟 bar 類似,但也有區別。

如下:

  • y :陣列或列表,代表需要繪製的條形圖在 y 軸上的座標點。
  • width :陣列或列表,代表需要繪製的條形圖在 x 軸上的值(也就是長度)。
  • height :條形圖的高度,預設是0.8。
  • left :條形圖的基線,也就是距離y軸的距離。

其他引數跟 bar 一樣。
返回值也是 BarContainer 容器物件。

還是以以上資料為例,將電影名和票房反轉一下。

範例程式碼如下:

plt.barh(list(movies.keys()),list(movies.values()))
plt.yticks(fontproperties=font,size=12)

3. 分組條形圖

現在有一組資料,是2019年春節賀歲片前五天的電影票房記錄。

範例程式碼如下:

movies = {
    "流浪地球":[2.01,4.59,7.99,11.83,16],
    "飛馳人生":[3.19,5.08,6.73,8.10,9.35],
    "瘋狂的外星人":[4.07,6.92,9.30,11.29,13.03],
    "新喜劇之王":[2.72,3.79,4.45,4.83,5.11],
    "廉政風雲":[0.56,0.74,0.83,0.88,0.92],
    "神探蒲松齡":[0.66,0.95,1.10,1.17,1.23],
    "小豬佩奇過大年":[0.58,0.81,0.94,1.01,1.07],
    "熊出沒·原始時代":[1.13,1.96,2.73,3.42,4.05]
}

plt.figure(figsize=(20,8))
width = 0.75
bin_width = width/5
movie_pd = pd.DataFrame(movies)
ind = np.arange(0,len(movies))
# 第一種方案
# first_day = movie_pd.iloc[0]
# plt.bar(ind-bin_width*2,first_day,width=bin_width,label='第一天')
# second_day = movie_pd.iloc[1]
# plt.bar(ind-bin_width,second_day,width=bin_width,label='第二天')
# third_day = movie_pd.iloc[2]
# plt.bar(ind,third_day,width=bin_width,label='第三天')
# four_day = movie_pd.iloc[3]
# plt.bar(ind+bin_width,four_day,width=bin_width,label='第四天')
# five_day = movie_pd.iloc[4]
# plt.bar(ind+bin_width*2,five_day,width=bin_width,label='第五天')

# 第二種方案
for index in movie_pd.index:
    day_tickets = movie_pd.iloc[index]
    xs = ind-(bin_width*(2-index))
    plt.bar(xs,day_tickets,width=bin_width,label="第%d天"%(index+1))
    for ticket,x in zip(day_tickets,xs):
        plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.1,ticket+0.1))
# 設定圖例
plt.legend(prop=font)
plt.ylabel("單位:億",fontproperties=font)
plt.title("春節前5天電影票房記錄",fontproperties=font)
# 設定x軸的座標
plt.xticks(ind,movie_pd.columns,fontproperties=font)
plt.xlim
plt.grid(True)
plt.show()

4. 堆疊條形圖

堆疊條形圖,是將一組相關的條形圖堆疊在一起進行比較的條形圖。

比如以下案例:

menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
groupNames = ('G1','G2','G3','G4','G5')
plt.bar(groupNames,menMeans,label="男性得分")
plt.bar(groupNames,womenMeans,bottom=menMeans,label='女性得分')
plt.legend(prop=font)

在繪製女性得分的條形圖的時候,因為要堆疊在男性得分的條形圖上,所以使用到了一
bottom 引數,就是距離 x 軸的距離。通過對貼條形圖,我們就可以清楚的知道,哪一個隊伍的綜合排名是最高的,並且在每個隊伍中男女的得分情況。

5. 條形圖應用場景

  • 數量統計。
  • 頻率統計。
  • 適用於分類資料對比。
  • 垂直條形圖最多不超過12個分類(也就是12個柱形),橫向條形圖最多不超過30個分類。如果垂直條形圖的分類名太長,那麼建議換成橫向條形圖。
  • 柱狀圖不適合表示趨勢,如果想要表示趨勢,應該使用折線圖。

到此這篇關於Matplotlib實現各種條形圖繪製的文章就介紹到這了,更多相關Matplotlib條形圖繪製內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com