猿问

反转数组中的点 - Matplotlib

我在 Matplotlib 中绘制了一系列点。这是我的代码:


masked = r['masks']


  fig=plt.figure()

  ax2=fig.add_axes([0,0,1,1])


  colors = ['b', 'g', 'r', 'c', 'm','y']


  for idx in range(masked.shape[2]):

    array = masked[:,:,idx]


    xs = []

    ys = []

    for i in range(len(array)):

        for j in range(len(array[0])):

            if array[i][j] == True:

                xs.append(j)

                ys.append(i)

    # ys.reverse()


    ax2.scatter(xs, ys, color=str(colors[idx]))

  

  plt.show()

这给了我这个情节: 情节 1

当我在上面的代码片段中取消注释时ys.reverse(),我希望图像垂直翻转,但我却得到了这个,这是完全错误的:

地块 2

我该如何解决这个问题并使情节正确翻转?注意:我不想要这样的解决方案plt.gca.invert_yaxis()- 我想要更正点数组。

谢谢,Vineeth


慕后森
浏览 136回答 2
2回答

Helenr

这是一个散点图,因此反转ys会弄乱数据,即您的点将(x0, y0)变成(x0, yn).如果你想翻转ys而不仅仅是翻转绘图轴,你需要做一些类似的事情ys = (ys.max() + ys.min()) - ys。您可以替换(ys.max() + ys.min())为更合适的数字。在您的代码中,您将替换:ax2.scatter(xs, ys, color=str(colors[idx]))和:xs = np.asarray(xs)ys = np.asarray(ys)# reverse ysys = (ys.max() + ys.min()) - ysax2.scatter(xs, ys, color=str(colors[idx]))

狐的传说

当您绘制散点图时,matplotlib 所做的是获取 x 和 y 数组的第 n 个元素,并使用这些坐标绘制一个点。这就是为什么仅仅颠倒顺序不起作用的原因(至少我还没有找到这样的工作解决方案)。你应该做的是正确地转换点 - 警告,前面有一些线性代数!这个想法很简单:首先减去每个 xs 点的 xs 均值(它的均值将为零)然后,用水平翻转矩阵 [[-1, 0], [0, 1]] 变换 xs 和 ys 点最后,将 xs 均值加回去,因此这些点再次以 x 为中心,位于它们之前的位置因此,在创建数组后,您应该尝试以下操作:xs_mean = sum(xs) / len(xs)matrix = [[-1, 0], [0, 1]]xss, yss = [], []for x, y in zip(xss, yss):    [x, y] = np.matmul(matrix, [x, y])    xss.append(x + x_mean)    yss.append(y)ax2.scatter(xss, yss, color=str(colors[idx]))我相信可能有更简单的方法来做到这一点,但我希望这被证明是有用的
随时随地看视频慕课网APP

相关分类

Python
我要回答