首頁 > 軟體

python繪製橫豎條形圖的方法

2022-04-21 13:01:13

條形圖是用寬度相同的條形的高度或長短來表示資料多少的圖形。用來繪製離散的資料,能夠一眼看出各個資料的大小,比較資料之間的差異。

繪製一個簡單的條形圖與折線圖的繪製方法也是大體一致,只需要把擬合方式plt.plot()修改為plt.bar()即可。例如繪製2017年內地電影票房前20的電影和電影票房資料,如何對資料進行視覺化分析呢?無疑是進行條形圖分析。

老規矩,上程式碼:

# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:WindowsFontsMSYHL.TTC")
 
a = ['戰狼2', '速度與激情8', '功夫瑜伽', '西遊伏妖篇', '變形金剛5:最後的騎士', '摔跤吧,爸爸',
'加勒比海盜5:死無對證', '金剛:骷髏島', '極限特工:終極迴歸', '生化危機6:終章', '乘風破浪',
'神偷奶爸3', '智取威虎山', '大鬧天竺', '金剛狼3:殊死一戰', '蜘蛛俠:英雄歸來', '悟空傳', '銀河護衛隊2',
'情聖', '新木乃伊']
 
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
 
# 設定影象大小
plt.figure(figsize=(20, 15), dpi=80)
 
# 繪製條形圖
plt.bar(range(len(a)), b, width=1)
 
# 設定字串到X軸
plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=90)
 
# 顯示圖形
plt.show()

結果如下:

程式分析:可以看出,繪製的方法與折線圖、散點圖大體一致,只是把擬合的方式改成了plt.bar(),其餘的大體一致。不過需要注意的是這個散點圖需要設定每個條柱的寬度不能超過1,否則會出現混疊!

大家可以發現,這個電影的名字在下方並不好看,對做資料分析的人並不友好,那麼就需要將上述的豎條形圖轉變成橫條形圖。具體方法很簡單,只需要將豎條形圖的plt.bar()改為plt.barh()即可。完整程式碼如下:

# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:WindowsFontsMSYHL.TTC")
 
a = ['戰狼2', '速度與激情8', '功夫瑜伽', '西遊伏妖篇', '變形金剛5:最後的騎士', '摔跤吧,爸爸',
'加勒比海盜5:死無對證', '金剛:骷髏島', '極限特工:終極迴歸', '生化危機6:終章', '乘風破浪',
'神偷奶爸3', '智取威虎山', '大鬧天竺', '金剛狼3:殊死一戰', '蜘蛛俠:英雄歸來', '悟空傳', '銀河護衛隊2',
'情聖', '新木乃伊']
 
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
 
# 設定影象大小
plt.figure(figsize=(20,8),dpi=80)
 
# 繪製條形圖
plt.barh(range(len(a)), b, height=0.3, color='orange')  # 區別於豎的條形圖 不能使用width
 
# 設定字串到X軸
plt.yticks(range(len(a)), a, fontproperties=my_font)
 
plt.grid(alpha=0.3)
 
# 儲存圖片
plt.savefig('./movie.png')
 
# 顯示圖形
plt.show()

執行結果如下:

可以看得出,橫條形圖在這裡效果比豎條形圖效果好,更容易觀測與分析。使用時需要根據實際情況進行斟酌,合理選取。

那麼問題又來了,如果我們知道了四部電影:猩球崛起3:終極之戰、敦煌爾克、蜘蛛俠:英雄歸來、戰狼2在三天之內的票房數目,想知道電影本身在這三天自己的票房變化,怎麼來繪製條形圖呢?

先上程式碼:

from matplotlib import pyplot as plt
from matplotlib import font_manager
 
my_font = font_manager.FontProperties(fname="C:WindowsFontsMSYHL.TTC")
 
a = ['猩球崛起3:終極之戰', '敦刻爾克', '蜘蛛俠:英雄歸來', '戰狼2']
b_16 = [15746, 312, 4497, 319]
b_15 = [12357, 156, 2045, 168]
b_14 = [2358, 399, 2358, 362]
 
bar_width = 0.2 # 乘以3小於1
 
# 設定相鄰的寬度
x_14 =list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]
 
# 設定影象大小
plt.figure(figsize=(20,8),dpi=80)
 
# 設定X軸
plt.xticks(x_15,a,fontproperties=my_font)
 
# 繪製影象 設定條形圖寬度
plt.bar(range(len(a)), b_14, width=bar_width, label='9月14日')
plt.bar(x_15, b_15, width=bar_width, label='9月15日')
plt.bar(x_16, b_16, width=bar_width, label='9月16日')
 
# 設定圖例
plt.legend(prop=my_font)
 
# 顯示影象
plt.show()

執行結果如下:

程式分析:可以看出來,上圖很好的完成了題目的要求。猩球崛起3:終極之戰的三日票房最高,同時三日票房總數呈現上升趨勢;敦刻爾克與戰狼2的電影票房總體都比較低;蜘蛛俠:英雄歸來的票房雖然不多,但有上升趨勢,票房數目中等。那麼是怎麼進行操作的呢?相當於在一幅圖中繪製三個直方圖,也就是四個電影在三天的票房數目。通過將寬度設定,實現三個直方圖的無縫連線,使得形成一部電影在三天的票房數目的對比效果。即第一個條形圖開始,第二個條形圖起始點加上一個條形圖的寬度,第三個條形圖加上兩個條形圖的寬度,然後形成三個直方圖的剛好契合。需要注意的是:這個每個直方圖的寬度不能超過1/3,也就是三個重疊在一起寬度不能超過1,否則會形成條形圖混疊。如下圖:

總結:條形圖繪製的要點就是使用plt.bar()或者plt.barh(),一定要注意條形圖寬度的設定,不能超過1,否則會混疊,影響效果,達不到目標要求。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


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