2016-03-13 17 views
5

Tôi hiện đang xây dựng một âm mưu bằng cách sử dụng hình chữ nhật Các bản vá để hiển thị một chuỗi các vị trí.Lớp phủ xoay Ảnh trên ô với Matplotlib

Plot of sequence

EDIT: Mã sử ​​dụng để tạo này (được xây dựng tắt của thư viện RLPy) -

def visualize_trajectory(self, trajectory=[[0,0,0,0], [0.1,0.1,0,0]]): 
    domain_fig = plt.figure() 

    for i, s in enumerate(trajectory): 
     x, y, speed, heading = s[:4] 
     car_xmin = x - self.REAR_WHEEL_RELATIVE_LOC 
     car_ymin = y - self.CAR_WIDTH/2. 

     car_fig = matplotlib.patches.Rectangle(
      [car_xmin, 
      car_ymin], 
      self.CAR_LENGTH, 
      self.CAR_WIDTH, 
      alpha=(0.8 * i)/len(trajectory)) 
     rotation = Affine2D().rotate_deg_around(
      x, y, heading * 180/np.pi) + plt.gca().transData 
     car_fig.set_transform(rotation) 
     plt.gca().add_patch(car_fig) 

Có cách nào để che phủ mỗi người trong các bản vá lỗi với hình ảnh? Lý tưởng nhất, sẽ có một hình ảnh xe hơi thay vì một hình chữ nhật ở mỗi vị trí.

Tôi đã chơi xung quanh với AnnotationBbox và TransformedBbox, nhưng cả hai dường như không linh hoạt khi giao dịch với xoay vòng.

+0

Mã nối trên. – richliaw

Trả lời

2

Hãy xem demo_affine_image từ matplotlib gallery. Nó cho thấy cách để xoay hình ảnh.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.transforms as mtransforms 
import matplotlib.cbook as cbook 

def get_image(): 
    fn = cbook.get_sample_data("necked_tensile_specimen.png") 
    arr = plt.imread(fn) 
    # make background transparent 
    # you won't have to do this if your car image already has a transparent background 
    mask = (arr == (1,1,1,1)).all(axis=-1) 
    arr[mask] = 0 
    return arr 

def imshow_affine(ax, z, *args, **kwargs): 
    im = ax.imshow(z, *args, **kwargs) 
    x1, x2, y1, y2 = im.get_extent() 
    im._image_skew_coordinate = (x2, y1) 
    return im 

N = 7 
x = np.linspace(0, 1, N) 
y = x**1.1 
heading = np.linspace(10, 90, N) 
trajectory = list(zip(x, y, heading)) 
width, height = 0.3, 0.3 
car = get_image() 
fig, ax = plt.subplots() 
for i, t in enumerate(trajectory, start=1): 
    xi, yi, deg = t 
    im = imshow_affine(ax, car, interpolation='none', 
         extent=[0, width, 0, height], clip_on=True, 
         alpha=0.8*i/len(trajectory)) 
    center_x, center_y = width//2, height//2 
    im_trans = (mtransforms.Affine2D() 
       .rotate_deg_around(center_x, center_y, deg) 
       .translate(xi, yi) 
       + ax.transData) 
    im.set_transform(im_trans) 

ax.set_xlim(-0.5, 1.5) 
ax.set_ylim(-0.5, 1.7) 
plt.show() 

enter image description here

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