Skip to content

Index

subsurfaceio.plot

General-purpose plotting API.

Describe a plot as a serializable specification, then render it with either backend. The specifications mirror the Plotly Express chart signatures, so a payload can cross a process boundary and be drawn on the far side.

This package exports only the specifications, which cost nothing beyond pydantic to import. Each backend figure is imported from its own module, so consumers that only build or inspect specifications never pay for a rendering stack, and the import itself states which backend is being pulled in:

from subsurfaceio.plot import Line
from subsurfaceio.plot.figure_plotly import PlotlyFigure

fig = PlotlyFigure(
    plot_model=Line(plot_type='line', x=[0, 1, 2], y=[0, 1, 4]),
).plot().fig

MplFigure renders the same specification with matplotlib and requires the mpl extra; importing that module is what enforces the requirement.

Modules:

Name Description
base

Backend-agnostic figure contract.

figure_mpl

Matplotlib backend for express plot specifications.

figure_plotly

Plotly backend for express plot specifications.

mixins

Backend figure mixins composed onto PlotlyFigure and MplFigure.

Classes:

Name Description
Bar

Specification for a bar chart, mirroring plotly.express.bar.

Line

Specification for a line plot, mirroring plotly.express.line.

Scatter

Specification for a scatter plot, mirroring plotly.express.scatter.

ScatterTernary

Specification for a ternary scatter, mirroring plotly.express.scatter_ternary.

SubplotInfo

One subplot, paired with the variables mapped to its axes.

Attributes:

Name Type Description
DiscriminatedPlotModel TypeAlias

Plot specification resolved from the plot_type discriminator.

PlotModel TypeAlias

Any supported plot specification.

DiscriminatedPlotModel module-attribute

DiscriminatedPlotModel: TypeAlias = Annotated[
    PlotModel, Field(discriminator="plot_type")
]

Plot specification resolved from the plot_type discriminator.

Use this as the field annotation so a serialized payload selects its own model.

PlotModel module-attribute

PlotModel: TypeAlias = Scatter | Line | Bar | ScatterTernary

Any supported plot specification.

Bar pydantic-model

Bases: BaseModel

Specification for a bar chart, mirroring plotly.express.bar.

Config:

  • extra: forbid

Fields:

animation_frame pydantic-field

animation_frame: Any = None

animation_group pydantic-field

animation_group: Any = None

barmode pydantic-field

barmode: Any = 'relative'

base pydantic-field

base: Any = None

category_orders pydantic-field

category_orders: Any = None

color pydantic-field

color: Any = None

color_continuous_midpoint pydantic-field

color_continuous_midpoint: Any = None

color_continuous_scale pydantic-field

color_continuous_scale: Any = None

color_discrete_map pydantic-field

color_discrete_map: Any = None

color_discrete_sequence pydantic-field

color_discrete_sequence: Any = None

custom_data pydantic-field

custom_data: Any = None

data_frame pydantic-field

data_frame: Any = None

error_x pydantic-field

error_x: Any = None

error_x_minus pydantic-field

error_x_minus: Any = None

error_y pydantic-field

error_y: Any = None

error_y_minus pydantic-field

error_y_minus: Any = None

facet_col pydantic-field

facet_col: Any = None

facet_col_spacing pydantic-field

facet_col_spacing: Any = None

facet_col_wrap pydantic-field

facet_col_wrap: int | None = 0

facet_row pydantic-field

facet_row: Any = None

facet_row_spacing pydantic-field

facet_row_spacing: Any = None

height pydantic-field

height: Any = None

hover_data pydantic-field

hover_data: Any = None

hover_name pydantic-field

hover_name: Any = None

labels pydantic-field

labels: Any = None

log_x pydantic-field

log_x: bool = False

log_y pydantic-field

log_y: bool = False

model_config class-attribute instance-attribute

model_config = ConfigDict(extra='forbid')

opacity pydantic-field

opacity: Any = None

orientation pydantic-field

orientation: Any = None

pattern_shape pydantic-field

pattern_shape: Any = None

pattern_shape_map pydantic-field

pattern_shape_map: Any = None

pattern_shape_sequence pydantic-field

pattern_shape_sequence: Any = None

plot_type pydantic-field

plot_type: Literal['bar']

range_color pydantic-field

