为了账号安全,请及时绑定邮箱和手机立即绑定

反转数组中的点 - Matplotlib

反转数组中的点 - Matplotlib

慕后森 2023-05-09 16:09:47
我在 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
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

这是一个散点图,因此反转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 ys

ys = (ys.max() + ys.min()) - ys


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


查看完整回答
反对 回复 2023-05-09
?
狐的传说

TA贡献1804条经验 获得超3个赞

当您绘制散点图时,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]))

我相信可能有更简单的方法来做到这一点,但我希望这被证明是有用的


查看完整回答
反对 回复 2023-05-09
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信