在學習Matplotlib可視化過程中繪制一些相應的圖形往往需要給圖形添加資料标簽這樣才能通過圖形更清楚的知道要表達的含義,下面通過一些簡單的案例來講解。
【案例一】
胡潤财富榜:億萬資産超高淨值家庭數
利用水準交錯條形圖對比2016年和2017年億萬資産超高淨值家庭數(top5)
【需要運作出的效果如下】

【代碼】
import matplotlib.pyplot as plt
import pandas as pd
# 解決亂碼
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文标簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負号
# 導入資料
raw_data = {'城市': ['北京','上海','香港','深圳','廣州'],
'2016': [15600,12700,11300,4270,3260],
'2017': [17400,14800,12000,5200,4020],}
# 建立資料框
df = pd.DataFrame(raw_data)
# 擷取下标
pos = list(range(len(df['城市'])))
# 設定圖形寬度
width = 0.3
# 繪圖
plt.bar([p - width/2 for p in pos], df['2016'],width,color='#FFCCCC', label=df['城市'][0])
plt.bar([p + width/2 for p in pos], df['2017'], width, color='#6699CC', label=df['城市'][1])
# 設定x軸标簽
plt.xticks(range(5),df['城市'])
# 設定y軸的範圍
plt.ylim([2000,20000])
# 給圖像加上圖例
plt.legend(['2016','2017'],loc='upper right')
# 為每個條形圖添加數值标簽
for x,y in enumerate(df['2016']):
plt.text(x-0.13,y,'%s' %round(y),ha='center', va= 'bottom',fontsize=9)
for x,y in enumerate(df['2017']):
plt.text(x+0.09,y ,'%s' %round(y),ha='center', va= 'bottom',fontsize=9)
# 為x,y軸添加标簽名
plt.xlabel('Top5 City')
plt.ylabel('Family Amount')
# 設定标題
plt.title('Millions Family Amount Top5 City Distribution')
# 顯示
plt.show()
【解析】
1.如果輸入的圖形需要顯示中文加入這兩句代碼就可以(解決Python matplotlib中文亂碼問題)
# 解決亂碼
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文标簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負号
2.将資料存入到資料框裡面
# 導入資料
raw_data = {'城市': ['北京','上海','香港','深圳','廣州'],
'2016': [15600,12700,11300,4270,3260],
'2017': [17400,14800,12000,5200,4020],}
# 建立資料框
df = pd.DataFrame(raw_data)
print(df)
然後列印下結果如下
城市 2016 2017
0 北京 15600 17400
1 上海 12700 14800
2 香港 11300 12000
3 深圳 4270 5200
4 廣州 3260 4020
3.擷取每座城市在資料框裡面對應的下标
# 擷取下标
pos = list(range(len(df['城市'])))
我們可以列印下pos
print(pos)
# 輸出結果
[0,1,2,3,4]
4.繪圖
# 設定圖形寬度
width = 0.3
# 繪圖
plt.bar([p - width/2 for p in pos], df['2016'],width,color='#FFCCCC', label=df['城市'][0])
plt.bar([p + width/2 for p in pos], df['2017'], width, color='#6699CC', label=df['城市'][1])
因為我們需要繪制2種條形圖是以需要2個plt.bar(),好了你可能會問[p - width/2 for p in pos]和[p + width/2 for p in pos]是什麼意思,那我們列印下看看
print([p - width/2 for p in pos])
print([p + width/2 for p in pos])
#輸出結果
[-0.15, 0.85, 1.85, 2.85, 3.85]
[0.15, 1.15, 2.15, 3.15, 4.15]
可以看到列印出來的是一些數字,話句話說是坐标,為什麼這樣說呢,你首先要了解plt.bar()這個函數
plt.bar(x=x, # 柱體在 x 軸上的坐标位置
height=y, # 柱體的高度
align='center', # x 軸上的坐标與柱體對其的位置
color='bisque', # 柱體的填充顔色
tick_label=labels, # 每個柱體的标簽名稱
alpha=0.6, # 柱體填充顔色的透明度
width=0.8, # 柱體的寬度
bottom=0.2, # 柱體基線的 y 軸坐标
edgecolor='g', # 柱體的邊框顔色
linewidth=1.5, # 柱體邊框線的寬度
)
這樣你應該懂了,相反後面的 df['2016']也就是條形圖對應的y的值,這樣下來我們就确定了(x,y)坐标了,然後就是那個width就是條形圖的圖形寬度。
5.設定x軸标簽
# 設定x軸标簽
plt.xticks(range(5),df['城市'])
看懂這段代碼你首先得知道plt.xticks()函數,這個函數就是顯示條形圖中x對應的文字
plt.xticks([-1,0,1],['-1','0','1'])
第一個:對應X軸上的值,第二個:顯示的文字
range(5)的結果為[0,1,2,3,4]
df['城市']對應的結果為:北京、上海、香港、深圳、廣州
然後結合下就是(0,北京)、(1,上海)、(2,香港)、(3,深圳)、(4,廣州)
6. 設定y軸的範圍(這個沒啥好解釋的)
# 設定y軸的範圍
plt.ylim([2000,20000])
7. 給圖像加上圖例
# 給圖像加上圖例
plt.legend(['2016','2017'],loc='upper right')
這段代碼就是顯示條形圖中2種顔色代表的含義在右上角那個圖示顯示如果你寫成plt.legend()也可以
8.為每個條形圖添加數值标簽
# 為每個條形圖添加數值标簽
for x,y in enumerate(df['2016']):
plt.text(x-0.13,y,'%s' %round(y),ha='center', va= 'bottom',fontsize=9)
for x,y in enumerate(df['2017']):
plt.text(x+0.09,y ,'%s' %round(y),ha='center', va= 'bottom',fontsize=9)
了解這段代碼你需要了解enumerate()函數和plt.text()函數
enumerate() 函數用于将一個可周遊的資料對象(如清單、元組或字元串)組合為一個索引序列,同時列出資料和資料下标,一般用在 for 循環當中。
以下是 enumerate() 方法的文法:
enumerate(sequence, [start=0])
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
plt.text(x,
y,
string,
fontsize=15,
verticalalignment="top",
horizontalalignment="right"
)
x,y:表示坐标值上的值
string:表示說明文字
fontsize:表示字型大小
verticalalignment:垂直對齊方式 ,參數:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]
horizontalalignment:水準對齊方式 ,參數:[ ‘center’ | ‘right’ | ‘left’ ]
fontsize,style,ha,va參數分别是字号,字型,垂直對齊方式,水準對齊方式。
看懂了enumerate()函數你大概知道了x和y的意思把,就是坐标軸上x和y,通過for循環周遊df['2016']這個資料集
接下來你可能很好奇plt.text()裡面的x-0.13和x+0.09是什麼意思,這裡主要的調整下x坐标對應的y的值在條形圖上的對齊位置,如果你們不知道你可以試一試直接寫x看看效果是什麼。
# 設定标題
plt.title('Millions Family Amount Top5 City Distribution')
# 顯示
plt.show()