2015-06-04 219 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)。如果那不是你想要的座標,你可以改變它(如果你想讓你的文本跟隨你的數據,'數據'似乎是合乎邏輯的選擇)。 –