本文示例代码、数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

在进行数据可视化时我们常常需要在可视化作品上进行一些文字标注,譬如对散点图我们可以将每个散点对应的属性信息标注在每个散点旁边,但随着散点量的增多,或图像上的某个区域聚集了较多的散点时,叠加上的文字标注会挤在一起相互叠置,出现如图1所示的情况:

图1

出现这种情况非常影响数据可视化作品的呈现效果,而我们下面要介绍的adjustText是一个辅助matplotlib所绘制的图像自动调整文字位置以缓解遮挡现象的库,其灵感来源于R中非常著名的辅助ggplot2解决文字遮挡问题的ggrepel

图2

它通过算法迭代,在一轮轮的迭代过程中逐渐消除文字遮挡现象:

图3

下面我们就来学习如何使用adjustText解决matplotlib图像文字遮挡问题。

2 使用adjustText解决文字遮挡问题

2.1 从一个简单的例子出发

使用pip install adjustTextconda install -c conda-forge adjusttext来安装adjustText。安装成功之后,首先生成随机示例数据以方便之后的演示:

import matplotlib.pyplot as plt
from adjustText import adjust_text
import numpy as np#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']seed = np.random.RandomState(42) # 固定随机数水平
x, y = seed.uniform(0, 1, [2, 100]) # 产生固定的均匀分布随机数
texts = [f'文字{i}' for i in range(x.__len__())]

接着我们先不使用adjustText调整图像,直接绘制出原始的散点+文字标签

fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(x, y, c='SeaGreen', s=10) # 绘制散点# 绘制所有点对应的文字标签
for x_, y_, text in zip(x, y, texts):plt.text(x_, y_, text, fontsize=12)# 美观起见隐藏顶部与右侧边框线
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)fig.savefig('图4.png', dpi=300, bbox_inches='tight', pad_inches=0) # 保存图像

图4

可以看到,在通常的情况下,散点聚集的区域内文字标签非常容易重叠在一起,接下来我们使用adjustText的基础功能来消除文字重叠现象:

图5

这时可以看到与图4相比,图5中的所有文字都没有出现彼此重叠现象,adjustText帮助我们自动微调了文字的摆放位置,并且距离原始散点偏移较大的文字还贴心的加上了连接线,至此,我们就初探了adjustText的强大功能,接下来我们来学习adjustText的更多功能。

2.2 adjust_text的用法

adjustText中的核心功能都通过调用函数adjust_text来实现,其核心参数如下:

texts:List型,每个元素都是表示单个文字标签对应的matplotlib.text.Text对象

ax:绘制文字标签的目标axe对象,默认为最近一次的axe对象

lim:int型,控制迭代调整文本标签位置的次数,默认为500次

precision:float型,用于决定迭代停止的精度,默认为0.01,即所有标签相互遮挡部分的长和宽占所有标签自身长宽之和的比例,addjust_text会在精度达到precision和迭代次数超过lim这两个条件中至少有一个满足时停止迭代

only_move:字典型,用于指定文本标签与不同对象发生遮挡时的位移策略,键有'points''text''objects',对应的值可选'xy''x''y',分别代表竖直和水平方向均调整、只调整水平方向以及只调整竖直方向

arrowprops:字典型,用于设置偏移后的文字标签与原始位置之间的连线样式,下文会作具体演示

save_steps:bool型,用于决定是否保存记录迭代过程中各轮的帧图像,默认为False

save_prefix:str型,当save_steps设置为True时,用于指定中间帧保存的路径,默认为'',即当前工作路径

下面我们来演示一下这些参数的使用效果,首先我们来看看only_move参数的效果,在图6的基础上,我们设置only_move={'text': 'x'},即当文字出现遮挡时,只在水平方向上进行偏移,这里将save_steps设置为True以直观地查看偏移过程:

fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(x, y, c='SeaGreen', s=10) # 绘制散点# 使用adjustText修正文字重叠现象
new_texts = [plt.text(x_, y_, text, fontsize=12) for x_, y_, text in zip(x, y, texts)]
adjust_text(new_texts, only_move={'text': 'x'},arrowprops=dict(arrowstyle='-', color='grey'),save_steps=True)# 美观起见隐藏顶部与右侧边框线
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

图6

可以看到在整个迭代微调的过程中,每个标签只在水平方向发生位移,你可以根据自己作图的实际需要灵活调整这里的平移策略。接下来我们来看看arrowprops对可视化结果的影响,在之前的例子里我们设置了arrowprops={arrowstyle='-', color='grey'},其中arrowstyle用于设定连线的线型,color不用多说,接下来我们添加参数lw用于控制线的宽度,并对线型与颜色进行修改:

fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(x, y, c='SeaGreen', s=10) # 绘制散点# 使用adjustText修正文字重叠现象
new_texts = [plt.text(x_, y_, text, fontsize=12) for x_, y_, text in zip(x, y, texts)]
adjust_text(new_texts, arrowprops=dict(arrowstyle='->', color='red',lw=1))# 美观起见隐藏顶部与右侧边框线
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)fig.savefig('图7.png', dpi=300, bbox_inches='tight', pad_inches=0) # 保存图像

