python 增强等值线图的可见性,使其大部分值接近零

elcex8rz  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(114)

我试图绘制一个等值线图。问题是矩阵的大部分值为0,重要的值很少。这导致图形非常单调,几乎没有可见的数据。我试图使用LogNorm将其归一化()但这使我的图变白色,因为零值。我想增强颜色,以便我更多地突出显示接近零的值(我们讨论的是1 e-7数量级的值),同时可能会增加热图中的颜色区域。最终的图应该类似于瀑布图(蓝色背景和彩色线)。ExpectationReality

X , Y = np.meshgrid(frequencies, speeds)
Z = freq_speed_grid.to_numpy()
ax = plt.figure(figsize=(10, 5))
levels=np.linspace(Z.min(), Z.max(), 50)
plt.contourf(X, Y, Z, cmap = "jet", norm=Normalize(), levels=levels)
plt.colorbar()
plt.xlabel("Frequency (Hz)")
plt.ylabel("Speed (RPM)")
plt.show()
5gfr0r5j

5gfr0r5j1#

让我们导入一些常用的东西,并组成一个Z数组,该数组最接近零,但其中包含一些LARGE值-Z从10-3到105

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10000, 101)
y = np.linspace(0, 15000, 151)
X, Y = np.meshgrid(x/10000, y/15000)
Z= 99999*X**15*Y**15+0.001

现在像你那样画出来

fig0, ax0 = plt.subplots()
cf0 = ax0.contourf(x, y, Z, levels=11, vmin=0, vmax=100000)
cb0 = fig0.colorbar(cf0)
cb0.set_ticks((0, 20000, 40000, 60000, 80000, 100000),
              labels='0 20000 40000 60000 80000 100000'.split())

接下来,自制的数据重新缩放,我绘制log10,必须注意重新缩放标签

fig1, ax1 = plt.subplots()
cf1 = ax1.contourf(x, y, np.log10(Z), levels=11,
      norm=plt.Normalize(vmin=-3, vmax=5, clip=True))
cb1 = fig1.colorbar(cf1)
cb1.set_ticks(range(-3, 6), 
              labels=['%.4g'%pow(10, c) for c in range(-3,6)])

它很好,但是很麻烦。幸运的是Matplotlib有我们需要的东西,它是matplotlib.colors.LogNorm,并且它做到了它所承诺的

from matplotlib.colors import LogNorm
fig2, ax2 = plt.subplots()
cf2 = ax2.contourf(x, y, Z, levels=11, norm=LogNorm(vmax=1E5, clip=1))
cb2 = fig2.colorbar(cf2)

遗憾的是,它不能正确格式化颜色条上的标签,但这很容易修复

fig3, ax3 = plt.subplots()
cf3 = ax3.contourf(x, y, Z, levels=11, norm=LogNorm(vmax=1E5, clip=1))
cb3 = fig3.colorbar(cf3)
cb3.set_ticks(cb3.get_ticks(),
              labels=['%.2g'%c for c in cb2.get_ticks()])

相关问题