如何用Python正确读取XMDS2输出的.h5文件并绘制图形?
Hey there! Let me walk you through figuring out this HDF5 file from XMDS2 and getting your 2D/3D plots set up. I’ve worked with similar XMDS2 output before, so let’s break this down step by step.
Step 1: Explore the Full HDF5 File Structure
The ['1'] you’re seeing is likely a group (not a dataset) that contains your actual xR, yR, zR, and time data. XMDS2 organizes simulation outputs into numbered groups by default. Let’s write a quick script to recursively explore every part of the file:
import h5py def explore_hdf5(group, path=""): for key in group.keys(): item = group[key] current_path = path + "/" + key if isinstance(item, h5py.Group): print(f"Group: {current_path}") explore_hdf5(item, current_path) elif isinstance(item, h5py.Dataset): print(f"Dataset: {current_path}, Shape: {item.shape}, Dtype: {item.dtype}") # Replace with your actual file path with h5py.File(r'Path...\lorenz.h5', 'r') as hdf: explore_hdf5(hdf)
When you run this, you’ll see a full list of groups and datasets. You should spot your xR, yR, zR, and time datasets nested under the 1 group.
Step 2: Load Your Data
Once you confirm the path to your datasets, load them into NumPy arrays like this:
import numpy as np import h5py with h5py.File(r'Path...\lorenz.h5', 'r') as hdf: # Access the simulation group sim_group = hdf['1'] # Load each dataset into a NumPy array time = np.array(sim_group['time']) xR = np.array(sim_group['xR']) yR = np.array(sim_group['yR']) zR = np.array(sim_group['zR']) # Verify the data shapes to make sure everything loaded correctly print(f"Time shape: {time.shape}") print(f"xR shape: {xR.shape}")
Step 3: Create 2D Plots (Variables vs Time)
Use Matplotlib (included with Spyder) to plot each variable against time:
import matplotlib.pyplot as plt # Set up a figure with 3 subplots plt.figure(figsize=(10, 6)) # xR vs Time plt.subplot(3, 1, 1) plt.plot(time, xR, label='xR', linewidth=1) plt.xlabel('Time') plt.ylabel('xR') plt.legend() plt.grid(alpha=0.3) # yR vs Time plt.subplot(3, 1, 2) plt.plot(time, yR, label='yR', color='orange', linewidth=1) plt.xlabel('Time') plt.ylabel('yR') plt.legend() plt.grid(alpha=0.3) # zR vs Time plt.subplot(3, 1, 3) plt.plot(time, zR, label='zR', color='green', linewidth=1) plt.xlabel('Time') plt.ylabel('zR') plt.legend() plt.grid(alpha=0.3) # Adjust spacing between plots plt.tight_layout() plt.show()
Step 4: Create a 3D Lorenz Attractor Plot
For the iconic 3D Lorenz attractor visualization, use Matplotlib’s 3D projection:
# Set up a 3D figure fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(projection='3d') # Plot the trajectory ax.plot(xR, yR, zR, linewidth=0.8, color='darkviolet') # Add labels and title ax.set_xlabel('xR') ax.set_ylabel('yR') ax.set_zlabel('zR') ax.set_title('Lorenz Attractor (XMDS2 Simulation Output)') plt.show()
Quick Notes for XMDS2 Newbies
- XMDS2 uses numbered groups (
1,2, etc.) to store outputs if you run multiple simulations in one script. That’s why you saw['1']at the top level. - If you ever get stuck finding data, the
explore_hdf5function above is your best friend—it reveals every layer of the HDF5 file.
内容的提问来源于stack exchange,提问作者DEMPEROR

