我试图在一行中绘制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()
,但地块的大小并不相同。
关于如何更改子图大小的任何想法?
答案 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