> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dataerai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visualization

> Interactive Plotly visualizations of extracted metadata and converted scientific data.

The visualization helpers render interactive [Plotly](https://plotly.com/python/) figures for both metadata and converted data, and can auto-route data to the right plot based on its detected type.

```bash theme={null}
pip install "dataerai-sdk[metaextract-viz]"
```

Every function returns a Plotly `Figure`, so you can `.show()` it, embed it, or `.write_html(...)` it.

## Metadata visualization

```python theme={null}
from dataerai.metaextract import extract_metadata
from dataerai.metaextract.viz import (
    visualize_metadata_hierarchical,
    visualize_metadata_summary,
    visualize_metadata_tree,
)

metadata = extract_metadata("afm_scan.ibw")

# Hierarchy chart — chart_type is "sunburst" (default), "treemap", or "icicle"
fig = visualize_metadata_hierarchical(metadata, chart_type="sunburst",
                                      height=800, width=1000, show=True)
fig.write_html("metadata_hierarchical.html")

# Summary of key fields
visualize_metadata_summary(metadata, output_path="metadata_summary.html", show=True)

# Interactive tree explorer
visualize_metadata_tree(metadata, title="AFM Metadata Explorer",
                        output_path="metadata_tree.html", show=True)
```

## Data visualization

Convert a file first, then plot the resulting `xarray.Dataset`. Dedicated visualizers ship for AFM, the three PFM variants, and XRD.

### AFM and PFM

```python theme={null}
from dataerai.metaextract import convert_file
from dataerai.metaextract.viz.instruments.oxford.afms import (
    visualize_afm_data,
    visualize_single_frequency_pfm_data,
    visualize_vector_pfm_data,
    visualize_dart_pfm_data,
)

# Tapping-mode AFM scan — 2D heatmap + 3D surface side by side
dataset = convert_file("afm_scan.ibw")
fig = visualize_afm_data(dataset, data_var="data",
                         plot_type="combined", show=True)
fig.write_html("afm_scan.html")
```

`visualize_afm_data()` accepts `plot_type` (`"combined"`, `"surface"`, `"heatmap"`, or `"line"`), a `colormap`, and optional `zmin`/`zmax` color limits. The PFM helpers follow the same pattern for single-frequency, vector, and DART piezoresponse data.

### XRD

```python theme={null}
from dataerai.metaextract import convert_file
from dataerai.metaextract.viz.instruments.Xray.panalytical import (
    visualize_xrd_rocking_curve,
    visualize_xrd_2theta_omega,
    visualize_xrd_rsm,
)

# XRD rocking curve
dataset = convert_file("xrd_rocking_curve.xrdml")
fig = visualize_xrd_rocking_curve(dataset, data_var="intensity",
                                  height=600, width=1200, log_y=False, show=True)
fig.write_html("rocking_curve.html")

# 2θ–ω scan (log y-axis by default)
dataset = convert_file("xrd_2theta_omega.xrdml")
visualize_xrd_2theta_omega(dataset, data_var="intensity",
                           height=600, width=1200, show=True)

# Reciprocal space map (2D area scan)
dataset = convert_file("xrd_rsm.xrdml")
visualize_xrd_rsm(dataset, data_var="intensity", show=True)
```

## Auto-routing by data type

`visualize_data()` inspects a dataset's detected [data type](/metaextract/data-types) and dispatches to the matching visualizer, so you don't have to pick the plot yourself:

```python theme={null}
from dataerai.metaextract import convert_file, visualize_data

dataset = convert_file("afm_scan.ibw")
fig = visualize_data(dataset, show=True)   # routes via the visualization registry
```

It raises `VisualizationNotFoundError` when the detected type has no registered plot (or none can be detected).

See which data types have a registered visualizer with `list_available_visualizations()`:

```python theme={null}
from dataerai.metaextract import list_available_visualizations

print(list_available_visualizations())
# {'Tapping Mode AFM': 'visualize_afm_data', 'XRD Rocking Curve': ..., ...}
```

To support a new type, register a visualizer with `register_visualization(name, func)` — see [Add a format](/metaextract/adding-formats).
