Animiertes 3D-Balkendiagramm mit Python

Ich muss einige Daten, z = f (x, y, t) , in einem 3D-Balkendiagramm anzeigen. Ich möchte dieses Diagramm mit der Zeit ändern / animieren.

Jetzt kann ich meine Daten z = f (x, y, t) für eine beliebige Zeit t anzeigen, aber ich kann keine Möglichkeit finden, das Diagramm automatisch neu zu zeichnen, um die Daten des nächsten Zeitschritts anzuzeigen. Gibt es einen Weg dafür?

Ich habe mit einer einfachen Schleife versucht, aber anscheinend kann ich nur die Daten zum letzten Mal sehen.

Hier ist die aktuelle Version meines Codes:

from mpl_toolkits.mplot3d import Axes3D from math import cos, sin import matplotlib.pyplot as plt import numpy as np # An arbitraty function for z = f(x,t) def z_xt(x, t): return 30*sin(5*t) + x**2 + 20 # An arbitraty function for z = f(y,t) def z_yt(y, t): return 20*cos(2*t) + y**3/10 + 20 # Superposition z(x,y,t) = z(x,t) + z(y,t) def z_xyt(f_xt, f_yt): return f_xt+f_yt # Definition of space and time domains nx = 9; dx = 1 ny = 6; dy = 1 nt = 10; dt = 1 y, x = np.mgrid[slice(0, ny, dy),slice(0, nx, dx)] t_list = [round(t*dt,2) for t in range(nt)] # The matrix that contains the solution for every time step Z_xyt = [z_xyt(z_xt(x, t), z_yt(y, t)) for t in t_list] # Plot data in a 3D bar chart fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x_grid, y_grid = np.meshgrid(np.arange(nx), np.arange(ny)) x_grid = x_grid.flatten() y_grid = y_grid.flatten() # Iterate time and plot coresponding data for index, t in enumerate(t_list): # Z_xyt data at time t_list[index] z_data = Z_xyt[index].flatten() # Draw/actualize 3D bar chart data for every time step bar_chart = ax.bar3d(x_grid, y_grid, np.zeros(len(z_data)), 1, 1, z_data) plt.draw() plt.show() 

Danke im Voraus!

  • Interpolationsmethode, die keine unnötigen Extremfelder hinzufügt
  • Kann kein Brokenaxes-Modul finden
  • Zwischenkreuzung zwischen Gerade und Kontur finden
  • Wie halte ich den kleineren Wert in einem Balkendiagramm vor (wenn ich die Stäbe nicht nebeneinander stellen kann)?
  • Interpolation einer 3D-Oberfläche, die an ihren Eckknoten bekannt ist und mit einer Farbkarte färbt
  • Wie man dynamisch eine Handlung in einer Schleife im ipython Notizbuch (innerhalb einer Zelle)
  • One Solution collect form web for “Animiertes 3D-Balkendiagramm mit Python”

    Ich habe endlich einen Weg gefunden, es zu tun, indem ich das Diagramm in ein PyQt-Fenster einbinde (nach den Anweisungen in diesem Beitrag ). Der unten vorgeschlagene Code erzeugt ein PyQt-Fenster, in dem das 3D-Balkendiagramm angezeigt wird. Das Diagramm kann mit einem Schieberegler (Zeitvariationen) animiert werden.

     import sys from PyQt4 import QtGui, QtCore from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar from mpl_toolkits.mplot3d import Axes3D from math import cos, sin import matplotlib.pyplot as plt import numpy as np # An arbitraty function for z = f(x,t) def z_xt(x, t): return 30*sin(5*t) + x**2 + 20 # An arbitraty function for z = f(y,t) def z_yt(y, t): return 20*cos(2*t) + y**3/10 + 20 # Superposition z(x,y,t) = z(x,t) + z(y,t) def z_xyt(f_xt, f_yt): return f_xt+f_yt # Definition of space and time domains nx = 9; dx = 1 ny = 6; dy = 1 nt = 50; dt = 0.05 y, x = np.mgrid[slice(0, ny, dy),slice(0, nx, dx)] t_list = [round(t*dt,2) for t in range(nt)] # The matrix that contains the solution for every time step Z_xyt = [z_xyt(z_xt(x, t), z_yt(y, t)) for t in t_list] # Plot data in a 3D bar chart fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x_grid, y_grid = np.meshgrid(np.arange(nx), np.arange(ny)) x_grid = x_grid.flatten() y_grid = y_grid.flatten() class Window(QtGui.QDialog): def __init__(self, parent=None): super(Window, self).__init__(parent) # a figure instance to plot on self.figure = plt.figure() # this is the Canvas Widget that displays the `figure` # it takes the `figure` instance as a parameter to __init__ self.canvas = FigureCanvas(self.figure) # this is the Navigation widget # it takes the Canvas widget and a parent self.toolbar = NavigationToolbar(self.canvas, self) # A slider to make time variations self.horizontalSlider = QtGui.QSlider(self) self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal) self.horizontalSlider.valueChanged.connect(self.plot) self.horizontalSlider.setMinimum(0) self.horizontalSlider.setMaximum(t_list.__len__()-1) # set the layout layout = QtGui.QVBoxLayout() layout.addWidget(self.toolbar) layout.addWidget(self.canvas) layout.addWidget(self.horizontalSlider) self.setLayout(layout) # Generate the chart for t=0 when the window is openned self.plot() def plot(self): # Read the slider value -> t = t_list[t_index] t_index = self.horizontalSlider.value() # Get the z-data for the given time index z_data = Z_xyt[t_index].flatten() # Discards the old chart and display the new one ax = self.figure.add_subplot(111,projection='3d') ax.hold(False) ax.bar3d(x_grid, y_grid, np.zeros(len(z_data)), 1, 1, z_data) # refresh canvas self.canvas.draw() if __name__ == '__main__': app = QtGui.QApplication(sys.argv) main = Window() main.show() sys.exit(app.exec_()) 

    Grafisch sieht das Fenster so aus:

    PyQt-Fenster zum Animieren von 3D-Bar-Zeichen

    Python ist die beste Programmiersprache der Welt.