條形圖的繪製方式跟折線圖非常的類似,只不過是換成了plt.bar
方法。plt.bar
方法有以下常用引數:
x
:一個陣列或者列表,代表需要繪製的條形圖的x軸的座標點。height
:一個陣列或者列表,代表需要繪製的條形圖y軸的座標點。width
:每一個條形圖的寬度,預設是0.8的寬度。bottom
:y
軸的基線,預設是0,也就是距離底部為0.align
:對齊方式,預設是center
,也就是跟指定的x
座標居中對齊,還有為edge
,靠邊對齊,具體靠右邊還是靠左邊,看width
的正負。color
:條形圖的顏色。
返回值為BarContainer
,是一個儲存了條形圖的容器,而條形圖實際上的型別是matplotlib.patches.Rectangle
物件。
更多參考:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar
條形圖的繪製:
比如現在有2019
年賀歲片票房的資料(資料來源:https://piaofang.maoyan.com/dashboard)
#票房單位億元 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 } plt.bar(np.arange(len(movies)),list(movies.keys())) plt.xticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font) plt.grid()
效果圖如下:
其中xticks
和yticks
的用法跟之前的折線圖一樣。這裡新出現的方法是bar
,bar
常用的有3個引數,分別是x
(x軸的座標點),y
(y軸的座標點)以及width
(條形的寬度)。
橫向條形圖:
橫向條形圖需要使用plt.barh
這個方法跟bar
非常的類似,只不過把方向進行旋轉。引數跟bar
類似,但也有區別。如下:
y
:陣列或列表,代表需要繪製的條形圖在y
軸上的座標點。width
:陣列或列表,代表需要繪製的條形圖在x
軸上的值(也就是長度)。height
:條形圖的高度,預設是0.8。left
:條形圖的基線,也就是距離y軸的距離。- 其他引數跟
bar
一樣。
返回值也是BarContainer
容器物件。
還是以以上資料為例,將電影名和票房反轉一下。示例程式碼如下:
movies = { "流浪地球":40.78, "飛馳人生":15.77, "瘋狂的外星人":20.83, "新喜劇之王":6.10, "廉政風雲":1.10, "神探蒲松齡":1.49, "小豬佩奇過大年":1.22, "熊出沒·原始時代":6.71 } plt.barh(np.arange(len(movies)),list(movies.values())) plt.yticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font) plt.grid()
效果圖如下:
分組條形圖:
現在有一組資料,是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()
示例圖如下:
堆疊條形圖:
堆疊條形圖,是將一組相關的條形圖堆疊在一起進行比較的條形圖。比如以下案例:
menMeans = (20, 35, 30, 35, 27) womenMeans = (25, 32, 34, 20, 25) groupNames = ('G1','G2','G3','G4','G5') xs = np.arange(len(menMeans)) plt.bar(xs,menMeans) plt.bar(xs,womenMeans,bottom=menMeans) plt.xticks(xs,groupNames) plt.show()
效果圖如下:
在繪製女性得分的條形圖的時候,因為要堆疊在男性得分的條形圖上,所以使用到了一個bottom
引數,就是距離x
軸的距離。通過對貼條形圖,我們就可以清楚的知道,哪一個隊伍的綜合排名是最高的,並且在每個隊伍中男女的得分情況。
條形圖應用場景:
- 數量統計。
- 頻率統計。