首页 > 解决方案 > 如何以半对数比例在 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 不是很熟悉,所以我希望它是我刚刚缺少的一些基本的东西。

我当前的输出

为什么 SymLogNorm 没有像本例那样创建延伸到负片的颜色渐变?我已经检查过 mymin 和 mymax 分别是负数和正数,所以我知道不是这样。

感谢您的帮助!

标签: pythonmatplotlibplotcolorbarcontourf

解决方案


推荐阅读