python - 如何以半对数比例在 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 分别是负数和正数,所以我知道不是这样。
感谢您的帮助!
解决方案
推荐阅读
- c# - 将 Base64 编码的字符串转换为 PDF
- javascript - 如何在Highcharts的X轴上显示两年的同月名称
- c# - 为什么 Html 解码不适用于 * $
- python - 在 python 内存中存储一个 base64 图像,然后检索以在 wxpython/PIL 中使用
- asp.net - 如何在.net core中为负载均衡器实现进程内共享会话
- c++ - 容器类型和编译时类型推导
- sql - 有没有一种方法可以创建一个虚拟表,在编辑后与之进行比较?
- python - 在python上反转奇异矩阵
- r - 如何在多面 ggplot2 上仅显示一次自定义注释?
- python - 使用 request.data 和 request.FILES 时出现 KeyError?