Решил построить поверхность при помощи matplotlib вот так:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(0, 10, 256)
y = np.linspace(0, 4, 128)
XX, YY = np.meshgrid(x, y)
ZZ = XX * YY
figure = plt.figure()
ax = Axes3D(figure)
surf = ax.plot_surface(XX, YY, ZZ, cmap='jet')
plt.colorbar(surf)
ax.set_xlabel('Very very very long X LABEL')
ax.set_ylabel('Very very very long Y LABEL')
plt.savefig('test.png')
plt.close()
В результате самый нижний край получается чуть-чуть обрезан, именно эта проблема показана на первом же рисунке в гайду по tight_layout, однако использование tight_layout в приведенном выше коде приводит к исключению:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(0, 10, 256)
y = np.linspace(0, 4, 128)
XX, YY = np.meshgrid(x, y)
ZZ = XX * YY
figure = plt.figure()
ax = Axes3D(figure)
surf = ax.plot_surface(XX, YY, ZZ, cmap='jet')
plt.colorbar(surf)
ax.set_xlabel('Very very very long X LABEL')
ax.set_ylabel('Very very very long Y LABEL')
plt.tight_layout()
plt.savefig('test.png')
plt.close()
$ python2 test.py
/usr/lib/python2.7/site-packages/matplotlib/figure.py:1742: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.
warnings.warn("This figure includes Axes that are not "
Traceback (most recent call last):
File "test.py", line 20, in <module>
plt.tight_layout()
File "/usr/lib/python2.7/site-packages/matplotlib/pyplot.py", line 1387, in tight_layout
fig.tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)
File "/usr/lib/python2.7/site-packages/matplotlib/figure.py", line 1752, in tight_layout
rect=rect)
File "/usr/lib/python2.7/site-packages/matplotlib/tight_layout.py", line 322, in get_tight_layout_figure
max_nrows = max(nrows_list)
ValueError: max() arg is an empty sequence
Может, кто сталкивался с подобным? Сходу не удается нагуглить.
P.S. Судя по тому, что в matplotlib все не очень гладко log scale с 3d параллельно где бы еще под онтопиком просто построить поверхность по имеющемуся массиву numpy.