python - 如何在 matplotlib 中为子图设置相同的纵横比
问题描述
我想要一排具有相同纵横比的子图。假设我想在 y 轴上绘制两个具有不同范围的不同函数。
对此似乎有很多问题,但这些示例似乎很方便地对所有子图都有相同的轴。无论如何,我发现没有一个对我有帮助。
我试过以下
import numpy as np
import matplotlib.pyplot as plt
xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2
fig, ax = plt.subplots(1,2)
ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)
ax[0].set_aspect(.5)
ax[1].set_aspect(.5)
plt.show(fig)
然而,matplotlib 似乎使用 x 和 y 轴数据来确定纵横比,并且由于 y 轴具有不同的范围,子图的结果也不同。这对我来说非常奇怪。如何使它们具有相同的物理纵横比?
我想人们可以尝试提取每个子图的限制并单独计算正确的纵横比,但这似乎是一种非常迂回的方式,我希望这样的基本功能可以使所有子图看起来都一样。
编辑所以我想要的是两个子图在人类意义上具有相同的纵横比,即图形的宽度与高度的比率对于两者都是相同的。例如,在 Mathematica 中,我可以通过简单地设置AspectRatio
属性来实现这一点:
xdata = Range[0, 2, .01];
ydata1 = {#, #} & /@ xdata;
ydata2 = {#, #^2} & /@ xdata;
fig = GraphicsRow[
ListLinePlot[#, AspectRatio -> 1/GoldenRatio, Frame -> True,
ImageSize -> 300] & /@ {ydata1, ydata2}];
Export["fig.png", fig]
解决方案
简短回答:制作子图时使用 figsize 关键字参数:
import numpy as np
import matplotlib.pyplot as plt
xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2
fig = plt.figure(figsize=(10,6))
ax = fig.subplots(1,2)
ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)
# Squares
ax[0].plot([0,1,1,0],[0,0,1,1])
ax[1].plot([0,1,1,0],[0,0,1,1])
plt.show(fig)
figsize
是以英寸为单位的元组,第一个元素为 x 方向的宽度,第二个元素为 y 方向的宽度。
它适用于整个图形;您将需要调整它以获得适合您的子图的形状。
更长的答案: .set_aspect(num)
为每个图设置 y 轴与 x 轴的比率。
因此,当您.set_aspect(.5)
在每个轴上使用时,您告诉matplotlib
重新配置每个轴,使 y 轴是 x 轴的 0.5 倍。这意味着一个 1x1 的正方形实际上在每个图上看起来像一个矩形:
import numpy as np
import matplotlib.pyplot as plt
xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2
fig, ax = plt.subplots(1,2)
ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)
# Squares
ax[0].plot([0,1,1,0],[0,0,1,1])
ax[1].plot([0,1,1,0],[0,0,1,1])
ax[0].set_aspect(.5)
ax[1].set_aspect(.5)
plt.show(fig)
这就是为什么你的地块形状不同的原因;轴限制不同,但您已将两个图上的形状大小设置为相同。
推荐阅读
- spring-boot - 如何启用 /refresh Actuator 端点并绕过 CSRF 限制?
- java - 使用 bukkit 加载地图的问题
- java - 如何使用 IText7 创建 QR 码的示例
- php - WP post_updated $post_after, $post_before 显示相同的产品类别
- php - 在开始之前访问具有 INT 的数组中的数据
- macos - macOS 高山脉中的颤振医生错误
- c# - 如何在c#中将一个数字四舍五入到十位?
- arrays - 如何从C#中的类数组中输出一个值
- python-3.x - Pandas:提取似乎有浮点变量的行的索引
- python - 使用环境名称对 cloudformation 堆栈进行 Python 过滤