python - 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. 我希望能够拉伸图像,使每个像素不完全是正方形,更像我附上的示例图。
任何帮助将不胜感激!提前致谢。
解决方案
水平空间不起作用的问题和图像绘图的固定纵横比都是由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()
推荐阅读
- javascript - React - 如何从 JSON 文件呈现内容?
- python-3.x - ML 模型中的虚拟变量问题(python 3)
- java - Java - 获取脚本标签内的文本
- docker - 使用混合 CMD 和 RUN 命令构建新容器不起作用
- python - 如何将 Pandas 日期时间列的时间更改为午夜?
- python - 如何在 Python 中使用 if-else 语句在多个变量之间切换
- sql - 执行错误:CREATE DATABASE aNewDb。原因:org.postgresql.util.PSQLException:错误:CREATE DATABASE 不能在事务块内运行
- protobuf-net - 类型“Namespace.SomeAbstractType”只能参与一个继承层次结构(Namespace.InterfaceType)
- node.js - Express - 当 POST 请求按预期运行时,为什么 PUT 请求会返回 404 错误?
- javascript - 如何关闭间隔循环