2012-01-04 23 views

Trả lời

23

Tôi sẽ xóa nhãn đánh dấu và thay thế văn bản bằng patches. Dưới đây là một ví dụ ngắn gọn về thực hiện nhiệm vụ này:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 


# define where to put symbols vertically 
TICKYPOS = -.6 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(range(10)) 

# set ticks where your images will be 
ax.get_xaxis().set_ticks([2,4,6,8]) 
# remove tick labels 
ax.get_xaxis().set_ticklabels([]) 


# add a series of patches to serve as tick labels 
ax.add_patch(patches.Circle((2,TICKYPOS),radius=.2, 
          fill=True,clip_on=False)) 
ax.add_patch(patches.Circle((4,TICKYPOS),radius=.2, 
          fill=False,clip_on=False)) 
ax.add_patch(patches.Rectangle((6-.1,TICKYPOS-.05),.2,.2, 
           fill=True,clip_on=False)) 
ax.add_patch(patches.Rectangle((8-.1,TICKYPOS-.05),.2,.2, 
           fill=False,clip_on=False)) 

Điều này dẫn đến hình sau:

enter image description here

Nó là chìa khóa để thiết lập clip_on-False, nếu không patches bên ngoài các trục sẽ không được được hiển thị. Các tọa độ và kích thước (bán kính, chiều rộng, chiều cao, vv) của các bản vá sẽ phụ thuộc vào vị trí các trục của bạn trong hình. Ví dụ, nếu bạn đang cân nhắc thực hiện điều này với các subplots, bạn sẽ cần phải nhạy cảm với các vị trí đắp vá để không chồng lên bất kỳ trục nào khác. Nó có thể là giá trị thời gian của bạn điều tra Transformations, và xác định vị trí và kích cỡ trong một đơn vị khác (Trục, Hình hoặc hiển thị).

Nếu bạn có tệp hình ảnh cụ thể mà bạn muốn sử dụng cho biểu tượng, bạn có thể sử dụng lớp BboxImage để tạo nghệ sĩ được thêm vào trục thay vì bản vá. Ví dụ tôi đã thực hiện một biểu tượng đơn giản với các kịch bản sau đây:

import matplotlib.pyplot as plt 

fig = plt.figure(figsize=(1,1),dpi=400) 
ax = fig.add_axes([0,0,1,1],frameon=False) 
ax.set_axis_off() 

ax.plot(range(10),linewidth=32) 
ax.plot(range(9,-1,-1),linewidth=32) 

fig.savefig('thumb.png') 

sản xuất hình ảnh này:

enter image description here

Sau đó, tôi đã tạo ra một BboxImage tại vị trí tôi muốn nhãn đánh dấu và kích thước tôi muốn:

lowerCorner = ax.transData.transform((.8,TICKYPOS-.2)) 
upperCorner = ax.transData.transform((1.2,TICKYPOS+.2)) 

bbox_image = BboxImage(Bbox([lowerCorner[0], 
          lowerCorner[1], 
          upperCorner[0], 
          upperCorner[1], 
          ]), 
         norm = None, 
         origin=None, 
         clip_on=False, 
         ) 

Được chú ý cách chuyển đổi từ đơn vị dữ liệu sang đơn vị hiển thị, whic h được yêu cầu trong định nghĩa của Bbox.

Bây giờ tôi đọc trong hình ảnh bằng cách sử dụng thường xuyên imread, và thiết lập kết quả của nó (một mảng NumPy) số liệu của bbox_image và thêm các nghệ sĩ với các trục:

bbox_image.set_data(imread('thumb.png')) 
ax.add_artist(bbox_image) 

Điều này dẫn đến một con số được cập nhật : enter image description here

Nếu bạn trực tiếp sử dụng hình ảnh, hãy chắc chắn để nhập khẩu các lớp học và phương pháp cần thiết:

from matplotlib.image import BboxImage,imread 
from matplotlib.transforms import Bbox 
Các vấn đề liên quan