Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以使用matplotlib进行添加剂混合?_Python_Matplotlib_Blending_Color Blending - Fatal编程技术网

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()
结果是:


如果您只需要一个图像作为结果,您可以将画布缓冲区作为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;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版本中,最终结果并没有那么漂亮(透明度被搞砸了),但我相信只要稍微调整一下,我现在就能让它工作了。谢谢因此,目前没有获得矢量化图形的解决方案(当你给出答案时,我实际上正在检查buffer_rgba()函数。是的,我认为这是目前使用Matplotlib可以做到的最好的方法。由于某种原因,在我的Matplotlib版本中,最终结果不太漂亮(透明度被搞砸了),但我相信只要稍作调整,我现在就能让它工作。谢谢!所以目前还没有获得矢量化图形的解决方案?:(这是你的图库吗?如果是,你应该在回答中明确表示你是你的图库的授权人?如果是,你应该在回答中明确表示你是作者