Вот код для воспроизвести проблему:
Код: Выделить всё
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import NonUniformImage
# calculate axis positions
x = np.geomspace(1, 100, 5)
dx = np.sqrt(x[1] / x[0]) # half the difference between points in logspace
y = np.linspace(0, 1, 3)
dy = (y[1] - y[0]) / 2 # half the difference between points in linspace
extent = (x[0] / dx, x[-1] * dx, y[0] - dy, y[-1] + dy)
# get some random image data to plot
z = np.random.uniform(size=(len(x), len(y)))
# create figure axes
fig, ax = plt.subplots(ncols=3, figsize=(12, 3))
# use imshow to plot array
ax[0].imshow(z.T, origin="lower", aspect="auto", extent=extent)
ax[0].set_xscale("log")
ax[0].set_title("imshow")
# use NonUniformImage to plot array
im = NonUniformImage(ax[1], extent=extent)
im.set_data(x, y, z.T)
ax[1].add_image(im)
ax[1].set_xscale("log")
ax[1].set_title("NonUniformImage")
# use pcolormesh to plot array
x2 = np.geomspace(*extent[:2], 6)
y2 = np.linspace(*extent[2:], 4)
ax[2].pcolormesh(x2, y2, z.T)
ax[2].set_title("pcolormesh")
# set axis scales
for i in range(3):
ax[i].set_xlim(*extent[:2])
ax[i].set_ylim(*extent[2:])
ax[i].set_xscale("log")
plt.show()
[img]https://i .sstatic.net/IYoJN2yW.png[/img]
Очевидно, что imshow искажает изображение, предположительно потому, что предполагает, что изображение содержит данные на линейно масштабированной оси. вторая панель показывает мою попытку использовать NonUniformImage, которая по какой-то причине делает все совершенно неправильно.
Третья панель показывает то, что я хочу видеть, хотя и с использованием pcolormesh, у которого есть серьезные недостатки Я упоминал выше.
По сути, я просто хочу показать «нормальное» изображение с прямоугольными пикселями одинакового размера на логарифмической оси. Я думаю, что это должно быть возможно, но мне не удалось этого добиться. Будем очень признательны за любую помощь!
Обратите внимание, что этот старый ответ не работает должным образом, поскольку он просто добавляет оси с логарифмическими отметками, поэтому пользователь не может надежно взаимодействовать с результатом (например, для измените галочки потом).
Подробнее здесь: https://stackoverflow.com/questions/792 ... matplotlib