Python anotation箭头方向

时间:2015-06-04 16:30:09

标签: python python-2.7 matplotlib annotations

我试图用Matplotlib在Python 2.7中注释一个散点图。这是情节代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(5,3), columns=list('ABC'))
df.insert(0,'Annotation_Text',['ABC','DEF','GHI','JKL','mnop'])

q = 2
pqr = 1

# Scatter Plot:
x = df['A']
y = df.iloc[:,q]
plt.scatter(x, y, marker='o', label = df.columns.tolist()[q])

# Plot annotation:
plt.annotate(df.iloc[pqr,0]+', (%.2f, %.2f)' % (x.ix[pqr],y.ix[pqr]), xy=(x.ix[pqr], y.ix[pqr]), xycoords='data', xytext = (x.ix[pqr], y.ix[pqr]), textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))

# Axes title/legend:
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
plt.legend(scatterpoints = 1)

plt.show()

如您所见,主线是以plt.annotate(df.iloc[pqr,0]+', (%...............开头的行。

我认为主要问题在于plt.annotate()行的这一部分:xytext = (x.ix[pqr], y.ix[pqr]), textcoords='offset points', arrowprops=dict(arrowstyle='-|>')。从这里开始,xytext = (x.ix[pqr], y.ix[pqr])只是要注释的数据点的x和y坐标的元组。不幸的是,这是将注释放在数据点上,这是我不想要的。我想在数据点和注释文本之间留一些空白。

另外,我遇​​到了这条线正在产生的箭头和注释的问题。见下文。 Annotation Image

问题:

  • 目前,注释文本与箭头重叠。注释文本太靠近数据点。我不希望它如此接近。
  • 箭头也是从右到左指向。我不认为我要求它从右到左绘制箭头,所以我不知道为什么它会朝这个方向绘制箭头。

有没有办法控制文本注释,以便与数据点没有重叠?另外,如何将箭头方向从右向左更改为a)best方向或b)从左到右?

1 个答案:

答案 0 :(得分:1)

null中,plt.annotate(...)给出了您想要指向的数据的位置(箭头的一端),xy给出了文本的位置。在您的代码中,它们是重叠的,因为您为xytextxy指定了相同的位置。试试这个(例如):

xytext

默认情况下,箭头指向文本到数据点。如果要更改箭头的方向,可以使用plt.annotate(df.iloc[pqr,0]+', (%.2f, %.2f)' % (x.ix[pqr], y.ix[pqr]), xy=(x.ix[pqr], y.ix[pqr]), xycoords='data', xytext=(x.ix[pqr], y.ix[pqr]+0.3), arrowprops=dict(arrowstyle='-|>'), horizontalalignment='center')