如何在matplotlib中移动Poly3DCollection对象?

时间:2015-04-04 21:38:43

标签: python animation matplotlib

我尝试使用matplotlib制作动画,并在第一步失败。我甚至无法制作一个移动的立方体。我使用plot_surface方法创建了六个曲面,但我无法精确地移动它们。我有两个问题:

  1. 如何移动Poly3DCollection对象。

    我尝试的方法是使用集合类提供的set_offsets。 但是这种方法只能设置xy,而且单位很奇怪。 例如,我在(1,0,0)创建一个立方体并调用set_offsets([100,0]), 绘制的立方体的水平位置约为1.4。我尝试将此单元链接到图形对象的dpi但是失败了。

  2. 我的数据的单位,行宽和set_offsets方法有哪些。

  3. 我目前的代码如下:

        # -*- 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()
    

1 个答案:

答案 0 :(得分:0)

根据PolyCollection documentation,默认情况下,偏移量应用于屏幕坐标。要在数据坐标中移动对象,请首先为每个对象调用set_offset_position('data'),例如

self.top.set_offset_position('data')