range_color: Any = None

range_x pydantic-field

range_x: Any = None

range_y pydantic-field

range_y: Any = None

subtitle pydantic-field

subtitle: Any = None

template pydantic-field

template: Any = None

text pydantic-field

text: Any = None

text_auto pydantic-field

text_auto: bool = False

title pydantic-field

title: Any = None

width pydantic-field

width: Any = None

x pydantic-field

x: Any = None

y pydantic-field

y: Any = None

Line pydantic-model

Bases: BaseModel

Specification for a line plot, mirroring plotly.express.line.

Config:

  • extra: forbid

Fields:

animation_frame pydantic-field

animation_frame: Any = None

animation_group pydantic-field

animation_group: Any = None

category_orders pydantic-field

category_orders: Any = None

color pydantic-field

color: Any = None

color_discrete_map pydantic-field

color_discrete_map: Any = None

color_discrete_sequence pydantic-field

color_discrete_sequence: Any = None

custom_data pydantic-field

custom_data: Any = None

data_frame pydantic-field

data_frame: Any = None

error_x pydantic-field

error_x: Any = None

error_x_minus pydantic-field

error_x_minus: Any = None

error_y pydantic-field

error_y: Any = None

error_y_minus pydantic-field

error_y_minus: Any = None

facet_col pydantic-field

facet_col: Any = None

facet_col_spacing pydantic-field

facet_col_spacing: Any = None

facet_col_wrap pydantic-field

facet_col_wrap: int | None = 0

facet_row pydantic-field

facet_row: Any = None

facet_row_spacing pydantic-field

facet_row_spacing: Any = None

height pydantic-field

height: Any = None

hover_data pydantic-field

hover_data: Any = None

hover_name pydantic-field

hover_name: Any = None

labels pydantic-field

labels: Any = None

line_dash pydantic-field

line_dash: Any = None

line_dash_map pydantic-field

line_dash_map: Any = None

line_dash_sequence pydantic-field

line_dash_sequence: Any = None

line_group pydantic-field

line_group: Any = None

line_shape pydantic-field

line_shape: Any = None

log_x pydantic-field

log_x: bool = False

log_y pydantic-field

log_y: bool = False

markers pydantic-field

markers: bool = False

model_config class-attribute instance-attribute

model_config = ConfigDict(extra='forbid')

orientation pydantic-field

orientation: Any = None

plot_type pydantic-field

plot_type: Literal['line']

range_x pydantic-field

range_x: Any = None

range_y pydantic-field

range_y: Any = None

render_mode pydantic-field

render_mode: Any = 'auto'

subtitle pydantic-field

subtitle: Any = None

symbol pydantic-field

symbol: Any = None

symbol_map pydantic-field

symbol_map: Any = None

symbol_sequence pydantic-field

symbol_sequence: Any = None

template pydantic-field

template: Any = None

text pydantic-field

text: Any = None

title pydantic-field

title: Any = None

width pydantic-field

width: Any = None

x pydantic-field

x: Any = None

y pydantic-field

y: Any = None

Scatter pydantic-model

Bases: BaseModel

Specification for a scatter plot, mirroring plotly.express.scatter.

Config:

  • extra: forbid

Fields:

animation_frame pydantic-field

animation_frame: Any = None

animation_group pydantic-field

animation_group: Any = None

category_orders pydantic-field

category_orders: Any = None

color pydantic-field

color: Any = None

color_continuous_midpoint pydantic-field

color_continuous_midpoint: Any = None

color_continuous_scale pydantic-field

color_continuous_scale: Any = None

color_discrete_map pydantic-field

color_discrete_map: Any = None

color_discrete_sequence pydantic-field

color_discrete_sequence: Any = None

custom_data pydantic-field

custom_data: Any = None

data_frame pydantic-field

data_frame: Any = None

error_x pydantic-field

error_x: Any = None

error_x_minus pydantic-field

error_x_minus: Any = None

error_y pydantic-field

error_y: Any = None

error_y_minus pydantic-field

error_y_minus: Any = None

facet_col pydantic-field

facet_col: Any = None

facet_col_spacing pydantic-field

facet_col_spacing: Any = None

facet_col_wrap pydantic-field

facet_col_wrap: int | None = 0

facet_row pydantic-field

