程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

如何使用Python Matplotlib繪制條形圖

編輯:Python

目錄

前言

一、一般條形圖

二、橫向條形圖

三、分組條形圖的繪制

四、堆疊條形圖繪制

總結 

前言

matplotlib是一個非常強大的Python第三方繪圖包,可以繪制非常多非常漂亮的圖形。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import font_manager一、一般條形圖

一般條形圖使用 pyplot.bar()函數繪制,其形式及參數如下:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)主要參數解釋:# x:一個數組或者列表,代表需要繪制的條形圖的x軸的坐標點。# height:一個數組或者列表,代表需要繪制的條形圖y軸的坐標點。# width:每一個條形圖的寬度,默認是0.8的寬度。# bottom:y軸的基線,默認是0,也就是距離底部為0.# align:對齊方式,{'center','edge'},默認是center,居中對齊;edge為靠邊對齊,具體靠右邊還是靠左邊,看width的正負。# color:條形圖的顏色。# edgecolor : 條形圖邊框的顏色。# linewidth : 條形圖邊框的寬度。如果為 0,則不繪制邊框

pyplot.bar()完整參數戳這裡

示例:

某天電影票房數據:

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

直接通過獲取字典的鍵值作為x,y軸數據

#票房單位億元movies = { "流浪地球":40.78, "飛馳人生":15.77, "瘋狂的外星人":20.83, "新喜劇之王":6.10, "廉政風雲":1.10, "神探蒲松齡":1.49, "小豬佩奇過大年":1.22, "熊出沒·原始時代":6.71}# 中文顯示問題plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.rcParams['font.size'] = 13# 設置圖大小plt.figure(figsize=(15,8))x = list(movies.keys()) # 獲取x軸數據(字典的鍵)y = list(movies.values()) # 獲取y軸數據(字典的值)plt.bar(x,y,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)# 繪制標題plt.title("電影票房數據",size=26)# 設置軸標簽plt.xlabel("電影名",size=28)plt.ylabel("票房/億",size=28)plt.show()

也可以利用字典創建DataFrame索引,通過data參數傳入

#票房單位億元movies = { "流浪地球":40.78, "飛馳人生":15.77, "瘋狂的外星人":20.83, "新喜劇之王":6.10, "廉政風雲":1.10, "神探蒲松齡":1.49, "小豬佩奇過大年":1.22, "熊出沒·原始時代":6.71}movies_df = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())}) #通過字典創建DataFrame索引font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=12) # 使用font_manager模塊設置中文# 設置圖的大小,傳入x,yplt.figure(figsize=(14,5))# 使用plt.bar()繪制條形圖plt.bar("name","tickes",data=movies_df,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)#設置X軸刻度,設置字體,也可以設置字體大小sizeplt.xticks(fontproperties=font)# 設置標題plt.title("電影票房數據",size=30)#設置X,Y軸名字plt.ylabel('票房',fontproperties=font,size=25)plt.xlabel('影片名字',fontproperties=font,size=25)#設置Y刻度plt.yticks(range(0,50,5),["%d"%x for x in range(0,50,5)],fontproperties=font1,size=20)# 只保留圖形信息plt.show()

二、橫向條形圖

橫向條形圖需要使用barh()這個跟bar非常的類似,只不過把方向進行旋轉。參數也和pyplot.bar()類似

matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)# 主要參數解釋:# y:數組或列表,代表需要繪制的條形圖在y軸上的坐標點。# width:數組或列表,代表需要繪制的條形圖在x軸上的值(也就是長度)。# height:條形圖的高度(寬度),默認是0.8。# left:條形圖的基線,也就是距離y軸的距離。默認為0

pyplot.barh()完整參數

示例:

plt.barh()

movies = { "流浪地球":40.78, "飛馳人生":15.77, "瘋狂的外星人":20.83, "新喜劇之王":6.10, "廉政風雲":1.10, "神探蒲松齡":1.49, "小豬佩奇過大年":1.22, "熊出沒·原始時代":6.71}font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')x1 = list(movies.keys())y1 = list(movies.values())# 設置圖的大小plt.figure(figsize=(10,5))# 使用plt.barh()plt.barh(x1,y1,height=0.7,left=0,color='c',edgecolor='r')#設置Y軸刻度,設置字體,也可以設置字體大小sizeplt.yticks(fontproperties=font2,size=20)plt.xlabel("票房/億",size=20)# 設置標題plt.title("電影票房數據",size=30)# 只保留圖形信息plt.show()

Axes.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

另外,還可通過返回的axes對象繪制圖形

movies = { "流浪地球":40.78, "飛馳人生":15.77, "瘋狂的外星人":20.83, "新喜劇之王":6.10, "廉政風雲":1.10, "神探蒲松齡":1.49, "小豬佩奇過大年":1.22, "熊出沒·原始時代":6.71}font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')mdf = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())})fig,axes = plt.subplots() # 通過返回的axes對象繪制圖形axes.barh("name","tickes",data = mdf,height=0.6,left=0,color='c',edgecolor='r')#設置Y軸刻度,設置字體,也可以設置字體大小sizeplt.yticks(fontproperties=font2,size=20)plt.xlabel("票房/億",size=24)# 設置標題plt.title("電影票房數據",size=27)# 只保留圖形信息plt.show()

三、分組條形圖的繪制

五天的電影票房數據(假設日期為1.1-1.5):並轉換為DataFrame索引

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]}mdf = pd.DataFrame(movies) mdf

