2012-03-21 32 views
7

Tôi đang cố gắng để sản xuất một đường viền đầy cốt truyện trong matplotlib bằng cách sử dụng contourf. Dữ liệu bị thiếu trong một mẫu răng cưa gần cuối cốt truyện. Mảng đường bao hóa ra trống không chỉ nơi dữ liệu ban đầu được đeo mặt nạ, mà còn trong các túi mà thuật toán đường bao không thể nội suy một cách rõ ràng bởi vì không có đủ vùng lân cận dữ liệu tốt.masking một phần của một contourf lô trong matplotlib

Tôi biết cách mở rộng tập dữ liệu để tạo đường nét hợp lý trong các túi này. Tuy nhiên, nếu tôi vẽ sơ đồ dữ liệu mở rộng, tôi sẽ tạo đường viền ở khắp mọi nơi. Tôi muốn che giấu các vùng mà dữ liệu gốc bị thiếu trong màu đen hoặc trắng.

Trên một chủ đề trước, tôi đã học cách làm điều này cho một hình ảnh bằng cách vẽ hình ảnh đầu tiên và sau đó phủ lên hình ảnh khác che khuất các vùng xấu. Các tương tự sẽ là đoạn mã dưới đây, nhưng nó không hoạt động cho một đường viền ... Tôi không thể có được bad_data imshow để che đậy âm mưu contourf mở rộng. Có thể không?

Cảm ơn, Eli

import matplotlib.pyplot as plt 
lev = [0.0,0.1,0.2,0.5,1.0,2.0,4.0,8.0,16.0,32.0]   
norml = colors.BoundaryNorm(lev, 256) 
# this is the contour plot, using extended_data so that the contours are plausibly extended 
cs = plt.contourf(x,z,extended_data,levels = lev, cmap = cm.RdBu_r,norm = norml) 
# now the attempt to cover it up -- but imshow will not cover up the original plot as it will with another image 
bad_data = np.ma.masked_where(~data.mask, data.mask, copy=True) 
plt.imshow(bad_data, interpolation='nearest', aspect = 'auto', cmap=cm.gray) 
plt.show() 
+0

tôi nên thêm rằng kể từ khi bài này, tôi nhận ra rằng tôi có thể xác định khu vực và sử dụng fill() để chặn các khu vực. Vì vậy, mức độ khẩn cấp thấp hơn, mặc dù nó vẫn sẽ có giá trị để biết nếu điều này có thể được thực hiện. –

+0

Giả sử bạn có một mảng 5x5 và chỉ mục [1, 1] bị thiếu, bạn sẽ thấy điều gì? Chỉ mục [1, 1] có được vẽ như một điểm đánh dấu không? – pelson

+1

Bạn có thể đăng một ví dụ làm việc tối thiểu không? – EnricoGiampieri

Trả lời

10

Đúng tôi nếu tôi sai, nhưng như tôi hiểu bạn có tình trạng này:

import numpy as np 
import matplotlib.pyplot as plt 
# generate some data with np.nan values (the missing values) 
d = np.random.rand(10, 10) 
d[2, 2], d[3, 5] = np.nan, np.nan 
# and in your case you actually have masked values too: 
d = np.ma.array(d, mask=d < .2) 
# now all of the above is just for us to get some data with missing (np.nan) and 
# masked values 

Bằng cách vẽ trên với contourf,

plt.contourf(d) 
plt.show() 

Tôi nhận được:

enter image description here

không hiển thị (trống) giá trị được che dấu (d < .2) cũng như giá trị np.nan (d [2, 2], d [3, 5])! và bạn muốn cho matplotlib chỉ không hiển thị các giá trị được che dấu. Vì vậy, chúng ta có thể làm điều này:

# the following line is replaced by your interpolation routine for 
# removing np.nan values 
d[np.isnan(d)] = 1 
# then because we use the masked array only the masked values will still be masked 
# but the np.nan values which were replaced through the interpolation algorithm 
# will show up if we do the contourf plot 
plt.contourf(d) 
plt.show() 

enter image description here

Tôi không biết nhanh như thế nào bằng cách sử dụng mảng đeo mặt nạ là trong trường hợp này, nhưng dù sao đây là cách tôi muốn làm điều đó. Nếu bạn muốn có một màu sắc khác nhau thay vì những điểm trống (whit), bạn cần phải tô màu các bản vá của các trục bên dưới vì contourf thực sự không vẽ bất cứ điều gì mà không có dữ liệu, hoặc dữ liệu đeo mặt nạ:

# make the background dark gray (call this before the contourf) 
plt.gca().patch.set_color('.25') 
plt.contourf(d) 
plt.show() 

để nhận được:

enter image description here

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