參考自Matplotlib Python 畫圖教程 (莫煩Python)(11)_演講•公開課_科技_bilibili_嗶哩嗶哩 https://www.bilibili.com/video/av16378354/index_10.html#page=11
"""柱狀圖""" import numpy as np import matplotlib.pyplot as plt n = 12 # 畫12個柱 X = np.arange(n) Y1 = (1-X/float(n))*np.random.uniform(0.5, 1.0, n) Y2 = (1-X/float(n))*np.random.uniform(0.5, 1.0, n) plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white') # 上柱,facecolor柱體顏色 plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # 下柱,edgecolor背景色 for x, y in zip(X, Y1): # zip是將X,Y1分別傳到x,y中,傳兩個 plt.text(x, y + 0.05, '%.2f' % y, ha='center', va='bottom') # ha,va規定坐標表示的點,默認左下 for x, y in zip(X, Y2): plt.text(x, -y - 0.05, '%.2f' % y, ha='center', va='top') # 字體上邊沿中點的坐標為x, -y - 0.05 plt.xlim(-.5, n) plt.ylim(-1.25, 1.25) plt.xticks([]) plt.yticks([]) plt.show()
更多細節 從零開始學Python【10】--matplotlib(條形圖)_搜狐科技_搜狐網 http://www.sohu.com/a/194395315_654419
一、簡單垂直條形圖
案例一:直轄市GDP水平
中國的四個直轄市分別為北京市、上海市、天津市和重慶市,其2017年上半年的GDP分別為12406.8億、13908.57億、9386.87
億、9143.64億。對於這樣一組數據,我們該如何使用條形圖來展示各自的GDP水平呢?
import matplotlib.pyplot as plt
GDP = [12406.8,13908.57,9386.87,9143.64]
# 繪圖
plt.bar(range(4), GDP, align = 'center',color='steelblue', alpha = 0.8)
# 添加軸標簽
plt.ylabel('GDP')
# 添加標題
plt.title('四個直轄市GDP大比拼')
# 添加刻度標簽
plt.xticks(range(4),['北京市','上海市','天津市','重慶市'])
# 設置Y軸的刻度范圍
plt.ylim([5000,15000])
# 為每個條形圖添加數值標簽 enumerate可以同時獲得索引和值
for x,y in enumerate(GDP):
plt.text(x,y+100,'%s' %round(y,1),ha='center')
# 顯示圖形
plt.show()
代碼解讀
bar函數指定了條形圖的x軸、y軸值,設置x軸刻度標簽為水平居中,條形圖的填充色為鐵藍色,同時設置透明度為0.8;
添加y軸標簽、標題、x軸刻度標簽值,為了讓條形圖顯示各柱體之間的差異,將y軸范圍設置在5000~15000;
通過循環的方式,添加條形圖的數值標簽;
二、簡單水平條形圖
案例二:同一本書不同平台最低價比較
很多人在買一本書的時候,都比較喜歡貨比三家,例如《python數據分析實戰》在亞馬遜、當當網、中國圖書網、京東和天貓的
最低價格分別為39.5、39.9、45.4、38.9、33.34。針對這個數據,我們也可以通過條形圖來完成,這里使用水平條形圖來顯示:
import matplotlib.pyplot as plt
price = [39.5,39.9,45.4,38.9,33.34]
# 繪圖
plt.barh(range(5), price, align = 'center',color='steelblue', alpha = 0.8)
# 添加軸標簽
plt.xlabel('價格')
# 添加標題
plt.title('不同平台書的最低價比較')
# 添加刻度標簽
plt.yticks(range(5),['亞馬遜','當當網','中國圖書網','京東','天貓'])
# 設置Y軸的刻度范圍
plt.xlim([32,47])
# 為每個條形圖添加數值標簽
for x,y in enumerate(price):
plt.text(y+0.1,x,'%s' %y,va='center')
# 顯示圖形
plt.show()
代碼解讀
水平條形圖的繪制與垂直條形圖的繪制步驟一致,只是調用了barh函數來完成。需要注意的是,條形圖的數值標簽設置有一些不
一樣,需要將標簽垂直居中顯示,使用va參數即可。
三、水平交錯條形圖
以上講的簡單垂直和水平條形圖是基於一種離散變量的情況,針對兩種離散變量的條形圖我們可以使用水平交錯條形圖和堆疊條
形圖,下面我們就來看看這兩種條形圖是如何繪制的。
案例三:胡潤財富榜:億萬資產超高凈值家庭數
利用水平交錯條形圖對比2016年和2017年億萬資產超高凈值家庭數(top5),其數據如下:
import matplotlib.pyplot as plt
import numpy as np
# 構建數據
Y2016 = [15600,12700,11300,4270,3620]
Y2017 = [17400,14800,12000,5200,4020]
labels = ['北京','上海','香港','深圳','廣州']
bar_width = 0.45
# 繪圖
plt.bar(np.arange(5), Y2016, label = '2016', color = 'steelblue', alpha = 0.8, width = bar_width)
plt.bar(np.arange(5)+bar_width, Y2017, label = '2017', color = 'indianred', alpha = 0.8, width = bar_width)
# 添加軸標簽
plt.xlabel('Top5城市')
plt.ylabel('家庭數量')
# 添加標題
plt.title('億萬財富家庭數Top5城市分布')
# 添加刻度標簽
plt.xticks(np.arange(5)+bar_width,labels)
# 設置Y軸的刻度范圍
plt.ylim([2500, 19000])
# 為每個條形圖添加數值標簽
for x2016,y2016 in enumerate(Y2016):
plt.text(x2016, y2016+100, '%s' %y2016)
for x2017,y2017 in enumerate(Y2017):
plt.text(x2017+bar_width, y2017+100, '%s' %y2017)
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()
代碼解讀
水平交錯條形圖繪制的思想很簡單,就是在第一個條形圖繪制好的基礎上,往左移一定的距離,再去繪制第二個條形圖,所以在
代碼中會出現兩個bar函數;
圖例的繪制需要在bar函數中添加label參數;color和alpha參數分別代表條形圖的填充色和透明度;
給條形圖添加數值標簽,同樣需要使用兩次for循環的方式實現;
四、垂直堆疊條形圖
垂直堆疊條形圖的繪制思想與水平交錯條形圖一樣,只不過一個是向上偏移,一個是往左偏移,具體我們以案例說明。
案例四:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 導入數據
data = pd.read_excel('C:\\Users\\Administrator\\Desktop\\貨運.xls')
# 繪圖
plt.bar(np.arange(8), data.loc[0,:][1:], color = 'red', alpha = 0.8, label = '鐵路', align = 'center')
plt.bar(np.arange(8), data.loc[1,:][1:], bottom = data.loc[0,:][1:], color = 'green', alpha = 0.8, label = '公
路', align = 'center')
plt.bar(np.arange(8), data.loc[2,:][1:], bottom = data.loc[0,:][1:]+data.loc[1,:][1:], color = 'm', alpha = 0.8,
label = '水運', align = 'center')
plt.bar(np.arange(8), data.loc[3,:][1:], bottom = data.loc[0,:][1:]+data.loc[1,:][1:]+data.loc[2,:][1:], color =
'black', alpha = 0.8, label = '民航', align = 'center')
# 添加軸標簽
plt.xlabel('月份')
plt.ylabel('貨物量(萬噸)')
# 添加標題
plt.title('2017年各月份物流運輸量')
# 添加刻度標簽
plt.xticks(np.arange(8),data.columns[1:])
# 設置Y軸的刻度范圍
plt.ylim([0,500000])
# 為每個條形圖添加數值標簽
for x_t,y_t in enumerate(data.loc[0,:][1:]):
plt.text(x_t,y_t/2,'%sW' %(round(y_t/10000,2)),ha='center', color = 'white')
for x_g,y_g in enumerate(data.loc[0,:][1:]+data.loc[1,:][1:]):
plt.text(x_g,y_g/2,'%sW' %(round(y_g/10000,2)),ha='center', color = 'white')
for x_s,y_s in enumerate(data.loc[0,:][1:]+data.loc[1,:][1:]+data.loc[2,:][1:]):
plt.text(x_s,y_s-20000,'%sW' %(round(y_s/10000,2)),ha='center', color = 'white')
# 顯示圖例
plt.legend(loc='upper center', ncol=4)
# 顯示圖形
plt.show()
代碼解讀
垂直條形圖的繪制不僅僅需要提供x,y軸的數值,還需要提供bottom參數,其目的就是在某個條形圖頂端的基礎上,繪制其他條
形圖,以此類推可以繪制多個堆疊條形圖;
圖例的位置選擇在了正上方,且設置列數為4,表面圖例以一排的形式展現;
堆疊條形圖的數值標簽,任然是按照y軸方向堆疊的思想,貼上數值標簽值;
由於航空運輸的貨物量非常少,導致圖中幾乎無法顯示;