Skip to content

Color modes

Set a point cloud's color mode from the Color by dropdown in the Display panel (lower-right corner of the viewer). What it applies to depends on your selection:

  • Nothing selected — the dropdown reads Color by (all scans) and sets the scene default. Every cloud follows it.
  • One or more scans selected — the dropdown reads Color by (N selected) and changes only those scans, leaving the rest alone.

That means two clouds can sit in different modes at once — a segmented scan showing its wood/leaf classes beside a raw scan colored by height.

Per-cloud color modes

Mode What it shows When to use
Per-scan color Each cloud drawn flat in its identifier swatch color (click a scan's color dot in the Scans panel to change it) Default. Best at-a-glance read of which points came from which scanner.
Z Axis (Height) Color by Z-axis position via colormap Good for any vertical structure — plant scans, terrain.
X Axis Color by X position Inspecting horizontal stripes or registration along X. Not offered for octree-streamed clouds.
Y Axis Color by Y position Same, for Y. Not offered for octree-streamed clouds.
Intensity Color by LiDAR intensity scalar Distinguishing reflective leaves from less reflective wood (species-dependent).
RGB Original per-point color from the file Scans co-registered with photography.
Solid Color A single flat color When you want the data out of the way to focus on a mesh or skeleton overlay.
Scalar Field Color by any per-point scalar the cloud carries Imported clouds with extra columns — reflectance, deviation, timestamp, target index — plus anything a tool wrote or you derived with a formula.

When a scalar mode is active, a colormap selector becomes available in the right panel: viridis (default), plasma, inferno, magma, turbo, jet, coolwarm, grayscale.

The legend stack

Every pseudocolored object contributes one entry to a single legend stack in the lower-right corner of the viewer. Each entry names the geometry it describes on the first line and the variable on the second, so a scene holding a segmented scan, a DEM mesh and an LAD grid reads unambiguously instead of stacking anonymous colorbars.

  • Objects sharing a mapping merge. Five scans all colored by height produce one entry captioned 5 scans, not five identical colorbars. Give one of them its own colormap and it splits out into its own entry, captioned by name.
  • Point clouds share one scale per variable. Every visible cloud colored by the same variable is mapped through a single domain, unioned across those clouds — so a given color means the same value everywhere in the scene, and a short scan next to a tall one is not stretched to fill the same gradient. Hiding a cloud re-tightens the scale to what remains visible, and a cloud colored by a different variable never affects it. The Min/Max inputs window this shared scale.
  • The scale ignores outliers. Its ends come from the 1st and 99th percentile of the data, not the single lowest and highest values. A few noise points far above the scene — a bird, a multipath return, a stray from a mis-registered scan — would otherwise set the top of the scale on their own, leaving every real point crowded into a sliver of the colormap. Points outside the range still draw, in the end colors. Type the true extremes into Min/Max if you want the full span.
  • The stack stops growing at three. Beyond that, the remaining entries collapse into a compact list of one-line rows; click a row to expand it. The selected object keeps a full-size entry, outlined in blue.
  • Click an entry's caption to edit it. An inline Colormap picker appears, applying to every object that entry covers — including all members of a merged group. Categorical entries have no picker, since their colors come from the classification scheme rather than a ramp.

Coloring by tree_instance deliberately shows no legend: tree ids are arbitrary labels and a scene routinely holds 100+ of them, so neither a gradient nor a class list would be readable. The points stay colored.

Colormaps: one default, per-object overrides

The Default colormap picker in the Display panel sets the palette for the whole scene. Individual objects can then override it, either from their own row — a mesh's Color by section, or a Leaf Area Density result's Colormap field — or straight from the legend entry (click its caption). Both surfaces edit the same setting. An overridden object stops following the default and shows a Reset link that puts it back.

Changing the default repaints everything still inheriting it, leaving overridden objects alone. This lets you compare two objects under different palettes — say a DEM mesh in plasma against an LAD grid in turbo — without one picker dragging the other along.

A scalar field selection belongs to the cloud that carries it, so deleting a segmented scan removes its mode with it; other clouds are unaffected.

Fields you derive yourself

The Scalar Fields tool computes a new field from a formula over the existing ones — intensity * 2, (intensity - mean(intensity)) / std(intensity), degrees(acos(nz)). The result is an ordinary scalar field: it appears in this dropdown, in the Filter panel and in the export column picker, and can feed another formula. The same tool reports each field's statistics and histogram.

Run it with several clouds checked and each one gets its own copy of the new column, and each is set to color by it — the field belongs to every cloud it was computed on, not to a shared result.

Scalar fields on imported clouds

Any extra numeric columns in an imported XYZ/TXT/CSV file — beyond the X/Y/Z, RGB, and intensity that Phytograph maps to dedicated channels — are carried through as scalar fields and listed under a Scalar fields group in the Color by dropdown. This works for both small clouds and large octree-streamed clouds (the columns travel into the octree as extra attributes), so a terrestrial-scanner export with Reflectance[dB], Deviation[], Target Index[], etc. exposes each as a selectable, color-mappable field.

For LAS/LAZ imports this covers two kinds of column:

  • The file's extra dimensions (e.g. Amplitude, Reflectance, Deviation), carried under their native names.
  • The standard LAS per-point fields that hold real data — classification, point_source_id, scan_angle, user_data, scanner_channel, and the per-pulse return fields. A standard field is only listed when it actually varies across the cloud; an all-zero or constant column (common for fields a scanner never populated) is skipped so the picker stays uncluttered. X/Y/Z, RGB, and intensity are always excluded here because they already have dedicated color modes.

Field names come from the file's header row when present (so Reflectance[dB] shows as Reflectance [dB]); files without a header fall back to positional names. The selected field's value range drives the colorbar — pooled across every visible cloud carrying that same field, and trimmed to the 1st–99th percentile so a few extreme values can't flatten the scale, as described under The legend stack — and the Min/Max inputs let you window it.

Note

Fields shown as labels (classifications, tree IDs, and any column you marked Label during import) are never trimmed — every class keeps its own color, including the rarest ones.

Note

Clouds imported before their attributes were carried (XYZ/CSV extras: v0.3.4; LAS/LAZ standard fields: v0.16.0) won't show those columns until re-imported — cached octrees built earlier don't carry the extra attributes.

Scalar fields on synthetic-scan clouds

A synthetic scan generates per-hit scalars (distance, timestamp, return index/count, pulse deviation, sub-rays hit, reflectance, organ type) the same way an imported cloud carries its columns. Which of these end up in the Color by list is governed by Retained per-hit fields in the Synthetic Scan Options dialog — only the fields you check are kept. Unlike imported clouds (where a constant column is hidden), a retained field is listed even when it's constant across the cloud, so a single-static-sweep timestamp or a single-return scan's return index/count still appears. Intensity always has its own dedicated Intensity mode and isn't part of this selection.

Categorical (classification) attributes

Some scalar attributes are categorical — integer class labels rather than a continuous measurement. The Ground Class attribute produced by Segment ground points (1 = ground, 2 = non-ground) is the first of these. These render with discrete per-class colors and a small class legend (ground in brown, non-ground in green) instead of a continuous colormap and colorbar, so each class reads as a distinct category rather than a position along a ramp.

The Wood Class attribute produced by Separate leaf and wood (1 = wood, 2 = leaf) is categorical the same way: wood renders in dark brown and leaf in green, each with its own legend entry.

The Noise Class attribute produced by Remove noise (1 = clean, 2 = noise) is categorical too. It renders clean points in muted gray and flagged points in red — deliberately the loudest coloring in the app, because reviewing the flagged points before removing them is the whole point of the two-step workflow.

The tree_instance attribute produced by Segment individual trees (0 = unassigned, 1..N = individual trees) is also categorical, but its class count isn't fixed: each tree's color is generated on the fly (a perceptually-spaced hue rotation) and the legend lists Tree 1, Tree 2, …, with unassigned points in gray.

The Plant organ attribute produced by Segment plant organs (1 = soil, 2 = stem, 3 = leaf) is categorical with a fixed legend: soil brown, stem gold, leaf green. Its companion Leaflet attribute (0 = not a leaflet, 1..N = one number per leaflet, lowest first) is generated on the fly like tree_instance: every leaflet gets its own color, and soil and stem are gray. Like tree_instance, it draws no legend, because a plant can have more than a hundred leaflets.

The Organ Type attribute carried by a synthetic scan of a generated plant (when organ type is checked under Retained per-hit fields) is categorical too: each hit is labeled with the organ it struck — Leaf, Petiole, Shoot, Peduncle, or Fruit — and renders with a distinct color per organ and a legend. Hits on imported (non-plant) geometry carry no organ data and read as Unknown (gray).

All of the class columns above are recognized by name when a file carrying them is imported, so a cloud exported from Phytograph and read back keeps its discrete coloring rather than arriving as a gradient.

You can also mark a column as categorical yourself in the import wizard — set its role to Label (rather than Scalar) for a column that holds class labels (a custom classification, a region id, …). It then colors with the same discrete per-class scheme (Class 0, Class 1, …) and legend instead of a continuous gradient. A column of text in an ASCII file is always a label, whichever role it is given, and its classes carry the file's own names rather than Class 1, Class 2, ….

Per-mesh color modes

Mode What it shows When to use
Solid Color Flat color Default.
Inclination Per-triangle zenith of the face normal, folded to 0–90° Reading surface tilt — flat vs. steep facets on a reconstruction.
Azimuth Per-triangle compass bearing of the face normal, 0–360° Seeing which way facets face.
Triangle Area Per-triangle surface area Spotting over-large bridging triangles or uneven tessellation.
Source Scan Each triangle in the color of the scan it came from (Helios multi-scan meshes) Seeing scan coverage / overlap on a Helios reconstruction.
Layers One of a DEM surface's stored scalar layers — elevation, density, intensity, hillshade, slope, or aspect Reading a generated DTM/DSM/CHM.

Meshes render per-vertex colors when the file carries them, but that is automatic — it isn't a selectable mode.

These modes are set from the Color by control that expands from a mesh's row in the Meshes panel (click the row's chevron). The control appears for triangulated meshes and DEM surfaces; fitted crowns don't have it. They share the scalar colormap selector and bottom-right colorbar. Source Scan is offered there too for Helios meshes built from more than one scan; it uses each scan's swatch color and shows a per-scan legend instead of a colorbar.

