2015-06-04 182 views
3

我想用Matplotlib注释Python 2.7中的散点图。这里是剧情代码:Python箭头方向

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

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

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') 

默认情况下箭头指向从文本到数据点。如果你想改变箭头的方向,你可以使用arrowprops=dict(arrowstyle='<|-')

+0

谢谢。那么,关于'xytext =(,)',如果我尝试这个'xy =(10,10),xytext =(10-0.1,10-0.1)',这是否意味着注释文本从'(9.9, 9.9)'或'(0.099,0.099)'? .i.e。 xytext =(,)'的单位是什么,'xy =(,)'的单位是多少? –

+1

默认情况下'xycoords'和'textcoords'应该是'data'。所以,在这种情况下,文本将在(9.9,9.9)。如果那不是你想要的坐标,你可以改变它(如果你想让你的文本跟随你的数据,'数据'似乎是合乎逻辑的选择)。 –