具有非线性轴的非均匀图像

2024-06-26 15:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非均匀网格中的图像,想用其中一个轴按对数比例缩放。这对于imshow是可能的,但是它需要规则间隔的数据。然而,{cd2}图形本身不能有不规则的效果。在

NonUniformImage可以实现这一点吗,甚至完全可能?下面是一些代码,它显示了我的意思(顶行是imshow,底行是NonUniformImage)。在

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib.image import NonUniformImage

# Linear x array for cell centers:
x = np.linspace(1, 10, 10) 

# Highly nonlinear x array:
x2 = x**3

# Linear y-array
y = np.linspace(1, 10, 10) 
z = np.sqrt(x[np.newaxis, :]**2 + y[:, np.newaxis]**2)


fig, axs = plt.subplots(nrows=2, ncols=2)
fig.subplots_adjust(bottom=0.07, hspace=0.3)

# Uniform Grid, linear x-axis
ax = axs[0, 0]
im = ax.imshow(z, extent=(1, 10, 1, 10), aspect='auto',origin='lower')
ax.set_title("Uniform Grid, linear x-axis")

# Uniform Grid, log x-axis (image changes)
ax = axs[0, 1]
im = ax.imshow(z, extent=(1, 10, 1, 10),aspect='auto',origin='lower')
ax.set_xscale('log')
ax.set_title('Uniform Grid, log x-axis')

# Correct ticklabel formatting
from matplotlib.ticker import StrMethodFormatter, NullFormatter
ax.xaxis.set_major_formatter(StrMethodFormatter('{x:.0f}'))
ax.xaxis.set_minor_formatter(NullFormatter())

# NonUniform Grid, linear x-axis
ax = axs[1, 0]
im = NonUniformImage(ax, interpolation='nearest', extent=(1, 1000, 1, 10))
im.set_data(x2, y, z)
ax.images.append(im)
ax.set_xlim(1, 1000)
ax.set_ylim(1, 10) 
ax.set_title('NonUniform Grid, lin x-axis')

# NonUniform Grid, logarithmic x-axis (this doesn't work as intended)
ax = axs[1, 1]
im = NonUniformImage(ax, interpolation='nearest', extent=(1, 1000, 1, 10))
im.set_data(x2, y, z)
ax.images.append(im)
ax.set_xlim(1, 1000)
ax.set_ylim(1, 10) 
ax.set_xscale('log')
ax.set_title('NonUniform Grid, log x-axis')

plt.show()

Resulting figure


Tags: importlogtitlenpuniformaxextentgrid