Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,7 @@ playwright/.cache/

# Ignore docs
**/*.md
**/docs/

# Ignore test cache
**/.tox/
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
uses: actions/checkout@v4

- name: Run tests
run: './tools/run_docker.sh e2e-tests'
run: './tools/run_docker.sh ./tests/docker-compose.yml e2e-tests'

- name: Upload Playwright report
uses: actions/upload-artifact@v4
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ hs_err_pid*
replay_pid*

plugins-venv/
plugins-dev-venv/
plugins-dev-venv/

# Docs snapshots
extract-results/
snapshot-results/
4 changes: 3 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ COPY package.json package-lock.json requirements.txt ./
# cd first so the cp doesn't include /tmp/deephaven-plugins in the paths
RUN cd /tmp/deephaven-plugins && cp --parents ./*/src/js/package.json /work/ && cp --parents ./*/setup.* /work/

FROM base as build
FROM base AS build
WORKDIR /work/
COPY --from=copy-plugins /work/ .

Expand Down Expand Up @@ -59,3 +59,5 @@ COPY --link docker/data /data

# Set the environment variable to enable the JS plugins embedded in Python
ENV DEEPHAVEN_ENABLE_PY_JS=true

HEALTHCHECK --interval=3s --retries=3 --timeout=11s CMD /opt/grpc_health_probe/grpc_health_probe -addr=localhost:10000 -connect-timeout=10s || exit 1
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,14 @@ python tools/plugin_builder.py --docs --install ui

After the first time install, you can drop the `--install` flag and just run the script with `--docs` unless you have plugin changes.

You can also re-generate the snapshots for the docs by passing the `--snapshots` flag. This should be done when new code blocks are added to the docs.

This example will build the docs for the `ui` plugin and re-generate the snapshots:

```shell
python tools/plugin_builder.py --docs --snapshots ui
```
Comment on lines +292 to +298

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should there be a section about running this with npm as well? It looks like the flag just runs the npm script under the hood. Should we even make it a separate flag or just bake it into the --docs flag?

The annoying thing is how long the docker snapshot image takes to build. Takes me like 2.5-3 min. So I could see that being an argument for not running it with the docs flag

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea I specifically had it as a separate flag as the snapshots container takes much longer to load if you haven't already built it.
I'll add a note about updating snapshots using npm...


To run the server, pass the `--server` flag.
First install `deephaven-server` if it is not already installed (if setup with `--configure=full` this is already done):

