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.