Обзор программного обеспечения для интерактивных построений с открытым исходным кодом с эталонным графиком рассеяния в 10 миллионов точек на Ubuntu 18.10
Вдохновленный сценарием использования, описанным по адресу: https://stats.stackexchange.com/questions/376361/how-to-find-the-sample-points-that-have-statistically-meaningful-large-outlier-r Я провел сравнительный анализ нескольких реализаций со следующими очень простыми и наивными данными по прямой линии на 10 миллионов точек:
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 в качестве цвета точки
- в интерактивном режиме выберите несколько интересных точек
- Просмотрите все размеры выбранных точек, чтобы попытаться понять, почему они являются выбросами в XY-разбросе
Тесты проводились в Ubuntu 18.10, на ноутбуке ThinkPad P51 с процессором Intel Core i7-7820HQ (4 ядра / 8 потоков), 2x оперативной памятью Samsung M471A2K43BB1-CRC (2x 16 ГБ), графическим процессором NVIDIA Quadro M1200 4 ГБ GDDR5.
Сводка результатов
Это то, что я наблюдал, учитывая мой очень специфический вариант использования теста и то, что я впервые использую многие из рассмотренных программ:
Обрабатывает ли он 10 миллионов баллов:
VisIt Yes
Paraview Barely
Mayavi Yes
gnuplot Barely on non-interactive mode.
matplotlib No
Много ли у него функций:
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.
Хорошо ли выглядит графический интерфейс (не учитывая хорошую производительность):
VisIt No
Paraview Very
Mayavi OK
gnuplot OK
matplotlib OK
Визит 2,13,3
Сайт: https://wci.llnl.gov/simulation/computer-codes/visit
Лицензия: BSD
Разработано Ливерморской национальной лабораторией им. Лоуренса , которая является лабораторией Национального управления по ядерной безопасности , так что вы можете себе представить, что 10 миллионов баллов ничего не изменит, если я смогу заставить их работать.
Установка: нет пакета Debian, просто загрузите двоичные файлы Linux с веб-сайта. Работает без установки. Смотрите также: https://askubuntu.com/questions/966901/installing-visit
На основе VTK , которая является базовой библиотекой, которую используют многие графические программы с высокой производительностью. Написано в C.
После 3 часов игры с пользовательским интерфейсом, я все заработал, и это помогло решить мой сценарий использования, как описано по адресу: https://stats.stackexchange.com/questions/376361/how-to-find-the-sample-points-that-have-statistically-meaningful-large-outlier-r
Вот как это выглядит на тестовых данных этого поста:
и увеличение с некоторыми кирками:
и вот окно выбора:
С точки зрения производительности, VisIt была очень хорошей: каждая графическая операция либо занимала небольшое количество времени, либо выполнялась незамедлительно, и я думаю, что она может легко обрабатывать гораздо больше данных. Когда мне пришлось ждать, оно показывает «обработку» сообщения с процентом оставшейся работы, и графический интерфейс не зависает.
Так как 10 миллионов точек работали так хорошо, я также пробовал 100 миллионов очков (файл CSV 2,7 ГБ), но он упал / перешел в странное состояние, к сожалению, я наблюдал это в htop
, поскольку 4 потока VisIt заняли все мои 16 ГБ ОЗУ и скорее всего умерла из-за сбоя malloc.
Первое начало было немного болезненным:
- многие из дефолтов кажутся ужасными, если вы не инженер по атомной бомбе? Например.:
- размер точки по умолчанию 1px (запутывается от пыли на моем мониторе)
- масштаб осей от 0,0 до 1,0: Как отобразить фактические значения числа осей в программе построения графиков Визит вместо дробей от 0,0 до 1,0?
- многооконные настройки, неприятные множественные всплывающие окна при выборе точек данных
- показывает ваше имя пользователя и график (удалите с помощью "Controls"> "Аннотация"> "Информация о пользователе")
- автоматическое позиционирование по умолчанию плохое: легенда конфликтует с осями, не может найти автоматизацию заголовка, поэтому пришлось добавить метку и переместить все вручную
- функций просто много, поэтому может быть сложно найти то, что вы хотите
- руководство было очень полезным, , но это мамонт на 386 страницах, зловеще датированный «октябрь 2005 г., версия 1.5». Интересно, использовали ли они это для разработки Trinity ! , и это красивый Сфинкс HTML , созданный сразу после того, как я первоначально ответил на этот вопрос
- нет пакета Ubuntu. Но встроенные двоичные файлы просто работали.
Я отношу эти проблемы к:
- он существует уже очень давно и использует некоторые устаревшие идеи графического интерфейса
- Вы не можете просто щелкнуть по элементам графика, чтобы изменить их (например, оси, заголовок и т. Д.), И есть много функций, поэтому найти тот, который вы ищете, немного сложно
Мне также нравится, как немного инфраструктуры LLNL просачивается в это репо. Смотрите, например, docs / OfficeHours.txt и другие файлы в этом каталоге! Я извиняюсь за Брэда, который является "парнем в понедельник утром"! Да, и пароль для автоответчика - "Убить Эда", не забывайте это.
Paraview 5.4.1
Сайт: https://www.paraview.org/
Лицензия: BSD
Установка:
sudo apt-get install paraview
Разработано Sandia National Laboratories , которая является еще одной лабораторией NNSA, поэтому мы снова ожидаем, что она легко обработает данные. Также VTK основан и написан на C ++, что было еще более перспективно.
Однако я был разочарован: по некоторым причинам, 10 миллионов очков сделали GUI очень медленным и безразличным.
Я в порядке с контролируемым, хорошо разрекламированным моментом "Я сейчас работаю, подожди немного", но GUI зависает, когда это происходит? Неприемлемо.
htop показал, что Paraview использовал 4 потока, но ни процессор, ни память не были исчерпаны.
С точки зрения графического интерфейса, Paraview очень красивый и современный, намного лучше, чем VisIt, когда он не заикается. Вот это для подсчета очков:
и вот электронная таблица с выбором точки вручную:
Другим недостатком является то, что Paraview чувствовал недостаток функций по сравнению с VisIt, например ::111172
Mayavi 4.6.2
Сайт: https://github.com/enthought/mayavi
Разработано: Enthought
Установка:
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 для 10 миллионов точек, и он работает нормально, без задержки:
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()
Выход:
Однако я не смог увеличить масштаб достаточно, чтобы увидеть отдельные точки, ближняя трехмерная плоскость была слишком далеко. Может быть, есть способ?
Одна из замечательных особенностей Mayavi заключается в том, что разработчики приложили немало усилий, чтобы вы могли красиво запускать и настраивать GUI из скрипта Python, во многом как Matplotlib и gnuplot. Кажется, что это также возможно в Paraview, но документы, по крайней мере, не так хороши.
Как правило, он не такой особенный, как VisIt / Paraview. Например, я не могу напрямую загрузить CSV из графического интерфейса: Как загрузить файл CSV из графического интерфейса Mayavi?
Gnuplot
Сайт: http://www.gnuplot.info/
gnuplot действительно удобен, когда мне нужно идти быстро и грязно, и это всегда первое, что я пробую.
Установка:
sudo apt-get install gnuplot
Для неинтерактивного использования он может достаточно хорошо обрабатывать 10 млн. Точек:
#!/usr/bin/env gnuplot
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10m.csv" using 1:2:3 palette
, который закончился через 7 секунд:
Но если я попытаюсь перейти на интерактив с
#!/usr/bin/env gnuplot
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
но была ошибка производительности с функцией надписей, в том числе для неинтерактивного рендеринга.Но я сообщил об этом, и Итан решил это за один день: https://groups.google.com/forum/#!topic/comp.graphics.apps.gnuplot/qpL8aJIi9ZE
Matplotlib 1.5.1, numpy 1.11.1, Python 3.6.7
Веб-сайт:https://matplotlib.org/
Matplotlib - это то, что я обычно пробую, когда мой скрипт gnuplot начинает становиться слишком безумным.
numpy.loadtxt
один занял около 10 секунд, поэтому я знал, что это не будет хорошо:
#!/usr/bin/env python3
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)
# Non-interactive.
#plt.savefig('matplotlib.png')
# Interactive.
plt.show()
Сначала неинтерактивная попытка дала хороший результат, но заняла 3 минуты и 55 секунд ...
Затем интерактивная попытка заняла много времени при первоначальном рендеринге и увеличении.,Не используется:
Обратите внимание, что на этом скриншоте выбор увеличения, который должен немедленно увеличиваться и исчезать, оставался на экране долгое время, пока он ждалувеличить, чтобы вычислить!
Мне пришлось закомментировать plt.figure(figsize=(8, 8), dpi=128)
, чтобы интерактивная версия работала по какой-то причине, иначе она взорвалась:
RuntimeError: In set_size: Could not set the fontsize