作者是跟著http://t.csdnimg.cn/4fVW0學習的,matplotlib系列文章是http://t.csdnimg.cn/4fVW0的自己學習過程中整理的詳細說明版本,對小白更友好哦!
四、條形圖
1. 一個數據樣本的條形圖
- 條形圖:常用于比較不同類別的數量或值,以及進行簡單的數據分析。
- 直方圖:常用于分析數據的集中趨勢、離散程度以及異常值的存在。
區別 | 頻數分布直方圖 | 條形圖 |
---|---|---|
橫軸上的數據 | 連續的,是一個范圍 | 孤立的,代表一個類別 |
長條形之間 | 沒有空隙 | 有空隙 |
頻數的表示 | 一般用面積表示;當寬度相同時,用長度表示 | 長條形的高度 |
?代碼詳解:
n = 12
?這行代碼定義了條形圖中的條形數量,這里設置為12。
X = np.arange(n)
?這行代碼使用NumPy的arange
函數創建一個數組,包含從0到n-1
的整數,這個數組將用于條形圖的x軸坐標。
Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
?這行代碼計算第一個條形圖的高度。每個高度是通過一個隨機數乘以(1-X/float(n))
得到的,這樣可以確保條形圖從左到右逐漸減小。np.random.uniform(0.5,1.0,n)
生成一個包含n個隨機數的數組,每個數在0.5到1.0之間。
Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
?這行代碼與上面類似,計算第二個條形圖的高度。
bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
?這行代碼在同一個x軸坐標上繪制第二個條形圖,但是高度為負值,這樣兩個條形圖就會堆疊在一起。
for x,y in zip(X,Y1):
?這個循環遍歷X
和Y1
數組的元素,將Y1
的值作為文本繪制在每個條形上方。
text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')代碼詳解:
x, y+0.05
:這兩個參數指定了文本在圖表中的位置。x
是條形的x軸坐標,y+0.05
表示在條形的頂部加上0.05的偏移量,這樣文本就會出現在條形的上方。偏移量確保文本不會與條形圖重疊。
'%0.2f' % y
:這是一個格式化字符串,用于將y
的值格式化為帶有兩位小數的浮點數。%0.2f
中的%
是一個占位符,0.2f
指定了浮點數的格式:至少一位整數,最多兩位小數,小數點后不足兩位的部分用0填充。
ha='center'
:這個參數指定了文本的水平對齊方式。ha
是horizontalalignment
的縮寫,'center'
表示文本應該水平居中對齊,即文本的中心位于指定的x坐標上。
va='bottom'
:這個參數指定了文本的垂直對齊方式。va
是verticalalignment
的縮寫,'bottom'
表示文本的底部與指定的y坐標對齊,即文本的底部位于指定的y坐標上。
from pylab import *n = 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)bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
bar(X, -Y2, facecolor='#ff9999', edgecolor='white')#xticks(X)
for x,y in zip(X,Y1):text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
for x, y in zip(X, -Y2):text(x, y-0.15, '%.2f'% y, ha='center', va='bottom')ylim(-1.25,+1.25)
show()
2. 多個數據樣本的條形圖
# 設置中文字體和負號正常顯示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = Falselabel_list = ['2014', '2015', '2016', '2017'] # 橫坐標刻度顯示值
num_list1 = [20, 30, 15, 35] # 縱坐標值1
num_list2 = [15, 30, 40, 20] # 縱坐標值2
x = range(len(num_list1))# 繪制條形圖
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.5, color='gold', label='部門一')
rects2 = plt.bar([i+0.4 for i in x], height=num_list2, width=0.4, color='lightcyan', label='部門二')# 設置y軸屬性
plt.ylim(0, 50)
plt.ylabel('數量')# 設置x軸屬性
plt.xticks([index+0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title('某某公司')
plt.legend()# 顯示文本
for rect in rects1:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height + 1, str(height), ha='center', va='bottom')
for rect in rects2:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height + 1, str(height), ha='center', va='bottom')plt.show()
?
3. 水平條形圖
代碼詳解:
price = [39.5, 39.9, 45.4, 38.9, 33.34]
:這行代碼定義了一個列表price
,包含了5個數值,分別代表了不同平臺的圖書價格。
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.5)
:這行代碼使用plt.barh()
函數繪制了一個水平條形圖。range(5)
生成了一個從0到4的整數序列,用于指定每個條形的位置。price
列表中的值被用來填充條形的高度。
plt.yticks(range(5), ['亞馬遜', '當當網', '中國圖書網', '京東', '天貓'])
:這行代碼設置了y軸的刻度標簽,與條形的位置對應,這里使用了中文標簽。
for x, y in enumerate(price):
:這行代碼開始了一個循環,enumerate(price)
會生成一個包含索引和價格的元組序列,然后for
循環會遍歷這個序列。
import matplotlib.pyplot as plt
import matplotlibmatplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = Falseprice = [39.5, 39.9, 45.4, 38.9, 33.34]# 繪制水平條形圖
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.5)
plt.yticks(range(5), ['亞馬遜', '當當網', '中國圖書網', '京東', '天貓'])
plt.xlim(30, 47)
plt.xlabel('價格')
plt.title('不同平臺圖書價格')
for x, y in enumerate(price):plt.text(y+0.2, x-0.1, '%s'%y)plt.show()
4. 繪制不同數據樣本進行對比的水平條形圖
代碼詳解:
y = range(1, len(num_list1)+1)
:這行代碼使用range()
函數創建了一個整數序列,從1開始,到num_list1
的長度加1結束。這個序列將用于確定條形圖的y軸位置。
y = [index*1.5 for index in y]
:這行代碼通過列表推導式創建了一個新的列表y
,每個元素都是原列表y
中對應元素的1.5倍。這會將條形圖的y軸位置放大,以便于在同一個圖表中繪制兩個條形圖。
plt.barh(y, num_list1, height=0.4, color='gold', alpha=0.5)
:這行代碼使用plt.barh()
函數繪制了第一個條形圖。y
列表中的值被用來確定條形的位置,num_list1
列表中的值被用來填充條形的高度。
plt.barh([index-0.4 for index in y], num_list2, height=0.4, color='paleturquoise', alpha=0.5)
:這行代碼使用plt.barh()
函數繪制了第二個條形圖。這里使用了列表推導式來創建一個新的y
列表,每個元素是原列表y
中對應元素的減去0.4,以便于在第一個條形圖的下方繪制第二個條形圖。
plt.text(x+0.8, y1-0.1, str(x), ha='center', va='bottom')
:這行代碼在每個條形旁邊添加了數量標簽。x+0.8
確保了標簽不會被條形覆蓋,而y1-0.1
確保了標簽不會被y軸的刻度覆蓋。
for x, y2 in zip(num_list2, y):
:這行代碼開始了一個新的循環,用于添加第二個條形圖的數量標簽。
plt.text(x+0.8, y2-0.5, str(x), ha='center', va='bottom')
:這行代碼在每個條形旁邊添加了第二個數量標簽。x+0.8
確保了標簽不會被條形覆蓋,而y2-0.5
確保了標簽不會被y軸的刻度覆蓋。
label_list = ['2014', '2015', '2016', '2017']
num_list1 = [20, 30, 15, 35]
num_list2 = [15, 33, 40, 20]
y = range(1, len(num_list1)+1)
y = [index*1.5 for index in y]plt.barh(y, num_list1, height=0.4, color='gold', alpha=0.5)
plt.barh([index-0.4 for index in y], num_list2, height=0.4, color='paleturquoise', alpha=0.5)
plt.yticks([index-0.2 for index in y], label_list)
plt.ylabel('年份')
plt.xlim(0, 45)
plt.xlabel('數量')for x, y1 in zip(num_list1, y):plt.text(x+0.8, y1-0.1, str(x), ha='center', va='bottom')
for x, y2 in zip(num_list2, y):plt.text(x+0.8, y2-0.5, str(x), ha='center', va='bottom')plt.show()
?