为什么我的彩条有它的行呢?(why does my colorbar have lines in i

2019-07-20 08:01发布

编辑 :既然这似乎成为一种流行的帖子,这里似乎是为我工作很好的解决方案。 感谢@gazzar和@mfra。

cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")

有谁知道为什么我的彩条有什么似乎是在这行? 或者说为什么是色彩过渡不流畅? 我使用的底图,很明显,但是这不应该的问题,因为它的引擎盖下AFAICT所有matplotlib调用。 我创建的地图做这样的事情

grays = 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")

我想没有,没有字母,结果是一样的。 也许是因为我的color_values阵列是不是足够细? 我可以设置映射到彩条某处背后的价值观? 我不知道怎么了,我没有在其他地方看到这个问题。 即,我可以复制matplotlib show_colorbars例如没有这个问题。

Answer 1:

如果你创建矢量图形,你有没有试过这种(摘自http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar ):

“已知一些矢量图形查看器(SVG和pdf)呈现颜色条段之间白色间隙这是由于在观众的错误不matplotlib作为一种变通方法的颜色条可以用重叠的分段中呈现。:

cbar = colorbar()
cbar.solids.set_edgecolor("face")
draw()

然而,这在其他情况下的消极后果。 特别是半透明的图像(阿尔法<1)和彩条扩展和默认不见(问题#1188)启用“。



Answer 2:

我一般喜欢栅格化彩条的内容,以避免此问题使用埃里克射击的意见, 在这里通过添加以下行。

cbar.solids.set_rasterized(True) 

此替代方法推测失败用于与透明度的图像,但对于大多数正常情况下,它产生所需的结果。



Answer 3:

它看起来像你的小区采用一些透明(alpha)值。 我有同样的问题(半透明的情节,但希望彩条是固体),而这个问题和答案固定它给我的! 以供参考:

cbar.set_alpha(1)
cbar.draw_all()


Answer 4:

我试过的其他意见给出两种设置,即

cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")

不幸的是没有为我工作。

于是,我尝试了完全不同的做法,是一个庞大的黑客攻击,但至少能够完成任务。 当你经过alphaimshow它设置将要用于与其他图像共混alpha值。 由于更高功率的原因(如@mfra已经提到)这造成的白线,我们如此鄙视。 显然然后关键是不能通过的α值来imshow 。 但是,我们仍然需要以某种方式创建的彩条。

因此,作为一种解决办法,我们可以做阿尔法以往给人的colormaps之前勾兑自己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的基础上, winter ,然后编辑一个非阿尔法通道(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")

这导致的图像,其颜色条有没有台词,但仍保留了透明度英寸 虽然它仍然是一个庞大的黑客攻击,至少我们不必忍受这些行了!



Answer 5:

尝试:

cbar = mymap.colorbar(sc, drawedges=False, location="bottom")

现在是有据可查的网站(即我能找到),但

*drawedges*   [ False | True ] If true, draw lines at color
              boundaries.

(从拉matplotlib/lib/matplotlib/colorbar.py )我想通过设置drawedgesTrue你告诉它来绘制这些行。



Answer 6:

下面可即使它不是优雅的另一种解决方案。

In [1]: children = cbar.ax.get_children()
In [2]: children
Out[2]:
[<matplotlib.collections.QuadMesh at 0x21783c41b70>,
 <matplotlib.collections.LineCollection at 0x21783bfdc18>,
 <matplotlib.patches.Polygon at 0x21783ba0588>,
 <matplotlib.patches.Polygon at 0x21783beef98>,
 <matplotlib.spines.Spine at 0x21783b77c88>,
 <matplotlib.spines.Spine at 0x21783b77470>,
 <matplotlib.spines.Spine at 0x21783b70c88>,
 <matplotlib.spines.Spine at 0x21783b70860>,
 <matplotlib.axis.XAxis at 0x21783b6ac50>,
 <matplotlib.axis.YAxis at 0x21783ba60f0>,
 <matplotlib.text.Text at 0x21783bc2198>,
 <matplotlib.text.Text at 0x21783bc2320>,
 <matplotlib.text.Text at 0x21783bc22b0>,
 <matplotlib.patches.Rectangle at 0x21783bc2358>]
In [3]: obj = children[1]  # Get the LineCollection object
In [4]: obj.set_linewidth(0)


Answer 7:

由于没有对我工作的其他建议,我结束了去除的彩条实例的Alpha通道:

from 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)

该彩条必须能够访问脸部颜色前一次绘制。



文章来源: why does my colorbar have lines in it?