我尝试了其他评论中给出的两种设置,即
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
不幸的是,它们都不适合我。
所以我尝试了一种完全不同的方法,这是一个巨大的 hack,但至少完成了工作。当您传递alpha
给imshow
它时,它会设置一个 alpha 值,该值将用于与其他图像混合。由于更高功率的原因(正如@mfra 所提到的),这会产生我们如此鄙视的白线。显然,关键是不要将 alpha 值传递给imshow
. 但是,我们仍然需要以某种方式创建颜色条。
因此,作为一种解决方法,我们可以在给imshow
. 例如,让我们使用winter
颜色图:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
xx, yy = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100))
zz = xx**2 + yy**2
my_cmap_rgb = plt.get_cmap('winter')(np.arange(256))
alpha = 0.5
for i in range(3): # Do not include the last column!
my_cmap_rgb[:,i] = (1 - alpha) + alpha*my_cmap_rgb[:,i]
my_cmap = mpl.colors.ListedColormap(my_cmap_rgb, name='my_cmap')
my_cmap_rgb
在这里,我基于非 Alpha 通道(0、1 和 2)创建一个新的颜色图,winter
然后编辑非 Alpha 通道(0、1 和 2)以自己进行 Alpha 混合。然后我可以简单地使用这个新的颜色图来绘制我的图。
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
ax.set_title("No lines and no transparency")
现在将其与您在没有此技巧的情况下获得的图像进行比较:
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap='winter', alpha=0.5)
cbar = plt.colorbar(cim)
ax.set_title("Lines and transparency")
显然,如果您不需要透明度,问题就解决了。另一方面,如果您确实需要透明度,还有另一种解决方法。您必须首先绘制没有透明度的图像以获得颜色条,然后绘制具有透明度但不会使用其颜色条的图像。
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
plt.cla() # Clears axis
ax.plot(50,50, 'ko')
ax.imshow(zz, cmap='winter', alpha=0.5)
ax.set_title("No lines and transparency")
这会导致图像的颜色条没有线条但仍保持透明度。虽然它仍然是一个巨大的黑客,但至少我们不必再忍受这些线了!