2015-06-04 2 views
3

Я пытаюсь аннотировать диаграмму рассеяния в Python 2.7 с помощью Matplotlib. Вот код участка:Направление стрелки на питон

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 дает позицию вашего текста. В вашем коде они перекрываются, потому что вы указали те же позиции для 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') 

Стрелка по умолчанию указывает от текста до точки данных. Если вы хотите изменить направление стрелки, вы можете использовать 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). Вы можете изменить это, если это не ваши желаемые координаты (если вы хотите, чтобы ваш текст соответствовал вашим данным, «данные» кажутся логичным выбором). –

Смежные вопросы