| 
 
	积分602贡献 精华在线时间 小时注册时间2021-12-11最后登录1970-1-1 
 | 
 
| 
本帖最后由 XiaoMaFenJu 于 2022-1-28 17:03 编辑
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 问题描述:
 下图是我想要得到的结果,特点是数值非均匀但间距相等,也就是colorbar密度不同。
 
 
 
 
 目前达到的结果为下图 
 
 代码如下 复制代码
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
#数据读取
data1 = np.loadtxt("./data/test.asc", skiprows=6)
#绘图,透明度50%,下限值0
img1 = plt.imshow(data1,alpha=0.5,vmin = 0,cmap = mpl.cm.get_cmap("plasma").copy())
#缺省值设置无色
img1.cmap.set_under(alpha = 0)
levels = [0,0.5,1,10,100,500,1000,2000,5000,10000]
h = plt.colorbar(ticks=levels,spacing = 'uniform')
plt.show()
实在不知道咋办了,请各位大佬指点!
 我目前还有两种想法,一种是自定义colormap,一种是改坐标轴ticks,但是看了许久还是没看明白,😔
 
 ====================================2022.01.28========================================
 
 更新!!!问题解决!
 也非常感谢评论区的各位大佬,这两天也是在自己摸索(摸鱼),找官方文档和茫茫的百度,选定的是 mpl.colors.BoundaryNorm ,但还是有点差距,还是密度问题没有解决,但看到评论区大佬也有用这个方法,和我当时找到的BoundaryNorm大体是运用一样的,那说明这个应该是没有错的,那问题应该在别的地方。
 正好前时间在找资料的时候找到一个“炸鸡人博客”,链接就不放了 ps:不让放;) ,有很详细的colormap和colorbar的讲解(我觉得这篇博客很nice,比官方文档看起来还舒服),当时我着重在BoundaryNorm,于是翻看其他部分,找到下面这句话:
 
 但是我之前是试过的,camp可以传入,但是norm会报错,这时我又去看那篇博客,发现复制代码对于画马赛克图的 pcolor、pcolormesh 和 imshow 函数,我们在实际使用中并不需要手动进行数据的归一化和颜色索引,只需在调用函数时通过 cmap 和 norm 参数把 colormap 和归一化的类传入即可,绘图函数会自动计算数据和颜色的对应关系。cmap 默认为 viridis,norm 默认为无参数的 Normalize。
 问题可以说解决了!删掉imshow()中的vmin和vmax,转而传入norm就没问题了!复制代码# 若在pcolormesh中给定了norm,就不能再指定vmin和vmax了.
很感谢评论区的各位大佬!
 完整代码我会附在下面!
 
 输出结果如下:复制代码import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
#数据读取
data = np.loadtxt("./data.asc", skiprows=6)
#colorbar设置
cmap = mpl.cm.jet
bins = [0, 0.5, 1, 10, 50, 100, 500, 1000, 2000, 5000]
nbin = len(bins) - 1
npt = cmap.N // nbin
segments = []
for i in range(nbin):
    segment = np.linspace(bins[i], bins[i + 1], npt)
    if i < nbin - 1:
        segment = segment[:-1]
    segments.append(segment)
segments = np.concatenate(segments)
norm = mpl.colors.BoundaryNorm(segments, cmap.N)
#绘图,透明度50%,下限值0
img1 = plt.imshow(data,alpha=0.5,norm = norm,cmap = cmap.copy())
#缺省值设置无色
img1.cmap.set_under(alpha = 0)
#colorbar
h = plt.colorbar()
h.set_ticks(bins)
h.set_ticklabels(bins)
#本地保存
#plt.savefig('test5',dpi = 1600)
#图片输出
plt.show()
   
 | 
 |