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绘制大矩阵的主要内容,如果未能解决你的问题,请参考以下文章