- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 15195775117 于 2022-6-26 12:47 编辑
1、需求缘起
用matplotlib画【填色等值线图】,有plt.contourf和plt.tricontourf两个函数,画的图如下:
这里有2个问题:
1、默认的色条,刻度值都是均匀的,
但工作中经常遇到需要对数据进行【非线性配色】的情况,
例如对湿度配色的值是[5,10,20,40,80,95](%)
2、默认的色条,两端是将刻度顶到头的,
但工作中,两头超出范围的值是额外配色的,
例如低于最低值的都配白色,高于最高值的都配紫色。这种姑且称为“两头开”色条。
以下,用一套笨办法解决这2个问题。
2、非线性配色,与“两头开”色条
处理效果图:色条刻度是非线性的,且“两头开”
源代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
# ======准备阶段,准备些必要的数据======
# 我们准备一个颜色序列,用于配色,
# 注意,颜色的写法比较灵活,支持3种
rgblist=[[0.5,0.5,0.5], # 灰色
"#0000ff", # 蓝色
"#00ffff", # 青色
"#00ff00", # 绿色
"#ffff00", # 黄色
(1,0,0), # 红色
"#000000" # 黑色
# 画等值线的层级,设置为不均匀的:
level=[5,6,8,11,15,20]
# “两头开”的色条,等值线层级有6个,颜色有7个,颜色比层级多1个
# 准备需要配色的数组:
data=np.random.randint(1,25,(8,10))
lng=np.linspace(100,120,10)
lat=np.linspace(20,30,8)
# ======至此,材料准备好了,以下开始画图======
# 将data转为浮点型数组,不然后续对data元素的修改都只能是整型,会出错
data=np.array(data,dtype=np.float32)
# 将颜色序列转为色条对象,可以直接由contourf函数引用
cmap = ListedColormap(rgblist)
# 配色层级数:
nlevel=len(level)
# 用data2代替data进行配色
data2=data
# 找出每个层级的元素的位置,追加到plist中:
plist=[]
# 低于最低层级的元素:
p=np.where(data2<level[0])
plist.append(p)
# 中间层级的元素:
for i in range(nlevel-1):
p=np.where((data2>=level)&(data2<level[i+1]))
plist.append(p)
# 高于最高层级的元素:
p=np.where(data2>=level[-1])
plist.append(p)
# 将每个层级的元素,以其所在层级序数替换之,这就实现了层级的线性
for i in range(nlevel+1):
data2[plist]=i+0.5
# 画data2:
plt.contourf(lng,lat,data2,range(nlevel+2),cmap=cmap)
# 色条的标题和小数位数
cb=plt.colorbar(label='nonlinear',format='%.1f')
# 伪装色条的刻度:
cb.set_ticks(ticks=np.arange(nlevel)+1,labels=level)
plt.show()
|
|