Scientific Visualisations with Python

# Example

Visualisation of the 3d scalar field

import vtk
import numpy as np
#
data = np.loadtxt("./scalar_field.txt")
#
points = vtk.vtkPoints()
scalars = vtk.vtkFloatArray()
for row in data:
    x, y, z, value = row
    points.InsertNextPoint(x, y, z)
    scalars.InsertNextValue(value)
#
# Create a polydata object
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
polydata.GetPointData().SetScalars(scalars)
#
# Use a vtkGlyph3D to create scalable glyphs
sphere_source = vtk.vtkSphereSource()
sphere_source.SetRadius(0.01)  # Base radius of the glyph (adjust as needed)
#
glyph3d = vtk.vtkGlyph3D()
glyph3d.SetSourceConnection(sphere_source.GetOutputPort())
glyph3d.SetInputData(polydata)
glyph3d.ScalingOff()  # Disable scaling so all glyphs are the same size
glyph3d.Update()
#
# Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(glyph3d.GetOutputPort())
mapper.SetScalarRange(scalars.GetRange())
#
actor = vtk.vtkActor()
actor.SetMapper(mapper)
#
# Add a scalar bar
scalar_bar = vtk.vtkScalarBarActor()
scalar_bar.SetLookupTable(mapper.GetLookupTable())
scalar_bar.SetTitle("Scalar Value")
scalar_bar.SetNumberOfLabels(5)
#
# Create a renderer, render window, and interactor
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
#
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)
#
# Add the actor and scalar bar to the renderer
renderer.AddActor(actor)
renderer.AddActor2D(scalar_bar)
#
renderer.SetBackground(0.1, 0.2, 0.4)
#
# Start the rendering loop
render_window.Render()
render_window_interactor.Start()


# Example

Visualisation of the 3d vector field

import numpy as np
import vtk
# -------------------------
# Load data (x y z vx vy vz)
# -------------------------
data = np.loadtxt("./vector_field.txt")  # change path if needed
# If your file contains other columns (e.g. scalar) adjust indexing.
#
points = vtk.vtkPoints()
vectors = vtk.vtkFloatArray()
vectors.SetNumberOfComponents(3)
vectors.SetName("vectors")
#
magnitudes = vtk.vtkFloatArray()
magnitudes.SetNumberOfComponents(1)
magnitudes.SetName("Magnitude")
#
for row in data:
    x, y, z, vx, vy, vz = row
    points.InsertNextPoint(x, y, z)
    vectors.InsertNextTuple((vx, vy, vz))
    mag = (vx*vx + vy*vy + vz*vz) ** 0.5
    magnitudes.InsertNextValue(mag)
#
# Create polydata and attach vectors + magnitude scalars
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
polydata.GetPointData().SetVectors(vectors)
polydata.GetPointData().AddArray(magnitudes)        # add magnitude array
polydata.GetPointData().SetScalars(magnitudes)     # make it the active scalar array
#
# -------------------------
# Glyph (arrow) setup
# -------------------------
arrow = vtk.vtkArrowSource()
arrow.Update()
#
glyph = vtk.vtkGlyph3D()
glyph.SetSourceConnection(arrow.GetOutputPort())
glyph.SetInputData(polydata)
#
glyph.SetVectorModeToUseVector()      # orient by vector
glyph.OrientOn()
#
glyph.ScalingOn()
glyph.SetScaleModeToScaleByVector()  # scale by vector magnitude
glyph.SetScaleFactor(0.1)            # tweak to desired arrow length
glyph.SetColorModeToColorByScalar()  # color by scalar array (Magnitude)
glyph.Update()
#
# -------------------------
# Mapper & Actor
# -------------------------
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(glyph.GetOutputPort())
#
# Tell mapper to use point field data and select the "Magnitude" array
mapper.SetScalarModeToUsePointFieldData()
mapper.SelectColorArray("Magnitude")
#
# Explicit scalar range from original magnitude array (safer)
mag_range = polydata.GetPointData().GetScalars("Magnitude").GetRange()
mapper.SetScalarRange(mag_range)
#
actor = vtk.vtkActor()
actor.SetMapper(mapper)
#
# -------------------------
# Scalar Bar
# -------------------------
scalar_bar = vtk.vtkScalarBarActor()
scalar_bar.SetLookupTable(mapper.GetLookupTable())
scalar_bar.SetTitle("Vector Magnitude")
scalar_bar.SetNumberOfLabels(5)
scalar_bar.SetMaximumWidthInPixels(150)
#
# -------------------------
# Renderer / Window / Interactor
# -------------------------
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
renderer.AddActor2D(scalar_bar)
renderer.SetBackground(0.1, 0.2, 0.4)
#
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window.SetSize(1200, 800)
#
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
#
# Optional: nicer camera / lighting
renderer.ResetCamera()
render_window.Render()
interactor.Start()