我最近看到这个包用于R/ggplot2,它允许一个人在一个绘图上有多个注释并自动调整它们的位置以最小化重叠,这样就提高了可读性.python/matplotlib有类似的东西吗?
编辑:我发现Matplotlib重叠注释/文本,它看起来很有希望,但似乎结果不如R包.
例:
from matplotlib import pyplot as plt import numpy as np xs = np.arange(10, step=0.1)+np.random.random(100)*3 ys = np.arange(10, step=0.1)+np.random.random(100)*3 labels = np.arange(100) plt.scatter(xs, ys) for x, y, s in zip(xs, ys, labels): plt.text(x, y, s) plt.show()
你可以看到,即使这样的短标签在数据密度很高时也会造成一个疯狂的混乱.
[12-11-2016更新了代码和第二个数字,因为从那时起库已经有了显着的改进]
答案完全重写
我为此目的创建了一个小型库,其工作方式类似于上面提到的ggrepel:https://github.com/Phlya/adjustText
通过关闭排斥点,即使对于这个困难的例子,它也会产生一些不错的效果:
from matplotlib import pyplot as plt from adjustText import adjust_text import numpy as np np.random.seed(2016) xs = np.arange(10, step=0.1) + np.random.random(100) * 3 ys = np.arange(10, step=0.1) + np.random.random(100) * 3 labels = np.arange(100) f = plt.figure() scatter = plt.scatter(xs, ys, s=15, c='r', edgecolors='w') texts = [] for x, y, s in zip(xs, ys, labels): texts.append(plt.text(x, y, s)) plt.show()
adjust_text(texts, force_points=0.2, force_text=0.2, expand_points=(1, 1), expand_text=(1, 1), arrowprops=dict(arrow, color='black', lw=0.5)) plt.show()