View this notebook on GitHub or run it yourself on Binder!


Logging Plots as PNGs#

rubicon_ml makes it easy to log Plotly plots and images with artifacts. In this example we’ll walk through creating a plot using plotly.express and saving it as an artifact.

Before getting started, we’ll have to install some dependencies for this example.

[1]:
! pip install kaleido Pillow
Requirement already satisfied: Pillow in /Users/nvd215/mambaforge/envs/rubicon-ml-dev/lib/python3.10/site-packages (9.2.0)

Set up#

First lets set up our rubicon_ml project.

[2]:
import os

from rubicon_ml import Rubicon


rubicon = Rubicon(persistence="memory")
project = rubicon.get_or_create_project("Artifact Plots")

Next, create plotting data. This example leverages plotly and plotly.express for data and plot generation.

[3]:
import plotly.express as px
from plotly import data


df = data.wind()
df.head()
[3]:
direction strength frequency
0 N 0-1 0.5
1 NNE 0-1 0.6
2 NE 0-1 0.5
3 ENE 0-1 0.4
4 E 0-1 0.4

Using the plotting data generated, create a plot and save it to a file. Utilizing write_image we can save our plot to a file. We can use this file to later log with rubicon_ml.

[4]:
scatter_plot = px.scatter(df, x="direction", y="frequency", color="strength")
scatter_plot.write_image("saved-scatter-plot-for-logging.png")

We can also create a plot and covert it to bytes to save it in memory. Using to_image we can convert our plot to bytes.

[5]:
bar_plot = px.bar(df, x="direction", y="frequency", color="strength")
bar_plot_bytes = bar_plot.to_image(format="png")

Logging your plot#

In rubicon_ml , artifacts are a catch-all for any other type of data that can be logged to a file. We can use artifacts to capture information that doesn’t fall into the experiment, dataframe, feature, and parameter categories.

Leveraging artifacts, plots can be logged just by passing its file location in the data_path argument to project.log_artifact().

[6]:
project.log_artifact(
    name="scatter plot",
    data_path="saved-scatter-plot-for-logging.png",
    description="saved scatter plot with path",
)
artifact_plot_from_file = project.artifact(name="scatter plot")

We can also log plots by passing its byte representation to the data_bytes argument to project.log_artifact() as well.

[7]:
project.log_artifact(name="bar plot", data_bytes=bar_plot_bytes)
artifact_plot_bytes = project.artifact(name="bar plot")

Retrieving your logged plot programmatically#

Since the PNG representations of both plots were logged, we can retrieve our artifact plots programmatically. Using io and PIL we can visualize our plots as PNG images.

[8]:
import io

from PIL import Image


imageScatterPlotStream = io.BytesIO(artifact_plot_from_file.data)
scatter_plot_image = Image.open(imageScatterPlotStream)

imageBarPlotStream = io.BytesIO(artifact_plot_bytes.data)
bar_plot_image = Image.open(imageBarPlotStream)

Finally, view the two images using display.

[9]:
display(scatter_plot_image)
../_images/logging-examples_logging-plots_20_0.png
[10]:
display(bar_plot_image)
../_images/logging-examples_logging-plots_21_0.png

We have logged our scatter_plot with Rubicon, so we can remove the file created earlier.

[11]:
!rm saved-scatter-plot-for-logging.png