Expand Down Expand Up @@ -357,6 +365,10 @@ python tools/plugin_builder.py -d ui plotly-express
BUILT=true npm run docs
```

### Snapshotting docs with npm

You can also use `npm` to snapshot the docs instead of using the `--snapshots` flag in `plugin_builder.py`. Just run `npm run update-doc-snapshots` from the root directory of this repo. This will run the snapshotting script and update the snapshots in the `docs` directory.

## Release Management

In order to manage changelogs, version bumps and github releases, we use [cocogitto](https://github.com/cocogitto/cocogitto), or `cog` for short. Follow the [Installation instructions](https://github.com/cocogitto/cocogitto?tab=readme-ov-file#installation) to install `cog`. For Linux and Windows, we recommend using [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) to install. For MacOS, we recommend using [brew](https://brew.sh/).
Expand Down
63 changes: 63 additions & 0 deletions docker-compose.docs-snapshots.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
services:
# Test server that has all the plugins loaded. Test sets are run against this server.
deephaven-plugins-docs-test-server:
container_name: deephaven-plugins
build:
dockerfile: ./Dockerfile
pull: true # We need to always pull the latest server image used in the Dockerfile
ports:
- '${DEEPHAVEN_SNAPSHOT_PORT:-10090}:10000'
environment:
- START_OPTS=-Xmx4g -DAuthHandlers=io.deephaven.auth.AnonymousAuthenticationHandler -Ddeephaven.console.type=python

# Extract the code blocks from the docs in the plugins directories and output them ssto a results directory.
deephaven-plugins-docs-extractor:
image: ghcr.io/deephaven/salmon-extractor
Comment thread
mofojed marked this conversation as resolved.
pull_policy: always
container_name: deephaven-plugins-docs-extractor
command:
[
'sh',
'-c',
'node extract.cjs --directory /extract/plotly-express --output /results/plotly-express; node extract.cjs --directory /extract/ui --output /results/ui',
]
volumes:
- ./plugins/ui/docs:/extract/ui
- ./plugins/plotly-express/docs:/extract/plotly-express
# exclude doc build directories by overriding with empty volumes
# We could extract from the build directories, but we need to output the snapshots to the build directory itself for Salmon to pick up...
- /extract/plotly-express/build/
- /extract/ui/build/
- ./docker/build/test-sets:/results # Output to a temporary build directory

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you could specify this as a docker volume at the top level of the compose file instead and then it won't need an intermediary directory on the host. The potential downside is less visibility into junk in this directory if it's not cleared by the extractor before running. Docker will create and manage the volume instead of using the host as a middleman.

volumes:
  test-sets:
services:
  extractor:
    volumes:
      - test-sets:/results

You can also still use the root volume definition to create a bind mount if you wanted it visible in the repo files. I think it works like this for the volume definition and then same to attach it to the service. The benefit of this would just be there's no accidental typo in the definition between the 2 containers, but that doesn't really matter in this case since it's only used twice

volumes:
  test-sets:
    driver: local
    driver_opts:
      o: bind
      device: ./docker/build/test-sets

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interestingly Copilot suggested exactly this, but with type: none added to driver_opts. Docs from driver_opts show type being specified: https://docs.docker.com/reference/compose-file/volumes/#driver_opts
I'll try with omitting it though.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So doing it this way throws an error if the directory doesn't already exist:

 ✔ deephaven-plugins-docs-validator Pulled                                                                                                                                                                                                  1.0s 
Error response from daemon: error while mounting volume '/var/lib/docker/volumes/deephaven-plugins_validator-results/_data': failed to mount local volume: mount /home/bender/dev/deephaven/iris-oss/deephaven-plugins/docker/build/validator-results:/var/lib/docker/volumes/deephaven-plugins_validator-results/_data, flags: 0x1000: no such file or directory ✔ deephaven-plugins-docs-validator Pulled                                                                                                                                                                                                  1.0s 
Error response from daemon: error while mounting volume '/var/lib/docker/volumes/deephaven-plugins_validator-results/_data': failed to mount local volume: mount /home/bender/dev/deephaven/iris-oss/deephaven-plugins/docker/build/validator-results:/var/lib/docker/volumes/deephaven-plugins_validator-results/_data, flags: 0x1000: no such file or directory

Not sure how to get around that without creating the directories first (outside of the docker compose file). It sounds like the path must exist for it to work: https://forums.docker.com/t/can-named-volume-in-docker-compose-file-create-a-folder-if-it-does-not-exist/143625

I think I'll just switch this back? Unless we want to git check-in those folders then ignore the contents...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doing it which way doesn't work? The bind mount as a named volume?

I'm fine without it, just thought it was worth trying. Only 2 locations and it would throw or not work if they didn't match.

Or the non-bind named volume where Docker handles it and it doesn't create the intermediate test-set files in the repo. Unless you want easier inspection of the test-set files

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bind mount as a named volume doesn't work if the directory doesn't already exist.


# Read the test sets from the results directory and run them against the test server, taking a snapshot of the results.
deephaven-plugins-docs-snapshotter:
image: ghcr.io/deephaven/salmon-snapshotter
pull_policy: always
depends_on:
deephaven-plugins-docs-test-server:
condition: service_healthy
deephaven-plugins-docs-extractor:
condition: service_completed_successfully
environment:
HOST_URL: 'http://deephaven-plugins-docs-test-server:10000'
command:
[
'sh',
'-c',
'node snapshot.cjs --directory /test-sets/plotly-express --output /results/plotly-express; node snapshot.cjs --directory /test-sets/ui --output /results/ui',
]
volumes:
- ./docker/build/test-sets:/test-sets
# Map all the results back to the snapshots directory for those docs
- ./plugins/ui/docs/snapshots:/results/ui
- ./plugins/plotly-express/docs/snapshots:/results/plotly-express

# Validate MDX and the snapshots that were written are valid
deephaven-plugins-docs-validator:
image: ghcr.io/deephaven/salmon-validator
pull_policy: always
volumes:
- ./plugins/ui/docs/build/markdown:/validate/ui
- ./plugins/plotly-express/docs/build/markdown:/validate/plotly-express
- ./docker/build/validator-results:/results
1 change: 1 addition & 0 deletions docker/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@
"test:ci:lint": "jest --config jest.config.lint.cjs --ci --cacheDirectory $PWD/.jest-cache",
"e2e": "playwright test",
"e2e:ui": "playwright test --ui",
"e2e:docker": "DEEPHAVEN_PORT=10001 ./tools/run_docker.sh e2e-tests",
"e2e:update-snapshots": "./tools/run_docker.sh update-snapshots",
"e2e:docker": "DEEPHAVEN_PORT=10001 ./tools/run_docker.sh ./tests/docker-compose.yml e2e-tests",
"e2e:update-snapshots": "./tools/run_docker.sh ./tests/docker-compose.yml update-snapshots",
"update-dh-packages": "lerna run --concurrency 1 update-dh-packages",
"update-dh-packages:ui": "npm run update-dh-packages -- --scope=@deephaven/js-plugin-ui --"
"update-dh-packages:ui": "npm run update-dh-packages -- --scope=@deephaven/js-plugin-ui --",
"update-doc-snapshots": "./tools/run_docker.sh ./docker-compose.docs-snapshots.yml deephaven-plugins-docs-snapshotter",
"validate-doc-snapshots": "./tools/run_docker.sh ./docker-compose.docs-snapshots.yml deephaven-plugins-docs-validator"
},
"devDependencies": {
"@deephaven/babel-preset": "^0.72.0",
Expand Down
2 changes: 2 additions & 0 deletions plugins/plotly-express/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"sphinx_markdown_builder",
"sphinx_autodoc_typehints",
"deephaven_autodoc",
"deephaven_code_block",
]

source_suffix = [".rst", ".md"] # Can use either rst or markdown files as input
Expand All @@ -41,6 +42,7 @@
always_use_bars_union = True

myst_all_links_external = True
myst_fence_as_directive = ("python", "groovy")

from deephaven_server import Server

Expand Down
Binary file removed plugins/plotly-express/docs/_assets/area_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/bar_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/box_plot.png
Binary file not shown.
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/funnel_area.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/funnel_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/heatmap.png
Binary file not shown.
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/icicle_plot.png
Binary file not shown.
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/layer_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/line_plot.png
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/ohlc_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/pie_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/plot_by.png
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/strip_plot.png
Binary file not shown.
Binary file removed plugins/plotly-express/docs/_assets/sub_plot.png
Binary file not shown.
Diff not rendered.
Diff not rendered.
Binary file removed plugins/plotly-express/docs/_assets/treemap_plot.png
Diff not rendered.
Diff not rendered.
Binary file removed plugins/plotly-express/docs/_assets/violin_plot.png
Diff not rendered.
4 changes: 1 addition & 3 deletions plugins/plotly-express/docs/area.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ usa_population = gapminder.where("Country == `United States`")
area_plot = dx.area(usa_population, x="Year", y="Pop")
```

