Python Matplotlib:使用透明颜色填充等高线图
在Matplotlib中,有人知道如何生成具有半透明颜色的美观填充等高线图吗?如果Python Matplotlib:使用透明颜色填充等高线图,python,matplotlib,Python,Matplotlib,在Matplotlib中,有人知道如何生成具有半透明颜色的美观填充等高线图吗?如果contourf()被传递一个带有半透明颜色的颜色贴图,它会在填充区域之间产生小间隙: 根据,这不是一个bug(“tourtf()[…]不绘制多边形边”)。要绘制边,建议“通过调用contour()”添加线条轮廓”。但这看起来也不太好,因为边缘变得过于不透明: 您可以使用contour()的linewidth参数,但这没有多大帮助。有什么想法吗 下面是重现问题的代码(我使用面向对象的API,但结果与pyplot
contourf()
被传递一个带有半透明颜色的颜色贴图,它会在填充区域之间产生小间隙:
根据,这不是一个bug(“tourtf()
[…]不绘制多边形边”)。要绘制边,建议“通过调用contour()
”添加线条轮廓”。但这看起来也不太好,因为边缘变得过于不透明:
您可以使用contour()
的linewidth
参数,但这没有多大帮助。有什么想法吗
下面是重现问题的代码(我使用面向对象的API,但结果与pyplot
相同):
导入matplotlib
将numpy作为np导入
从matplotlib.figure导入图形
从matplotlib.backends.backend_agg导入图Canvasagg
#生成一些数据
形状=(100100)
x_rng=np.linspace(-1,1,shape[1])
y_rng=np.linspace(-1,1,shape[0])
x、 y=np.meshgrid(x_rng,y_rng)
z=np.sqrt(x**2+y**2)
#塑造形象
宽度?英寸,高度?英寸=5,5?结果为500x500px,dpi=100
图=图()
图设置尺寸英寸((宽度英寸,高度英寸))
图Canvasagg(图)
ax=图添加轴([0,0,1,1.])
ax.set_axis_off()
#定义一些alpha<1的颜色
α=0.9
颜色=[
(0.1,0.1,0.5,α),#深蓝色
(0.0,0.7,0.3,阿尔法),#绿色
(0.9,0.2,0.7,α),#粉红色
(0.0,0.0,0.0,alpha),#黑色
(0.1,0.7,0.7,α),#浅蓝色
]
cmap=matplotlib.colors.ListedColormap(颜色)
levels=np.array(np.linspace(0,z.max(),len(colors)))
norm=matplotlib.colors.BoundaryNorm(级别,ncolors=cmap.N)
#轮廓图在填充区域之间产生小间隙
cnt=ax.contourf(x,y,z,levels,cmap=cmap,norm=norm,
抗锯齿=真,linecolor='none')
#这填补了空白,但使其过于不透明
#最大轮廓(x,y,z,水平,cmap=cmap,norm=norm,
#抗锯齿=真)
#这一技巧也是如此:
#对于cnt.collections中的c:
#c.设置边缘颜色(“面”)
filename=“/tmp/contourf.png”
fig.savefig(文件名,dpi=100,transparent=True,format=“png”)
PS:SVG后端的相同绘图看起来不错
PPS:pcolormesh()
也有类似的问题:
ax.pcolormesh(x,y,z,cmap=cmap,norm=norm,
edgecolor=“面”,抗锯齿=真)
我不知道这是否解决了您的问题,因为“好看”有点主观,但当放大到该级别时,获得没有任何抗锯齿问题或锯齿边缘的图像的唯一方法是使用矢量格式,如SVG、EPS等(如您所指出的) SVG(可缩放矢量图形) 如果禁用抗锯齿功能,可以消除边缘模糊和“不透明”,但在高缩放级别时,圆将呈现锯齿状边缘外观。您可以尝试将dpi增加到300dpi,并保存为tiff: Tiff,300dpi,抗锯齿=False 抗锯齿将沿圆边界混合图像,因此混合透明的粉红色和绿色将产生一种看起来更暗的颜色,这可能会给人一种看起来更不透明的印象,即使透明度在概念上是相同的 我对代码的以下部分进行了注释,得到了不同的外观结果,但结果过于主观,无法判断哪个更好看: 设置轮廓,但不设置边缘颜色:
ax.contour(x, y, z, levels, cmap=cmap, norm=norm,
antialiased=True)
# the same is true for this trick:
# for c in cnt.collections:
# c.set_edgecolor("face")
不设置轮廓,但设置边缘颜色:
# ax.contour(x, y, z, levels, cmap=cmap, norm=norm,
# antialiased=True)
# the same is true for this trick:
for c in cnt.collections:
c.set_edgecolor("face")
但它们是否好看取决于解释。我发现的另一件事是,我的图像查看器内置了自己的抗锯齿功能,所以在尝试进行比较时,您可能希望关闭该功能 备注:
antialiased=True
似乎有效果(但关闭它也不会产生好的结果)。感谢您的关注。我通过在不使用透明度的情况下绘图(使用RGB颜色作为RGBA颜色的“占位符”)以及在后处理步骤中应用透明度来解决这个问题。我对你的答案投了赞成票,但没有接受,因为它实际上并没有解决原来的问题。