首页 > 解决方案 > 如何创建两个共享 x 轴的子图,其中只有一个轴的纵横比为 1:1?

问题描述

我正在努力弄清楚如何堆叠子图,其中一个子图以 1:1 的纵横比显示数据,另一个则没有,它们都共享 x 轴。我想要的图是这样的:

在此处输入图像描述

我对这个数字的出发点是这段代码:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()

ax_top = fig.add_subplot(2, 1, 1)
ax_top.set_aspect(1.0)

x = np.linspace(0, 4*np.pi)
ax_top.plot(x, 5*np.sin(x))

ax_bot = fig.add_subplot(2, 1, 2, sharex=ax_top)
ax_bot.bar([2, 4, 6, 8, 10], [12, 13, 15, 10, 8])

plt.show()

但这会产生:

在此处输入图像描述

我希望下图与上图具有相同的宽度,并且匹配的 x 刻度线在两个图之间排列。我已经尝试了很多事情来试图将这个基本数字强制转换为所需的数字,但我似乎缺少一些它不起作用的根本原因。

如何使用 matplotlib 制作我想要的图形?

标签: pythonmatplotlib

解决方案


只需使图形更高,以便获得空白的维度是垂直维度:

只是为了清楚这里发生了什么 - subplot(2, 1) 为一个子图分配一半的数字,为另一个分配一半。如果绘图的纵横比使其变窄,则必须有空白。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4, 7.5))

ax_top = fig.add_subplot(2, 1, 1)
ax_top.set_aspect(1.0)

x = np.linspace(0, 4*np.pi)
ax_top.plot(x, 5*np.sin(x))

ax_bot = fig.add_subplot(2, 1, 2, sharex=ax_top)
ax_bot.bar([2, 4, 6, 8, 10], [12, 13, 15, 10, 8])

plt.show()

在此处输入图像描述

当然还有其他方法可以做到这一点,包括使用轴网格工具包:https ://matplotlib.org/devdocs/gallery/axes_grid1/scatter_hist_locatable_axes.html


推荐阅读