带有非线性轴的NonUniformImage

时间:2019-02-15 16:19:52

标签: python matplotlib

我有一个不均匀网格中的图像,并希望使用对数缩放的轴之一对其进行绘制。 imshow可以做到这一点,但是这需要规则间隔的数据。我可以用NonUniformImage绘制不规则网格数据,但是设置ax.set_xscale('log')仅对轴有影响,而对图像本身没有影响。

使用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

0 个答案:

没有答案