And*_*anu 3 python plot matplotlib
我想出了以下代码来生成python + matplotlib中的数字:
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(1,1,1, projection='3d')
ax.plot_surface(KX[kxl3d:kxr3d,kxl3d:kxr3d], KY[kxl3d:kxr3d,kxl3d:kxr3d],
BLP[kxl3d:kxr3d,kxl3d:kxr3d], rstride=8, cstride=8, alpha=0.4)
for idx in range(3):
ax.plot(kx[x_points]+momentum_spi[idx,0], ky[y_points]+momentum_spi[idx,1],
energy_spi[idx], linestyle='none', marker='o',
markerfacecolor=color_spi[idx], markersize=5)
ax.set_xlim(kl3d, kr3d)
ax.set_ylim(kl3d, kr3d)
ax.set_xlabel(r'$k_x[\mu m^{-1}]$')
ax.set_ylabel(r'$k_y[\mu m^{-1}]$')
ax.set_zlabel(r'$\epsilon-\omega_X[\gamma_p]$')
Run Code Online (Sandbox Code Playgroud)
输出是:

我的问题是,我怎么能
您可以使用此处张贴的代码将zaxis释放到左侧:
tmp_planes = ax.zaxis._PLANES
ax.zaxis._PLANES = ( tmp_planes[2], tmp_planes[3],
tmp_planes[0], tmp_planes[1],
tmp_planes[4], tmp_planes[5])
view_1 = (25, -135)
view_2 = (25, -45)
init_view = view_2
ax.view_init(*init_view)
Run Code Online (Sandbox Code Playgroud)
您可以通过添加新行并设置来控制标签到轴的距离linespacing:
ax.set_xlabel('\n' + 'xlabel', linespacing=4)
Run Code Online (Sandbox Code Playgroud)
这是一个完整的例子:
#!/usr/bin/python3
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
tmp_planes = ax.zaxis._PLANES
ax.zaxis._PLANES = ( tmp_planes[2], tmp_planes[3],
tmp_planes[0], tmp_planes[1],
tmp_planes[4], tmp_planes[5])
view_1 = (25, -135)
view_2 = (25, -45)
init_view = view_2
ax.view_init(*init_view)
ax.plot_surface(X, Y, Z)
ax.set_xlabel('\n' + 'xlabel', linespacing=4)
ax.set_ylabel('ylabel')
fig.tight_layout()
fig.savefig('test.png')
Run Code Online (Sandbox Code Playgroud)

(注意,虽然zx和zy网格在盒子的错误一侧.我不知道如何解决这个问题).
官方的方法是使用:
ax.tick_params(axis='z', pad=50)ax.set_zlabel(r'k_z...', labelpad=30)不过,也有一点运气不好。tick_params1.3.1 的官方 API 文档说:虽然当前实现了此功能,但 Axes3D 对象的核心部分可能会忽略其中一些设置。看来这pad就是其中之一。
set_zlabel文档中说:目前,labelpad 对标签没有影响。
对于第二个问题有一个简单的解决方法。它很丑陋但有效:
ax.set_zlabel('\n' + r'$\epsilon-\omega_X[\gamma_p]$', linespacing=2.5)
Run Code Online (Sandbox Code Playgroud)
您可以通过调整linespacing。单位是一行文本的高度。(请注意,如果您进行交互式调整,除非您以某种方式更改文本,否则不会绘制它们。)
对于 z 刻度标签,您可以使用类似的技巧:
ax.set_zticklabels([" "+tl.get_text() for tl in ax.get_zticklabels()])
Run Code Online (Sandbox Code Playgroud)
这允许您一次调整一格位置。当然,在数学文本模式下您也可以使用间距命令 ( '\/')。