facet_row: Any = None

facet_row_spacing pydantic-field

facet_row_spacing: Any = None

height pydantic-field

height: Any = None

hover_data pydantic-field

hover_data: Any = None

hover_name pydantic-field

hover_name: Any = None

labels pydantic-field

labels: Any = None

log_x pydantic-field

log_x: bool = False

log_y pydantic-field

log_y: bool = False

marginal_x pydantic-field

marginal_x: Any = None

marginal_y pydantic-field

marginal_y: Any = None

model_config class-attribute instance-attribute

model_config = ConfigDict(extra='forbid')

opacity pydantic-field

opacity: Any = None

orientation pydantic-field

orientation: Any = None

plot_type pydantic-field

plot_type: Literal['scatter']

range_color pydantic-field

range_color: Any = None

range_x pydantic-field

range_x: Any = None

range_y pydantic-field

range_y: Any = None

render_mode pydantic-field

render_mode: Any = 'auto'

size pydantic-field

size: Any = None

size_max pydantic-field

size_max: Any = None

subtitle pydantic-field

subtitle: Any = None

symbol pydantic-field

symbol: Any = None

symbol_map pydantic-field

symbol_map: Any = None

symbol_sequence pydantic-field

symbol_sequence: Any = None

template pydantic-field

template: Any = None

text pydantic-field

text: Any = None

title pydantic-field

title: Any = None

trendline pydantic-field

trendline: Any = None

trendline_color_override pydantic-field

trendline_color_override: Any = None

trendline_options pydantic-field

trendline_options: Any = None

trendline_scope pydantic-field

trendline_scope: Any = 'trace'

width pydantic-field

width: Any = None

x pydantic-field

x: Any = None

y pydantic-field

y: Any = None

ScatterTernary pydantic-model

Bases: BaseModel

Specification for a ternary scatter, mirroring plotly.express.scatter_ternary.

Config:

  • extra: forbid

Fields:

a pydantic-field

a: Any = None

animation_frame pydantic-field

animation_frame: Any = None

animation_group pydantic-field

animation_group: Any = None

b pydantic-field

b: Any = None

c pydantic-field

c: Any = None

category_orders pydantic-field

category_orders: Any = None

color pydantic-field

color: Any = None

color_continuous_midpoint pydantic-field

color_continuous_midpoint: Any = None

color_continuous_scale pydantic-field

color_continuous_scale: Any = None

color_discrete_map pydantic-field

color_discrete_map: Any = None

color_discrete_sequence pydantic-field

color_discrete_sequence: Any = None

custom_data pydantic-field

custom_data: Any = None

data_frame pydantic-field

data_frame: Any = None

height pydantic-field

height: Any = None

hover_data pydantic-field

hover_data: Any = None

hover_name pydantic-field

hover_name: Any = None

labels pydantic-field

labels: Any = None

model_config class-attribute instance-attribute

model_config = ConfigDict(extra='forbid')

opacity pydantic-field

opacity: Any = None

plot_type pydantic-field

plot_type: Literal['scatter_ternary']

range_color pydantic-field

range_color: Any = None

size pydantic-field

size: Any = None

size_max pydantic-field

size_max: Any = None

subtitle pydantic-field

subtitle: Any = None

symbol pydantic-field

symbol: Any = None

symbol_map pydantic-field

symbol_map: Any = None

symbol_sequence pydantic-field

symbol_sequence: Any = None

template pydantic-field

template: Any = None

text pydantic-field

text: Any = None

title pydantic-field

title: Any = None

width pydantic-field

width: Any = None

SubplotInfo dataclass

One subplot, paired with the variables mapped to its axes.

Attributes:

Name Type Description
row int

One-based row index, counted so that row 1 is the bottom row, matching the express start_cell='bottom-left' convention.

col int

One-based column index, counted left to right.

x_var str | None

Variable drawn on the x-axis, or None when unset.

y_var str | None

Variable drawn on the y-axis, or None when unset.

subplot Any

Backend subplot handle. A matplotlib.axes.Axes for the matplotlib backend, or a Plotly subplot namedtuple.

col instance-attribute

col: int

row instance-attribute

row: int

subplot instance-attribute

subplot: Any

x_var instance-attribute

x_var: str | None

y_var instance-attribute

y_var: str | None