【问题标题】:Strange lines appear on pcolormesh in basemap when using a nonzero alpha value使用非零 alpha 值时,底图中的 pcolormesh 上会出现奇怪的线条
【发布时间】:2020-04-15 00:29:00
【问题描述】:

在底图投影(或 cartopy 投影)上使用 pcolormesh 绘制数据时,我注意到将 alpha 值设置为小于 1 时出现奇怪的线条。

示例代码:

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt

plt.clf()

dpp =1 # degrees per pixel
lons = np.arange(-180,180+dpp,dpp)
lats = -1*np.arange(-90,90+dpp,dpp)

m = Basemap(projection='robin',lon_0=0)
data = np.random.random((np.size(lats), np.size(lons)))
lons, lats = np.meshgrid(lons, lats)
x, y = m(lons, lats)

im = m.pcolormesh(x, y, x, latlon=False, cmap='RdBu')
#im = m.pcolormesh(lons, lats, data, latlon=True, cmap='RdBu')

m.colorbar(im)
plt.show()

输出显示出现奇怪的线条:

如果我改为设置 alpha=1,线条就会消失,并且行为符合预期:

关于如何让 pcolormesh 使用非零 alpha 值的任何想法?

【问题讨论】:

    标签: python matplotlib matplotlib-basemap cartopy


    【解决方案1】:

    使用pcolor 而不是pcolormesh,它有点慢,但在处理光栅化输出方面做得更好。请务必设置snap = True,这将使网格与像素对齐。

    示例

    import numpy as np
    import matplotlib.pyplot as plt
    
    lons, lats = np.meshgrid(np.arange(-180,180), np.arange(90,-90,-1))
    
    im = plt.pcolor(lons, lats, lons, cmap='RdBu', alpha=0.5, snap=True)
    
    cbar = plt.colorbar(im)
    cbar.set_alpha(0.5)
    plt.show()
    

    这也适用于mpl_toolkits.basemap

    颜色条中的线条是由open issue #1188 引起的,据我所知,没有不涉及手动创建颜色条的已知解决方法。

    【讨论】:

    • 我转载了你上面的图(虽然彩条上还有奇怪的线条)。但是,当使用底图或 cartopy 时,我仍然会得到奇怪的线条。因此,在使用弯曲投影(如鲁滨逊投影)时,这似乎仍然是一个问题。
    • 在脚本中使用以下行仍然会出现奇怪的行: import cartopy.crs as ccrs ____ ax = plt.axes(projection=ccrs.Robinson()) _____ im = ax.pcolor(lons , lats, lons, transform=ccrs.PlateCarree(),cmap='RdBu', alpha=0.5, snap=True)
    • 如何手动创建具有正确 alpha 值的颜色条?
    • @ricitron 抱歉,您将使用弯曲投影。 pcolorpcolormesh 都不够用,你必须imshow 我相信
    【解决方案2】:

    由于它是一张全球地图,我使用 imshow 代替 pcolor 或 pcolormesh 让它工作:

    import numpy as np
    import matplotlib.pyplot as plt
    import cartopy.crs as ccrs
    
    plt.clf()
    
    lons, lats = np.meshgrid(np.arange(-180,180), np.arange(90,-90,-1))
    
    im = ax.imshow(lons, transform=ccrs.PlateCarree(),cmap='RdBu', alpha=0.5, extent=[-180,180,-90,90])
    
    cbar = plt.colorbar(im)
    cbar.set_alpha(0.5)
    
    plt.show()
    

    然而,颜色条仍然存在问题。

    【讨论】:

    • 正如我在回答中提到的,彩条的问题受open issue on github 的影响,没有现有的解决方法,缺少对彩条创建的完全手动处理。 Matplotlib 根本无法正确处理颜色条的 alpha
    • 是否有手动创建所需颜色条的示例?即,使用 matplotlib 色标并为颜色条设置 alpha=0.5
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2022-08-07
    相关资源
    最近更新 更多