Python數據分析入門(十七):繪制條形圖


條形圖的繪制方式跟折線圖非常的類似,只不過是換成了plt.bar方法。plt.bar方法有以下常用參數:

  1. x:一個數組或者列表,代表需要繪制的條形圖的x軸的坐標點。
  2. height:一個數組或者列表,代表需要繪制的條形圖y軸的坐標點。
  3. width:每一個條形圖的寬度,默認是0.8的寬度。
  4. bottomy軸的基線,默認是0,也就是距離底部為0.
  5. align:對齊方式,默認是center,也就是跟指定的x坐標居中對齊,還有為edge,靠邊對齊,具體靠右邊還是靠左邊,看width的正負。
  6. 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()

 

效果圖如下:


其中xticksyticks的用法跟之前的折線圖一樣。這里新出現的方法是barbar常用的有3個參數,分別是x(x軸的坐標點),y(y軸的坐標點)以及width(條形的寬度)。

 

橫向條形圖:

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

  1. y:數組或列表,代表需要繪制的條形圖在y軸上的坐標點。
  2. width:數組或列表,代表需要繪制的條形圖在x軸上的值(也就是長度)。
  3. height:條形圖的高度,默認是0.8。
  4. left:條形圖的基線,也就是距離y軸的距離。
  5. 其他參數跟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軸的距離。通過對貼條形圖,我們就可以清楚的知道,哪一個隊伍的綜合排名是最高的,並且在每個隊伍中男女的得分情況。

 

條形圖應用場景:

    1. 數量統計。
    2. 頻率統計。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM