Python使用matplotlib绘制大矩阵

Posted

技术标签:

【中文标题】Python使用matplotlib绘制大矩阵【英文标题】:Python plot Large matrix using matplotlib 【发布时间】:2015-09-21 18:56:25 【问题描述】:

我正在尝试绘制一个包含 2000 列和 200000 行的矩阵。当矩阵很小时,我可以使用

测试绘图并测试导出矩阵图
matshow(my_matrix)
show()

但是,当向 my_matrix 添加更多行时,由于行数多于列数,图形会变得非常窄,从而在放大时失去精度。我可以使矩阵图形可滚动吗?如果没有,我怎样才能在不损失精度的情况下可视化这样的矩阵?

我也尝试调用 savefig('filename', dpi=300) 以保存图像而不会损失太多精度,但是当矩阵很大时它会抛出 MemoryError 。非常感谢!

【问题讨论】:

可能对您的需求来说太简单了,但是您是否尝试过将大矩阵拆分为多个部分,然后在每个部分上调用 matshow? ax.set_aspect('auto') 将解决纵横比问题,但您的像素将是矩形而不是正方形。我已经用 2k x 150k 做了一些事情,但它开始突破 mpl 的极限(c++ 光栅化代码中有一些硬编码的 32 位整数)。 @tcaswell matshow() 返回一个 AxesImage。我相信 set_aspect() 函数只能由 Axes 对象访问。我不知道如何从 AxesImage 中获取 Axes 对象。 我最终采纳了您的建议。通过调用 ax = plt.gca() 然后 ax.set_aspect('auto') 获取当前轴,我还将矩阵拆分为更小的矩阵。 嗨@emily - 考虑为您自己的问题添加一个答案,以便将来遇到相同问题的人可以轻松找到它。 【参考方案1】:

我最终综合了@tcaswell 和@lesnikow 的建议。

获取当前坐标轴以便正确设置自动纵横比,我还将矩阵拆分为更小的矩阵:

    import matplotlib.pylab as plt

    for j in range(lower_bound_on_rows, upper_bound_on_rows): nums.append(j)
    partial_matrix = my_matrix[nums, :] 

    plt.matshow(partial_matrix, fignum=100)
    plt.gca().set_aspect('auto')
    plt.savefig('filename.png', dpi=600)

我的矩阵在垂直方向上很长,所以我按行切片并将所有列保留在较小的矩阵中。如果您的矩阵水平较长,请像这样翻转索引 my_matrix[:, nums]

【讨论】:

以上是关于Python使用matplotlib绘制大矩阵的主要内容,如果未能解决你的问题,请参考以下文章

python是不是有绘制混淆矩阵的函数,怎么来实现

怎么利用python绘制sse值与k值的函数图像

Python矩阵作图库matplotlib的初级使用

python绘制混淆矩阵

Python绘制wav文件音频图(静态)[matplotlib/wave]

python matplotlib subplot 上面面积大下面小怎么办