0

我试图弄清楚如何让下面的 3D matplotlib 图像在画布上绘制得更高,这样它就不会被剪裁。这是我用来创建情节的代码。我找不到附加包含 Z 标高的文本文件的方法(在下面的代码中引用),但它只是一个包含由 0 到 1 之间的值组成的表面的二维数组。

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

nrow=30
ncol=100

f = open(r'C:\temp\fracEvapCume_200.txt','r')
fracEvapTS = np.loadtxt(f)
f.close()

X, Y = np.meshgrid(ncol, nrow)
Y3d, X3d = np.mgrid[0:Y, 0:X]

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.auto_scale_xyz([0, 100], [0, 30], [0, 0.2])
Y3d, X3d = np.mgrid[0:Y, 0:X]
Z = fracEvapTS

surf = ax.plot_surface(X3d, Y3d, Z, cmap='autumn', cstride=2, rstride=2)
ax.set_xlabel("X-Label")
ax.set_ylabel("Y-Label")
ax.set_zlabel("Z-Label")
ax.pbaspect = [1., .33, 0.25]
ax.dist  = 7
plt.tight_layout()
plt.savefig('clipped.png')

为了使该ax.pbaspect=[1., .33, 0.25]行正常工作,按照本文中的建议对 site-packages\mpl_toolkits\mplot3d\axes3d.py 中的函数get_proj进行了更改。为了让图形画得更大,我根据这篇文章添加了。最后,基于这篇文章,我希望能够回滚边距并防止下面显示的红色/黄色表面被剪裁,但这也不起作用。我找不到将图像在画布上向上移动的命令,从而避免了图形顶部所有不必要的空白并防止红色/黄色表面被剪裁。是否有一行 Python 可以完成此任务?ax.dist = 7plt.tight_layout()

在此处输入图像描述

添加该行后plt.tight_layout(),情况变得更糟:

在此处输入图像描述

4

1 回答 1

1

问题是您对site-packages\mpl_toolkits\mplot3d\axes3d.py的修改会更改投影矩阵,而不会更改视图的中心,一旦在相机坐标中转换就会弄乱场景的位置。

因此,当视图缩放(使用ax.dist)然后移动时,绘图有时会脱离画布。

在此处输入图像描述

您需要将以下行替换为axes3d.pyget_proj中的函数:

    # look into the middle of the new coordinates
    R = np.array([0.5, 0.5, 0.5])

经过 :

    # look into the middle of the new coordinates
    try:
        R = np.array(self.pbaspect)/2
    except AttributeError:
        R = np.array([0.5, 0.5, 0.5])

这应该有效:

在此处输入图像描述

PS:用于制作数字的代码:

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

nrow=30
ncol=100

X, Y = np.meshgrid(ncol, nrow)
Y3d, X3d = np.mgrid[0:Y, 0:X]
Z = np.sin(Y3d/Y)*np.sin(X3d/X)

fig = plt.figure()
for i in range(4):
    ax = fig.add_subplot(2,2,i,projection='3d')
    ax.auto_scale_xyz([0, 100], [0, 30], [0, 0.2])

    surf = ax.plot_surface(X3d, Y3d, Z, cmap='autumn', cstride=2, rstride=2)
    ax.set_xlabel("X-Label")
    ax.set_ylabel("Y-Label")
    ax.set_zlabel("Z-Label")
    ax.pbaspect = [1., .33, 0.25]
    ax.dist  = 7
于 2015-07-25T12:39:49.723 回答