matplotlib 如何在2D和3D投影之间切换

wtzytmuj  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(140)

我有一个matplotlib图,我希望能够在2D和3D投影之间切换。我可以从2D到3D,但我似乎不知道如何走另一条路。举例来说...

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

def randrange(n, vmin, vmax):
    return (vmax-vmin)*np.random.rand(n) + vmin

fig = plt.figure()

# Create a 3D scatter plot...
ax = fig.add_subplot(111, projection='3d')
n = 100
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
    xs = randrange(n, 23, 32)
    ys = randrange(n, 0, 100)
    zs = randrange(n, zl, zh)
    ax.scatter(xs, ys, zs, c=c, marker=m)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

# Now I want a 2D plot...
ax.cla()
ax = fig.add_subplot(111)
ax.plot(xs, ys)

plt.show()

打印停留在3D投影中,并且projection=“2D”不是有效的kwarg。..
我想也许是斧头。clf()会按照我的要求来定义一个新的数字。但它只是给了我以下错误:ValueError:未知元素O
有谁能给予我一个提示,关于这个问题的解决方案?ValueError是否与问题有关,还是提示我的设置存在其他问题?是否有kwarg将投影从3D切换到2D?

0yycz8jy

0yycz8jy1#

让我先说,如果你通过去把你以前实际使用的问题的答案与你以前的问题区分开来来提高你的接受率(目前是0%),那么也许更多的人会愿意帮助你。
现在,回答你的问题,没有“2d”投影kwarg。然而,如果你想通过并快速决定你想要哪种类型的投影,取决于关键字“q”,下面的内容应该会对你有所帮助。我还修改了基本设置,以避免不同类型的绘图之间的混淆,因为在循环之外有一些绘图调用,并且通常清理了您的组织。
希望这能帮上忙。

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

def randrange(n, vmin, vmax):
   return (vmax-vmin)*np.random.rand(n) + vmin

fig = plt.figure()
plt.clf()

q='2d'

n = 100
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
  xs = randrange(n, 23, 32)
  ys = randrange(n, 0, 100)  
  zs = randrange(n, zl, zh)

if q=='3d':

  # Create a 3D scatter plot...
  ax = fig.add_subplot(111, projection='3d')
  ax.scatter(xs, ys, zs, c=c, marker=m)
  ax.set_xlabel('X Label')
  ax.set_ylabel('Y Label')
  ax.set_zlabel('Z Label')
  plt.show()

else:
  plt.clf()
  ax = fig.add_subplot(111)
  ax.plot(xs, ys)
  ax.set_xlabel('X Label')
  ax.set_ylabel('Y Label')
  plt.show()
f8rj6qna

f8rj6qna2#

我相信我已经找到了一个可能的解决方案,尽管它似乎会导致一点内存问题。我怀疑它实际上并没有删除最初的绘图数据,只是将其从图中删除,这样每次投影改变时内存使用量就会攀升。

# Delete the 3D subplot
self.fig.delaxes(self.axes)
# Create a new subplot that is 2D
self.axes = self.fig.add_subplot(111)
# 2D scatter
self.axes.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
# Update the figure
self.canvas.draw()
mcvgt66p

mcvgt66p3#

我也遇到了同样的问题,并尝试了公认的解决方案(由丹发布)。它工作了,但给了我以下警告:
“用户警告:此图包括与tight_layout不兼容的轴,因此其结果可能不正确。“
但是,如果我用途:

self.figure.clf()
self.axes = self.figure.add_subplot(111)

那么它会在没有任何警告的情况下工作。

相关问题