为什么Matplotlib绘图比pd.DataFrame.plot()慢这么多?

4

亲爱的社区成员们,你好:

我在搜索过程中没有找到类似的内容,希望没有忽略任何东西。我有以下问题:

我有一个大数据集,其形状为 1352x121797(即 1353 个样本和 121797 个时间点)。现在我已经对它们进行了聚类,并希望为每个聚类生成一个图表,在该图表中绘制此聚类的每个时间序列。

然而,当使用 matplotlib 语法时,速度非常慢(我不确定这是从哪里来的)。即使过了5-10分钟,它也没有完成。

import matplotlib.pyplot as plt
import pandas as pd

fig, ax = plt.subplots()

for index, values in subset_cluster.iterrows(): # One Cluster subset, dataframe of shape (11x121797)
    ax.plot(values)

fig.savefig('test.png')

即使在ax.plot(values)之后插入一个break,它仍然无法完成。 我正在使用Spyder,认为这可能是由于Spyder始终在控制台中内联呈现图。然而,当简单地使用Series values.plot()的pandas方法,而不是ax.plot(values)时,图形出现并在1-2秒钟内保存。
由于我需要matplotlib的自定义选项来标准化所有的图形并让它们看起来漂亮一点,所以我希望使用matplotlib语法。有人有任何想法吗?
提前致谢
编辑:因此,在尝试一下似乎渲染是耗时的部分时。当使用后端matplotlib.use('Agg')运行时,绘图命令可以更快地运行(如果使用plt.plot()而不是ax.plot()),但是plt.savefig()会花费很长时间。然而,即使对于121xxx数据点,它也应该在相当一段时间内完成,对吧?

请注意,ax.plot(values)values.plot()不同。由于pandas绘图函数只是基于matplotlib的,除非您绘制不同的内容(就像在这里一样),否则matplotlib在绘制时不可能比pandas慢。如果需要,请随时提供一个最小可复现示例[mcve]。 - ImportanceOfBeingErnest
+1. 我遇到了完全相同的问题。我正在对数据集的列进行循环,并使用data.plot( x='timestamp', y=col, label=col, figsize=(20,10))绘图,用了3.2秒,而使用plt.figure(figsize=(20,10)) plt.plot( data['timestamp'], data[col], label=col)已经运行了10分钟,仍然没有完成。Pandas在调用Matplotlib之前会对轴缩放、标签等进行一些优化,但这让我想知道是什么导致了如此巨大的差异。显然,最耗时的应该是绘制数据。 - F. Remonato
1个回答

2
作为答案发布,希望能对提问者或其他人有所帮助:我曾经遇到同样的问题,并发现原因是我的x轴数据是一个对象,而y轴数据是float64。在将该对象显式设置为DateTime后,使用Matplotlib绘图与Pandas的df.plot()一样快。我猜测Pandas在绘制时更擅长理解数据类型。
提问者,您可能需要检查您正在绘制的值是否具有正确的类型,或者像我一样,在从文件加载数据框时遇到了一些问题。

谢谢!正是我需要的。我使用了df.astype()将我的值从字符串转换为浮点数,但我错过了索引。也许pandas在绘图之前会将字符串转换为浮点数? - Noah Sprent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接