python - 如何创建两个共享 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 制作我想要的图形?
解决方案
只需使图形更高,以便获得空白的维度是垂直维度:
只是为了清楚这里发生了什么 - 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
推荐阅读
- node.js - 使用 promise 等待 http post 结束
- regex - python / ansible中的正则表达式
- excel - Boto3 获取所有具有 ebs 卷 id 的 ec2 实例的列表,大小为 excel
- javascript - 如何在数组中找到两个最大数(负数和正数)?
- javascript - node-postgres 如何为插入查询参数化动态字符串数组?
- javascript - 为什么 React-Native 不显示 Axios 获取的数据?
- flutter - Flutter 使用 just-audio 包比较不同的音频
- android - 违反意图重定向策略 - 按照提供的文档修复后被拒绝
- gitlab - 可以在 JSON 文件中访问 gitlab 变量吗?
- reactjs - 如何卸载 DatePicker 组件,以便在重新呈现页面时使用默认值再次加载