我正在尝试制作一个使用轮廓和轮廓的图,它们都使用相同的色图,绘制相同的数据。但是,contourf仅用于绘制以某种方式“显着”的数据(使用屏蔽数组)。同时,轮廓用于绘制所有数据。目的是制作一个可以获得所有信息的情节,但是眼睛会被吸引到更重要的区域。
我几乎可以按照我的意愿工作,但我发现轮廓线的颜色与contourf中填充轮廓的颜色略有不同。
我猜测差异来自这样一个事实,即轮廓颜色实际上是轮廓颜色之间的中间部分(这是有意义的,因为轮廓线被定义为一个值,例如1,2,等等,填充的轮廓在1和2之间,即“值”为1.5等。
我将我的色彩映射定义为
cmap = cm.coolwarm
cnorm=clrs.Normalize(cmap,clip=False)
cmap.set_under(color=cmap(0.0),alpha=1.0)
cmap.set_over(color=cmap(1.0),alpha=1.0)
我的轮廓水平,用于轮廓和轮廓f
clevs = [-3.,-2.,-1.,1.,2.,3.]
轮廓线标绘为
cplot=map.contour(x,y,diff,clevs,\
cmap=cmap,\
norm=cnorm,\
extend='both')
并将填充的轮廓绘制为
cplot=map.contourf(x,y,true_mask,clevs,cmap=cmap,\
norm=cnorm,
extend='both')
是否有直接的方法让轮廓线的颜色与填充轮廓的颜色“匹配”,即1处的线是1-2填充轮廓的颜色,2处的线是颜色在2-3填充轮廓中,-1处的线具有-2- 1填充轮廓的颜色等?
非常感谢你的帮助。
答案 0 :(得分:0)
我认为这里可能的解决方案是为轮廓调用创建一个新的色彩映射表。如果原始色彩映射定义为
cmap = matplotlib.cm.coolwarm
cnorm=matplotlib.colors.Normalize(cmap,clip=False)
cmap.set_under(color=cmap(0.0),alpha=1.0)
cmap.set_over(color=cmap(1.0),alpha=1.0)
和轮廓水平绘制为
clevs = [-3.,-2.,-1.,1.,2.,3.]
然后可以通过
创建新的色彩映射表cw=matplotlib.cm.get_cmap('coolwarm',8*(len(clevs)+1))
cw_vals=cw(np.arange(8*(len(clevs)+1)))
new_cw_vals=np.zeros([len(clevs),cw_vals.shape[1]],dtype=np.float128)
new_cw_vals_t = np.float128(cw_vals[4::8,:])
new_cw_vals_b = np.float128(cw_vals[12::8,:])
for i in np.arange(new_cw_vals.shape[0]):
if clevs[i] < 0.0:
new_cw_vals[i,:]=np.float32(new_cw_vals_t[i,:])
else:
new_cw_vals[i,:]=np.float32(new_cw_vals_b[i,:])
newcmap = matplotlib.colors.LinearSegmentedColormap.from_list("newcw", new_cw_vals)
newcnorm=matplotlib.colors.Normalize(newcmap,clip=False)
我不得不放弃以允许我没有绘制0线的事实。
然后用于轮廓调用
cplot=map.contour(x,y,diff,clevs,
cmap=newcmap,
norm=newcnorm,
vmin=vmin,vmax=vmax)
基本上我正在创建一个点数为8倍的色彩图,然后选择中点。虽然它并不完美,但颜色与contourf的颜色相差甚远。这可能取决于舍入差异(色图值似乎是float32)。它也有点特定于clevs中使用的值,尽管它可以很容易地改变其他值。