2013-09-16 50 views
5

问题:matplotlib的轮廓期望输入2D数组的顺序是什么?matplotlib轮廓输入数组顺序

精心:Matplotlib轮廓文件说,日常通话

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) 

凡scalar_field必须是一个二维数组。例如,可以通过

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) 

生成scalar_field如果scalar_field给予轮廓,

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

图的取向不正确(旋转)。要恢复正确的方向scalar_field必须调换:

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

那么,什么是为了使轮廓预计scalar_field了?

回答

5

您应该绘制使用contour传球也2- d阵列为XY,然后在scalar_field阵列中的每个点将对应于坐标(x, y) in X and Y。您可以使用numpy.meshgrid方便地创建XY

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)  

的参数indexing可以更改为'ij'如果希望x坐标来表示线和y代表列,但在这种情况下scalar_fied必须使用ij计算索引。

+0

请您详细说明索引部分和顺序吗? – Ivan

+0

@Ivan当你使用''xy''索引时,你可以想象你从上面看矩阵,x坐标从左到右,而y坐标从底部到顶部。这不是你想要的,所以你可以选择'ij''索引,其中第一个索引可以看作是行,第二个索引可以看作是列... –

2

x值预计对应于列中的数据的,而不是行(即,x是水平轴和y是垂直轴)。您已将其颠倒过来,这就是为什么您必须转置z值才能使其正常工作。

为了避免需要转置,创建你阵列:

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

你能解释一下它在说什么你说关于X和Y的文件? – Ivan

+0

matplotlib 1.2.1的'contour' doc字符串表示“* X *和* Y *必须都是与* Z *形状相同的2-D,或者它们必须都是1-D,这样len( X)''是* Z *中的列数,''len(Y)''是* Z *中的行数。“ – bogatron

+0

是的,但这正是我的问题:len(x)是_first_索引,因此重塑必须遵守,因此正确的答案是重塑(n_x,n_y),而不是相反。这就是为什么混乱。 – Ivan