我正在尝试停止我的图形中的注释文本重叠。在Matplotlib overlapping annotations的公认答案中建议的方法看起来非常有希望,但是它是用于条形图的。我很难把“axis”方法转换成我想做的,我不明白文本是如何排列的。
import sys
import matplotlib.pyplot as plt
# start new plot
plt.clf()
plt.xlabel("Proportional Euclidean Distance")
plt.ylabel("Percentage Timewindows Attended")
plt.title("Test plot")
together = [(0, 1.0, 0.4), (25, 1.0127692669427917, 0.41), (50, 1.016404709797609, 0.41), (75, 1.1043426359673716, 0.42), (100, 1.1610446924342996, 0.44), (125, 1.1685687930691457, 0.43), (150, 1.3486407784550272, 0.45), (250, 1.4013999168008104, 0.45)]
together.sort()
for x,y,z in together:
plt.annotate(str(x), xy=(y, z), size=8)
eucs = [y for (x,y,z) in together]
covers = [z for (x,y,z) in together]
p1 = plt.plot(eucs,covers,color="black", alpha=0.5)
plt.savefig("test.png")
可以找到图像(如果可以的话)here(此代码):
以及here(更复杂):
我只想在这里发布另一个解决方案,一个小库,我编写它来实现这类事情:https://github.com/Phlya/adjustText 该过程的示例如下:
下面是示例图像:
如果你想要一个完美的身材,你可以随便摆弄一下。首先,让我们也让文本排斥行-因为我们只是使用scipy.interpolate.interp1d沿着它们创建许多虚拟点
我们希望避免沿着x轴移动标签,因为,好吧,为什么不为了说明的目的这样做呢。为此,我们使用参数
only_move={'points':'y', 'text':'y'}
。如果只想在它们与文本重叠的情况下沿x轴移动它们,请使用move_only={'points':'y', 'text':'xy'}
。同样,在开始时,函数选择文本相对于其原始点的最佳对齐方式,因此我们只希望它也沿着y轴发生,因此autoalign='y'
。我们还减少了从点到点的排斥力,以避免由于我们人工避开线而使文本飞得太远。一起:我费了好大劲才弄明白。原来的解决方案再次归功于Matplotlib overlapping annotations的答案。
但我不知道如何找到文本的确切宽度和高度。如果有人知道,请发布一个改进(或添加一个评论与方法)。
创建http://i.stack.imgur.com/xiTeU.png
更复杂的图形现在是http://i.stack.imgur.com/KJeYW.png,仍然有点不确定,但好多了!
相关问题 更多 >
编程相关推荐