如何以半对数比例在Contourf上制作颜色条

时间:2018-06-22 23:59:53

标签: python matplotlib plot colorbar contourf

因此,我正在为一些学校作业创建电场的等高线图,其变化非常极端(1e-6至1e + 8),我想以对数刻度显示等高线。问题在于,既有正电场又有负电场,并且Matplotlib.Ticker.LogLocator破坏了负值,我希望所有值都绘制在连续的颜色图上。我找不到任何简单的方法来设置代码来进行半对数缩放,而其他解决方案也让我望而却步。

到目前为止,这是我的代码:

def plotEField2D(data_in, ax, fig, field='Ey', xlim=100, ylim=100, num_levels=20, 
                 contours=False, num_lines=10):

    electric_data = data_in.electric
    ax.set_xlim(-xlim, xlim)
    ax.set_ylim(-ylim, ylim)

    ax.set_title('2D ' + field + ' Contour')
    ax.set_xlabel('x (nm)')
    ax.set_ylabel('y (nm)')

    e_data = pd.pivot_table(electric_data[['x','y', field]],
                            values=field, index='y', columns='x')

    e_data = e_data.interpolate().fillna(0)

    mymin = np.min(e_data.values)
    mymax = np.max(e_data.values)

    e = ax.contourf(e_data.columns, e_data.index, e_data.values, num_levels,
                    cmap=plt.cm.coolwarm, locator=matplotlib.ticker.LogLocator(),
                    norm=matplotlib.colors.SymLogNorm(linthresh=1000, linscale=0.1, vmin=mymin,
                                                      vmax=mymax), vmin=mymin, vmax=mymax)

    fig.colorbar(e, ax=ax, format='%.0e', extend='both')

    if contours:
        e = ax.contour(e_data.columns, e_data.index, e_data.values, 
                              num_lines, colors='k', linewidths=1)

我正在尝试在Contourf图中实现SymLogNorm,但是,正如您在图像中看到的那样,即使我传入了SymLogNorm参数,contourf也正在筛选出小于0的值。我对SymLogNorm不太熟悉,所以我希望它是我所缺少的基本知识。

My current output

为什么SymLogNorm不创建像this example那样延伸到负数的颜色渐变?我检查过mymin和mymax分别是负数和正数,所以我知道不是那样。

感谢您的帮助!

0 个答案:

没有答案