Как раскрасить точки графика разброса по значению третьего столбца в Paraview, как палитра gnuplot? - PullRequest
1 голос

Например, я генерирую данные с:

i=0; while [ "$i" -lt 10 ]; do echo "$i,$((2*i)),$((4*i))"; i=$((i+1)); done > main.csv

, который содержит:

0,0,0
1,2,4
2,4,8
3,6,12
4,8,16
5,10,20
6,12,24
7,14,28
8,16,32
9,18,36

Затем, например, в gnuplot я получаю то, что хочу, с palette:

#!/usr/bin/env gnuplot
set terminal png size 1024,1024
set output "main.png"
set datafile separator ","
set key off
plot "main.csv" using 1:2:3 palette pt 7 pointsize 10

, что дает желаемое:

enter image description here

Как добиться этого эффекта с Paraview?

Мне удалось построить точечную диаграмму с помощью линейного графика, но все точки красного цвета выглядят так:

enter image description here

Также я не мог изменить размеры маркеров, но для этого я нашел открытую проблему: https://gitlab.kitware.com/paraview/paraview/issues/14169

Изначально я изучаю графический интерфейс для построения графиков, но если у вас есть опция сценариев, которую тоже стоит знать.

Причина, по которой я заглядываю в Parasol, заключается в том, что мне нужно в интерактивном режиме построить 10M точек, которые, как я обнаружил, gnuplot и matplotlib плохо обрабатывают, поэтому мне интересно, удастся ли это решение на основе VTK сократить. Больше информации на: Большой участок: ~ 20 миллионов образцов, гигабайт данных

Протестировано в Ubuntu 18.10, Paraview 5.4.1.

1 Ответ

1 голос
/ 24 мая 2019

Вот сценарий python для чтения файла и отображения маркеров в представлении ParaView 3D Render.

import paraview.simple as pvs

# create a new 'CSV Reader'
csvReader = pvs.CSVReader(FileName=['C:\\your_file.csv'])
csvReader.HaveHeaders = 0

# create a new 'Table To Points'
tableToPoints = pvs.TableToPoints(Input=csvReader)
tableToPoints.XColumn = 'Field 0'
tableToPoints.YColumn = 'Field 1'
tableToPoints.ZColumn = 'Field 2'
tableToPoints.KeepAllDataArrays = 1
tableToPoints.a2DPoints = 1

# create a new 'Glyph'
glyph = pvs.Glyph(Input=tableToPoints, GlyphType='Arrow')
glyph.Scalars = ['POINTS', 'Field 0']
glyph.Vectors = ['POINTS', 'None']
glyph.GlyphType = '2D Glyph'
glyph.GlyphType.GlyphType = 'Square'
glyph.GlyphType.Filled = 1
glyph.ScaleMode = 'off'
glyph.ScaleFactor = 1.0
glyph.GlyphMode = 'All Points'
### uncomment to scale markers by 'Field 2'
# glyph1.Scalars = ['POINTS', 'Field 2']
# glyph1.ScaleMode = 'scalar'

# show data in view
renderView = pvs.GetActiveView()
glyphDisplay = pvs.Show(glyph, renderView)
glyphDisplay.Representation = 'Surface'
pvs.ColorBy(glyphDisplay, ('POINTS', 'Field 2'))
glyphDisplay.SetScalarBarVisibility(renderView, True)
glyphDisplay.RescaleTransferFunctionToDataRange(True, False)

renderView.Update()
pvs.UpdatePipeline()
renderView.AxesGrid.Visibility = 1
renderView.ResetCamera()
pvs.Render(renderView)

И результат: enter image description here

...