我尝试使用matplotlib制作动画,并在第一步失败。我甚至无法制作一个移动的立方体。我使用plot_surface
方法创建了六个曲面,但我无法精确地移动它们。我有两个问题:
如何移动Poly3DCollection对象。
我尝试的方法是使用集合类提供的set_offsets
。
但是这种方法只能设置x
和y
,而且单位很奇怪。
例如,我在(1,0,0)创建一个立方体并调用set_offsets([100,0]),
绘制的立方体的水平位置约为1.4。我尝试将此单元链接到图形对象的dpi但是失败了。
我的数据的单位,行宽和set_offsets
方法有哪些。
我目前的代码如下:
# -*- coding: utf-8 -*-
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")
plt.xlabel('x')
plt.ylabel('y')
class cube():
def __init__(self, ax, x = 0, y = 0, z = 0,
height = 1., width = 1., depth = 1.) :
self.ax = ax
self.initiate(ax, x, y, z, height, width, depth)
def initiate(self, ax, x = 0, y = 0, z = 0,
height = 1., width = 1., depth = 1.) :
self.ax = ax
self.x, self.y, self.z = x, y, z
self.height, self.width, self.depth = height, width, depth
X = [[x, x + width], [x, x + width]]
Y = [[y, y], [y, y]]
Z = [[z, z], [depth, depth]]
self.top = ax.plot_surface(X, Y, Z, linewidth=1, edgecolors='black', shade=False, color = 'red')
X = [[x, x + width], [x, x + width]]
Y = [[y + height, y + height], [y + height, y + height]]
Z = [[z, z], [depth, depth]]
self.bottom = ax.plot_surface(X, Y, Z, linewidth=1, edgecolors='black', shade=False, color = 'red')
X = [[x, x + width], [x, x + width]]
Y = [[y, y], [y + height, y + height]]
Z = [[z, z], [z, z]]
self.front = ax.plot_surface(X, Y, Z, linewidth=1, edgecolors='black', shade=False, color = 'green')
X = [[x, x + width], [x, x + width]]
Y = [[y, y], [y + height, y + height]]
Z = [[depth, depth], [depth, depth]]
self.back = ax.plot_surface(X, Y, Z, linewidth=1, edgecolors='black', shade=False, color = 'green')
X = [[x, x], [x, x]]
Y = [[y, y + height], [y, y + height]]
Z = [[z, z], [depth, depth]]
self.left = ax.plot_surface(X, Y, Z, linewidth=1, edgecolors='black', shade=False, color = 'blue')
X = [[x + width, x + width], [x + width, x + width]]
Y = [[y, y + height], [y, y + height]]
Z = [[z, z], [depth, depth]]
self.right = ax.plot_surface(X, Y, Z,
linewidth=1, edgecolors='black', shade=False, color = 'blue')
def set_location(self, x, y, z) :
c.front.set_offsets([x, y])
c.back.set_offsets([x, y])
c.left.set_offsets([x, y])
c.right.set_offsets([x, y])
c.top.set_offsets([x, y])
c.bottom.set_offsets([x, y])
c = cube(ax, 1, 0, 0)
print type(c.left)
c.set_location(100, 0, 0)
plt.show()
答案 0 :(得分:0)
根据PolyCollection documentation,默认情况下,偏移量应用于屏幕坐标。要在数据坐标中移动对象,请首先为每个对象调用set_offset_position('data')
,例如
self.top.set_offset_position('data')