<p>所以你的数据并没有那么大,而且你在绘制数据时遇到了麻烦,这说明工具有问题。Matplotlib。。。。不是很好吗。它有很多选项,输出也很好,但它占用了大量内存,而且它基本上假设您的数据很小。但还有其他选择。</p>
<p>因此,作为一个示例,我使用以下命令生成了一个20M数据点文件“bigdata.bin”:</p>
<pre><code>#!/usr/bin/env python
import numpy
import scipy.io.numpyio
npts=20000000
filename='bigdata.bin'
def main():
data = (numpy.random.uniform(0,1,(npts,3))).astype(numpy.float32)
data[:,2] = 0.1*data[:,2]+numpy.exp(-((data[:,1]-0.5)**2.)/(0.25**2))
fd = open(filename,'wb')
scipy.io.numpyio.fwrite(fd,data.size,data)
fd.close()
if __name__ == "__main__":
main()
</code></pre>
<p>这会生成一个大小约229MB的文件,并不是很大;但您已经表示希望转到更大的文件,因此最终会达到内存限制。</p>
<p>让我们先关注非互动情节。首先要意识到的是,每一点上都有象形文字的矢量图将是一场灾难——对于20米的每一点来说,其中大部分都将重叠,试图渲染小的十字或圆或其他东西将是一个离散点,生成巨大的文件并花费数吨的时间。我认为这就是默认情况下下沉matplotlib的原因。</p>
<p>Gnuplot处理这个问题没有问题:</p>
<pre><code>gnuplot> set term png
gnuplot> set output 'foo.png'
gnuplot> plot 'bigdata.bin' binary format="%3float32" using 2:3 with dots
</code></pre>
<p><img src="https://i.stack.imgur.com/6INOr.png" alt="gnuplot"/></p>
<p>甚至Matplotlib也可以谨慎地运行(选择光栅后端,并使用像素标记点):</p>
<pre><code>#!/usr/bin/env python
import numpy
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
datatype=[('index',numpy.float32), ('floati',numpy.float32),
('floatq',numpy.float32)]
filename='bigdata.bin'
def main():
data = numpy.memmap(filename, datatype, 'r')
plt.plot(data['floati'],data['floatq'],'r,')
plt.grid(True)
plt.title("Signal-Diagram")
plt.xlabel("Sample")
plt.ylabel("In-Phase")
plt.savefig('foo2.png')
if __name__ == "__main__":
main()
</code></pre>
<p><img src="https://i.stack.imgur.com/PjFoD.png" alt="matplotlib"/></p>
<p>现在,如果你想互动,你就必须把数据放在箱子里打印,然后动态放大。我不知道有什么python工具可以帮助您立即完成这项工作。</p>
<p>另一方面,绘制大数据是一项相当常见的任务,而且有一些工具可以胜任这项工作。<a href="http://www.paraview.org/">Paraview</a>是我个人的最爱,而<a href="https://wci.llnl.gov/codes/visit/">VisIt</a>是另一个。它们都主要用于3D数据,但Paraview也特别适合2d,而且非常具有交互性(甚至有一个Python脚本接口)。唯一的诀窍是将数据写入Paraview可以轻松读取的文件格式。</p>