我正在尝试使用Matplotlib在轮廓上绘制一些点。
我有要从中绘制轮廓的标量场。但是,我的ndarray的尺寸为0 x 20,但是我的实际空间从-4到4不等。
我可以使用以下代码绘制此轮廓:
x, y = numpy.mgrid[-4:4:20*1j, -4:4:20*1j]
# Draw the scalar field level curves
cs = plt.contour(scalar_field, extent=[-4, 4, -4, 4])
plt.clabel(cs, inline=1, fontsize=10)
问题在于,因为我必须在该图上绘制一些点,并且这些点是使用ndarray获得的,即,我得到的点随此数组维数而变化。
我试图使用以下代码绘制这些点:
def plot_singularities(x_dim, y_dim, steps, scalar_field, min_points, max_points, file_path):
"""
:param x_dim : the x dimension of the scalar field
:param y_dim : the y dimension of the scalar field
:param steps : the discretization of the scalar field
:param file_path : the path to save the data
:param scalar_field : the scalar_field to be plot
:param min_points : a set (x, y) of min points of the scalar field
:param max_points : a set (x, y) of max points of the scalar field
"""
min_points_x = min_points[0]
min_points_y = min_points[1]
max_points_x = max_points[0]
max_points_y = max_points[1]
plt.figure()
x, y = numpy.mgrid[-x_dim:x_dim:steps*1j, -y_dim:y_dim:steps*1j]
# Draw the scalar field level curves
cs = plt.contour(scalar_field, extent=[-x_dim, x_dim, -y_dim, y_dim])
plt.clabel(cs, inline=1, fontsize=10)
# Draw the min points
plt.plot(min_points_x, min_points_y, 'ro')
# Draw the max points
plt.plot(max_points_x, max_points_y, 'bo')
plt.savefig(file_path + '.png', dpi=100)
plt.close()
但是我得到了这张图片:
这是不正确的。
如果我更改此行:
cs = plt.contour(scalar_field, extent=[-x_dim, x_dim, -y_dim, y_dim])
对于那个:
cs = plt.contour(scalar_field)
I get the desired behavior, but the extents doesn't show my real data space, but the ndarray dimension.
At last, if I don't plot these points (comment the plot() lines), I can the extents that I want:
But I have to plot the points. Both data are in the same space. But the contour() function allows me to specify the grid. I could found a manner to do this when plotting the points.
How can I properly set the extents?
If you don't provide x
and y
data corresponding to the scalar field, contour
uses integer values up to the size of the array. That is why the axes are displaying the dimension of the array. The parameters extent
should give the minimum and maximum x
and y
values; I assume this is what you mean by "data space." So the call to contour
would be:
contour(scalar_field,extent=[-4,4,-4,4])
This can be reproduced by specifying x
and y
data:
contour(numpy.linspace(-4,4,20),numpy.linspace(-4,4,20),scalar_field)
然后,轮廓看起来与第一个绘图完全相同。我认为这是不正确的原因,因为最小和最大点不在正确的位置。根据您所提供的信息,这是因为min_points
和max_points
你传递给你的函数是指数的阵列scalar_field
,所以它们对应于整数,而不是实际的x
和y
值。通过定义以下内容,尝试使用这些索引来访问x
和y
点:
x=numpy.linspace(-4,4,20)
y=numpy.linspace(-4,4,20)
例如,如果最小点为(0,1)
,则对应于(x[0], y[1])
。我认为使用可以完成类似的操作mgrid
,但我自己从未使用过。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句