interplot¶
Quick Start¶
interplot¶
Create matplotlib
and plotly
charts with the same few lines of code.
It combines the best of the matplotlib
and the plotly
worlds through a unified, flat API.
Switch between matplotlib
and plotly
with the single keyword interactive
. All the necessary boilerplate code to translate between the packages is contained in this module.
Currently supported building blocks:
scatter plots
line
scatter
linescatter
bar charts
bar
histogram
hist
boxplot
boxplot
heatmap
heatmap
linear regression
regression
line fill
fill
annotations
text
Supported
2D subplots
automatic color cycling
3 different API modes
One line of code
>>> interplot.line([0,4,6,7], [1,2,4,8]) [plotly line figure] >>> interplot.hist(np.random.normal(40, 8, 1000), interactive=False) [matplotlib hist figure] >>> interplot.boxplot( >>> [ >>> np.random.normal(20, 5, 1000), >>> np.random.normal(40, 8, 1000), >>> np.random.normal(60, 5, 1000), >>> ], >>> ) [plotly boxplots]
Decorator to auto-initialize plots to use in your methods
>>> @interplot.magic_plot >>> def plot_my_data(fig=None): >>> # import and process your data... >>> data = np.random.normal(2, 3, 1000) >>> # draw with the fig instance obtained from the decorator function >>> fig.add_line(data, label="my data") >>> fig.add_fill((0, 999), (-1, -1), (5, 5), label="sigma") >>> plot_my_data(title="My Recording") [plotly figure "My Recording"] >>> @interplot.magic_plot_preset(interactive=False, title="Preset Title") >>> def plot_my_data_preconfigured(fig=None): >>> # import and process your data... >>> data = np.random.normal(2, 3, 1000) >>> # draw with the fig instance obtained from the decorator function >>> fig.add_line(data, label="my data") >>> fig.add_fill((0, 999), (-1, -1), (5, 5), label="sigma") >>> plot_my_data_preconfigured() [matplotlib figure "Preset Title"]
The
interplot.Plot
class for full control>>> fig = interplot.Plot( >>> interactive=True, >>> title="Everything Under Control", >>> fig_size=(800, 500), >>> rows=1, >>> cols=2, >>> shared_yaxes=True, >>> # ... >>> ) >>> fig.add_hist(np.random.normal(1, 0.5, 1000), row=0, col=0) >>> fig.add_boxplot( >>> [ >>> np.random.normal(20, 5, 1000), >>> np.random.normal(40, 8, 1000), >>> np.random.normal(60, 5, 1000), >>> ], >>> row=0, >>> col=1, >>> ) >>> # ... >>> fig.post_process() >>> fig.show() [plotly figure "Everything Under Control"] >>> fig.save("export/path/file.html") saved figure at export/path/file.html
Resources¶
Documentation: https://interplot.janjo.ch
Demo Notebooks: https://nbviewer.org/github/janjoch/interplot/tree/main/demo/
Source Code: https://github.com/janjoch/interplot
Licence¶
Demo¶
View on NBViewer
:
Try on Binder
:
Install¶
pip install interplot
dev installation¶
git clone https://github.com/janjoch/interplot
cd interplot
pip install -e .
Contribute¶
Ideas, bug reports/fixes, feature requests and code submissions are very welcome! Please write to janjo@duck.com or directly into a pull request.
Examples¶
>>> interplot.line([0,4,6,7], [1,2,4,8])
>>> interplot.line(
... x=[0,4,6,7],
... y=[1,2,4,8],
... interactive=False,
... color="red",
... title="matplotlib static figure",
... xlabel="abscissa",
... ylabel="ordinate",
... )
>>> fig = interplot.Plot(
... interactive=True,
... title="Everything Under Control",
... fig_size=(800, 500),
... rows=1,
... cols=2,
... shared_yaxes=True,
... save_fig=True,
... save_format=("html", "png"),
... # ...
... )
... fig.add_hist(np.random.normal(1, 0.5, 1000), row=0, col=0)
... fig.add_boxplot(
... [
... np.random.normal(20, 5, 1000),
... np.random.normal(40, 8, 1000),
... np.random.normal(60, 5, 1000),
... ],
... row=0,
... col=1,
... )
... # ...
... fig.post_process()
... fig.show()
saved figure at Everything-Under-Control.html
saved figure at Everything-Under-Control.png
>>> @interplot.magic_plot
... def plot_lines(samples=100, n=10, label="sigma={0}, mu={1}", fig=None):
... """
... Plot Gaussian noise.
...
... The function must accept the `fig` parameter from the decorator.
... """
... for i in range(1, n+1):
... fig.add_line(
... np.random.normal(i*10,i,samples),
... label=label.format(i, i*10),
... )
>>> plot_lines(samples=200, title="Normally distributed Noise")
>>> plot_lines(
... samples=200, interactive=False, title="Normally distributed Noise")
Note
More examples can be found on NBViewer.