我试图用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坐标的元组。不幸的是,这是将注释放在数据点上,这是我不想要的。我想在数据点和注释文本之间留一些空白。
另外,我遇到了这条线正在产生的箭头和注释的问题。见下文。
问题:
有没有办法控制文本注释,以便与数据点没有重叠?另外,如何将箭头方向从右向左更改为a)best
方向或b)从左到右?
答案 0 :(得分:1)
在null
中,plt.annotate(...)
给出了您想要指向的数据的位置(箭头的一端),xy
给出了文本的位置。在您的代码中,它们是重叠的,因为您为xytext
和xy
指定了相同的位置。试试这个(例如):
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')