如何强制相等的子图大小

时间:2019-07-01 05:10:56

标签: python matplotlib plot subplot

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

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="option_76" class="option-label">
   <span class="iradio_minimal">
      <input type="radio" name="field_54" id="option_76" value="testing 1" style="position: absolute; opacity: 0;">
        <ins class="iCheck-helper" style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255); border: 0px; opacity: 0; cursor: pointer;"></ins>
   </span>testing 1
</label>

<label for="option_77" class="option-label">
   <span class="iradio_minimal">
      <input type="radio" name="field_54" id="option_77" value="testing 2" style="position: absolute; opacity: 0;">
        <ins class="iCheck-helper" style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255); border: 0px; opacity: 0; cursor: pointer;"></ins>
   </span>testing 2
</label>

<label for="option_78" class="option-label">
   <span class="iradio_minimal">
      <input type="radio" name="field_54" id="option_78" value="testing 3" style="position: absolute; opacity: 0;">
        <ins class="iCheck-helper" style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255); border: 0px; opacity: 0; cursor: pointer;"></ins>
   </span>testing 3
</label>

<label for="option_79" class="option-label">
   <span class="iradio_minimal">
      <input type="radio" name="field_54" id="option_79" value="testing 4" style="position: absolute; opacity: 0;">
        <ins class="iCheck-helper" style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255); border: 0px; opacity: 0; cursor: pointer;"></ins>
   </span>testing 4
</label>

上面的代码确实生成三列绘图,第一个是1D,而不是2D,最后是3D。但是,从所附图像中可以看到,尽管我尝试使用here的建议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() ,但地块的大小并不相同。

enter image description here

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

1 个答案:

答案 0 :(得分:0)

Matplotlib.pyplot的自动布局算法不在乎是要绘制3D对象,2D对象还是1D(点)。当然,定义对象的语法将发生变化,而3D对象将采用3个参数。但是对象的放置方式并没有改变。我发现了您的特定数据可能会给您带来麻烦的一些可能原因。

第一个图像是2D图像,并且y轴比例小于其他两个图像。同样,第一个图像x轴比例的宽度是y轴比例的高度的两倍。第二张和第三张图像包含垂直颜色图,这使这些图像的总高度更高。

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行和col 1,将第2个图添加到第2行,col 1,将第3个图添加到第2行,col 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

Matplotlib set_aspect docs