如何确定 matplotlib axes 对象的投影方式(2D 或 3D)?

4
在Python的matplotlib库中,创建一个坐标轴对象时很容易指定它的投影方式:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
ax = plt.axes(projection='3d')

那么我如何确定一个已经存在的轴对象的投影方式?没有 ax.get_projectionax.properties 也没有“projection”键,快速的谷歌搜索也没有找到任何有用的信息。

3个回答

5

事实证明,这里给出的答案实际上是回答这个问题的更好答案: python check if figure is 2d or 3d而我在那个重复的问题中提供的答案是这个问题的更好答案。

无论如何,您都可以使用轴的name。这是确定投影的字符串。

plt.gca().name   or   ax.name

如果ax是轴。

3D轴的名称将为"3d"。2D轴的名称将为"rectilinear""polar"或其他类型的绘图取决于名称。自定义投影将有它们的自定义名称。

因此,只需使用ax.name而不是ax.get_projection()


1
那可能是默认名称,但用户可以随时更改它。 - Peter Corke

4

我认为没有自动化的方法,但很明显某些属性仅限于3D投影 (zlim等)。

因此,您可以编写一个小帮助函数来测试它是否为3D:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def axesDimensions(ax):
    if hasattr(ax, 'get_zlim'): 
        return 3
    else:
        return 2


fig = plt.figure()

ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, projection='3d')

print "ax1: ", axesDimensions(ax1)
print "ax2: ", axesDimensions(ax2)

这会输出:

ax1:  2
ax2:  3

谢谢。我会接受这个答案,因为它解决了问题,但我会继续寻找内置的方法来完成这个任务。如果我找到任何东西,我会更新我的问题。 - binnev

2

根据投影方式,ax将是不同的类。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, projection='3d')

print(type(ax1))  # <class 'matplotlib.axes._subplots.AxesSubplot'>
print(type(ax2))  # <class 'matplotlib.axes._subplots.Axes3DSubplot'>

isinstance(ax1, plt.Axes)  # True
isinstance(ax1, Axes3D)    # False
isinstance(ax2, plt.Axes)  # True - Axes3D is also a plt.Axes
isinstance(ax2, Axes3D)    # True 

1
我认为这是最直接和可靠的方法。在我的情况下,我想检查一个图轴是否使用了极坐标投影,可以类似地执行 isinstance(ax, plt.PolarAxes) - Erlend Magnus Viggen
1
我认为这是最直接和可靠的方法。在我的情况下,我想检查一个坐标轴是否使用了极坐标投影,可以类似地使用isinstance(ax, plt.PolarAxes)来完成。 - undefined

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