Polars 与 matplotlib 配合得很好。
在matplotlib中,你可以直接使用polars的数据进行绘制图形,而无需把polars的dataframe转为pandas的dataframe:
import polars as pl
import matplotlib.pyplot as plt
# 创建一个polars DataFrame
df_pl = pl.DataFrame({
"x": [1, 2, 3, 4, 5],
"y": [2, 3, 5, 7, 11]
})
# 使用matplotlib绘图
plt.figure(figsize=(10, 6))
plt.plot(df_pl["x"], df_pl["y"], marker='o')
# 数据量大的时候,建议使用表达式API来引用列:
# plt.plot(df_pl.select(pl.col("x")), df_pl.select(pl.col("y")), marker='x')
plt.title("Example Plot")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
再例如,要制作条形图,我们直接将 Polars 数据框中的列传递给它。
在下面的第一个示例中,我们可以看到北大西洋中爱尔兰波浪浮标测得的最大波浪高度(这只是一个片段,用于向您展示它的工作方式)。
stationAggs = stationAggs.sort("significant_wave_height_max").tail(6)
fig, ax = plt.subplots()
ax.barh(
y=stationAggs["stationID"],
width=stationAggs["significant_wave_height_max"],
)
ax.set_xlabel('Max wave height (m)')
我们是否也可以进行一些风暴追踪呢?
在第二个示例中,我们使用快速的 groupby_dynamic 方法对每个站点的波浪高度取3小时的平均值。
为了绘制多线图,我们需要对每个线调用 ax.plot 方法。我们可以通过循环遍历一个分组对象来获取每个站点的数据,并在9月26日看到一场带有一些大块波浪的风暴。
# 每个站点的平均时间序列分为3小时窗口
averagedValuesDf = (
dfBigWaves
.groupby_dynamic("time","3h",by="stationID")
.agg(
pl.col("significant_wave_height").mean()
)
)
fig,ax = plt.subplots(figsize=(12, 4), dpi=80)
# 遍历groupby以获取每个站点的值
for stationDf in averagedValuesDf.groupby("stationID"):
stationID = stationDf[0,0]
# 为每个站点添加一行
ax.plot(
stationDf["time"],
stationDf["significant_wave_height"],
label=stationID
)
plt.legend()
总之,如果你习惯了使用matplotlib,polars的数据能够与之无缝连接。
当然,如果你使用其他可视化库,比如Altair、Plotly、holoviews等,这些库也可以与polars直接集成。这在另一篇文章里也有介绍:
从 Pandas 到 Polars 十一:在Polars环境中,Matplotlib与Plotly的比较
退一步说,如果你只习惯使用pandas的数据进行绘图,那也可以使用polars的df.to_pandas()方法将数据转为pandas的格式,只不过在转换为 Pandas DataFrame 时,可能会有一些性能损失,特别是对于大型数据集。
往期热门文章:
从 Pandas 到 Polars 二十六:在Polars中,不要遍历列
从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
从 Pandas 到 Polars 十三:流式处理的关键参数
从 Pandas 到 Polars 十:“Polars 表达式“是什么?