Python 是否可以使用matplotlib进行添加剂混合?

Python 是否可以使用matplotlib进行添加剂混合?,python,matplotlib,blending,color-blending,Python,Matplotlib,Blending,Color Blending,当处理不同颜色的重叠高密度散点图或线图时,可以方便地实现加法混合方案,其中每个标记的RGB颜色相加,以在画布中生成最终颜色。这是2D和3D渲染引擎中的常见操作 然而,在Matplotlib中,我只发现了对alpha/不透明混合的支持。有没有什么迂回的方法可以做到这一点,或者我一直在渲染位图,然后在一些绘画程序中混合它们 编辑:下面是一些示例代码和手动解决方案。 这将产生两个部分重叠的随机分布: x1 = randn(1000) y1 = randn(1000) x2 = randn(1000)

当处理不同颜色的重叠高密度散点图或线图时,可以方便地实现加法混合方案,其中每个标记的RGB颜色相加,以在画布中生成最终颜色。这是2D和3D渲染引擎中的常见操作

然而,在Matplotlib中,我只发现了对alpha/不透明混合的支持。有没有什么迂回的方法可以做到这一点,或者我一直在渲染位图,然后在一些绘画程序中混合它们

编辑:下面是一些示例代码和手动解决方案。

这将产生两个部分重叠的随机分布:

x1 = randn(1000)
y1 = randn(1000)
x2 = randn(1000) * 5
y2 = randn(1000)
scatter(x1,y1,c='b',edgecolors='none')
scatter(x2,y2,c='r',edgecolors='none')
这将在matplotlib中生成以下内容:

如你所见,有一些重叠的蓝色点被红色点遮挡,我们希望看到它们。通过在matplotlib中使用alpha/opacity混合,可以执行以下操作:

scatter(x1,y1,c='b',edgecolors='none',alpha=0.5)
scatter(x2,y2,c='r',edgecolors='none',alpha=0.5)
这将产生以下结果:

但我真正想要的是:

我可以通过将每个绘图单独渲染为位图手动执行此操作:

xlim = plt.xlim()
ylim = plt.ylim()
scatter(x1,y1,c='b',edgecolors='none')
plt.xlim(xlim)
plt.ylim(ylim)
scatter(x2,y2,c='r',edgecolors='none')
plt.xlim(xlim)
plt.ylim(ylim)
plt.savefig(r'scatter_blue.png',transparent=True)
plt.savefig(r'scatter_red.png',transparent=True)
这给了我以下图像:

然后,您可以将它们作为独立层加载到Paint.NET/PhotoShop/gimp中,然后添加混合


现在理想的情况是能够在Matplotlib中以编程方式完成这项任务,因为我将处理数百个这样的任务

如果您只需要一个图像作为结果,您可以将画布缓冲区作为numpy数组获取,然后进行混合,下面是一个示例:

from matplotlib import pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.scatter(x1,y1,c='b',edgecolors='none')
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.patch.set_facecolor("none")
ax.patch.set_edgecolor("none")
fig.canvas.draw()

w, h = fig.canvas.get_width_height()
img = np.frombuffer(fig.canvas.buffer_rgba(), np.uint8).reshape(h, w, -1).copy()

ax.clear()
ax.scatter(x2,y2,c='r',edgecolors='none')
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.patch.set_facecolor("none")
ax.patch.set_edgecolor("none")
fig.canvas.draw()

img2 = np.frombuffer(fig.canvas.buffer_rgba(), np.uint8).reshape(h, w, -1).copy()

img[img[:, :, -1] == 0] = 0
img2[img2[:, :, -1] == 0] = 0

fig.clf()

plt.imshow(np.maximum(img, img2))
plt.subplots_adjust(0, 0, 1, 1)
plt.axis("off")
plt.show()
结果是:


我的matplotlib后端现在支持此功能(仅主控):

导入matplotlib;matplotlib.use(“module://mplcairo.qt")
从matplotlib导入pyplot作为plt
从MPL导入操作员\u t
将numpy作为np导入
x1=np.random.randn(1000)
y1=np.随机随机随机数(1000)
x2=np.随机随机数(1000)*5
y2=np.random.randn(1000)
图,ax=plt.子批次()
#图形和轴背景必须透明。
图补丁集(alpha=0)
ax.patch.set(alpha=0)
pc1=最大散射(x1,y1,c='b',边色='none')
pc2=最大散射(x2,y2,c='r',边色='none')
操作员添加补丁艺术家(pc2)#使用添加剂混合。
plt.show()

最简单的方法可能是制作二维直方图。请向我们展示一些示例代码和数据,让我们开始。谢谢,刚刚添加了一些示例代码和手动解决方案的步骤。谢谢,现在问题好多了,我会看看我能做些什么。我不认为这是一种我们支持的开箱即用的模式。我也不理解你关于“固定颜色背景”的评论,它应该与画布上当前的颜色混合。当你的答案出现时,我实际上正在检查缓冲区函数。是的,我认为这是目前使用Matplotlib可以做到的最好的方法。出于某种原因,在我的Matplotlib版本中,最终结果并没有那么漂亮(透明度被搞砸了),但我相信只要稍微调整一下,我现在就能让它工作了。谢谢因此,目前没有获得矢量化图形的解决方案(这是你的图书馆吗?如果是的话,你应该在回答中明确你是作者