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

如何在matplotlib中按模型分组绘制多组X(val1)Y(val2)折线且无需循环

折线图绘制实现方案

错误原因说明

原有代码通过pivot转换数据后,DataFrame索引为alpha,调用plot方法时默认将索引作为X轴,同时把val1、val2都作为Y轴数值列,因此每个模型对应2条折线,最终得到4条不符合预期的输出。

完整无循环实现(含样例数据)

方式1:基于seaborn实现(更简洁)

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 样例数据构造,可替换为你自己的DataFrame
data = {
    "alpha": [0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.4],
    "model": ["A", "A", "A", "A", "B", "B", "B", "B", "B"],
    "val1": [1, 2, 3, 4, 1.2, 2.1, 3.3, 4.2, 4.2],
    "val2": [5, 7, 6, 8, 4.5, 6.8, 7.2, 8.5, 8.5]
}
df = pd.DataFrame(data)

# 绘图逻辑
plt.figure(figsize=(15, 13))
sns.lineplot(
    data=df,
    x="val1",
    y="val2",
    hue="model",
    marker="o",
    sort=False
)
plt.xlabel("val1")
plt.ylabel("val2")
plt.show()

方式2:纯pandas实现(无需额外安装seaborn)

import pandas as pd
import matplotlib.pyplot as plt

# 样例数据构造,可替换为你自己的DataFrame
data = {
    "alpha": [0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.4],
    "model": ["A", "A", "A", "A", "B", "B", "B", "B", "B"],
    "val1": [1, 2, 3, 4, 1.2, 2.1, 3.3, 4.2, 4.2],
    "val2": [5, 7, 6, 8, 4.5, 6.8, 7.2, 8.5, 8.5]
}
df = pd.DataFrame(data)

# 绘图逻辑
ax = df.plot(
    kind="line",
    x="val1",
    y="val2",
    by="model",
    figsize=(15, 13),
    marker="o"
)
ax.set_xlabel("val1")
ax.set_ylabel("val2")
plt.show()

注意事项

  • sort=False参数可保证折线按alpha的原有顺序连接点,不会因为val1非单调打乱连线顺序,如需按val1从小到大排序后连线可删除该参数
  • 代码默认保留所有重复的(val1, val2)对,如需去重可在绘图前执行df = df.drop_duplicates(subset=["model", "alpha", "val1", "val2"])
  • 不同模型的val1取值不需要完全一致,只要在同一数值范围即可正常在同一坐标系展示

内容的提问来源于stack exchange,提问作者eduardokapp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:02