Skeleton coloring

Skeletons have a single toggle rather than a mode list: Color by branch order, in the Skeletons panel.

State What it shows
On Branch order, as an 8-step ramp indexed from the tips: order 1 red → orange → yellow → green → cyan → blue → violet → order 8+ (trunk) pink. Orders above 8 clamp to pink.
Off (default) The skeleton's flat color (amber by default), which you can change per skeleton.

QSM color modes

A QSM is colored from the Color by dropdown at the bottom of the QSM results panel. It applies to every QSM in the scene.

Mode What it shows When to use
Shoot rank Color by branching order (trunk = 0, scaffolds = 1, …) Default. Reading structure — which axis is the trunk vs. a scaffold.
Shoot id A distinct color per shoot, so each continuous axis reads as one object Seeing the shoots themselves, independent of rank.
Color One flat color for the whole tree, from a swatch or hex field Figures where the QSM is context, or to match a house style.
Texture A bark image wrapped around every branch Presentation-ready renders.

The first two modes encode data as color and get a slight self-glow so the hues stay legible against the dark viewport. Color and Texture are appearance modes and light normally, so a picked color renders as exactly that color and a bark photo keeps its true tones.

The Shoot rank palette is fixed and chosen so adjacent ranks stay clearly distinguishable:

Rank Color
0 (trunk) Wood tan
1 (scaffolds) Red-orange
2 Blue
3 Green
4 Violet
5+ Pink

