编辑:由于这似乎是一个受欢迎的帖子,因此以下解决方案对我来说似乎很好。 谢谢@gazzar和@mfra。
2cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
有谁知道为什么我的颜色条中似乎有线条? 还是为什么颜色过渡不平滑? 显然,我在使用底图,但这没关系,因为所有这些都是在AFAICT之下进行的matplotlib调用。 我创建地图做类似
4grays = plt.cm.get_cmap("Grays")
sc = mymap.scatter(xpoints, ypoints, s=sizes, c=color_values, cmap=grays, alpha=.75,
marker="o", zorder=10, vmin=0, vmax=1)
cbar = mymap.colorbar(sc, drawedges=True, location="bottom")
我尝试了没有和没有alpha,结果是相同的。 也许是因为我的color_values数组不够好吗? 我可以在某处设置映射到颜色栏的基础值吗? 我没有看到如何,也没有在其他地方看到这个问题。 即,我可以复制matplotlib show_colorbars示例,而不会出现此问题。
您是否尝试过以其他格式保存图形? 如果是,您是否总是遇到此问题?
我只是因为alpha才看到了这一点,您真的确定在alpha = 1.0时也一样吗?
是的,它发生在png中,但我没有对此进行故障排除。 是的,我在SVG的alpha = 1.0时看到了它。
嗯..下面列出的所有选项似乎都无法解决我的问题。 将图片另存为PDF时,我的颜色栏仍具有白线。
在最新编辑中作为解决方案给出的两行不应一起使用。 一个或另一个就足够了。
如果创建矢量图形,是否尝试过此操作(取自http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar):
"众所周知,某些矢量图形查看器(svg和pdf)在颜色条的各段之间呈现白色间隙。这是由于查看器中的错误而不是matplotlib所致。作为解决方法,可以使用重叠的段来呈现颜色条:
3cbar = colorbar()
cbar.solids.set_edgecolor("face")
draw()
但是,这在其他情况下也会带来负面影响。特别是对于半透明图像(alpha <1)和颜色条扩展名,并且默认情况下未启用(请参见问题1188)。"
谢谢。确实确实是通过#1188和附加的(还原的)PR读取的问题。同样有趣的是,SVG在Firefox和Chrome中的渲染方式确实有所不同,我没有想到。
看起来alpha <1的最佳结果来自使用drawedges = False和set_edgecolor(" face")。我现在有黑线,但它们的发音不太明显,只有较深的颜色。
这确实是查看器中的一个错误,但是使用次优的方式来渲染颜色条也是正确的。整个图形应使用平滑阴影而不是256个小矩形绘制为单个图形。 PDF和SVG格式均支持具有任意颜色的线性平滑阴影。
看起来您的绘图使用了一些透明(alpha)值。我遇到了同样的问题(半透明的图,但希望颜色条是实心的),这个问题和答案为我解决了!以供参考:
2cbar.set_alpha(1)
cbar.draw_all()
这工作了!这个答案应该更高。
我通常更喜欢对颜色条内容进行栅格化处理,以使用Eric Firing的建议(在此处添加以下行)来避免此问题。
1cbar.solids.set_rasterized(True)
对于具有透明性的图像,此解决方法应该会失败,但是对于大多数正常情况,它会产生所需的结果。
绕到这两年后。这确实确实有很大帮助。
优秀。看起来更好,并且svg输出也更小!
我尝试了其他评论中给出的两个设置,即
2cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
不幸的是,这两个都不对我有用。
因此,我尝试了一种完全不同的方法,这是一个巨大的漏洞,但至少可以完成工作。当您将alpha传递给imshow时,它将设置一个Alpha值,该值将用于与其他图像混合。由于功率较高的原因(如@mfra所提到的),这会产生我们鄙视的白线。显然,关键是不要将alpha值传递给imshow。但是,我们仍然需要以某种方式创建颜色栏。
因此,作为一种解决方法,我们可以在向imshow提供颜色映射之前进行Alpha混合。例如,让我们使用winter颜色图:
13import 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')
在这里,我基于winter创建一个新的颜色图my_cmap_rgb,然后编辑非alpha通道(0、1和2)来自己进行alpha混合。然后,我可以简单地使用这个新的颜色图来绘制我的身影。
4f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
ax.set_title("No lines and no transparency")
现在,将其与无需此技巧即可获得的图像进行比较:
4f, ax = plt.subplots()
cim = ax.imshow(zz, cmap='winter', alpha=0.5)
cbar = plt.colorbar(cim)
ax.set_title("Lines and transparency")
显然,如果您不需要透明度,则可以解决问题。另一方面,如果您确实需要透明度,则还有另一种解决方法。您必须先绘制不透明的图像以获得颜色条,然后再绘制具有透明性但不使用其颜色条的图像。
7f, 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")
这将导致图像的颜色条没有线条,但仍保留透明度。尽管它仍然是一个巨大的漏洞,但至少我们不必再忍受这些行了!
我应用了最后一个技巧(没有alpha的图,有色条的图,有alpha的图),因为我必须通过imshow运行图像,第二个透明地覆盖在第一个上,第二个具有colorbar。因此遇到了透明-条纹问题。
尝试:
1cbar = mymap.colorbar(sc, drawedges=False, location="bottom")
现在,它已经在网络上有很好的记录(我可以找到),但是
2*drawedges* [ False | True ] If true, draw lines at color
boundaries.
(从matplotlib/lib/matplotlib/colorbar.py中拉出)我认为通过将drawedges设置为True,可以告诉它绘制这些线条。
drawedges确实为我绘制了边缘,但是将它们绘制为黑色!没有特别的帮助。 mfras解决方案对我来说毫无优势。 (matplotlib v1.3.1)
由于没有其他建议对我有用,所以我最终从颜色栏实例中删除了Alpha通道:
8from matplotlib.colors import to_rgb
lut = colorbar.solids.get_facecolor()
bg_color = to_rgb('white')
lut[:, :3] *= lut[:, 3:]
lut[:, :3] += (1 - lut[:, 3:]) * bg_color
lut[:, 3] = 1.
colorbar.solids.set_facecolor(lut)
必须先绘制一次颜色栏,然后才能访问面部颜色。
即使不是很优雅,也可以使用以下解决方案。
19In [1]: children = cbar.ax.get_children()
In [2]: children
Out[2]:
[,
,
In [3]: obj = children[1] # Get the LineCollection object
In [4]: obj.set_linewidth(0)