Python matplotlib—使用adjustText对文本进行y调整

Python matplotlib—使用adjustText对文本进行y调整,python,matplotlib,Python,Matplotlib,这是我使用pyplot生成的一个图,并且(试图)使用adjustText库(我也在这里找到)调整文本 如您所见,它在0

这是我使用pyplot生成的一个图,并且(试图)使用adjustText库(我也在这里找到)调整文本

如您所见,它在
0
的部分变得非常拥挤。我在想,在
0.8
中仍然有足够的空间,这样它们都可以很好地适应和标记点

我的尝试是:

plt.plot(df.fpr,df.tpr,marker='.',ls='-') 
texts = [plt.text(df.fpr[i],df.tpr[i], str(df.thr1[i])) for i in df.index] 
adjust_text(texts,
            expand_text=(2,2),
            expand_points=(2,2),
            expand_objects=(2,2),
            force_objects = (2,20),
            force_points = (0.1,0.25),
            lim=150000,
            arrowprops=dict(arrowstyle='-',color='red'),
            autoalign='y',
            only_move={'points':'y','text':'y'}
            )
其中my
df
是可以找到的熊猫数据帧


根据我在文档中的理解,我尝试通过增大边界框和y力来改变边界框和y力,认为这会将标签进一步向上推,但事实似乎并非如此

我是adjustText的作者,对不起,我刚刚注意到这个问题。你会遇到这个问题,因为你有很多重叠的文本,它们的y坐标完全相同。通过在标签上沿y方向添加一个微小的随机移位,很容易解决这个问题(您确实需要增加文本的力度,否则沿一维的移动速度会非常慢),如下所示:

np.random.seed(0)
f, ax = plt.subplots(figsize=(12, 6))
plt.plot(df.fpr,df.tpr,marker='.',ls='-') 
texts = [plt.text(df.fpr[i], df.tpr[i]+np.random.random()/100, str(df.thr1[i])) for i in df.index]
plt.margins(y=0.125)
adjust_text(texts,
            force_text=(2, 2),
            arrowprops=dict(arrowstyle='-',color='red'),
            autoalign='y',
            only_move={'points':'y','text':'y'},
            )
还请注意,我增加了沿y轴的边距,这对角有很大帮助。结果不是很完美,将算法限制在一个轴上会使生活更加困难。。。但已经没问题了


必须提到的是,数字的大小非常重要,我不知道你的是什么。

我是adjustText的作者,很抱歉我刚刚注意到这个问题。你会遇到这个问题,因为你有很多重叠的文本,它们的y坐标完全相同。通过在标签上沿y方向添加一个微小的随机移位,很容易解决这个问题(您确实需要增加文本的力度,否则沿一维的移动速度会非常慢),如下所示:

np.random.seed(0)
f, ax = plt.subplots(figsize=(12, 6))
plt.plot(df.fpr,df.tpr,marker='.',ls='-') 
texts = [plt.text(df.fpr[i], df.tpr[i]+np.random.random()/100, str(df.thr1[i])) for i in df.index]
plt.margins(y=0.125)
adjust_text(texts,
            force_text=(2, 2),
            arrowprops=dict(arrowstyle='-',color='red'),
            autoalign='y',
            only_move={'points':'y','text':'y'},
            )
还请注意,我增加了沿y轴的边距,这对角有很大帮助。结果不是很完美,将算法限制在一个轴上会使生活更加困难。。。但已经没问题了

必须提到的是,数字的大小非常重要,我不知道你的是什么