首页 > 解决方案 > 为什么 matplotlib.pyplot.savefig() 会弄乱非常大的 pandas.plotting.scatter_matrix() 的图像输出?

问题描述

我试图计算pandas.plotting.scatter_matrix()非常大的值 pandas.DataFrame() (相对于这个特定的操作,大多数库要么大部分时间运行 OOM,要么实现 50000 的行计数检查,请参阅vaex-scatter)。

我拥有的“时间序列”DataFrame 形状是(10000000, 41). 每个值都是浮点数或整数。

Q1:所以我想问的第一件事是如何有效地处理内存和空间。

我在第一季度尝试了什么

Q1 和新 Q2 的当前解决方法

%%time
# plt.xticks(np.arange(len(dataset.columns)),dataset.columns, rotation = 90)
# plt.yticks(np.arange(len(dataset.columns)),dataset.columns)
axes = scatter_matrix(dataset._to_pandas(), figsize=(512,512))
plt.tight_layout()
plt.savefig('scatter_matrix.jpeg')

Q2:我无法弄清楚为什么渲染的图像在视觉上不正确。

渲染图像的示例,因为文件太大,无法在此处发布

错过的情节

幻影网格

这就是网格的样子。

有许多图像伪影。有什么建议么?

标签: pythonpandasdataframematplotlib

解决方案


对于未来的读者,我选择的过程是使用datashader.org,正如@JodyKlymak 在他的评论(谢谢)中所建议的那样pandas.DataFrame

请记住,这种方法可以回答这两个问题。

  1. 将您的转换modin.pandas.DataFramepandas.DataFrame私人modin.pandas.DataFrame._to_pandas()
  2. 首先将图形绘制到 xarray 图像,如xarray-imshow
import datashader as ds
import datashader.transfer_functions as tf

cols = dataset_1.columns
plots = {}
for idx in range(41): # generating 40 plots on the fly
    if idx == 0:
        pass
    else:
        x = cols[idx]
        y = cols[idx-1]
        plots['some_unique_key'] = tf.shade(cvs.points(dataset_1[[x, y]], x, y))

# traverse the dictionary to use the xarray.plot.imshow() 
plots['some_unique_key'].plot.imshow()

时间

CPU times: user 723 ms, sys: 43 ms, total: 766 ms
Wall time: 757 ms

图片

在此处输入图像描述


推荐阅读