7

问题: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

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 赋予轮廓,

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

图的方向不正确(旋转)。要恢复正确的方向,必须转置 scalar_field:

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

那么轮廓期望 scalar_field 具有的顺序是什么?

4

2 回答 2

8

您应该使用为andcontour传递二维数组进行绘图,然后数组中的每个点将对应于and中的坐标。您可以方便地创建和使用:XYscalar_field(x, y)XYXYnumpy.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)    

如果您希望坐标表示行和表示列,则可以将参数indexing更改为,但在这种情况下必须使用索引计算。'ij'xyscalar_fiedij

于 2013-09-16T20:22:31.280 回答
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)
于 2013-09-16T19:56:55.040 回答