![Area Plot Basic Example](./_assets/area_plot.png)

### Area by group

Area plots are unique in that the y-axis demonstrates each groups' total contribution to the whole. Pass the name of the grouping column(s) to the `by` argument.
Expand All @@ -47,7 +45,7 @@ area_plot_group = dx.area(large_countries_population, x="Year", y="Pop", by="Cou

Area plots take a calendar argument. Dates and times are excluded from axes so that they conform to the calendar.

```python
```python order=area_plot_default,area_plot_cal_name,area_plot_cal_y,area_plot_cal,dog_prices,stocks
import deephaven.plot.express as dx
from deephaven.calendar import calendar, set_calendar

Expand Down
4 changes: 1 addition & 3 deletions plugins/plotly-express/docs/bar.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ tips = dx.data.tips()
bar_plot = dx.bar(tips, x="Day", y="TotalBill")
```

![Bar Plot Basic Example](./_assets/bar_plot.png)

Change the x-axis ordering by sorting the dataset by the categorical variable.

```python order=ordered_bar_plot,tips
Expand Down Expand Up @@ -56,7 +54,7 @@ bar_plot_sex = dx.bar(sorted_tips, x="Day", y="TotalBill", by="Sex")

Visualize the frequency of categories in a column by passing to either the `x` or `y` argument.

```python
```python order=bar_plot_vertical,bar_plot_horizontal,tips
import deephaven.plot.express as dx

tips = dx.data.tips()
Expand Down
2 changes: 0 additions & 2 deletions plugins/plotly-express/docs/box.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ box_plot_x = dx.box(tips, x="TotalBill")
box_plot_y = dx.box(tips, y="TotalBill")
```

![Box Plot Basic Example](./_assets/box_plot.png)

### Distributions for multiple groups

Box plots are useful for comparing the distributions of two or more groups of data. Pass the name of the grouping column(s) to the `by` argument.
Expand Down
4 changes: 1 addition & 3 deletions plugins/plotly-express/docs/candlestick.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,11 @@ candlestick_plot = dx.candlestick(
)
```

![Candlestick Plot Basic Example](./_assets/candlestick_plot.png)

### Calendar

Candlestick plots take a calendar argument. Dates and times are excluded from axes so that they conform to the calendar.

```python
```python order=candlestick_plot_default,candlestick_plot_cal_name,candlestick_plot_cal,dog_prices,stocks_1min_dog,stocks
import deephaven.plot.express as dx
import deephaven.agg as agg
from deephaven.calendar import calendar, set_calendar
Expand Down
8 changes: 3 additions & 5 deletions plugins/plotly-express/docs/density_heatmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ iris = dx.data.iris()
heatmap = dx.density_heatmap(iris, x="PetalLength", y="PetalWidth")
```

![Heatmap Basic Example](./_assets/heatmap.png)

### A density heatmap with a custom color scale

Custom color scales can be provided to the `color_continuous_scale` argument, and their range can be defined with the `range_color` argument.

```py order=heatmap_colorscale,iris
```python order=heatmap_colorscale,iris
import deephaven.plot.express as dx
iris = dx.data.iris()

Expand All @@ -46,7 +44,7 @@ heatmap_colorscale = dx.density_heatmap(iris,

The number of bins on each axis can be set using the `nbinsx` and `nbinsy` arguments. The number of bins significantly impacts the visualization by changing the granularity of the grid.

```py order=heatmap_bins,iris
```python order=heatmap_bins,iris
import deephaven.plot.express as dx
iris = dx.data.iris()

Expand All @@ -66,7 +64,7 @@ heatmap_bins = dx.density_heatmap(

Use an additional continuous variable to color the heatmap. Many statistical aggregations can be computed on this column by providing the `histfunc` argument. Possible values for the `histfunc` are `"abs_sum"`, `"avg"`, `"count"`, `"count_distinct"`, `"max"`, `"median"`, `"min"`, `"std"`, `"sum"`, and `"var"`.

```py order=heatmap_aggregation,iris
```python order=heatmap_aggregation,iris
import deephaven.plot.express as dx
iris = dx.data.iris()

Expand Down
2 changes: 0 additions & 2 deletions plugins/plotly-express/docs/funnel-area.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ marketing = dx.data.marketing()
funnel_area_plot = dx.funnel_area(marketing, names="Stage", values="Count")
```

![Funnel Area Basic Example](./_assets/funnel_area.png)

## API Reference

```{eval-rst}
Expand Down
2 changes: 0 additions & 2 deletions plugins/plotly-express/docs/funnel.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ marketing = dx.data.marketing()
funnel_plot = dx.funnel(marketing, x="Count", y="Stage")
```

![Funnel Plot Basic Example](./_assets/funnel_plot.png)

## API Reference

```{eval-rst}
Expand Down
8 changes: 3 additions & 5 deletions plugins/plotly-express/docs/histogram.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ hist_plot_x = dx.histogram(setosa, x="SepalLength")
hist_plot_y = dx.histogram(setosa, y="SepalLength")
```

![Histogram Plot Basic Example](./_assets/histogram_plot.png)

Modify the bin size by setting `nbins` equal to the number of desired bins.

```python order=hist_20_bins,hist_3_bins,hist_8_bins,virginica,iris
Expand All @@ -40,13 +38,13 @@ iris = dx.data.iris()
virginica = iris.where("Species == `virginica`")

# too many bins will produce jagged, disconnected histograms
hist_20_bins = dx.histogram(setosa, x="SepalLength", nbins=20)
hist_20_bins = dx.histogram(virginica, x="SepalLength", nbins=20)

# too few bins will mask distributional information
hist_3_bins = dx.histogram(setosa, x="SepalLength", nbins=3)
hist_3_bins = dx.histogram(virginica, x="SepalLength", nbins=3)

# play with the `nbins` parameter to get a good visualization
hist_8_bins = dx.histogram(setosa, x="SepalLength", nbins=8)
hist_8_bins = dx.histogram(virginica, x="SepalLength", nbins=8)
```

### Bin and aggregate on different columns
Expand Down
7 changes: 3 additions & 4 deletions plugins/plotly-express/docs/icicle.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,27 +31,26 @@ gapminder_recent = (

icicle_plot = dx.icicle(gapminder_recent, names="Continent", values="Pop", parents="World")
```

### An icicle plot with `path`

Instead of manually aggregating and passing in `names` and `parents`, use the `path` argument to specify the hierarchy of the data. The first column is the root category, and the last column is the leaf category. The values are automatically summed up.

```python order=treemap_path_plot,gapminder
```python order=icicle_path_plot,gapminder
import deephaven.plot.express as dx

gapminder = dx.data.gapminder().update_view("World = `World`")

icicle_path_plot = dx.icicle(gapminder, path=["World", "Continent", "Country"], values="Pop")
```

![Icicle Plot Basic Example](./_assets/icicle_plot.png)

# A nested icicle plot with branch values

By default, the `branchvalues` argument is set to `"remainder"`.
Keep the default if the values column should be added to the sum of its children to get the value for a node.
If the values column is equal to the sum of its children, set `branchvalues` to `"total"`.

```python
```python order=icicle_nested,merged_gapminder,world,continents,countries
import deephaven.plot.express as dx
from deephaven import merge

Expand Down
12 changes: 5 additions & 7 deletions plugins/plotly-express/docs/indicator.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ An indicator plot is a type of plot that highlights a collection of numeric valu

Visualize a single numeric value by passing the column name to the `value` argument. The table should contain only one row.

```python
```python order=indicator_plot,dog_avg,my_table
import deephaven.plot.express as dx
from deephaven import agg as agg

Expand All @@ -26,8 +26,6 @@ dog_avg = my_table.where("Sym = `DOG`").agg_by([agg.avg(cols="Price")])
indicator_plot = dx.indicator(dog_avg, value="Price")
```

![Indicator Plot Basic Example](./_assets/indicator_plot.png)

### A delta indicator plot

Visualize a single numeric value with a delta to a reference value by passing the reference column name to the `reference` argument.
Expand Down Expand Up @@ -134,7 +132,7 @@ The default format is set within the Settings panel. If only `value` is specifie
If `reference` is specified, the default format is the `Integer` format if they are both integers. Otherwise, the default format is the `Decimal` format.
If a prefix or suffix is passed within the format string, it will be overridden by the `prefix` and `suffix` arguments.

```python
```python order=indicator_plot_prefix,indicator_plot,dog_avg,my_table
import deephaven.plot.express as dx
from deephaven import agg as agg

Expand Down Expand Up @@ -243,7 +241,7 @@ indicator_plot = dx.indicator(sym_avg, value="Price", by="Sym", cols=2)
Change the color of the delta value based on whether it is increasing or decreasing by passing `increasing_color_sequence` and `decreasing_color_sequence`.
These colors are applied sequentially to the indicators and looped if there are more indicators than colors.

```python
```python order=indicator_plot,sym_agg,my_table
import deephaven.plot.express as dx
from deephaven import agg as agg

Expand All @@ -268,7 +266,7 @@ indicator_plot = dx.indicator(
Change the color of the gauge based on the value by passing `gauge_color_sequence`.
These colors are applied sequentially to the indicators and looped if there are more indicators than colors.

```python
```python order=indicator_plot,sym_agg,my_table
import deephaven.plot.express as dx
from deephaven import agg as agg

Expand All @@ -287,7 +285,7 @@ indicator_plot = dx.indicator(
Create groups of styled indicators by passing the grouping categorical column name to the `by` argument.
`increasing_color_map` and `decreasing_color_map` can be used to style the indicators based on the group.

```python
```python order=indicator_plot,sym_agg,my_table
import deephaven.plot.express as dx
from deephaven import agg as agg

Expand Down
2 changes: 0 additions & 2 deletions plugins/plotly-express/docs/layer-plots.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ financial_plot = dx.layer(
)
```

![Layer Plot Basic Example](./_assets/layer_plot.png)

## API Reference

```{eval-rst}
Expand Down
Loading
Loading