将 Matplotlib 与 Dask 结合使用

MDD*_*id1 3 python matplotlib pandas dask dask-dataframe

假设我们有 pandas dataframepd和 dask dataframe dd。当我想用 matplotlib 绘制 pandas 时,我可以轻松做到:

fig, ax = plt.subplots()
ax.bar(pd["series1"], pd["series2"])
fig.savefig(path)
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试对 dask dataframe 执行相同操作时,我得到的Type Errors是:

TypeError: Cannot interpret 'string[python]' as a data type
Run Code Online (Sandbox Code Playgroud)

string[python]这只是一个示例,无论您的dd["series1"]数据类型是什么,都将在此处输入。

所以我的问题是:使用matplotlibwith 的正确方法是什么dask?将这两个库结合起来是否是一个好主意?

Dah*_*ahn 7

SultanOrazbayev 的仍然是正确的,这里是一个详细说明该datashader选项的答案(hvplot在幕后调用)。

不要使用 Matplotlib,使用hvPlot

如果您希望在数据仍然很大时绘制数据,我建议使用 hvPlot,因为它可以本机处理 dask 数据帧。它还自动提供交互性

例子

import numpy as np
import dask
import hvplot.dask

# Create Dask DataFrame with normally distributed data
df = dask.datasets.timeseries()
df['x'] = df['x'].map_partitions(lambda x: np.random.randn(len(x)))
df['y'] = df['y'].map_partitions(lambda x: np.random.randn(len(x)))

# Plot
df.hvplot.scatter(x='x', y='y', rasterize=True)
Run Code Online (Sandbox Code Playgroud)


Sul*_*yev 5

使用dask替代方案的动机之一pandas是数据的大小。因此,pandas用 DataFrame交换daskDataFrame 可能不可行。想象一个散点图,这可能适用于 10K 点,但如果 dask 数据帧有十亿行,那么简单的matplotlib散点图可能是一个坏主意(datashader是一个更合适的工具)。

一些图形表示对数据的大小不太敏感,例如,只要类别数量不随数据缩放,标准化条形图就应该很好地工作。在这种情况下,最简单的解决方案是dask在使用 绘制感兴趣的统计数据之前使用 来计算它们pandas

总结一下:我会考虑图表的性质,找出最好的工具/表示形式,如果可以/应该用 来完成matplotlib,那么我会在daskDataFrame 上运行计算,以将简化的结果作为pandas数据帧获取,然后继续这matplotlib