matplotlib中轮廓和轮廓f之间的颜色差异

时间:2013-07-23 15:21:00

标签: python matplotlib contour color-mapping

我正在尝试制作一个使用轮廓和轮廓的图,它们都使用相同的色图,绘制相同的数据。但是,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填充轮廓的颜色等?

非常感谢你的帮助。

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中使用的值,尽管它可以很容易地改变其他值。

相关问题