2013-09-16 47 views
5

Câu hỏi: đường viền từ matplotlib mong đợi cho mảng 2D đầu vào là gì?Thứ tự mảng đường viền đầu vào matplotlib

Xây dựng: Matplotlib tài liệu hướng dẫn đường viền nói rằng các cuộc gọi thông thường là

x_axis = np.linspace(10,100,n_x) 
y_axis = np.linspace(10,100,n_y) 
matplotlib.pyplot.contour(x_axis, y_axis, scalar_field) 

đâu scalar_field phải là một mảng 2D. Ví dụ, scalar_field có thể được tạo ra bởi

scalar_field = np.array([(x*y) for x in x_axis for y in y_axis]) 
scalar_field = scalar_field.reshape(n_x, n_y) 

Nếu scalar_field được trao cho đường viền,

plt.contour(x_axis, y_axis,scalar_field) #incorrect 

định hướng của cốt truyện là không chính xác (xoay). Để khôi phục đúng hướng, scalar_field phải được chuyển vị trí:

plt.contour(x_axis, y_axis,scalar_field.transpose()) #correct 

Vì vậy, thứ tự đường viền mong đợi rằng scalar_field có là gì?

Trả lời

5

Bạn nên vẽ bằng mảng contour qua cũng 2-D cho XY, sau đó mỗi điểm trong scalar_field mảng của bạn sẽ tương ứng với một phối hợp (x, y) trong XY. Bạn có thể thoải mái tạo XY sử dụng numpy.meshgrid:

import matplotlib.pyplot as plt 
import numpy as np 

X, Y = np.meshgrid(x_axis, y_axis, copy=False, indexing='xy') 
plt.contour(X, Y, scalar_field)  

Đối số indexing có thể được thay đổi để 'ij' nếu bạn muốn x phối hợp để đại diện cho dòng và y để đại diện cho cột, nhưng trong trường hợp này scalar_fied phải được tính bằng ij lập chỉ mục.

+0

Bạn có thể vui lòng xây dựng trên phần chỉ mục và thứ tự không? – Ivan

+0

@Ivan Khi bạn sử dụng chỉ mục 'xy'' bạn có thể tưởng tượng bạn đang nhìn vào ma trận từ phía trên và tọa độ x đi từ trái sang phải, trong khi toạ độ y từ dưới lên trên. Đây không phải là những gì bạn muốn đôi khi, do đó bạn có tùy chọn để sử dụng '' ij'' chỉ mục, nơi chỉ số đầu tiên có thể được xem như là dòng và thứ hai là cột ... –

2

Các giá trị x dự kiến ​​sẽ tương ứng với cột dữ liệu, không phải là hàng (ví dụ: x là trục ngang và y là trục thẳng đứng). Bạn có nó đảo ngược, đó là lý do tại sao bạn phải chuyển đổi các giá trị z để làm cho nó hoạt động.

Để tránh yêu cầu chuyển vị, tạo mảng của bạn như:

scalar_field = np.array([(x*y) for y in y_axis for x in x_axis]) 
scalar_field = scalar_field.reshape(n_y, n_x) 
+0

Bạn có thể giải thích ở đâu trong tài liệu nói rằng bạn đang nói gì về x và y không? – Ivan

+0

Chuỗi tài liệu 'đường viền 'cho matplotlib 1.2.1 cho biết" * X * và * Y * phải là 2-D với hình dạng giống như * Z *, hoặc cả hai phải là 1-D sao cho '' len (X) '' là số cột trong * Z * và '' len (Y) '' là số hàng trong * Z *. " – bogatron

+0

Có, nhưng đó chính xác là câu hỏi của tôi: len (x) là chỉ mục _first_, vì vậy việc định hình lại phải tuân theo điều đó, và do đó câu trả lời đúng là định hình lại (n_x, n_y) và không phải là cách khác. Đó là lý do tại sao là khó hiểu. – Ivan