python畫圖時給圖中的點加標籤之plt.text

python畫圖時給圖中的點加標籤之plt.text

在這篇文章你將學到

  • plt.text()用法
  • 如何給單個點加標籤
  • 如何批量給點加標籤
  • 如何調參是的標籤位置美觀

背景

今天在用matplotlib模塊畫各城市2019-nCoV疫情確診人數和節前流入人口數的圖的時候遇到了要給圖中的點加上標籤示意,原本圖長這個樣子
圖 1 散點圖(未標籤)
現在要給各散點標註是哪個哪個城市,即下面這種圖
圖 2  散點圖(帶標籤)
之前瞭解matplotlib模塊加標籤主要有matplotlib.pyplot.text()和matplotlib.pyplot.annotate()兩個關鍵函數,後者適用範圍更廣,今天主要談一下前者matplotlib.pyplot.text(),簡寫成plt.text() 。

準備知識

在此重點講一下plt.text()的用法和參數設置,plt.text()函數基本語法如下

plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)

其中

  • x,y表示標籤添加的位置,默認是根據座標軸的數據來度量的,是絕對值,也就是說圖中點所在位置的對應的值,特別的,如果你要變換座標系的話,要用到transform=ax.transAxes參數。
  • s表示標籤的符號,字符串格式,比如你想加個“我愛三行科創”,更多的是你標註跟數據有關的主體,你如實寫便是。
  • fontsize顧名思義就是你加標籤字體大小了,取整數。
  • verticalalignment表示垂直對齊方式 ,可選 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等
  • horizontalalignment表示水平對齊方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等
  • rotation表示標籤的旋轉角度,以逆時針計算,取整
  • 後面還有 family 用來設置字體,style 設置字體的風格,weight 字體的粗細, bbox 給字體添加框,如 bbox=dict(facecolor=‘red’, alpha=0.5) 等,各種風格,應有盡有,總有一款適合你。

實例操作

講解玩關鍵函數類plt.text()的用法之後,我們要進行實際操作。首先,我們用下面代碼把第一張圖畫出來

import pandas as pd #導入數據分析模塊
import matplotlib.pyplot as plt #導入繪圖模塊類
plt.rcParams['font.sans-serif']=['SimHei'] #圖中文字體設置爲黑體
plt.rcParams['axes.unicode_minus']=False #負值顯示
data=pd.read_excel(r"D:\城市租賃地圖\人流流動與疫情發展\百度遷徙.xlsx") #讀取數據
city_name=data['city'] #城市名稱
people_flow=data['out_people']*100 #流出人口,單位百人
confirm=data['confirm(2.10)'] #確診人數

fig=plt.figure(figsize=(8,6)) #新建畫布
ax=plt.subplot(1,1,1) #子圖初始化
ax.scatter(people_flow,confirm) #繪製散點圖   
ax.set_title("人口流入-確診人數")
ax.set_xlabel("人口流入數(百人)")
ax.set_ylabel("確診人數")
plt.show()

然後再給第一個點加上標籤,只需要添加一行代碼即可
單點標籤

ax.text(430, 337, "北京", fontsize=12, color = "r", style = "italic", weight = "light", verticalalignment='center', horizontalalignment='right', rotation=90)

其中430, 337就是這個點的座標值,北京是這個點的主體,你可以不斷的去調後面的參數使其滿足你所需。

接着,我們要批量給圖中的點加上主體標籤,使其看起來像第二張圖,需要用到循環語句來控制加標籤的位置

for i in range(len(confirm)):
    ax.text(people_flow[i]*1.01, confirm[i]*1.01, city_name[i], fontsize=10, color = "r", style = "italic", weight = "light", verticalalignment='center', horizontalalignment='right',rotation=0) #給散點加標籤

這裏關鍵是裏面偏移參數的設定,比如這裏兩個偏移率都設置成1.01, 當初想的是標籤不要覆蓋原來的點,兩者最好不重合,看起來大方得體,你可以開始的設置成1.0,觀察效果然後慢慢調節,舉個例子,如果是柱狀圖,且寬度適合的話,第一個偏移率設置成1.0,第二個設置成1.05左右,即稍微高出柱子多一丁點顯示柱子的標籤。

完整代碼

最後給出完整代碼,如果你不會寫代碼或者只要數據測試,可以來“三行科創”微信公衆號留言,其中百度遷徙.xlsx如下
在這裏插入圖片描述

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 15 10:29:38 2020
project name:add_annotation
@author: 帥帥de三叔
"""
import pandas as pd #導入數據分析模塊
import matplotlib.pyplot as plt #導入繪圖模塊類
plt.rcParams['font.sans-serif']=['SimHei'] #圖中文字體設置爲黑體
plt.rcParams['axes.unicode_minus']=False #負值顯示
data=pd.read_excel(r"D:\城市租賃地圖\人流流動與疫情發展\百度遷徙.xlsx") #讀取數據
city_name=data['city'] #城市名稱
people_flow=data['out_people']*100 #流出人口,單位百人
confirm=data['confirm(2.10)'] #確診人數

fig=plt.figure(figsize=(8,6)) #新建畫布
ax=plt.subplot(1,1,1) #子圖初始化
ax.scatter(people_flow,confirm) #繪製散點圖   
ax.set_title("人口流入-確診人數")
ax.set_xlabel("人口流入數(百人)")
ax.set_ylabel("確診人數")
#ax.text(430, 337, "北京", fontsize=12, color = "r", style = "italic", weight = "light", verticalalignment='center', horizontalalignment='right',rotation=90)
for i in range(len(confirm)):
    ax.text(people_flow[i]*1.01, confirm[i]*1.01, city_name[i], 
            fontsize=10, color = "r", style = "italic", weight = "light",
            verticalalignment='center', horizontalalignment='right',rotation=0) #給散點加標籤
plt.show()

參考文獻
1,https://matplotlib.org/api/_as_gen/matplotlib.pyplot.text.html?highlight=text#matplotlib.pyplot.text
2,https://matplotlib.org/gallery/text_labels_and_annotations/text_rotation_relative_to_line.html#sphx-glr-gallery-text-labels-and-annotations-text-rotation-relative-to-line-py
3,https://www.jb51.net/article/164818.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章