如何在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
相关产品推荐
相关产品推荐

