爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7280|回复: 6

[作图] 如何给一串数字对应颜色(color bar)?

[复制链接]
发表于 2022-7-12 10:59:10 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我有一串数字,代表不同的温度数值,比如25,26.7,28,29,33.4,36

如何做一个color bar,给不同的温度数值对应一个合适的颜色?
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2022-7-12 11:01:30 | 显示全部楼层
问题主要在于数字是不均匀分布的,所以颜色在color bar上也是不均匀分布的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-7-12 12:02:03 | 显示全部楼层
gsn_define_colormap(wks,"temp_diff_18lev")
res@cnLevelSelectionMode= "ExplicitLevels"
res@cnLevels = (/-20,-16,-14,-12,-10,-8,-6,-4,-2,0,2,4,6/); 值
res@cnFillColors = (/2,3,4,5,6,7,8,9,10,11,12,13/) ;颜色设置

这种试试可以么。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-12 19:40:25 | 显示全部楼层
是冉冉升起的冉 发表于 2022-7-12 12:02
gsn_define_colormap(wks,"temp_diff_18lev")
res@cnLevelSelectionMode= "ExplicitLevels"
res@cnLevels ...

不是画contour哈

比如说我要找出和数值对应的颜色,然后把散点画上对应的颜色
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-7-13 12:41:56 | 显示全部楼层
如果你的散点是用cn的source画的,可以参考这个:
rest=res
  rest@cnLevelSelectionMode="ExplicitLevels"
  rest@cnLevels=(/0.05,0.1/)
  rest@cnFillPalette="GMT_gray"
  rest@cnFillColors         = (/1,4,-1/)
  rest@cnFillPattern        =17
  rest@cnFillScaleF=0.6
  rest@cnFillDotSizeF  = 0.0015
  rest@cnInfoLabelOn=False
  rest@lbLabelBarOn=False
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-7-13 14:51:15 | 显示全部楼层
如果用Python的话,给个参考吧
import matplotlib as mpl
import matplotlib.pyplot as plt
# 随机生成一个序列作为案例, 替换成你实际的序列
np.random.seed(19680801)
data = np.round(np.random.randn(5, 5))
valueList = np.array([-2., -1., 0., 1., 2.])
# 设置边界值
boundList = np.ones([valueList.shape[0] + 1])
boundList[1:-1:] = (valueList[1::] + valueList[0:-1:])/2
boundList[0] = valueList[0]*2 - boundList[1]
boundList[-1] = valueList[-1]*2 - boundList[-2]
# 绘图
cmap = mpl.cm.viridis # 里面用你想用的cmap名
plt.pcolormesh(data, norm=mpl.colors.BoundaryNorm(boundList, cmap.N, extend='both'))
cl = plt.colorbar()
cl.set_ticks(valueList)
2022.07.13-自己-Clip_20220713145021-剪切板.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-7-13 15:00:33 | 显示全部楼层
咦,才发现是散点图,不过方法差不多,如果不需要标签在中间的话,就把boundList设置成与valueList一样的就行
import matplotlib as mpl
import matplotlib.pyplot as plt
# 随机生成一个序列作为案例, 替换成你实际的序列
np.random.seed(19680801)
data = np.round(np.random.randn(5, 5))
valueList = np.array([-2., -1., 0., 1., 2.])
# 设置边界值
boundList = np.ones([valueList.shape[0] + 1])
boundList[1:-1:] = (valueList[1::] + valueList[0:-1:])/2
boundList[0] = valueList[0]*2 - boundList[1]
boundList[-1] = valueList[-1]*2 - boundList[-2]
data = np.reshape(data, [-1])
# 绘图
cmap = mpl.cm.viridis # 里面用你想用的cmap名
plt.scatter(np.arange(1, 26), np.arange(1, 26), c=data, norm=mpl.colors.BoundaryNorm(boundList, cmap.N, extend='both'))
cl = plt.colorbar()
cl.set_ticks(valueList)
Snipaste_2022-07-13_15-00-03.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表