关于等值线图的调整

关于等值线图的调整

在画等值线图的时候有几个数值的关系和逻辑还是挺容易弄混的.

1
2
3
4
5
6
7
8
9
# X, Y, Z = x坐标,y坐标,产热
Z[Z<0] = 1e-6 # 示意,把一些奇异的点去掉
fig, ax = plt.subplots(figsize=(4.5, 2.625))
norm_log = colors.LogNorm(vmin=1e-2, vmax=Z.max())
levels = np.array([1e-12, 1e6, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15])
cf = plt.contourf(X, Y, Z, levels=levels, norm=norm_log, cmap='jet')
cb = plt.colorbar(cf, ax=ax)
# sm = plt.cm.ScalarMappable(norm=norm_log, cmap=cmap)
# cb = plt.colorbar(sm, ax=ax)

这里有三个数的关系需要弄清楚,一个是Z[Z<0] = 1e-1的1e-6,一个是colors.LogNorm(vmin=1e-2, vmax=Z.max())的1e-2,一个是plt.contourflevels里的1e-12.

LogNorm中的vminvmax指定了数值的映射关系,把vmin映射到0,把vmax映射到1,所绘制物理场小于vmin的值全部映射到0的颜色,大于vmax的值全部绘制成1的颜色,因此如果把上面的norm_log改成

1
norm_log = colors.LogNorm(vmin=1e9, vmax=1e10)

那么就会画出下面这张产热分布图,小于1e9的产热都映射为jet的最低颜色,大于1e10的产热都被映射为jet的最高颜色. 因为colorbar描述了色彩和数值之间的映射关系,因此colorbar只受norm_log控制,与所绘制的物理量的分布情况无关.

plt.contourf中的levels参数传入一个数组,这个数组代表要画的等值线,每两个等值线之间包围的区域用一个色块填充,因此这个levels数组的要求是至少包括两个元素,而且数组中的元素必须是递增的,因为只有两个等值线才能包出来一块区域。如果把levels参数设置为[1e-12, 1e12],那么等值线图就只围出了一个区域,大于1e12产热的区域没有画出来.

因此在画最上方的HEMT器件里的产热分布时,把负值的几个点都调整为1e-6,而vmin设置为1e-2,此时小于1e-2的产热全部用cmap最低值的颜色来表示,因此负值的几个点全部被掩盖掉了. 在plt.contourf中的levels的最小值设置为1e-12,levels中下一个数值直接设置到1e6,此时1e-12到1e9之间的范围全部用一个色块表示,因为他们占据总产热的量很小,而且衰减很快,并不需要知道他们的分布,用一个色块掩盖即可.

一些注意事项

  • pcolor是像素点绘图,直接映射某个像素点和颜色的关系,因此colorbar是可以画成连续的,而contourf是把两个等值线之间的区域用同一个色块表示,同一个色块并不是相同的数值,因此colorbar必须用离散的.