如何用Python Matplotlib绘制多组3D曲面?XML数据处理报错解决
问题根源
- 数据提取结构错误:原代码提取所有
<Voltage>节点时未按<Temperature>分组,导致turn_on_energy是一维数组(所有电压数据平铺),而非按温度分组的二维结构(5个温度组,每组4个电压数据)。 - 维度不匹配:
plot_surface要求Z参数为二维数组(对应X、Y网格的每个点),原代码构造Z的逻辑错误,导致传入一维数组。 - Meshgrid参数错误:X、Y应对应电流(I)和电压(V)的网格,而非温度与电流。
修正后的完整代码
1. 修正数据提取函数turn_on_loss
def turn_on_loss(root, ns, filename): turn_on_loss_data = root.find('.//ns:TurnOnLoss', namespaces=ns) if turn_on_loss_data is None: return # 提取各轴数据 turn_on_temperature = [float(t) for t in turn_on_loss_data.find('.//ns:TemperatureAxis', namespaces=ns).text.split()] turn_on_current = [float(c) for c in turn_on_loss_data.find('.//ns:CurrentAxis', namespaces=ns).text.split()] turn_on_voltage_drop = [float(v) for v in turn_on_loss_data.find('.//ns:VoltageAxis', namespaces=ns).text.split()] # 按Temperature分组提取Energy数据 turn_on_energy = [] # 遍历每个Temperature节点 for temp_node in turn_on_loss_data.findall('.//ns:Energy/ns:Temperature', namespaces=ns): temp_energy = [] # 提取当前Temperature下的所有Voltage数据 for volt_node in temp_node.findall('.//ns:Voltage', namespaces=ns): energy_vals = [float(e) for e in volt_node.text.split()] temp_energy.append(energy_vals) turn_on_energy.append(temp_energy) # 调用绘图函数,传入完整的温度、能量数据 plot_energy_loss(turn_on_current, turn_on_temperature, turn_on_voltage_drop, turn_on_energy, 'Turn on Energy', f'{filename} Output Characteristic Turn-on Energy')
2. 修正绘图函数plot_energy_loss
import matplotlib.pyplot as plt import numpy as np from matplotlib import cm def plot_energy_loss(current, temperatures, voltage, energy, energy_type, title): fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 创建电流(X)和电压(Y)的网格:X.shape=(4,7), Y.shape=(4,7)(对应4个电压,7个电流) X, Y = np.meshgrid(current, voltage) # 为每个温度分配不同颜色 colors = cm.viridis(np.linspace(0, 1, len(temperatures))) for idx, (temp, temp_energy) in enumerate(zip(temperatures, energy)): # 将当前温度下的4个电压数据转换为二维数组:Z.shape=(4,7) Z = np.array(temp_energy) # 绘制曲面 ax.plot_surface(X, Y, Z, color=colors[idx], alpha=0.7, label=f'T={temp}°C') # 设置坐标轴标签和标题 ax.set_xlabel('Current [A]') ax.set_ylabel('Voltage Drop [V]') ax.set_zlabel(f'{energy_type} [μJ]') ax.set_title(title) # 添加图例(3D图需手动调整图例位置) ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1)) plt.tight_layout() plt.show()
关键修正点说明
- 数据结构修正:
turn_on_energy变为[温度1[电压1数据, 电压2数据,...], 温度2[...], ...]的二维嵌套结构,每个温度组对应一组完整的电压-电流能量数据。 - Meshgrid构造:用
current和voltage生成网格,确保X(电流)、Y(电压)的维度与Z(能量)匹配(均为(电压数量, 电流数量))。 - Z数组维度:直接将每个温度下的电压数据转换为二维数组,满足
plot_surface对Z的2D要求。 - 多曲面区分:使用颜色映射为每个温度曲面分配独特颜色,并添加图例便于区分。
内容的提问来源于stack exchange,提问作者HWJ
相关产品推荐
相关产品推荐

