在轮廓上绘制点 - Matplotlib / Python

时间:2014-07-11 22:17:34

标签: python matplotlib plot

我正在尝试使用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()

但我得到了这张图片:

enter image description here

哪个不正确。

如果我更改此行:

cs = plt.contour(scalar_field, extent=[-x_dim, x_dim, -y_dim, y_dim])

对于那个:

cs = plt.contour(scalar_field)

enter image description here

我得到了所需的行为,但扩展区并未显示我的实际数据空间,而是显示 ndarray 维度。

最后,如果我不绘制这些点(注释plot()行),我可以使用我想要的范围:

enter image description here

但我必须绘制积分。 两个数据都在同一个空间中。 但 contour()功能允许我指定网格。 在绘制点时,我可以找到一种方法来做到这一点。

我想知道如何根据需要正确设置范围。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果您未提供与标量字段对应的xy数据,contour将使用最大为数组大小的整数值。这就是轴显示阵列尺寸的原因。参数extent应该提供最小和最大xy值;我认为这就是你所说的数据空间。"因此,对contour的调用将是:

contour(scalar_field,extent=[-4,4,-4,4])

可以通过指定xy数据来重现这一点:

contour(numpy.linspace(-4,4,20),numpy.linspace(-4,4,20),scalar_field)

然后轮廓看起来与第一个图中的完全一致。我认为这是不正确的原因,因为最小和最大点不在正确的位置。根据您提供的信息,这是因为传递给您的函数的min_pointsmax_points indices 到数组scalar_field,因此它们对应于整数,而不是实际的xy值。尝试使用这些索引通过定义:

来访问xy
x=numpy.linspace(-4,4,20)
y=numpy.linspace(-4,4,20)

例如,如果您的最小点为(0,1),则它将与(x[0], y[1])对应。我认为mgrid可以做类似的事情,但我自己从未使用过。

答案 1 :(得分:0)

您想要绘制真实数据空间中的轮廓和点,是吗? plt.contour将获取与您拥有的2d数组相关联的x和y值,并将在轴上正确绘制。

xvals = -x_dim:x_dim:step  # I'm not sure about these ... but you get the idea
yvals = -y_dim:y_dim_step
plt.contour(xvals, yvals, scalar_field)