2015-05-18 12 views
7

Tôi có một cốt truyện mà tôi muốn chú thích một vị trí cụ thể trên trục x với một mũi tên và một label:Có thể gắn chú thích matplotlib vào tọa độ dữ liệu trong trục x, nhưng đến vị trí tương đối trong trục y không?

  • Vị trí của các đỉnh của mũi tên cần phải được xác định một cách chính xác trong tọa độ dữ liệu .
  • Mũi tên phải thẳng đứng, do đó tọa độ x của đầu cùn của mũi tên (và nhãn văn bản) cũng phải được chỉ định chính xác trong tọa độ dữ liệu.
  • Tuy nhiên, tôi lý tưởng muốn có thể chỉ định vị trí y của đầu cùn của mũi tên có liên quan đến hộp giới hạn trục, thay vì dữ liệu.

giải pháp làm việc hiện tại của tôi liên quan đến việc xác định vị trí của cả hai chóp mũi tên và nhãn trong dữ liệu tọa độ:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib.transforms import blended_transform_factory 


x = np.random.randn(10000) 
r = 3 
label = 'foo' 
arrowprops = dict(fc='r', ec='k') 

def make_example_plot(): 
    fig, ax = plt.subplots(1, 1) 
    ax.hold(True) 
    counts, edges, patches = ax.hist(x) 
    return fig, ax 

fig, ax = make_example_plot() 
lo, hi = ax.get_ylim() 
ax.annotate(label, xy=(r, 0), xycoords='data', 
      xytext=(r, hi * 1.1), textcoords='data', fontsize='xx-large', 
      ha='center', va='center', color='r', arrowprops=arrowprops) 
ax.set_ylim(0, hi * 1.3) 

enter image description here

tôi muốn có thời gian lưu trú nhãn ở một vị trí cố định trong y bất kể cách tôi mở rộng hoặc xoay các trục y. Tôi có thể đạt được hiệu quả mong muốn cho một nhãn văn bản đơn giản bằng cách thông qua một chuyển đổi xy pha trộn để ax.text:

fig, ax = make_example_plot() 
tform = blended_transform_factory(ax.transData, ax.transAxes) 
ax.text(r, 0.9, label, fontsize='xx-large', color='r', transform=tform) 

enter image description here

Nếu bạn sinh sản con số này sau đó xoay hoặc quy mô nó, bạn sẽ thấy rằng di chuyển văn bản trong x tương ứng với hộp giới hạn trục, nhưng vẫn ở vị trí cố định trong y. Tất nhiên điều này vẫn không cho tôi mũi tên, mặc dù. Tôi đã hy vọng rằng tôi có thể sử dụng phương pháp tương tự với ax.annotate, nhưng điều này dường như không làm việc:

fig, ax = make_example_plot() 
tform = blended_transform_factory(ax.transData, ax.transAxes) 
ax.annotate(label, xy=(r, 0), xycoords='data', transform=tform, 
      xytext=(r, 0.9), textcoords='data', fontsize='xx-large', 
      ha='center', va='center', color='r', arrowprops=arrowprops) 

Nhãn và mũi tên được đặt tại y = 0.9 trong tọa độ dữ liệu, không phải ở 90% tổng chiều cao của trục y:

enter image description here

có cách nào để xác định riêng rẽ các hệ quy chiếu cho x và y-biến đổi áp dụng cho một matplotlib.text.Annotation?

Trả lời

7

Chuyển biến đổi sang thông số xycoordstextcoords thay vì tham số transform. Giống như vậy:

fig, ax = make_example_plot() 
tform = blended_transform_factory(ax.transData, ax.transAxes) 
ax.annotate(label, xy=(r, 0), xycoords=tform, 
      xytext=(r, 0.9), textcoords=tform, fontsize='xx-large', 
      ha='center', va='center', color='r', arrowprops=arrowprops) 
+0

Rất đẹp! Tùy chọn để chuyển trực tiếp một phép biến đổi cho các đối số 'xycoords =' và 'textcoords =' dường như không được đề cập trong tài liệu. –

+0

Nó không phải là rất rõ ràng thực sự. Trong [pyplot.annotation] (http://matplotlib.org/1.4.0/api/pyplot_api.html#matplotlib.pyplot.annotate) có nhận xét sau: _ "Bạn có thể sử dụng một thể hiện của Transform hoặc Artist. Trục chú thích để biết thêm chi tiết "_. Điều này dẫn đến [Sử dụng phối hợp phối hợp với chú thích] (http://matplotlib.org/1.4.0/users/annotations_guide.html#using-complex-coordinate-with-annotation), cung cấp một số ví dụ tốt. – titusjan

+1

Chà, tài liệu có thể thực sự làm với một số làm rõ ... –

Các vấn đề liên quan