2012-01-25 28 views
25

Tôi có một vấn đề đơn giản trong python và matplotlib. Tôi có 3 danh sách: x, y và rho với rho [i] mật độ tại điểm x [i], y [i]. Tất cả các giá trị của x và y nằm trong khoảng từ -1. và 1. nhưng chúng không theo thứ tự cụ thể.Python: 2d đường viền cốt truyện từ 3 danh sách: x, y và rho?

Cách tạo một đường bao (giống với imshow) của mật độ rho (nội suy tại các điểm x, y).

Cảm ơn bạn rất nhiều.

EDIT: Tôi làm việc với mảng lớn: x, y và rho có từ 10.000 đến 1.000.000 yếu tố

+0

đã mã bạn chấp nhận làm việc cho bạn? có cùng kiểu kịch bản nhưng không thể giải quyết được. – diffracteD

Trả lời

39

Bạn cần phải suy rho giá trị của bạn. Không có cách nào để làm điều này, và phương pháp "tốt nhất" phụ thuộc hoàn toàn vào thông tin ưu tiên bạn nên kết hợp vào nội suy.

Trước khi tôi đi vào một phương pháp nội suy "hộp đen", mặc dù, một hàm cơ sở hướng tâm (ví dụ: "mỏng-tấm-spline" là một loại đặc biệt của chức năng cơ sở xuyên tâm) thường là một lựa chọn tốt. Nếu bạn có hàng triệu điểm, thực hiện này sẽ không hiệu quả, nhưng như là một điểm khởi đầu:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate 

# Generate data: 
x, y, z = 10 * np.random.random((3,10)) 

# Set up a regular grid of interpolation points 
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) 
xi, yi = np.meshgrid(xi, yi) 

# Interpolate 
rbf = scipy.interpolate.Rbf(x, y, z, function='linear') 
zi = rbf(xi, yi) 

plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower', 
      extent=[x.min(), x.max(), y.min(), y.max()]) 
plt.scatter(x, y, c=z) 
plt.colorbar() 
plt.show() 

enter image description here

+0

Phương pháp rất thú vị nhưng nó không hoạt động với các mảng lớn: x, y và rho có khoảng 10000 phần tử ... – Vincent

+0

Bạn vẫn có thể sử dụng Rbf cho mảng lớn, bạn chỉ cần bao gồm các điểm lân cận. Tôi sẽ thêm một ví dụ chỉ trong một chút. Cách khác, nếu bạn không muốn thực sự lấy mẫu mọi thứ trên một mạng lưới thông thường, bạn có thể sử dụng tam giác delaunay để vẽ các đường bao (mà chỉ là một dạng nội suy đơn giản và không đặc biệt trơn tru). Tuy nhiên, với nhiều điểm đó, thực tế hơn là chỉ cần sử dụng phương thức nội suy cục bộ. –

+0

@JoeKington Xin chào, tôi đang gặp sự cố với mã ở trên, Tập dữ liệu của tôi bao gồm các danh sách x, y và z. x và y khác nhau độc lập, z thay đổi tùy theo (x, y). 'x = (1,2 đến 2,5)', 'y = (90 đến 180)' và 'z = (5 đến -5)'. Nếu tôi thử mã trên với tập dữ liệu của tôi, tôi đang nhận được một âm mưu sụp đổ (không có gì dọc theo trục x). Hãy giúp tôi. – diffracteD

11

Bạn có thể sử dụng griddata (yêu cầu scipy> = 0,10), đó là một phương pháp tam giác dựa trên scipy của .

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate 

# Generate data: for N=1e6, the triangulation hogs 1 GB of memory 
N = 1000000 
x, y = 10 * np.random.random((2, N)) 
rho = np.sin(3*x) + np.cos(7*y)**3 

# Set up a regular grid of interpolation points 
xi, yi = np.linspace(x.min(), x.max(), 300), np.linspace(y.min(), y.max(), 300) 
xi, yi = np.meshgrid(xi, yi) 

# Interpolate; there's also method='cubic' for 2-D data such as here 
zi = scipy.interpolate.griddata((x, y), rho, (xi, yi), method='linear') 

plt.imshow(zi, vmin=rho.min(), vmax=rho.max(), origin='lower', 
      extent=[x.min(), x.max(), y.min(), y.max()]) 
plt.colorbar() 
plt.show() 

Ngoài ra còn có khoảng cách nghịch đảo nặng suy - tương tự như RBF, nhưng nên làm việc tốt hơn cho lớn Số điểm: Inverse Distance Weighted (IDW) Interpolation with Python

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