解决matplotlib文字标签遮挡问题


本文示例代码、数据已上传至个人Github仓库https://github.com/CNFeffery/DataScienceStudyNotesgit

1 简介

在进行数据可视化时咱们经常须要在可视化做品上进行一些文字标注,譬如对散点图咱们能够将每一个散点对应的属性信息标注在每一个散点旁边,但随着散点量的增多,或图像上的某个区域汇集了较多的散点时,叠加上的文字标注会挤在一块儿相互叠置,出现如图1所示的状况:github

图1

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

图2

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

图3

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

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

2.1 从一个简单的例子出发

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

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(01, [2100]) # 产生固定的均匀分布随机数
texts = [f'文字{i}' for i in range(x.__len__())]

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

fig, ax = plt.subplots(figsize=(88))
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=(88))
ax.scatter(x, y, c='SeaGreen', s=10# 绘制散点

# 使用adjustText修正文字重叠现象
new_texts = [plt.text(x_, y_, text, fontsize=12for 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=(88))
ax.scatter(x, y, c='SeaGreen', s=10# 绘制散点

# 使用adjustText修正文字重叠现象
new_texts = [plt.text(x_, y_, text, fontsize=12for 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/ )查看。



本文分享自微信公众号 - 凹凸数据(alltodata)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索