如何旋转 3D 绘图中的偏移文本?

ole*_*cki 5 python matplotlib

我正在尝试在 Matplotlib 中使用偏移文本中的比例绘制 3D 图形。为此,我使用了ImportanceOfBeingErnest 的自定义轴主要格式化程序,以便将此比例设为乳胶格式:

\n
import matplotlib\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as ticker\nfrom mpl_toolkits.mplot3d import Axes3D  \nfrom matplotlib import cm\nimport numpy as np\n\nclass OOMFormatter(matplotlib.ticker.ScalarFormatter):\n    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):\n        self.oom = order\n        self.fformat = fformat\n        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)\n    def _set_order_of_magnitude(self):\n        self.orderOfMagnitude = self.oom\n    def _set_format(self, vmin=None, vmax=None):\n        self.format = self.fformat\n        if self._useMathText:\n             self.format = r\'$\\mathdefault{%s}$\' % self.format\n\n\nx = np.linspace(0, 22, 23)\ny = np.linspace(-10, 10, 21)\nX, Y = np.meshgrid(x, y)\nV = -(np.cos(X/10)*np.cos(Y/10))**2*1e-4\n\nfig, ax = plt.subplots(subplot_kw={"projection": "3d"})\nsurf = ax.plot_surface(X, Y, V, cmap=cm.jet,\n                       linewidth=0, antialiased=False)\nax.zaxis.set_major_formatter(OOMFormatter(int(\'{:.2e}\'.format(np.min(V)).split(\'e\')[1]), mathText=True))\nax.zaxis.set_rotate_label(False) \nax.set_xlabel(r\'$x$ (cm)\', size=20, labelpad=10)\nax.set_ylabel(r\'$y$ (cm)\', size=20, labelpad=10)\nax.set_zlabel(r\'$A_z$\', size=20, labelpad=10)\n
Run Code Online (Sandbox Code Playgroud)\n

结果如下图所示:\n图 1:初始图

\n

请注意,比例(z 轴偏移文本,x 10^{-4})旋转了 90 度。为了解决这个问题,我尝试访问偏移文本的元素并将其旋转设置为 0:

\n
ax.zaxis.get_offset_text().set_rotation(0)\nax.zaxis.get_offset_text().get_rotation()\n>>> 0\n
Run Code Online (Sandbox Code Playgroud)\n

这是没有用的,因为偏移文本没有旋转一英寸。然后我尝试在运行绘图函数时打印文本对象:

\n
surf = ax.plot_surface(X, Y, V, cmap=cm.jet,\n                       linewidth=0, antialiased=False)\n.\n.\n.\nprint(ax.zaxis.get_offset_text())\n>>>Text(1, 0, \'\')\n
Run Code Online (Sandbox Code Playgroud)\n

这让我认为偏移文本可能没有存储在这个变量中,但是当我运行相同的命令而不调用绘图函数时,它返回的正是我期望的结果:

\n
print(ax.zaxis.get_offset_text())\n>>>Text(-0.1039369506424546, 0.050310729257045626, \'$\\\\times\\\\mathdefault{10^{\xe2\x88\x924}}\\\\mathdefault{}$\')\n
Run Code Online (Sandbox Code Playgroud)\n

我究竟做错了什么?

\n

moz*_*way 3

我不得不说,这是一个很好且有趣的问题,我对此挠了挠头\xe2\x80\xa6

\n

您可以使用 访问偏移文本ot = ax.zaxis.get_offset_text()。隐藏它很容易ot.set_visible(False),但由于某种未知的原因,它无法旋转ot.set_rotation(90)。我尝试使用 打印文本值print(ot.get_text()),但是这不会输出任何内容,除非已经绘制了绘图。只有绘制完图后,才会返回\'$\\\\times\\\\mathdefault{10^{-4}}\\\\mathdefault{}$\'。这告诉我这很可能是问题的根源。无论您对偏移文本应用什么,它都会在图形生成的最后一步中被覆盖,并且失败。

\n

我得出的结论是,最好的方法是隐藏偏移量并在图表上注释自己。您可以使用以下代码片段以编程方式完成此操作:

\n
ax.zaxis.get_offset_text().set_visible(False)\nexponent = int(\'{:.2e}\'.format(np.min(V)).split(\'e\')[1])\nax.text(ax.get_xlim()[1]*1.1, ax.get_ylim()[1], ax.get_zlim()[1],\n        \'$\\\\times\\\\mathdefault{10^{%d}}\\\\mathdefault{}$\' % exponent)\n
Run Code Online (Sandbox Code Playgroud)\n

结果:

\n

带有自定义偏移文本的图表

\n