繪制分組條形圖思路:先選出每天所有電影的票房數據,可使用DataFrame.iloc[]方法獲取,例如

# 獲取第一天票房數據mdf.iloc[0]流浪地球 2.01飛馳人生 3.19瘋狂的外星人 4.07新喜劇之王 2.72廉政風雲 0.56神探蒲松齡 0.66小豬佩奇過大年 0.58熊出沒·原始時代 1.13Name: 0, dtype: float64

然後按天進行繪制,這裡需要確定一個中心點作為中間日期的條形圖位置(這裡為第三天),有多少部電影就需要多少個中心點,可使用np.arange(len(movies))獲取x軸刻度作為中心點。最後根據日期按條形圖的寬度調整條形圖位置即可。

plt.figure(figsize=(15,5))# 設置X軸刻度為一個數組(有廣播功能)xticks = np.arange(len(movies)) #設置字體font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')# 設置條形圖寬度bar_width = 0.15#設置第一天所有影片條形圖的位置plt.bar(xticks-2*bar_width,mdf.iloc[0],width=bar_width,color='pink') # iloc[]取DataFrame的一行#設置第二天所有影片條形圖的位置 plt.bar(xticks-bar_width,mdf.iloc[1],width=bar_width)#設置第三天所有影片條形圖的位置,默認在[0 1 2 3 4 5 6 7]center處plt.bar(xticks,mdf.iloc[2],width=bar_width)#設置第四天所有影片條形圖的位置plt.bar(xticks+bar_width,mdf.iloc[3],width=bar_width)#設置第五天所有影片條形圖的位置plt.bar(xticks+2*bar_width,mdf.iloc[4],width=bar_width)# 設置X軸信息plt.xticks(xticks,mdf.columns,fontproperties=font,size=15)#設置Y刻度plt.yticks(range(0,20,2),["%d"%x for x in range(0,20,2)],fontproperties=font,size=16)#設置X,Y軸名字plt.ylabel('票房/億',fontproperties=font,size=30)plt.xlabel('影片名字',fontproperties=font,size=30)# 設置標題plt.title("五日票房數據",fontproperties=font,size=30)# 只保留圖形信息plt.show()

使用循環繪制每日數據

plt.figure(figsize=(16,5))# 設置X軸刻度為一個數組(有廣播功能)#xticks1 = np.arange(len(movies)) # 這樣設置每部電影X軸的距離是1,如果5個條形圖寬度之後大於1會和其他電影重疊,可以設置步長xticks1 = np.arange(0,7*len(movies),7) # 改變步長,要在設置X軸信息處改變xticks(步長*ticks labels)的第一個參數,否則對應不上#設置字體font4 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')# 設置條形圖寬度bar_width1 = 1.05#使用循環畫出前五天的條形圖for index in mdf.index: # plt.bar(xticks1+(-2+index)*bar_width1,mdf.iloc[index],width=bar_width1,label='第%d天票房'%(index+1)) xs = xticks1+(-2+index)*bar_width1 # 在X軸的位置 day_tickets = mdf.iloc[index] plt.bar(xs,day_tickets,width=bar_width*7,label="第%d天票房"%(index+1)) #設置注釋文本 # zip(day_tickets,xs)打包為元素為元組的列表,元素個數與最短的列表一致 for ticket,x in zip(day_tickets,xs): # ticket是day_tickets列表的值,x是xs的值 plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.2,ticket+0.1))# 設置X軸信息plt.xticks(7*xticks,mdf.columns,fontproperties=font4,size=15)#設置X,Y軸名字plt.ylabel('票房/億',fontproperties=font4,size=25)plt.xlabel('影片名字',fontproperties=font4,size=25)# 設置標題plt.title("五日票房數據",fontproperties=font4,size=30)# 設置圖例font4.set_size(15) # 圖例無size屬性,可以在字體設置font4中改大小(或者font.set_size():只改圖例plt.legend(prop=font4) # 根據bar()函數的中的label標簽進行設置,不可缺少# 設置網格plt.grid()# 只保留圖形信息plt.show()

四、堆疊條形圖繪制

堆疊條形圖就是在已有數據基礎位置上進行繪制圖形,使用bottom參數,以已有數據作為新數據的基地進行新數據的繪制,可以達到調整條形圖的位置的目的。

示例:

# 男女不同組別的等分情況menMeans = (20, 35, 30, 35, 27)womenMeans = (25, 32, 34, 20, 25)groupNames = ('G1','G2','G3','G4','G5')xs = np.arange(len(menMeans)) # 有多少個組font5 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=16)plt.figure(figsize=(15,7))# 繪制男性得分plt.bar(xs,menMeans,label='男性得分',width=0.4)# 繪制女性得分,以男性得分的最大值為基底plt.bar(xs,womenMeans,bottom=menMeans,label='女性得分',width=0.4)#設置圖例plt.legend(prop=font5) # 根據bar()函數的中的label標簽進行設置# 設置X軸刻度名稱plt.xticks(xs,groupNames)# 設置標簽plt.xlabel("組別",fontproperties=font5,size=23)plt.ylabel("得分",fontproperties=font5,size=23)# 設置標題plt.title("男女不同組別得分",fontproperties=font5,size=28)# 只保留圖形plt.show()

總結 

到此這篇關於如何使用Python Matplotlib繪制條形圖的文章就介紹到這了,更多相關Python Matplotlib繪制條形圖內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved