登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 阿月浑 于 2022-4-19 10:29 编辑
【菜鸟的一些绘图记录】
#自用笨方法,如有其他方法还望不吝赐教#
在重现一篇文献中的图像时发现原作者用的是对数色标,本人先是直接绘制等值线图(其实已经很接近了): 原图 直接绘制 为了精益求精,就想进一步取对数色标。但用了比较常见的直接取对数的方法,图像会变成较大的几个粗糙色块,和原文图像相差甚远,无法看出细节的变化。贴两个常规方法主要代码: 直接设置 - pcm = ax.contourf(np.arange(-180,180,resolution), np.arange(-90,90,resolution), a, [1e0,1e1,1e2], cmap = mycm, crs = ccrs.PlateCarree(), extend = 'both')
- cb = fig.colorbar(pcm, orientation = 'vertical', fraction = 0.02, pad = 0.05, aspect = 17)
复制代码
进一步,使用colors.LogNorm - import matplotlib.colors as colors
- from matplotlib.colors import LogNorm
- norm = colors.LogNorm(vmin = 1E0, vmax = 1E2)
- pcm = ax.contourf(np.arange(-180,180,resolution), np.arange(-90,90,resolution), a, levels = [0.1,1,10,100], norm= norm, cmap = mycm, crs = ccrs.PlateCarree(), extend = 'both')
- #使用[0.1,1,10,100],而不能用线性np.arange
- cb = fig.colorbar(pcm, orientation = 'vertical', fraction = 0.02, pad = 0.05, aspect = 17)
复制代码都不太符合我的需求。因此,我最初的解决方法是图像和色标分别绘制,即用“伪色标”的方法实现绘图细节,并且调节了色标和图像的对应关系。 这里是绘制等高线图后,直接用plt.colorbar或fig.colorbar单独绘制一个对数色标(注意在新版本的Matplotlib中,DivergingNorm更新为TwoSlopeNorm): - import matplotlib.colors as colors
- from matplotlib.colors import LogNorm
- import matplotlib.cm as cm
- norm = colors.DivergingNorm(vmin = 1, vmax = 100, vcenter=10)
- #vmax/vmin应相同,中间值vcenter应为对数色标的中间值
- im = cm.ScalarMappable(norm = normcb, cmap = mycm)
- pcm = ax.contourf(np.arange(-180,180,resolution), np.arange(-90,90,resolution), a, np.arange(1,100,0.5), norm= norm, cmap = mycm, crs = ccrs.PlateCarree(), extend = 'both')
- cb = fig.colorbar(im, orientation = 'vertical', fraction = 0.02, pad = 0.05, aspect = 17)#绘制im色标
复制代码 感谢论坛灭火器老师的指出,虽然图像看起来基本没问题,这个方法其实是不对的,contourf和colorbar用的normalization并不同。
因此进行改进: - import matplotlib.colors as colors
- from matplotlib.colors import LogNorm
- import matplotlib.cm as cm
- norm = colors.LogNorm(vmin = 1E0, vmax = 1E2)
- levels = np.logspace(0, 2, 100)
- pcm = ax.contourf(np.arange(-180,180,resolution), np.arange(-90,90,resolution), a, levels, norm= norm, cmap = mycm, crs = ccrs.PlateCarree(), extend = 'both')
- cb = fig.colorbar(pcm, ticks=[1,10,100], orientation = 'vertical', fraction = 0.02, pad = 0.05, aspect = 17)
- cb.ax.minorticks_off()
复制代码
这样应该就比较正确了
参考链接: 关于python:matplotlib等高线图:对数刻度成比例的颜色条水平 | 码农家园 (codenong.com)
做一个学习记录,如有问题或更好的方法,欢迎指出
|