【问题标题】:How to force equal subplot size [duplicate]如何强制相等的子图大小[重复]
【发布时间】:2019-07-01 05:10:56
【问题描述】:

我试图在一行中绘制 3 个图,但所有图的大小应该相同(至少相同高度)。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.gridspec as gridspec

x = np.random.uniform(size=2000) - 0.5
y = np.random.uniform(size=2000) - 0.5
z = np.random.uniform(size=2000) - 0.5
DPI = 106

fig = plt.figure(figsize=(900 / DPI, 350 / DPI))
gs = gridspec.GridSpec(1, 3, width_ratios=[1,1,1])

# 1D
r = np.abs(x)
# plot
ax1 = fig.add_subplot(gs[0])
plot = ax1.scatter(x, r, s = 1, c=r, cmap='jet', marker='.', alpha = 1, vmax = 0.5)
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_aspect('equal')

# 2D
r = np.sqrt(x * x + y * y)
# plot
ax2 = fig.add_subplot(gs[1])
plot = ax2.scatter(x, y, s = 1, c=r, cmap='jet', marker='.', alpha = 1, vmax = 0.5)
ax2.set_xlabel('$x$')
ax2.set_ylabel('$y$')
ax2.set_aspect('equal')
fig.colorbar(plot, shrink = 1, ax = ax2)


# 3D
r = np.sqrt(x * x + y * y + z * z)
ax3 = fig.add_subplot(gs[2], projection='3d')
plot = ax3.scatter(x, y, z, s = 10, c=r, cmap='jet', marker='.', alpha = 1, vmax = 0.5)

ax3.set_xlabel('$x$')
ax3.set_ylabel('$y$')
ax3.set_zlabel('$z$')
ax3.view_init(30, 240)
ax3.set_aspect('equal', 'box')
fig.colorbar(plot, shrink = 1,ax = ax3)

fig.tight_layout()

上面的代码确实生成了三列图,首先是 1D,然后是 2D,最后是 3D 图。但是,正如您从所附图片中看到的那样,即使我尝试使用 gridspec 建议的 here,这些图的大小也不相同。

关于如何更改子图大小的任何想法?

【问题讨论】:

    标签: python matplotlib plot subplot


    【解决方案1】:

    Matplotlib.pyplot 的自动布局算法并不关心您绘制的是 3D 对象、2D 对象还是 1D(点)。当然,定义对象的语法会改变,一个 3D 对象需要 3 个参数。但是对象如何排成一行并没有改变。我看到了您的特定数据可能会给您带来麻烦的几个可能原因。

    第一个图像是 2D 图像,其 y 轴比例小于其他 2 个图像。此外,第一个图像 x 轴刻度的宽度是 y 轴刻度高度的两倍。第 2 和第 3 图像包含垂直颜色图,这使这些图像的总高度更高。

    1) 您可以将第一个图的 y 轴更改为比当前更高。

    ax1.set_aspect('equal')
    

    第一个图中的此代码阻止您仅更改 y 轴刻度。可以去掉这条线,手动设置y轴刻度的比例更大。

    2) 使整行更高,因此第二和第三图中的垂直颜色图不会决定图形空间的整体高度。将 figsize 的 x 和 y 属性设置为 (12, 12) 并查看是否可以解决问题。 figsize 中的第二个数字设置高度。

    fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(12, 12))
    

    3) 或者,您可以在它自己的第一行中绘制第一张图,在单独的第二行中绘制第二张和第三张图。将 nrows 设置为 2,将 ncols 设置为 2,然后将第 1 个图添加到第 1 行和第 1 列,将第 2 个图添加到第 2 行第 1 列,将第 3 个图添加到第 2 行第 2 列。

    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 18))
    

    您可以参考 Matplotlib 文档以获取设置布局参数的详细信息。希望其中之一能奏效。 :-)

    https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.axes.Axes.set_aspect.html

    【讨论】:

    • 其中一个地块在 3D 空间中是非常重要的。为什么?因为您的第一个解决方案看起来很有希望,但我无法让它工作,因为其中一个情节是 3D。
    • 3D 绘图应该无关紧要。尝试在第一个图上增加 y 轴刻度。或者尝试手动增大第一个绘图高度。 :-)
    • Projection = '3d'必须设置为 3D 绘图(或类似的东西)。
    猜你喜欢
    • 2016-10-12
    • 2019-07-31
    • 2018-10-22
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多