imshow使用对数刻度的x轴不是等间距的。

3
我正在使用pcolor生成以下图表(下面是代码)。它有一个以对数刻度显示的colorbar,x值也是以对数刻度显示的。问题是,这个图表中的矩形宽度不同(我已经添加了红色网格以更好地显示矩形,这是Trenton的建议)。有没有办法确保每个矩形的宽度都相同?

enter image description here

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()

1
@TrentonMcKinney 因为我已经将x轴设置为对数刻度,并且x轴上的数值在对数域中是等间距的,因为我使用了geomspace,所以我确实希望它们是等间距的 - undefined
1
请在问题中添加更新。这个情节有助于解释你的期望吗? - undefined
@TrentonMcKinney 是的,非常有帮助。你觉得我应该把它加到问题里吗? - undefined
1
如果有帮助的话,可以调整或标记它。或者使用这个情节,看你喜欢哪个。 - undefined
1
@TrentonMcKinney 謝謝你。我對這個很困惑。如果我運行ax.get_xticks(),我得到array([1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02]),這似乎與我們在圖中看到的不一致。 - undefined
显示剩余2条评论
1个回答

3
你需要指定箱子的边缘。在numpy中可能有更好的方法,但思路很简单 - 将数据转换为对数空间,通过线性插值获取箱子的边缘,然后再转换回正常空间。
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)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接