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

如何用plotnine实现与matplotlib一致的多折线图绘制?

用plotnine正确实现多折线图的方法

原Matplotlib实现代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

x = [1,2,3]
y = [ [30, 4, 50], [300,400,500], [350,450,550] ]
plt.plot(x, y)
plt.show()

问题分析

你写出的plotnine代码未能生成正确结果,核心原因是没有严格遵循plotnine依赖的**整洁数据(tidy data)**规范,且未明确指定折线的分组逻辑,导致geom_line无法正确识别不同折线的点集合。

正确的Plotnine实现方案

方案1:直接构造长格式数据

通过平铺x值、合并y值、生成分组标识,构造符合要求的长格式DataFrame,同时显式指定group参数确保折线分组正确:

import numpy as np
import plotnine as p9
import pandas as pd

x = [1,2,3]
y = [ [30, 4, 50], [300,400,500], [350,450,550] ]

# 构造整洁格式的数据集
data = pd.DataFrame({
    'x': np.tile(x, len(y)),  # 重复x轴数据,次数等于折线总数
    'y': np.concatenate(y),   # 平铺所有y轴数据
    'group': np.repeat(np.arange(1, len(y)+1), len(x))  # 为每条折线分配唯一分组标识
})

# 绘制多折线图
plot = (
    p9.ggplot(data, p9.aes(x='x', y='y', color='factor(group)', group='group')) +
    p9.geom_line()
)
plot.draw()

方案2:宽格式转长格式(更直观)

先将数据整理为宽格式(每列对应一条折线),再通过pd.melt转换为长格式,更符合可视化逻辑:

import numpy as np
import plotnine as p9
import pandas as pd

x = [1,2,3]
y = [ [30, 4, 50], [300,400,500], [350,450,550] ]

# 先构造宽格式数据
df_wide = pd.DataFrame(y, columns=x).T
df_wide.columns = [f'折线{i+1}' for i in range(len(y))]
df_wide = df_wide.reset_index().rename(columns={'index':'x'})

# 转换为长格式
data = pd.melt(df_wide, id_vars='x', var_name='分组', value_name='y')

# 绘制折线图
plot = (
    p9.ggplot(data, p9.aes(x='x', y='y', color='分组', group='分组')) +
    p9.geom_line()
)
plot.draw()

关键说明

plotnine基于ggplot2的语法规则,要求数据必须是整洁数据:每一行代表一个独立观测,每一列对应一个变量。显式指定group参数可以确保geom_line将同一分组内的点按x轴顺序连接成折线,避免出现点乱连的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:46:28