【问题标题】:Convert QuadMesh generated by pcolormesh to an RGBA array将 pcolormesh 生成的 QuadMesh 转换为 RGBA 数组
【发布时间】:2021-01-08 17:54:08
【问题描述】:

假设我有以下代码:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = np.arange(10)
z = np.sum(np.meshgrid(x,y), 0)

qm = plt.pcolormesh(x, y, z[:-1, :-1])

qm 现在是 QuadMesh 对象。现在,我想将此 QuadMesh 转换为一个 RGBA 数组,在本例中是一个 9x9x4 数组,给出每个点的红色、绿色、蓝色和 alpha 值。

QuadmEsh 对象确实有一个to_rgba() 子例程,但我无法解释documentationto_rgba() 需要一些 x 值,其中 x 被描述为“一维或二维标量序列,并且将根据规范和颜色图返回相应的 rgba 值 ndarray为此 ScalarMappable 设置”。但我不确定这意味着什么......

【问题讨论】:

  • 首先,您的代码并没有按照您的想法执行。但除此之外:为什么需要这种很少需要的方法?你试图达到的目标是什么?这听起来有点像 X-Y 问题,但也许我错了。
  • 我在z 的作业中有错字,我认为这就是您的引用(现已修复)。最终我试图找到这个问题的答案:stackoverflow.com/questions/62884579/… 不涉及绘制单个矩形。我的想法是,如果我可以提取 RGBA 图像,我可以编辑 alpha 值并使用 imshow 重新绘制。
  • 这确实是我能想到的唯一一个 to_rgba() 的应用(但我很高兴了解其他用途)。

标签: python matplotlib


【解决方案1】:

我不相信在绘制 pcolormesh 之前没有更好的方法来解决这个问题,但我认为这是你打算做的:

from matplotlib import pyplot as plt
import numpy as np

fig, (ax1, ax2) = plt.subplots(1, 2)

x = np.arange(10)
y = np.arange(10)
z = np.sum(np.meshgrid(x,y), 0)
    
qm1 = ax1.pcolormesh(x, y, z[:-1, :-1], cmap="plasma")
ax1.axes.set_aspect("equal")

#retrieve rgba values of the quadmesh object
rgbas = qm1.to_rgba(qm1.get_array().reshape(z[:-1, :-1].shape))

#modify the alpha values
rgbas[:, :, 3] = np.linspace(0, 1, z[:-1, :-1].size).reshape(z[:-1, :-1].shape)

#plot back with imshow 
qm2 = ax2.imshow(rgbas, origin="lower")

ax1.set_title("pcolormesh")
ax2.set_title("imshow after alpha modification")
plt.tight_layout()
plt.show()

示例输出:

【讨论】:

猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2012-04-11
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多