在画等值线图的时候有几个数值的关系和逻辑还是挺容易弄混的.
1 2 3 4 5 6 7 8 9
|
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)
|
这里有三个数的关系需要弄清楚,一个是
Z[Z<0] = 1e-1
的1e-6,一个是
colors.LogNorm(vmin=1e-2, vmax=Z.max())
的1e-2,一个是
plt.contourf
中
levels
里的1e-12.
LogNorm
中的
vmin
和
vmax
指定了数值的映射关系,把
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必须用离散的.