在Ubuntu上对具有1000万点散点图基准的开源交互式绘图软件进行的调查
受到以下描述的用例的启发:https ://stats.stackexchange.com/questions/376361/how-to-find-the-sample-points-that-have-statistically-有意义-大-离群值-r我已对其进行基准测试以下非常简单且幼稚的1000万点直线数据的一些实现:
i=0;
while [ "$i" -lt 10000000 ]; do
echo "$i,$((2 * i)),$((4 * i))"; i=$((i + 1));
done > 10m.csv
前几行10m.csv
如下所示:
0,0,0
1,2,4
2,4,8
3,6,12
4,8,16
基本上,我想:
- 进行多维数据的XY散点图,希望将Z作为点颜色
- 交互式选择一些有趣的观察点
- 查看所选点的所有尺寸(至少包括X,Y和Z)以尝试了解为什么它们在XY散点中是异常值
为了获得更多乐趣,我还准备了更大的10亿点数据集,以防任何程序可以处理1000万点!CSV文件有点不稳定,所以我转到了HDF5:
import h5py
import numpy
size = 1000000000
with h5py.File('1b.hdf5', 'w') as f:
x = numpy.arange(size + 1)
x[size] = size / 2
f.create_dataset('x', data=x, dtype='int64')
y = numpy.arange(size + 1) * 2
y[size] = 3 * size / 2
f.create_dataset('y', data=y, dtype='int64')
z = numpy.arange(size + 1) * 4
z[size] = -1
f.create_dataset('z', data=z, dtype='int64')
这将产生一个〜23GiB文件,其中包含:
- 十亿点的直线很像
10m.csv
- 图表中心上方的一个离群点
除非在小节中另有说明,否则这些测试都是在Ubuntu 18.10中进行的,除非是在具有Intel Core i7-7820HQ CPU(4核/ 8线程),2个Samsung M471A2K43BB1-CRC RAM(2个16GiB),NVIDIA Quadro M1200的ThinkPad P51笔记本电脑上进行的4GB GDDR5 GPU。
结果汇总
考虑到我非常特定的测试用例,并且我是许多审查软件的首次用户,这就是我观察到的:
它可以处理1000万点吗?
Vaex Yes, tested up to 1 Billion!
VisIt Yes, but not 100m
Paraview Barely
Mayavi Yes
gnuplot Barely on non-interactive mode.
matplotlib No
Bokeh No, up to 1m
PyViz ?
seaborn ?
它有很多功能吗?
Vaex Yes.
VisIt Yes, 2D and 3D, focus on interactive.
Paraview Same as above, a bit less 2D features maybe.
Mayavi 3D only, good interactive and scripting support, but more limited features.
gnuplot Lots of features, but limited in interactive mode.
matplotlib Same as above.
Bokeh Yes, easy to script.
PyViz ?
seaborn ?
GUI是否感觉良好(不考虑良好的性能):
Vaex Yes, Jupyter widget
VisIt No
Paraview Very
Mayavi OK
gnuplot OK
matplotlib OK
Bokeh Very, Jupyter widget
PyViz ?
seaborn ?
Vaex 2.0.2
https://github.com/vaexio/vaex
安装并获得一个hello world的工作,如以下所示:如何在Vaex中进行交互式2D散点图缩放/点选择?
我以高达10亿的积分测试了vaex,它非常有效!
它是“ Python脚本优先”的代码,它具有很高的可重复性,使我可以轻松地与其他Python东西交互。
Jupyter设置有几个移动的部分,但是一旦我使它与virtualenv一起运行,那就太神奇了。
要加载在Jupyter中运行的CSV:
import vaex
df = vaex.from_csv('10m.csv', names=['x', 'y', 'z'],)
df.plot_widget(df.x, df.y, backend='bqplot')
我们可以立即看到:
现在,我们可以使用鼠标缩放,平移和选择点,并且更新速度非常快,所有这些操作都在10秒内完成。在这里,我放大查看了一些单独的点,并选择了其中一些(图像上较淡的矩形):
用鼠标进行选择后,其效果与使用该df.select()
方法完全相同。因此,我们可以通过在Jupyter中运行来提取所选点:
df.to_pandas_df(selection=True)
输出格式为:
x y z index
0 4525460 9050920 18101840 4525460
1 4525461 9050922 18101844 4525461
2 4525462 9050924 18101848 4525462
3 4525463 9050926 18101852 4525463
4 4525464 9050928 18101856 4525464
5 4525465 9050930 18101860 4525465
6 4525466 9050932 18101864 4525466
由于10M点效果很好,所以我决定尝试1B点...而且效果也不错!
import vaex
df = vaex.open('1b.hdf5')
df.plot_widget(df.x, df.y, backend='bqplot')
要观察离群值,该离群值在原始图上是不可见的,我们可以遵循如何在vaex交互式Jupyter bqplot plot_widget中更改点样式以使单个点变大和可见?并使用:
df.plot_widget(df.x, df.y, f='log', shape=128, backend='bqplot')
产生:
然后选择点:
我们获得异常值的完整数据:
x y z
0 500000000 1500000000 -1
这是创作者的演示,具有更有趣的数据集和更多功能:https : //www.youtube.com/watch?v=2Tt0i823-ec&t=770
在Ubuntu 19.04中测试。
VisIt 2.13.3
网站:https://wci.llnl.gov/simulation/computer-codes/visit
许可证:BSD
由劳伦斯·利弗莫尔国家实验室(Lawrence Livermore National Laboratory)开发,该实验室是国家核安全局的实验室,因此,如果我能使它正常工作,那么您可以想象1000万点将毫无用处。
安装:没有Debian软件包,只需从网站下载Linux二进制文件即可。无需安装即可运行。另请参阅:https : //askubuntu.com/questions/966901/installing-visit
基于VTK,VTK是许多高性能绘图软件使用的后端库。用C写。
经过3个小时的用户界面玩后,我确实可以使用它了,并且确实可以解决我的用例,详情如下:https : //stats.stackexchange.com/questions/376361/how-to-find-the-sample-具有统计意义的大离群值r
这是此帖子的测试数据的外观:
和一些选择的变焦:
这是选择窗口:
在性能方面,VisIt很好:每个图形操作要么只花费少量时间,要么立即执行。当我不得不等待时,它会显示一条“处理中”消息以及剩余的工作量百分比,并且GUI没有冻结。
由于10m点工作得很好,所以我也尝试了100m点(一个2.7G CSV文件),但不幸的是它崩溃了/进入了一种奇怪的状态,我看着它进入,htop
因为4个VisIt线程占用了我所有的16GiB RAM并可能由于应有的死机了失败的malloc。
最初的入门有点痛苦:
- 如果您不是核弹工程师,那么许多默认设置都会令人感到残酷吗?例如:
- 只有很多功能,因此很难找到想要的功能
- 该手册非常有帮助,
但是它是一个386页PDF庞然大物,日期不详,日期为“ October 2005 Version 1.5”。我想知道他们是否以此来发展Trinity!这是我最初回答此问题后创建的一个很好的Sphinx HTML
- 没有Ubuntu软件包。但是预编译的二进制文件确实可以工作。
我将这些问题归因于:
- 它已经存在了很长时间,并使用了一些过时的GUI创意
- 您不能只单击绘图元素来更改它们(例如,轴,标题等),并且有很多功能,因此很难找到想要的功能
我也很喜欢它有些LLNL基础结构泄漏到该存储库中。例如,请参阅docs / OfficeHours.txt和该目录中的其他文件!对于“星期一早上的家伙”布拉德(Brad)感到抱歉!哦,答录机的密码是“ Kill Ed”,请不要忘记这一点。
视点5.4.1
网站:https://www.paraview.org/
许可证:BSD
安装:
sudo apt-get install paraview
由桑迪亚国家实验室(Sandia National Laboratories)开发,该实验室是NNSA的另一个实验室,因此我们再次希望它可以轻松处理数据。也是基于VTK并用C ++编写的,这进一步受到了欢迎。
但是我很失望:由于某种原因,1000万点使GUI非常缓慢且无响应。
我对广告中的“我现在正在工作,稍等片刻”这一刻受到控制是很好的,但是在这种情况下GUI冻结了吗?不能接受的。
htop显示Paraview正在使用4个线程,但是CPU和内存均未达到极限。
在GUI方面,Paraview非常美观和现代,在不卡口的情况下比VisIt更好。这是一个较低的点数供参考:
这是带有手动点选择的电子表格视图:
另一个缺点是与VisIt相比,Paraview感觉缺乏功能,例如:
Mayavi 4.6.2
网站:https://github.com/enthought/mayavi
制定者:有思想
安装:
sudo apt-get install libvtk6-dev
python3 -m pip install -u mayavi PyQt5
VTK Python之一。
Mayavi似乎非常专注于3D,我找不到如何在其中进行2D绘制的图表,因此不幸的是,它并没有削减它的使用范围。
但是,仅为了检查性能,我改编了以下示例:https : //docs.enthought.com/mayavi/mayavi/auto/example_scatter_plot.html,获得了1000万分,并且运行良好,没有滞后:
import numpy as np
from tvtk.api import tvtk
from mayavi.scripts import mayavi2
n = 10000000
pd = tvtk.PolyData()
pd.points = np.linspace((1,1,1),(n,n,n),n)
pd.verts = np.arange(n).reshape((-1, 1))
pd.point_data.scalars = np.arange(n)
@mayavi2.standalone
def main():
from mayavi.sources.vtk_data_source import VTKDataSource
from mayavi.modules.outline import Outline
from mayavi.modules.surface import Surface
mayavi.new_scene()
d = VTKDataSource()
d.data = pd
mayavi.add_source(d)
mayavi.add_module(Outline())
s = Surface()
mayavi.add_module(s)
s.actor.property.trait_set(representation='p', point_size=1)
main()
输出:
但是,我无法放大到足以看到单个点的地方,近3D平面太远了。也许有办法吗?
关于Mayavi的一件很酷的事情是,开发人员付出了很多努力,使您可以很好地从Python脚本启动和设置GUI,就像Matplotlib和gnuplot一样。看来在Paraview中也可以做到这一点,但是文档至少没有那么好。
通常,感觉不到VisIt / Paraview的功能。例如,我无法直接从GUI加载CSV:如何从Mayavi GUI加载CSV文件?
Gnuplot 5.2.2
网站:http : //www.gnuplot.info/
当我需要快速又肮脏时,gnuplot真的很方便,这始终是我尝试的第一件事。
安装:
sudo apt-get install gnuplot
对于非交互式使用,它可以合理地处理10m个点:
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10m1.csv" using 1:2:3:3 with labels point
在7秒内完成:
但是如果我尝试与
set terminal wxt size 1024,1024
set key off
set datafile separator ","
plot "10m.csv" using 1:2:3 palette
和:
gnuplot -persist main.gnuplot
那么初始渲染和缩放就太迟钝了。我什至看不到矩形选择线!
还要注意,对于我的用例,我需要使用超文本标签,如下所示:
plot "10m.csv" using 1:2:3 with labels hypertext
但标签功能存在性能错误,包括非交互式渲染。但是我报告了它,伊桑(Ethan)在一天之内解决了这个问题:https : //groups.google.com/forum/#!topic/comp.graphics.apps.gnuplot/qpL8aJIi9ZE
但是,我必须说,有一种合理的解决方法可以选择异常值:只需将带有行ID的标签添加到所有点!如果附近有很多点,您将无法阅读标签。但是对于您关心的异常值,您可能会发现!例如,如果我在原始数据中添加一个异常值:
cp 10m.csv 10m1.csv
printf '2500000,10000000,40000000\n' >> 10m1.csv
并将plot命令修改为:
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10.csv" using 1:2:3:3 palette with labels
这显着减慢了绘图速度(在上述修复后40分钟),但产生了合理的输出:
因此,通过一些数据过滤,我们最终会到达那里。
Matplotlib 1.5.1,numpy 1.11.1,Python 3.6.7
网站:https://matplotlib.org/
当我的gnuplot脚本开始变得太疯狂时,我通常会尝试使用Matplotlib。
numpy.loadtxt
一个人花了大约10秒钟,所以我知道这不会进展顺利:
import numpy
import matplotlib.pyplot as plt
x, y, z = numpy.loadtxt('10m.csv', delimiter=',', unpack=True)
plt.figure(figsize=(8, 8), dpi=128)
plt.scatter(x, y, c=z)
plt.show()
首先,非交互式尝试提供了良好的输出,但耗时3分55秒...
然后,交互式交互花了很长时间进行初始渲染和缩放。无法使用:
请注意,在此屏幕截图中,应立即缩放并消失的缩放选择在等待计算缩放时在屏幕上停留了很长时间!
plt.figure(figsize=(8, 8), dpi=128)
由于某种原因,我不得不注释掉交互式版本才能工作,否则它会被炸毁:
RuntimeError: In set_size: Could not set the fontsize
散景1.3.1
https://github.com/bokeh/bokeh
Ubuntu 19.04安装:
python3 -m pip install bokeh
然后启动Jupyter:
jupyter notebook
现在,如果我绘制100万个点,则一切工作正常,界面很棒且快速,包括缩放和悬停信息:
from bokeh.io import output_notebook, show
from bokeh.models import HoverTool
from bokeh.transform import linear_cmap
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
import numpy as np
N = 1000000
source = ColumnDataSource(data=dict(
x=np.random.random(size=N) * N,
y=np.random.random(size=N) * N,
z=np.random.random(size=N)
))
hover = HoverTool(tooltips=[("z", "@z")])
p = figure()
p.add_tools(hover)
p.circle(
'x',
'y',
source=source,
color=linear_cmap('z', 'Viridis256', 0, 1.0),
size=5
)
show(p)
初始视图:
缩放后:
如果我阻塞了10m,htop
表明铬有8个线程在不间断的IO状态下占用了我所有的内存。
这询问有关参考点的问题:如何参考选定的bokeh背景数据点
毕威士
https://pyviz.org/
TODO评估。
集成Bokeh + datashader +其他工具。
视频演示1B数据点:https : //www.youtube.com/watch? v = k27MJJLJNT4“ PyViz:仪表板,用于在30行Python中可视化10亿个数据点”,“ Anaconda,Inc.” 发表于2018-04-17。
海生的
https://seaborn.pydata.org/
TODO评估。
已经有关于如何使用seaborn可视化至少5000万行的质量检查。