这时连线随着我们自定义的设置改变到相应的样式:

图7

有关adjustText的更多参数设置信息和示例可以去官方文档(https://adjusttext.readthedocs.io/en/latest/ )查看。

以上就是本文的全部内容,如有疑问欢迎在评论区与我们讨论。

-END-

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【Python基础】解决matplotlib文字标签遮挡问题相关推荐

  1. 【Python基础】Matplotlib 实操干货,38个案例带你从入门到进阶!

    译文出品:Python数据之道 原文作者:Rizky Maulana Nurhidayat 翻译:Lemon Matplotlib 实操干货, 38个案例带你从入门到进阶! 「Python数据之道」注 ...

  2. 【Python基础】Matplotlib官方小抄手册公开(配套可视化代码)!

    出品:Python数据科学 作者:东哥起飞 Matplotlib作为强大的数据可视化工具,一直备受Python数据爱好者们追捧.网络上虽有零零散散的教程,但并不是非常的系统和直观,往往我们遇到一些问题 ...

  3. python雷达图详解_Python基础教程 - matplotlib实现雷达图和柱状图

    原标题:Python基础教程 - matplotlib实现雷达图和柱状图 Python基础教程记录 - 使用matplotlib实现雷达图和柱状图. 注:主要是设置add_subplot(133),分 ...

  4. Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式、清除原有图像、设置横坐标显示文字/旋转角度、添加图例、绘图布局自动调整、图像显示、图像暂停)

    Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式.清除原有图像.设置横坐标显示文字/旋转角度.添加图例.绘图布局自动调整.图像显示.图像暂停) 目 ...

  5. python基础知识及数据分析工具安装及简单使用(Numpy/Scipy/Matplotlib/Pandas/StatsModels/Scikit-Learn/Keras/Gensim))

    Python介绍. Unix & Linux & Window & Mac 平台安装更新 Python3 及VSCode下Python环境配置配置 python基础知识及数据分 ...

  6. Python数据可视化matplotlib:第四回:文字图例尽眉目

    Python数据可视化matplotlib:第四回:文字图例尽眉目 1. Figure和Axes上的文本 大家可以看到有些论文或者博客上都有绘制的很漂亮的图,其中大部分都在图形绘制上进行一定的注释说明 ...

  7. python 基础知识之(numpy、pandas、matplotlib、tensorflow)

    1.Numpy库: 参考网页 1.1创建Numpy变量 创建一个 ndarray 只需调用 NumPy 的 array 函数即可:numpy.array(object, dtype = None, c ...

  8. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  9. python中plot不能显示标签_python 2: 解决python中的plot函数的图例legend不能显示中文问题...

    问题: 图像标题.横纵坐标轴的标签都能显示中文名字,但是图例就是不能显示中文,怎么解决呢? 解决: plt.figure() plt.title(u'训练性能', fontproperties=fon ...

最新文章

  1. python基础教程书籍推荐-Python入门书籍推荐,我的清单
  2. 张小龙内部分享:一个产品只能有一个主线功能
  3. 戏说 Windows GDI (2)
  4. maskrcnn还可以加网络吗_桃子加蜂蜜可以榨汁吗?桃子和蜂蜜可以一起吃吗?原来可以这样吃...
  5. android面试详解
  6. 大数据笔记(十三)——常见的NoSQL数据库之HBase数据库(A)
  7. 无罪的罪人_探索敏捷和无罪的文化
  8. php实现笔记共享,[转载]利用memcached在多台服务器之间共享PHP的session数据
  9. 官宣!《花木兰》内地定档
  10. LinkedList源码
  11. OKR与互联网创业团队
  12. 旋转校正原理_【干货】全站仪水准器的检校原理及方法,值得学习!
  13. 如何在Scala中使用条件表达式 .
  14. 华为笔试题分享:分糖果
  15. extjs 教程 java_ExtJS6.2学习
  16. SQL Server 游标
  17. stm8单片机程序加密方法 id加密技巧
  18. 程序员的macOS系列:精选Mac App
  19. python查找相似图片或重复图片
  20. C语言打印菱形和空心菱形

热门文章

  1. MongoDB学习之(一)安装
  2. Android ListViewview入门
  3. 一些 Google 搜索词
  4. 转:Linux--进程间通信(信号量,共享内存)
  5. 实验楼 “python3简明教程” 挑战三:玩转函数
  6. hfss13.0安装教程
  7. 虚拟机VMware 14安装教程
  8. 北斗导航 | 完全自主研发国产高端三维激光雷达助力中国测绘技术发展
  9. 北斗导航 | 基于MATLAB的卫星轨道模拟
  10. 北斗导航 | 利用模拟卫星星座估计GNSS接收机位置