Unified API and style for Python plotting libraries
Project description
Unified API and style for Python plotting libraries.
Usage
| plotly | matplotlib |
import numpy as np
import uplt
x = np.linspace(0, np.pi*4, num=100)
phi = np.pi/4
fig = uplt.figure('plotly')
fig.plot(x, np.sin(x - 0*phi), name='#1')
fig.plot(x, np.sin(x - 1*phi), name='#2')
fig.plot(x, np.sin(x - 2*phi), name='#3')
fig.plot(x, np.sin(x - 3*phi), name='#4')
fig.xlabel('X').ylabel('Y')
fig.legend().show()
|
import numpy as np
import uplt
x = np.linspace(0, np.pi*4, num=100)
phi = np.pi/4
fig = uplt.figure('matplot')
fig.plot(x, np.sin(x - 0*phi), name='#1')
fig.plot(x, np.sin(x - 1*phi), name='#2')
fig.plot(x, np.sin(x - 2*phi), name='#3')
fig.plot(x, np.sin(x - 3*phi), name='#4')
fig.xlabel('X').ylabel('Y')
fig.legend().show()
|
|
|
|
💡 See gallery for more examples.
💡 The
uplotalias is available and can be used interchangeably withuplt.
Install
Recent stable version (without any plotting library):
pip install uplt-py
To automatically install all optional dependencies (matplotlib, plotly, ...):
pip install "uplt-py[all]"
If you need only matplotlib support:
pip install "uplt-py[matplot]"
💡 Replace
[matplot]with[plotly]for plotly-only installation
Plotting Libs - Pros & Cons
Matplotlib
🟢 Highly configurable.
🟢 Good documentation and a lot of ready-to-use recipes (e.g. on StackOverflow).
🟡 Common API (MATLAB legacy).
🔴 Limited interactivity (especially for Jupyter).
🔴 API, behavior and parameter names are inconsistent (e.g. plt.xlim and axis.set_xlim).
🔴 Slow and limited 3D rendering.
Plotly
🟢 Very good interactivity.
🟢 Native compatibility with Jupyter.
🟢 Possibility to save interactive plot (html-file).
🟢 Fast and interactive 3D plot.
🔴 Not well documented (a lot of parameters, small amount of examples).
🔴 High memory consumption (limited number of plots in Jupyter).
🔴 Some expected API functions are missing (e.g. imshow).
🔴 3D and 2D axis parameters are not unified (e.g. layout.xaxis doesn't work for 3D).
Functions
| Function | Description |
|---|---|
plot(x, y, z) plot(obj) |
Plot 2D or 3D line. Line plot for custom class (supported by a plugin). |
scatter(x, y, z) scatter(obj) |
Scatter plot for 2D or 3D data points. Scatter plot for custom class (supported by a plugin). |
surface3d(x, y, z) |
Plot a surface in 3D space where the color scale corresponds to the z-values. |
bar(x, y) |
Create a bar plot. |
imshow(image) |
Display an image. |
hline(y) vline(x) |
Plot horizontal or vertical line. 2D only |
title(text) |
Set the title of the figure. |
legend(show) |
Show or hide the legend on the figure. |
grid(show) |
Show or hide the grid on the figure. |
xlabel(text) ylabel(text) zlabel(text) |
Set the label for the x, y, z-axis. |
xlim(min, max) ylim(min, max) zlim(min, max) |
Set limits for the x, y, z-axis. |
xscale() yscale() |
Set scale for the x, y-axis: 'linear' or 'log'. |
current_color() scroll_color(count) reset_color() |
Get the color which will be used for the next plot. Scroll a list of predefined colors for plots. Set the current color to the start of the list. |
axis_aspect(mode) |
Set the aspect ratio of the axis. |
as_image() |
Get the figure as a NumPy array. |
save(filename) |
Save the figure to a file. |
close() |
Close the figure. Free allocated resources. |
show(block) |
Display the figure. |
Extending
Plugin
The plugin system allows extending uplt for visualizing custom objects.
For example, the DataFrame plugin enables this code:
import uplt
import pandas as pd
car_crashes = pd.read_csv(
'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/car_crashes.csv'
)
fig = uplt.figure()
fig.plot(car_crashes[['total', 'speeding', 'alcohol', 'no_previous']])
fig.show()
To implement the plugin, you can follow this structure:
import numpy as np
import pandas as pd
import uplt.plugin as plugin
class DataFramePlugin(plugin.IPlotPlugin):
def extract_data(self, obj: pd.DataFrame) -> list[plugin.PlotData]:
data = []
for name in obj.columns:
if not np.issubdtype(obj.dtypes[name], np.number): continue
y = obj[name].values
x = np.arange(len(y))
data.append(plugin.PlotData(x=x, y=y, name=name.replace('_', ' ').title()))
return data
plugin.register(pd.DataFrame, handler=DataFramePlugin())
💡 Check
test/plugin.pyfor a more advanced plugin example.
Engine
Adding a new plotting library is straightforward. Implement two interfaces IPlotEngine and IFigure:
import uplt
from uplt import IPlotEngine, IFigure
class MyEngine(IPlotEngine):
...
def figure(self, ...) -> MyFigure: ...
class MyFigure(IFigure):
def plot(self, ...): ...
def scatter(self, ...): ...
...
# register the engine
uplt.engine.register(MyEngine(), name='test')
Then use it in the regular way:
import uplt
fig = uplt.figure(engine='test')
fig.plot(...)
fig.show()
Dependencies
Python≥ 3.10NumPy≥ 1.21v2.0 supportedpillow≥ 10.3
Optional
matplotlib≥ 3.7plotly≥ 5.17
License
This software is licensed under the BSD-3-Clause license.
See the LICENSE file for details.
TODO
Check the plan for new features here.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uplt_py-0.8.3.tar.gz.
File metadata
- Download URL: uplt_py-0.8.3.tar.gz
- Upload date:
- Size: 2.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c9b23b9b66c928a1ab65c5f94bb025263503fbf5b867634ca128646e3e07e73
|
|
| MD5 |
c9b611fc7f422d3fcd3debed9711bc01
|
|
| BLAKE2b-256 |
0dd32a92dc50899d661cc29f2c5cc41f5be03635d8b7515fe034078e15d21f33
|
File details
Details for the file uplt_py-0.8.3-py3-none-any.whl.
File metadata
- Download URL: uplt_py-0.8.3-py3-none-any.whl
- Upload date:
- Size: 33.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18f3ed84ab1fcc8069b08d9ca4479ce14160e7a5cfc09c794ba0d466211b3634
|
|
| MD5 |
6adfde78663b42c427d4fa5f2f3e9115
|
|
| BLAKE2b-256 |
c4f4573ddbe699b446e23dbd81c5d93142bfdc51394fb50c4bf945e9fab57615
|