Thay vì từ hoặc số là nhãn đánh dấu của trục x, tôi muốn vẽ một bản vẽ đơn giản (làm bằng đường kẻ và hình tròn) làm nhãn cho mỗi dấu x. Điều này có thể không? Nếu vậy, cách tốt nhất để đi về nó trong matplotlib là gì?Làm thế nào tôi có thể làm cho các nhãn xtick của một âm mưu là bản vẽ đơn giản bằng cách sử dụng matplotlib?
Trả lời
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:
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:
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 :
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