numpy 图中X轴表示对数刻度不是等间距

jhdbpxl9  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(95)

我使用pcolor来生成下面的图(代码如下)。它有一个colorbar在对数尺度和x值也在对数尺度。问题是这个图中的矩形有不同的宽度(我用了一个红色网格来更好地显示矩形,这是特伦顿的建议)。有什么方法可以确保每个矩形的宽度都一样吗?

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np

# Generate Values
x_values = np.geomspace(start=1, stop=1e-2, num=6)
y_values = np.arange(start=0, stop=50, step=4, dtype=int)
x_grid, y_grid = np.meshgrid(x_values, y_values)
z_values = np.random.randn(len(y_values), len(x_values))

fig, ax = plt.subplots()
im = ax.pcolor(x_grid, y_grid, z_values, norm=matplotlib.colors.LogNorm(), ec='r', lw=2)
ax.set_xscale('log')
fig.colorbar(im)
plt.show()
r7xajy2e

r7xajy2e1#

您需要指定容器边缘。在numpy中可能有一种更好的方法来做到这一点,但想法很简单-转换到对数空间,通过线性插值得到bin边缘,然后转换回正常空间。

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np

# Generate Values
x_values = np.geomspace(start=1, stop=1e-2, num=6)
y_values = np.arange(start=0, stop=50, step=4, dtype=int)
# edges?
logx = np.log10(x_values)
edgex = np.hstack((
    logx[:-1] - np.diff(logx) / 2,
    logx[-1] - np.diff(logx)[-1] / 2, logx[-1] + np.diff(logx)[-1] / 2))
edgex = 10**edgex

edgey = np.hstack((
    y_values[:-1] - np.diff(y_values) / 2,
    y_values[-1] - np.diff(y_values)[-1] / 2, y_values[-1] + np.diff(y_values)[-1] / 2))

np.random.seed(12345)
z_values = np.random.randn(len(y_values), len(x_values))

fig, axs = plt.subplots(1, 2, layout='constrained')
ax = axs[0]
im = ax.pcolormesh(x_values, y_values, z_values, norm=LogNorm(), ec='r', lw=2)
ax.set_xscale('log')
ax.set_title('Linear gaps')
ax.plot(x_values, 0 * x_values, 'dm')
fig.colorbar(im)

ax = axs[1]
im = ax.pcolormesh(edgex, edgey, z_values, norm=LogNorm(), ec='r', lw=2)
ax.plot(x_values, 0 * x_values, 'dm')
ax.set_xscale('log')
ax.set_title('Log gaps')
fig.colorbar(im)

相关问题