2011-11-14 40 views
5

Tôi có một ô trong pylab mà tôi muốn kẹp vào đường viền của bản đồ Vương quốc Anh.Cắt một hình ảnh bằng cách sử dụng một số bản vá trong matplotlib

Tôi cũng đã thực hiện một loạt các bản vá lỗi có chứa các đường nét của mỗi nước: một cho nước Anh, một cho Wales, vv

Clipping cốt truyện một bản vá hoạt động rực rỡ:

fig = plt.figure() 
ax = fig.add_subplot(111) 
im = ax.scatter(x,y,c = z) 
ax.add_patch(patch) 
im.set_clip_path(patch) 

Nhưng nếu tôi cố gắng và làm điều đó nhiều hơn một, nó khiến tôi không có gì - dễ hiểu, vì không có phần nào của cốt truyện ở trong mỗi quốc gia cùng một lúc.

Có ai biết cách tôi có thể cắt bằng cách sử dụng câu lệnh loại 'OR' không? (ví dụ: không clip nếu trong bản vá này hoặc bản vá này, v.v.)

+0

Tôi chưa từng làm việc với các bản vá lỗi, nhưng có cách nào để chúng có thể được thêm vào cùng nhau không? –

+0

Ngẫu nhiên, nếu bạn đang làm một cái gì đó đòi hỏi một bản đồ, tôi giả sử bạn đã tìm thấy sơ đồ nền, một phần mở rộng matplotlib để vẽ bản đồ? –

+0

Cảm ơn bạn Thomas - vâng, tôi đã tìm thấy bản đồ cơ sở. Nó là rất tốt cho âm mưu geolocated điểm/liên nước chảy vv, và thực sự sẽ làm việc tốt trong ví dụ này. Tôi chưa làm cách nào để tạo ra các ô như KDE có thể phù hợp với ranh giới bản đồ, và tôi đã tìm kiếm một giải pháp tổng quát hơn. –

Trả lời

6

Tôi nghĩ bạn có thể làm điều này bằng cách tạo nhiều ô phân tán, cắt từng ô bằng một bản vá duy nhất (ví dụ: một bản có nước Anh, một nước có Ireland, v.v.). Mặc dù điều này có thể không phải những gì bạn yêu cầu, tức là "Có ai biết làm thế nào tôi có thể clip sử dụng tuyên bố kiểu một 'OR'?", Nó sẽ có tác dụng tương tự:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

np.random.seed(101) 
x = np.random.random(100) 
y = np.random.random(100) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
imForEngland = ax.scatter(x,y) 
fig.savefig('beforeclip.png') 
imForWales = ax.scatter(x,y) 
england = patches.Circle((.75,.75),radius=.25,fc='none') 
wales = patches.Circle((.25,.25),radius=.25,fc='none') 
ax.add_patch(england) 
ax.add_patch(wales) 
imForEngland.set_clip_path(england) 
imForWales.set_clip_path(wales) 

fig.savefig('afterclip.png') 

Trước khi bản vá lỗi: enter image description here Sau các bản vá lỗi: enter image description here

+0

Cảm ơn Yann! Ý tưởng tuyệt vời. –

+0

Không có vấn đề @ hannah-fry, nếu bạn cho rằng "câu trả lời" của bạn, thì hãy kiểm tra nó ở bên trái. Nếu không, hy vọng ai đó có thể cung cấp cho bạn một câu trả lời cụ thể hơn. – Yann

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