jse*_*old 41 python matplotlib matplotlib-basemap
编辑:由于这似乎是一个受欢迎的帖子,这里的解决方案似乎对我有用.谢谢@gazzar和@mfra.
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我的colorbar看起来像是哪条线?或者更确切地说为什么颜色过渡不平滑?显然,我正在使用底图,但这并不重要,因为它是引擎盖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")
Run Code Online (Sandbox Code Playgroud)
我试过没有和没有alpha,结果是一样的.也许是因为我的color_values数组不够好?我可以在某处设置映射到颜色条的基础值吗?我不知道怎么样,我在其他地方看不到这个问题.也就是说,我可以复制matplotlib show_colorbars示例而不会出现此问题.

小智 27
如果你创建矢量图形,你试过这个(取自http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar):
"众所周知,一些矢量图形查看器(svg和pdf)在颜色条的各个部分之间呈现白色间隙.这是由于观察者中的错误而不是matplotlib.作为一种解决方法,可以使用重叠的部分呈现颜色条:
cbar = colorbar()
cbar.solids.set_edgecolor("face")
draw()
Run Code Online (Sandbox Code Playgroud)
然而,这在其他情况下会产生负面影响.特别是半透明图像(alpha <1)和colorbar扩展名,默认情况下不启用,请参阅(问题#1188)."
看起来你的情节使用了一些透明(alpha)值.我有同样的问题(半透明的情节,但希望颜色条是坚实的),这个问题和答案为我修复了它!以供参考:
cbar.set_alpha(1)
cbar.draw_all()
Run Code Online (Sandbox Code Playgroud)
我一般喜欢栅格化彩条的内容,以避免此问题使用埃里克射击的意见,在这里通过添加以下行.
cbar.solids.set_rasterized(True)
Run Code Online (Sandbox Code Playgroud)
对于具有透明度的图像,这种解决方法可能会失败,但对于大多数正常情况,它会产生所需的结果.
我尝试了其他评论中给出的两种设置,即
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
Run Code Online (Sandbox Code Playgroud)
不幸的是,两者都没有为我工作.
所以我尝试了一种完全不同的方法,这是一个巨大的黑客,但至少完成工作.传递alpha给imshow它时,设置一个alpha值,用于与其他图像混合.由于功率较高的原因(正如@mfra所提到的),这就产生了我们如此鄙视的白线.显然,关键是不要传递alpha值imshow.但是,我们仍然需要以某种方式创建颜色条.
因此,作为一种解决方法,我们可以在给色彩映射之前进行alpha混合imshow.举个例子,让我们使用wintercolormap:
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')
Run Code Online (Sandbox Code Playgroud)
在这里,我创建一个新的色彩映射,my_cmap_rgb基于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")
Run Code Online (Sandbox Code Playgroud)
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap='winter', alpha=0.5)
cbar = plt.colorbar(cim)
ax.set_title("Lines and transparency")
Run Code Online (Sandbox Code Playgroud)
显然,如果您不需要透明度,问题就解决了.另一方面,如果确实需要透明度,还有一个解决方法.您必须首先绘制没有透明度的图像以获得颜色条,然后使用透明度绘制一个图像,但不使用其颜色条.
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")
Run Code Online (Sandbox Code Playgroud)
这会产生一个图像,其颜色条没有线条但仍保留透明度.虽然它仍然是一个巨大的黑客,至少我们不必忍受这些线路了!
| 归档时间: |
|
| 查看次数: |
7717 次 |
| 最近记录: |