<p><strong>请注意,下面的答案简化了修补程序,但使用的基本原理与@ChristianSarofeen的答案相同。</strong></p>
<h3>溶液</h3>
<p>正如其他答案中已经指出的,它不是当前在matplotlib中实现的特性。但是,由于您所请求的只是一个可以应用于matplotlib所使用的现有投影矩阵的<strong>3D转换,并且由于Python的出色特性,这个问题可以用一个简单的<strong>oneliner解决:</p>
<pre><code>ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([scale_x, scale_y, scale_z, 1]))
</code></pre>
<p>其中<code>scale_x</code>、<code>scale_y</code>和<code>scale_z</code>是从0到1的值,它们将相应地沿每个轴重新缩放绘图。<code>ax</code>只是可以通过<code>ax = fig.gca(projection='3d')</code>获得的3D轴</p>
<h3>解释</h3>
<p>为了解释,函数<code>Axes3D</code>的<code>get_proj</code>从当前观看位置生成投影矩阵。乘以缩放矩阵:</p>
<pre><code>scale_x, 0, 0
0, scale_y, 0
0, 0, scale_z
0, 0, 1
</code></pre>
<p>包括渲染器使用的投影的缩放。所以,我们现在要做的是用一个表达式替换原来的<code>get_proj</code>函数,这个表达式取原来<code>get_proj</code>的结果,然后乘以缩放矩阵。</p>
<h3>示例</h3>
<p>用标准参数函数示例说明结果:</p>
<pre><code>from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z ** 2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
# OUR ONE LINER ADDED HERE:
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([0.5, 0.5, 1, 1]))
ax.plot(x, y, z)
plt.show()
</code></pre>
<p>对于值<code>0.5, 0.5, 1</code>,我们得到:</p>
<p><img src="https://i.stack.imgur.com/pFqDp.png" alt="enter image description here"/></p>
<p>而对于值<code>0.2, 1.0, 0.2</code>,我们得到:</p>
<p><img src="https://i.stack.imgur.com/kEReL.png" alt="enter image description here"/></p>