You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Matplotlib绘制多组3D曲面?XML数据处理报错解决

问题根源
  1. 数据提取结构错误:原代码提取所有<Voltage>节点时未按<Temperature>分组,导致turn_on_energy是一维数组(所有电压数据平铺),而非按温度分组的二维结构(5个温度组,每组4个电压数据)。
  2. 维度不匹配:plot_surface要求Z参数为二维数组(对应X、Y网格的每个点),原代码构造Z的逻辑错误,导致传入一维数组。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:19:52