With the Plots Artifacts API, your Latch workflow can generate a new notebook from a standard Plot template and automatically populate it with parameters and outputs from earlier steps in your pipeline.

For example, in the video below, a DESeq2 workflow execution outputs a Plots Artifact on Latch Data with all the notebook parameters filled out. This eliminates the need for manual parameter entry by scientists, thereby minimizing rooms for errors.

Every Plot notebook is backed by a dedicated computer. To save costs, this new computer is only spun up when the end user double-clicks on the Artifact on Latch Data for the first time.

Usage

First, define the PlotsArtifact dataclass:

Example
from latch.types.plots import PlotsArtifactBindings, PlotsArtifactTemplate, PlotsArtifact, Widget

artifact = PlotsArtifact(
    bindings=PlotsArtifactBindings(
        plot_templates=[
            PlotsArtifactTemplate(
                template_id="1234", ## The Plot template ID 
                widgets=[
                    Widget(
                        transform_id="1234", ## The Python transform ID
                        key="1", ## The `key` of the widget that we want to populate
                        value="Value" ## Value to populate that widget with
                    )
                ],
            )
        ]
    )
)

Next, dump the dataclass into a JSON file and upload it to Latch Data.

Example 1: Inside a Jupyter notebook
...

from latch.ldata.path import LPath
# Convert the dataclass to a dictionary
artifact_dict = asdict(artifact)

# Write it to a JSON file
with open("artifact.json", "w") as f:
    json.dump(artifact_dict, f, indent=2)

latch_path = LPath("latch:///artifact.json")
latch_path.upload_from("artifact.json")

Example 2: Inside a Latch workflow
from latch.types.plots import PlotsArtifactBindings, PlotsArtifactTemplate, PlotsArtifact, Widget

@small_task
def my_task(output_dir: LatchDir) -> LatchFile:
    artifact = PlotsArtifact(
        bindings=PlotsArtifactBindings(
            plot_templates=[
                PlotsArtifactTemplate(
                    template_id="46", ## The Plot template ID 
                    widgets=[
                        Widget(
                            transform_id="1234", ## The Python transform ID
                            key="input_1", ## The `key` of the widget that we want to populate
                            value="petal.width" ## Value to populate that widget with
                        )
                    ],
                )
            ]
        )
    )

# Convert the dataclass to a dictionary
artifact_dict = asdict(artifact)

# Write it to a JSON file
with open("artifact.json", "w") as f:
    json.dump(artifact_dict, f, indent=2)

# You need to return a file artifact for the workflow
return LatchFile(output_path, f"{output_dir.remote_path}/artifact.json")