In Shoot id mode each shoot's color comes from a perceptually-spaced hue rotation, so neighboring shoots don't collide. In either mode, clicking a shoot in the results list highlights that whole axis and dims the rest.

Texture mode adds a Bark picker — the five bark images from the Helios plant-architecture library, or your own uploaded JPEG/PNG — and a Tile (m) size that sets how large one bark tile is in the real world (default 0.25 m; smaller = finer pattern). Because the tile is measured in world units rather than as a fixed number of wraps, the bark holds a consistent physical scale from trunk to twig instead of stretching wider as a branch thickens. See Build a QSM.

Leaf area density voxels

A leaf area density result is a grid of voxel cells, each colored by its LAD value (m²/m³). A colorbar labeled LAD [m²/m³] shows the range.

Control What it does
Colormap Same palette set as scalar fields. Follows the scene default until you change it here, which overrides it for this result only (Reset restores the default).
Opacity Cell translucency, so you can see through the grid into the canopy.
Hide empty voxels On by default — voxels with no returns (LAD ≤ 0) are hidden so only foliage-bearing cells draw. Turn off to see the full grid faintly.

Hover a voxel to read its exact LAD, G(θ), and hit count.

Reading scalar colormaps

The default colormap (viridis) goes:

  • Deep purple / forest — lowest value
  • Teal / blue-green — mid-low
  • Lime / yellow-green — mid-high
  • Bright yellow — highest

Other colormaps preserve order but use different palettes. Viridis is the project default because it's perceptually uniform and prints well in grayscale — useful for figures.