1

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

我的轮廓水平,用于轮廓和轮廓是

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 填充轮廓的颜色等?

非常感谢您的帮助。

4

1 回答 1

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

于 2013-07-24T11:38:10.090 回答