使用Matplotlib进行3D图形绘制时的标签操作

5
我想出了以下代码来在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]$')

输出结果如下: 3d_rings 我的问题是,我要如何:
1.将z轴标签和刻度标签移动到图形的左侧,以便它们不会被环覆盖。
2.增加x轴和y轴刻度标签与轴标签之间的间距(请注意,它们有些重叠,特别是对于y轴)。

我认为您只是设置了错误的xlim和ylim。这就是为什么您会得到不愉快的输出。您能否发布完整的示例?(在当前片段中,KX未定义)。 - Adobe
2个回答

7
您可以使用此处发布的代码(链接)将z轴捕捉到左侧:
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)

您可以通过添加新行并设置linespacing来控制标签到轴的距离:

ax.set_xlabel('\n' + 'xlabel', linespacing=4)

这是一个完整的示例:

#!/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')

请注意,zx和zy网格放在盒子的错误一侧。我不知道如何修复它。

5

官方的方法是使用:

  1. ax.tick_params(axis='z', pad=50)
  2. ax.set_zlabel(r'k_z...', labelpad=30)

然而,有一点不太幸运。使用 tick_params 函数时,1.3.1 版本的官方 API 文档表示:虽然该函数目前已实现,但 Axes3D 对象的核心部分可能会忽略其中一些设置。 看起来 pad 就是其中之一。

在使用 set_zlabel 函数时,文档中写道:当前,labelpad 对标签没有影响。

对于第二个问题,有一个简单的解决方法。虽然不太美观,但可以解决问题:

ax.set_zlabel('\n' + r'$\epsilon-\omega_X[\gamma_p]$', linespacing=2.5)

您可以通过调整linespacing关键字来调整位置。单位是一行文本的高度。(注意,如果您进行交互式调整,则除非您以某种方式更改文本,否则它们不会被绘制。)
对于z轴刻度标签,您可以使用类似的技巧:
ax.set_zticklabels(["       "+tl.get_text() for tl in ax.get_zticklabels()])

这使您可以逐个空格地调整位置。当然,在数学文本模式下,您也可以使用间距命令('\/')。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接