首页 > 解决方案 > Python中的堆叠图像和绘图

问题描述

我是 Python 新手,正在尝试创建类似于我使用 IDL 制作的图形。我正在尝试制作如下图(不要担心它所代表的数据):

在此处输入图像描述

如您所见,该图是与折线图相邻显示的图像。当我尝试在 Python 中重新创建它时,我遇到了一些问题,请参阅下面的代码:

import matplotlib.pyplot as pyplot
import numpy as numpy
import pandas as pandas

fig, ax = pyplot.subplots(2, 1, sharex = True, gridspec_kw={'hspace': 0})
fig.subplots_adjust(hspace=0)
ax[0].imshow(rot_selected_logfile1[::-1], cmap='rainbow')
ax[1].pyplot(testarr, testarr)
ax[0].axis('off')

pyplot.show()

这是它的输出:

在此处输入图像描述

有些事情我需要发生在我自己无法弄清楚的事情上。任何帮助将不胜感激!
1.我需要图像与线图完全相邻,但由于某种原因我无法做到这一点(如果你看到我的代码,我已经尝试过,但无法让它工作)。
2. 我需要摆脱图像的当前轴,然后在图像上创建另一组
3. 我希望能够拉伸图像,使每个像素不完全是正方形,更像我附上的示例图。

任何帮助将不胜感激!提前致谢。

标签: pythonnumpymatplotlib

解决方案


水平空间不起作用的问题和图像绘图的固定纵横比都是由imshow默认为类似于图像尺寸的纵横比引起的。aspect='auto'将此更改为常规图形的默认行为。

要获得图像下方的 x 刻度,并考虑到图像和线图使用共享 x 轴,可以在下图的顶部绘制辅助 x 轴。在里面设置它的刻度和它的刻度标签应该得到想要的结果。

可以通过 设置所有边的刻度tick_params

要为图像设置正确的 x 和 y 轴,可以使用extent=参数 of 。imshow

下面的代码尝试重新创建一个类似于问题中的情节。由于imshow似乎不适用于 lognorm,因此 lognorm 直接应用于图像。

import matplotlib.pyplot as plt
from matplotlib import ticker, colors
import numpy as np

N = 200
x0, x1 = 18, 22
y0, y1 = 0, 100
values = np.abs(np.random.uniform(-0.5, 0.55, N).cumsum())
values[N // 2:] += 10
img = np.zeros((30, N))
img[0, :] = 3 ** values
for i in range(1, img.shape[0]):
    img[i, :] = img[i-1, :] * 0.01

fig, ax = plt.subplots(2, 1, sharex=True, gridspec_kw={'hspace': 0})
norm=colors.LogNorm(vmin=1, vmax=1e6)
plot0 = ax[0].imshow(norm(img), cmap='rainbow',
                      aspect='auto', extent=[x0, x1, y0, y1], origin='lower')
# ax[0].axis('off')
ax[0].set_xticks([])  # remove x ticks

ax[1].plot(np.linspace(x0, x1, N), values)
# move all ticks of the lower plot inward, set ticks at the 4 directions
ax[1].tick_params(axis='both', which='both', direction='in', left=True, right=True, top=True, bottom=True)
ax[1].xaxis.set_major_locator(ticker.MultipleLocator(1))  # major ticks at whole hours
ax[1].xaxis.set_minor_locator(ticker.MultipleLocator(1 / 6))  # minor ticks every 10 minutes

# optionally set ticklabels at the top of the bottom subplot
# secax = ax[1].secondary_xaxis('top')
# secax.tick_params(axis='x', direction='in', pad=-20) # negative padding to also move labels inside
# secax.xaxis.set_major_locator(ticker.MultipleLocator(1))  # major ticks at whole hours

plt.show()

演示图


推荐阅读