在这篇文章你将学到
今天在用matplotlib模块画各城市2019-nCoV疫情确诊人数和节前流入人口数的图的时候遇到了要给图中的点加上标签示意,原本图长这个样子
现在要给各散点标注是哪个哪个城市,即下面这种图
之前了解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)
其中
讲解玩关键函数类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