Instructions to use dl1wjd2/Logistics_AX with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use dl1wjd2/Logistics_AX with ultralytics:
from huggingface_hub import hf_hub_download from ultralytics import YOLO # pick the weights file from this repo's "Files and versions" tab weights = hf_hub_download("dl1wjd2/Logistics_AX", "<weights>.pt") model = YOLO(weights) source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
Upload folder using huggingface_hub (part 9)
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +6 -0
- hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/INSTALLER +1 -0
- hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/LICENSE +1253 -0
- hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/METADATA +1366 -0
- hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/RECORD +891 -0
- hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/WHEEL +6 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patches.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_path.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_png.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_polar.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_scale.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_skew.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_spines.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_style.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_table.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_testing.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_text.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc +3 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_units.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/conftest.py +3 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_afm.py +148 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_agg.py +396 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_agg_filter.py +30 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_animation.py +573 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_api.py +178 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_arrow_patches.py +221 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_artist.py +625 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_axes.py +0 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_axis.py +130 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_bases.py +589 -0
- hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_cairo.py +53 -0
.gitattributes
CHANGED
|
@@ -144,3 +144,9 @@ hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_colors.cpytho
|
|
| 144 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_figure.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 145 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_image.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 146 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_legend.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_figure.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 145 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_image.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 146 |
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_legend.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 147 |
+
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 148 |
+
hug/lib/python3.12/site-packages/mpl_toolkits/mplot3d/__pycache__/axes3d.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 149 |
+
hug/lib/python3.12/site-packages/mpl_toolkits/mplot3d/tests/__pycache__/test_axes3d.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 150 |
+
hug/lib/python3.12/site-packages/mpmath/__pycache__/function_docs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 151 |
+
hug/lib/python3.12/site-packages/mpmath/tests/__pycache__/test_fp.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 152 |
+
hug/lib/python3.12/site-packages/mpmath/tests/__pycache__/test_functions2.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pip
|
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/LICENSE
ADDED
|
@@ -0,0 +1,1253 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
License agreement for matplotlib versions 1.3.0 and later
|
| 2 |
+
=========================================================
|
| 3 |
+
|
| 4 |
+
1. This LICENSE AGREEMENT is between the Matplotlib Development Team
|
| 5 |
+
("MDT"), and the Individual or Organization ("Licensee") accessing and
|
| 6 |
+
otherwise using matplotlib software in source or binary form and its
|
| 7 |
+
associated documentation.
|
| 8 |
+
|
| 9 |
+
2. Subject to the terms and conditions of this License Agreement, MDT
|
| 10 |
+
hereby grants Licensee a nonexclusive, royalty-free, world-wide license
|
| 11 |
+
to reproduce, analyze, test, perform and/or display publicly, prepare
|
| 12 |
+
derivative works, distribute, and otherwise use matplotlib
|
| 13 |
+
alone or in any derivative version, provided, however, that MDT's
|
| 14 |
+
License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
|
| 15 |
+
2012- Matplotlib Development Team; All Rights Reserved" are retained in
|
| 16 |
+
matplotlib alone or in any derivative version prepared by
|
| 17 |
+
Licensee.
|
| 18 |
+
|
| 19 |
+
3. In the event Licensee prepares a derivative work that is based on or
|
| 20 |
+
incorporates matplotlib or any part thereof, and wants to
|
| 21 |
+
make the derivative work available to others as provided herein, then
|
| 22 |
+
Licensee hereby agrees to include in any such work a brief summary of
|
| 23 |
+
the changes made to matplotlib .
|
| 24 |
+
|
| 25 |
+
4. MDT is making matplotlib available to Licensee on an "AS
|
| 26 |
+
IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
| 27 |
+
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
|
| 28 |
+
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
| 29 |
+
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
|
| 30 |
+
WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
| 31 |
+
|
| 32 |
+
5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
|
| 33 |
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
|
| 34 |
+
LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
|
| 35 |
+
MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
|
| 36 |
+
THE POSSIBILITY THEREOF.
|
| 37 |
+
|
| 38 |
+
6. This License Agreement will automatically terminate upon a material
|
| 39 |
+
breach of its terms and conditions.
|
| 40 |
+
|
| 41 |
+
7. Nothing in this License Agreement shall be deemed to create any
|
| 42 |
+
relationship of agency, partnership, or joint venture between MDT and
|
| 43 |
+
Licensee. This License Agreement does not grant permission to use MDT
|
| 44 |
+
trademarks or trade name in a trademark sense to endorse or promote
|
| 45 |
+
products or services of Licensee, or any third party.
|
| 46 |
+
|
| 47 |
+
8. By copying, installing or otherwise using matplotlib ,
|
| 48 |
+
Licensee agrees to be bound by the terms and conditions of this License
|
| 49 |
+
Agreement.
|
| 50 |
+
|
| 51 |
+
License agreement for matplotlib versions prior to 1.3.0
|
| 52 |
+
========================================================
|
| 53 |
+
|
| 54 |
+
1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
|
| 55 |
+
Individual or Organization ("Licensee") accessing and otherwise using
|
| 56 |
+
matplotlib software in source or binary form and its associated
|
| 57 |
+
documentation.
|
| 58 |
+
|
| 59 |
+
2. Subject to the terms and conditions of this License Agreement, JDH
|
| 60 |
+
hereby grants Licensee a nonexclusive, royalty-free, world-wide license
|
| 61 |
+
to reproduce, analyze, test, perform and/or display publicly, prepare
|
| 62 |
+
derivative works, distribute, and otherwise use matplotlib
|
| 63 |
+
alone or in any derivative version, provided, however, that JDH's
|
| 64 |
+
License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
|
| 65 |
+
2002-2011 John D. Hunter; All Rights Reserved" are retained in
|
| 66 |
+
matplotlib alone or in any derivative version prepared by
|
| 67 |
+
Licensee.
|
| 68 |
+
|
| 69 |
+
3. In the event Licensee prepares a derivative work that is based on or
|
| 70 |
+
incorporates matplotlib or any part thereof, and wants to
|
| 71 |
+
make the derivative work available to others as provided herein, then
|
| 72 |
+
Licensee hereby agrees to include in any such work a brief summary of
|
| 73 |
+
the changes made to matplotlib.
|
| 74 |
+
|
| 75 |
+
4. JDH is making matplotlib available to Licensee on an "AS
|
| 76 |
+
IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
| 77 |
+
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
|
| 78 |
+
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
| 79 |
+
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
|
| 80 |
+
WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
| 81 |
+
|
| 82 |
+
5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
|
| 83 |
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
|
| 84 |
+
LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
|
| 85 |
+
MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
|
| 86 |
+
THE POSSIBILITY THEREOF.
|
| 87 |
+
|
| 88 |
+
6. This License Agreement will automatically terminate upon a material
|
| 89 |
+
breach of its terms and conditions.
|
| 90 |
+
|
| 91 |
+
7. Nothing in this License Agreement shall be deemed to create any
|
| 92 |
+
relationship of agency, partnership, or joint venture between JDH and
|
| 93 |
+
Licensee. This License Agreement does not grant permission to use JDH
|
| 94 |
+
trademarks or trade name in a trademark sense to endorse or promote
|
| 95 |
+
products or services of Licensee, or any third party.
|
| 96 |
+
|
| 97 |
+
8. By copying, installing or otherwise using matplotlib,
|
| 98 |
+
Licensee agrees to be bound by the terms and conditions of this License
|
| 99 |
+
Agreement.
|
| 100 |
+
----
|
| 101 |
+
|
| 102 |
+
This binary distrubution of Matplotlib can also bundle the following software
|
| 103 |
+
(depending on the build):
|
| 104 |
+
|
| 105 |
+
Name: AMS Fonts
|
| 106 |
+
Files: matplotlib/tests/cmr10.pfb
|
| 107 |
+
Description: Type-1 version of one of Knuth's Computer Modern fonts
|
| 108 |
+
License: OFL-1.1
|
| 109 |
+
The cmr10.pfb file is a Type-1 version of one of Knuth's Computer Modern fonts.
|
| 110 |
+
It is included here as test data only, but the following license applies.
|
| 111 |
+
|
| 112 |
+
Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org).
|
| 113 |
+
All Rights Reserved.
|
| 114 |
+
|
| 115 |
+
"cmb10" is a Reserved Font Name for this Font Software.
|
| 116 |
+
"cmbsy10" is a Reserved Font Name for this Font Software.
|
| 117 |
+
"cmbsy5" is a Reserved Font Name for this Font Software.
|
| 118 |
+
"cmbsy6" is a Reserved Font Name for this Font Software.
|
| 119 |
+
"cmbsy7" is a Reserved Font Name for this Font Software.
|
| 120 |
+
"cmbsy8" is a Reserved Font Name for this Font Software.
|
| 121 |
+
"cmbsy9" is a Reserved Font Name for this Font Software.
|
| 122 |
+
"cmbx10" is a Reserved Font Name for this Font Software.
|
| 123 |
+
"cmbx12" is a Reserved Font Name for this Font Software.
|
| 124 |
+
"cmbx5" is a Reserved Font Name for this Font Software.
|
| 125 |
+
"cmbx6" is a Reserved Font Name for this Font Software.
|
| 126 |
+
"cmbx7" is a Reserved Font Name for this Font Software.
|
| 127 |
+
"cmbx8" is a Reserved Font Name for this Font Software.
|
| 128 |
+
"cmbx9" is a Reserved Font Name for this Font Software.
|
| 129 |
+
"cmbxsl10" is a Reserved Font Name for this Font Software.
|
| 130 |
+
"cmbxti10" is a Reserved Font Name for this Font Software.
|
| 131 |
+
"cmcsc10" is a Reserved Font Name for this Font Software.
|
| 132 |
+
"cmcsc8" is a Reserved Font Name for this Font Software.
|
| 133 |
+
"cmcsc9" is a Reserved Font Name for this Font Software.
|
| 134 |
+
"cmdunh10" is a Reserved Font Name for this Font Software.
|
| 135 |
+
"cmex10" is a Reserved Font Name for this Font Software.
|
| 136 |
+
"cmex7" is a Reserved Font Name for this Font Software.
|
| 137 |
+
"cmex8" is a Reserved Font Name for this Font Software.
|
| 138 |
+
"cmex9" is a Reserved Font Name for this Font Software.
|
| 139 |
+
"cmff10" is a Reserved Font Name for this Font Software.
|
| 140 |
+
"cmfi10" is a Reserved Font Name for this Font Software.
|
| 141 |
+
"cmfib8" is a Reserved Font Name for this Font Software.
|
| 142 |
+
"cminch" is a Reserved Font Name for this Font Software.
|
| 143 |
+
"cmitt10" is a Reserved Font Name for this Font Software.
|
| 144 |
+
"cmmi10" is a Reserved Font Name for this Font Software.
|
| 145 |
+
"cmmi12" is a Reserved Font Name for this Font Software.
|
| 146 |
+
"cmmi5" is a Reserved Font Name for this Font Software.
|
| 147 |
+
"cmmi6" is a Reserved Font Name for this Font Software.
|
| 148 |
+
"cmmi7" is a Reserved Font Name for this Font Software.
|
| 149 |
+
"cmmi8" is a Reserved Font Name for this Font Software.
|
| 150 |
+
"cmmi9" is a Reserved Font Name for this Font Software.
|
| 151 |
+
"cmmib10" is a Reserved Font Name for this Font Software.
|
| 152 |
+
"cmmib5" is a Reserved Font Name for this Font Software.
|
| 153 |
+
"cmmib6" is a Reserved Font Name for this Font Software.
|
| 154 |
+
"cmmib7" is a Reserved Font Name for this Font Software.
|
| 155 |
+
"cmmib8" is a Reserved Font Name for this Font Software.
|
| 156 |
+
"cmmib9" is a Reserved Font Name for this Font Software.
|
| 157 |
+
"cmr10" is a Reserved Font Name for this Font Software.
|
| 158 |
+
"cmr12" is a Reserved Font Name for this Font Software.
|
| 159 |
+
"cmr17" is a Reserved Font Name for this Font Software.
|
| 160 |
+
"cmr5" is a Reserved Font Name for this Font Software.
|
| 161 |
+
"cmr6" is a Reserved Font Name for this Font Software.
|
| 162 |
+
"cmr7" is a Reserved Font Name for this Font Software.
|
| 163 |
+
"cmr8" is a Reserved Font Name for this Font Software.
|
| 164 |
+
"cmr9" is a Reserved Font Name for this Font Software.
|
| 165 |
+
"cmsl10" is a Reserved Font Name for this Font Software.
|
| 166 |
+
"cmsl12" is a Reserved Font Name for this Font Software.
|
| 167 |
+
"cmsl8" is a Reserved Font Name for this Font Software.
|
| 168 |
+
"cmsl9" is a Reserved Font Name for this Font Software.
|
| 169 |
+
"cmsltt10" is a Reserved Font Name for this Font Software.
|
| 170 |
+
"cmss10" is a Reserved Font Name for this Font Software.
|
| 171 |
+
"cmss12" is a Reserved Font Name for this Font Software.
|
| 172 |
+
"cmss17" is a Reserved Font Name for this Font Software.
|
| 173 |
+
"cmss8" is a Reserved Font Name for this Font Software.
|
| 174 |
+
"cmss9" is a Reserved Font Name for this Font Software.
|
| 175 |
+
"cmssbx10" is a Reserved Font Name for this Font Software.
|
| 176 |
+
"cmssdc10" is a Reserved Font Name for this Font Software.
|
| 177 |
+
"cmssi10" is a Reserved Font Name for this Font Software.
|
| 178 |
+
"cmssi12" is a Reserved Font Name for this Font Software.
|
| 179 |
+
"cmssi17" is a Reserved Font Name for this Font Software.
|
| 180 |
+
"cmssi8" is a Reserved Font Name for this Font Software.
|
| 181 |
+
"cmssi9" is a Reserved Font Name for this Font Software.
|
| 182 |
+
"cmssq8" is a Reserved Font Name for this Font Software.
|
| 183 |
+
"cmssqi8" is a Reserved Font Name for this Font Software.
|
| 184 |
+
"cmsy10" is a Reserved Font Name for this Font Software.
|
| 185 |
+
"cmsy5" is a Reserved Font Name for this Font Software.
|
| 186 |
+
"cmsy6" is a Reserved Font Name for this Font Software.
|
| 187 |
+
"cmsy7" is a Reserved Font Name for this Font Software.
|
| 188 |
+
"cmsy8" is a Reserved Font Name for this Font Software.
|
| 189 |
+
"cmsy9" is a Reserved Font Name for this Font Software.
|
| 190 |
+
"cmtcsc10" is a Reserved Font Name for this Font Software.
|
| 191 |
+
"cmtex10" is a Reserved Font Name for this Font Software.
|
| 192 |
+
"cmtex8" is a Reserved Font Name for this Font Software.
|
| 193 |
+
"cmtex9" is a Reserved Font Name for this Font Software.
|
| 194 |
+
"cmti10" is a Reserved Font Name for this Font Software.
|
| 195 |
+
"cmti12" is a Reserved Font Name for this Font Software.
|
| 196 |
+
"cmti7" is a Reserved Font Name for this Font Software.
|
| 197 |
+
"cmti8" is a Reserved Font Name for this Font Software.
|
| 198 |
+
"cmti9" is a Reserved Font Name for this Font Software.
|
| 199 |
+
"cmtt10" is a Reserved Font Name for this Font Software.
|
| 200 |
+
"cmtt12" is a Reserved Font Name for this Font Software.
|
| 201 |
+
"cmtt8" is a Reserved Font Name for this Font Software.
|
| 202 |
+
"cmtt9" is a Reserved Font Name for this Font Software.
|
| 203 |
+
"cmu10" is a Reserved Font Name for this Font Software.
|
| 204 |
+
"cmvtt10" is a Reserved Font Name for this Font Software.
|
| 205 |
+
"euex10" is a Reserved Font Name for this Font Software.
|
| 206 |
+
"euex7" is a Reserved Font Name for this Font Software.
|
| 207 |
+
"euex8" is a Reserved Font Name for this Font Software.
|
| 208 |
+
"euex9" is a Reserved Font Name for this Font Software.
|
| 209 |
+
"eufb10" is a Reserved Font Name for this Font Software.
|
| 210 |
+
"eufb5" is a Reserved Font Name for this Font Software.
|
| 211 |
+
"eufb7" is a Reserved Font Name for this Font Software.
|
| 212 |
+
"eufm10" is a Reserved Font Name for this Font Software.
|
| 213 |
+
"eufm5" is a Reserved Font Name for this Font Software.
|
| 214 |
+
"eufm7" is a Reserved Font Name for this Font Software.
|
| 215 |
+
"eurb10" is a Reserved Font Name for this Font Software.
|
| 216 |
+
"eurb5" is a Reserved Font Name for this Font Software.
|
| 217 |
+
"eurb7" is a Reserved Font Name for this Font Software.
|
| 218 |
+
"eurm10" is a Reserved Font Name for this Font Software.
|
| 219 |
+
"eurm5" is a Reserved Font Name for this Font Software.
|
| 220 |
+
"eurm7" is a Reserved Font Name for this Font Software.
|
| 221 |
+
"eusb10" is a Reserved Font Name for this Font Software.
|
| 222 |
+
"eusb5" is a Reserved Font Name for this Font Software.
|
| 223 |
+
"eusb7" is a Reserved Font Name for this Font Software.
|
| 224 |
+
"eusm10" is a Reserved Font Name for this Font Software.
|
| 225 |
+
"eusm5" is a Reserved Font Name for this Font Software.
|
| 226 |
+
"eusm7" is a Reserved Font Name for this Font Software.
|
| 227 |
+
"lasy10" is a Reserved Font Name for this Font Software.
|
| 228 |
+
"lasy5" is a Reserved Font Name for this Font Software.
|
| 229 |
+
"lasy6" is a Reserved Font Name for this Font Software.
|
| 230 |
+
"lasy7" is a Reserved Font Name for this Font Software.
|
| 231 |
+
"lasy8" is a Reserved Font Name for this Font Software.
|
| 232 |
+
"lasy9" is a Reserved Font Name for this Font Software.
|
| 233 |
+
"lasyb10" is a Reserved Font Name for this Font Software.
|
| 234 |
+
"lcircle1" is a Reserved Font Name for this Font Software.
|
| 235 |
+
"lcirclew" is a Reserved Font Name for this Font Software.
|
| 236 |
+
"lcmss8" is a Reserved Font Name for this Font Software.
|
| 237 |
+
"lcmssb8" is a Reserved Font Name for this Font Software.
|
| 238 |
+
"lcmssi8" is a Reserved Font Name for this Font Software.
|
| 239 |
+
"line10" is a Reserved Font Name for this Font Software.
|
| 240 |
+
"linew10" is a Reserved Font Name for this Font Software.
|
| 241 |
+
"msam10" is a Reserved Font Name for this Font Software.
|
| 242 |
+
"msam5" is a Reserved Font Name for this Font Software.
|
| 243 |
+
"msam6" is a Reserved Font Name for this Font Software.
|
| 244 |
+
"msam7" is a Reserved Font Name for this Font Software.
|
| 245 |
+
"msam8" is a Reserved Font Name for this Font Software.
|
| 246 |
+
"msam9" is a Reserved Font Name for this Font Software.
|
| 247 |
+
"msbm10" is a Reserved Font Name for this Font Software.
|
| 248 |
+
"msbm5" is a Reserved Font Name for this Font Software.
|
| 249 |
+
"msbm6" is a Reserved Font Name for this Font Software.
|
| 250 |
+
"msbm7" is a Reserved Font Name for this Font Software.
|
| 251 |
+
"msbm8" is a Reserved Font Name for this Font Software.
|
| 252 |
+
"msbm9" is a Reserved Font Name for this Font Software.
|
| 253 |
+
"wncyb10" is a Reserved Font Name for this Font Software.
|
| 254 |
+
"wncyi10" is a Reserved Font Name for this Font Software.
|
| 255 |
+
"wncyr10" is a Reserved Font Name for this Font Software.
|
| 256 |
+
"wncysc10" is a Reserved Font Name for this Font Software.
|
| 257 |
+
"wncyss10" is a Reserved Font Name for this Font Software.
|
| 258 |
+
|
| 259 |
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
| 260 |
+
This license is copied below, and is also available with a FAQ at:
|
| 261 |
+
http://scripts.sil.org/OFL
|
| 262 |
+
|
| 263 |
+
-----------------------------------------------------------
|
| 264 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 265 |
+
-----------------------------------------------------------
|
| 266 |
+
|
| 267 |
+
PREAMBLE
|
| 268 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 269 |
+
development of collaborative font projects, to support the font creation
|
| 270 |
+
efforts of academic and linguistic communities, and to provide a free and
|
| 271 |
+
open framework in which fonts may be shared and improved in partnership
|
| 272 |
+
with others.
|
| 273 |
+
|
| 274 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 275 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 276 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 277 |
+
redistributed and/or sold with any software provided that any reserved
|
| 278 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 279 |
+
however, cannot be released under any other type of license. The
|
| 280 |
+
requirement for fonts to remain under this license does not apply
|
| 281 |
+
to any document created using the fonts or their derivatives.
|
| 282 |
+
|
| 283 |
+
DEFINITIONS
|
| 284 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 285 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 286 |
+
include source files, build scripts and documentation.
|
| 287 |
+
|
| 288 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 289 |
+
copyright statement(s).
|
| 290 |
+
|
| 291 |
+
"Original Version" refers to the collection of Font Software components as
|
| 292 |
+
distributed by the Copyright Holder(s).
|
| 293 |
+
|
| 294 |
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
| 295 |
+
or substituting -- in part or in whole -- any of the components of the
|
| 296 |
+
Original Version, by changing formats or by porting the Font Software to a
|
| 297 |
+
new environment.
|
| 298 |
+
|
| 299 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 300 |
+
writer or other person who contributed to the Font Software.
|
| 301 |
+
|
| 302 |
+
PERMISSION & CONDITIONS
|
| 303 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 304 |
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
| 305 |
+
redistribute, and sell modified and unmodified copies of the Font
|
| 306 |
+
Software, subject to the following conditions:
|
| 307 |
+
|
| 308 |
+
1) Neither the Font Software nor any of its individual components,
|
| 309 |
+
in Original or Modified Versions, may be sold by itself.
|
| 310 |
+
|
| 311 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 312 |
+
redistributed and/or sold with any software, provided that each copy
|
| 313 |
+
contains the above copyright notice and this license. These can be
|
| 314 |
+
included either as stand-alone text files, human-readable headers or
|
| 315 |
+
in the appropriate machine-readable metadata fields within text or
|
| 316 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 317 |
+
|
| 318 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 319 |
+
Name(s) unless explicit written permission is granted by the corresponding
|
| 320 |
+
Copyright Holder. This restriction only applies to the primary font name as
|
| 321 |
+
presented to the users.
|
| 322 |
+
|
| 323 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 324 |
+
Software shall not be used to promote, endorse or advertise any
|
| 325 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 326 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 327 |
+
permission.
|
| 328 |
+
|
| 329 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 330 |
+
must be distributed entirely under this license, and must not be
|
| 331 |
+
distributed under any other license. The requirement for fonts to
|
| 332 |
+
remain under this license does not apply to any document created
|
| 333 |
+
using the Font Software.
|
| 334 |
+
|
| 335 |
+
TERMINATION
|
| 336 |
+
This license becomes null and void if any of the above conditions are
|
| 337 |
+
not met.
|
| 338 |
+
|
| 339 |
+
DISCLAIMER
|
| 340 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 341 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 342 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 343 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 344 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 345 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 346 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 347 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 348 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 349 |
+
|
| 350 |
+
|
| 351 |
+
|
| 352 |
+
Name: BaKoMa Fonts
|
| 353 |
+
Files: matplotlib/mpl-data/fonts/ttf/cm*.ttf matplotlib/mpl-data/fonts/afm/cm*.afm
|
| 354 |
+
Description: Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
|
| 355 |
+
License: BaKoMa Fonts Licence
|
| 356 |
+
BaKoMa Fonts Licence
|
| 357 |
+
--------------------
|
| 358 |
+
|
| 359 |
+
This licence covers two font packs (known as BaKoMa Fonts Collection,
|
| 360 |
+
which is available at `CTAN:fonts/cm/ps-type1/bakoma/'):
|
| 361 |
+
|
| 362 |
+
1) BaKoMa-CM (1.1/12-Nov-94)
|
| 363 |
+
Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
|
| 364 |
+
|
| 365 |
+
2) BaKoMa-AMS (1.2/19-Jan-95)
|
| 366 |
+
AMS TeX fonts in PostScript Type 1 and TrueType font formats.
|
| 367 |
+
|
| 368 |
+
Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved.
|
| 369 |
+
|
| 370 |
+
Permission to copy and distribute these fonts for any purpose is
|
| 371 |
+
hereby granted without fee, provided that the above copyright notice,
|
| 372 |
+
author statement and this permission notice appear in all copies of
|
| 373 |
+
these fonts and related documentation.
|
| 374 |
+
|
| 375 |
+
Permission to modify and distribute modified fonts for any purpose is
|
| 376 |
+
hereby granted without fee, provided that the copyright notice,
|
| 377 |
+
author statement, this permission notice and location of original
|
| 378 |
+
fonts (http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma)
|
| 379 |
+
appear in all copies of modified fonts and related documentation.
|
| 380 |
+
|
| 381 |
+
Permission to use these fonts (embedding into PostScript, PDF, SVG
|
| 382 |
+
and printing by using any software) is hereby granted without fee.
|
| 383 |
+
It is not required to provide any notices about using these fonts.
|
| 384 |
+
|
| 385 |
+
Basil K. Malyshev
|
| 386 |
+
INSTITUTE FOR HIGH ENERGY PHYSICS
|
| 387 |
+
IHEP, OMVT
|
| 388 |
+
Moscow Region
|
| 389 |
+
142281 PROTVINO
|
| 390 |
+
RUSSIA
|
| 391 |
+
|
| 392 |
+
E-Mail: bakoma@mail.ru
|
| 393 |
+
or malyshev@mail.ihep.ru
|
| 394 |
+
|
| 395 |
+
|
| 396 |
+
|
| 397 |
+
|
| 398 |
+
Name: ColorBrewer Color Schemes
|
| 399 |
+
Files: lib/matplotlib/_cm.py
|
| 400 |
+
Description: Color schemes from ColorBrewer
|
| 401 |
+
License: Apache-2.0
|
| 402 |
+
Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes
|
| 403 |
+
|
| 404 |
+
Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University.
|
| 405 |
+
|
| 406 |
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
|
| 407 |
+
You may obtain a copy of the License at
|
| 408 |
+
|
| 409 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 410 |
+
|
| 411 |
+
Unless required by applicable law or agreed to in writing, software distributed
|
| 412 |
+
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
| 413 |
+
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
| 414 |
+
specific language governing permissions and limitations under the License.
|
| 415 |
+
|
| 416 |
+
|
| 417 |
+
Name: Courier 10
|
| 418 |
+
Files: matplotlib/tests/Courier10PitchBT-Bold.pfb
|
| 419 |
+
Description: Courier 10 font, used in tests.
|
| 420 |
+
License: Bitstream-Charter
|
| 421 |
+
The Courier10PitchBT-Bold.pfb file is a Type-1 version of
|
| 422 |
+
Courier 10 Pitch BT Bold by Bitstream, obtained from
|
| 423 |
+
<https://ctan.org/tex-archive/fonts/courierten>. It is included
|
| 424 |
+
here as test data only, but the following license applies.
|
| 425 |
+
|
| 426 |
+
|
| 427 |
+
(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
|
| 428 |
+
|
| 429 |
+
You are hereby granted permission under all Bitstream propriety rights
|
| 430 |
+
to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
|
| 431 |
+
Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
|
| 432 |
+
for any purpose and without restriction; provided, that this notice is
|
| 433 |
+
left intact on all copies of such fonts and that Bitstream's trademark
|
| 434 |
+
is acknowledged as shown below on all unmodified copies of the 4 Charter
|
| 435 |
+
Type 1 fonts.
|
| 436 |
+
|
| 437 |
+
BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
|
| 438 |
+
|
| 439 |
+
|
| 440 |
+
Name: FreeType
|
| 441 |
+
Files: matplotlib/ft2font.*.so
|
| 442 |
+
Description: Font rendering library
|
| 443 |
+
License: FTL OR GPL-2.0-or-later
|
| 444 |
+
The FreeType 2 font engine is copyrighted work and cannot be used
|
| 445 |
+
legally without a software license. In order to make this project
|
| 446 |
+
usable to a vast majority of developers, we distribute it under two
|
| 447 |
+
mutually exclusive open-source licenses.
|
| 448 |
+
|
| 449 |
+
This means that *you* must choose *one* of the two licenses described
|
| 450 |
+
below, then obey all its terms and conditions when using FreeType 2 in
|
| 451 |
+
any of your projects or products.
|
| 452 |
+
|
| 453 |
+
- The FreeType License, found in the file `docs/FTL.TXT`, which is
|
| 454 |
+
similar to the original BSD license *with* an advertising clause
|
| 455 |
+
that forces you to explicitly cite the FreeType project in your
|
| 456 |
+
product's documentation. All details are in the license file.
|
| 457 |
+
This license is suited to products which don't use the GNU General
|
| 458 |
+
Public License.
|
| 459 |
+
|
| 460 |
+
Note that this license is compatible to the GNU General Public
|
| 461 |
+
License version 3, but not version 2.
|
| 462 |
+
|
| 463 |
+
- The GNU General Public License version 2, found in
|
| 464 |
+
`docs/GPLv2.TXT` (any later version can be used also), for
|
| 465 |
+
programs which already use the GPL. Note that the FTL is
|
| 466 |
+
incompatible with GPLv2 due to its advertisement clause.
|
| 467 |
+
|
| 468 |
+
The contributed BDF and PCF drivers come with a license similar to
|
| 469 |
+
that of the X Window System. It is compatible to the above two
|
| 470 |
+
licenses (see files `src/bdf/README` and `src/pcf/README`). The same
|
| 471 |
+
holds for the source code files `src/base/fthash.c` and
|
| 472 |
+
`include/freetype/internal/fthash.h`; they were part of the BDF driver
|
| 473 |
+
in earlier FreeType versions.
|
| 474 |
+
|
| 475 |
+
The gzip module uses the zlib license (see `src/gzip/zlib.h`) which
|
| 476 |
+
too is compatible to the above two licenses.
|
| 477 |
+
|
| 478 |
+
The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code
|
| 479 |
+
taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses
|
| 480 |
+
the 'Old MIT' license, compatible to the above two licenses.
|
| 481 |
+
|
| 482 |
+
The MD5 checksum support (only used for debugging in development
|
| 483 |
+
builds) is in the public domain.
|
| 484 |
+
|
| 485 |
+
|
| 486 |
+
Name: HarfBuzz
|
| 487 |
+
Files: matplotlib/ft2font.*.so
|
| 488 |
+
Description: Text shaping library
|
| 489 |
+
License: MIT-Modern-Variant
|
| 490 |
+
HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
|
| 491 |
+
For parts of HarfBuzz that are licensed under different licenses see individual
|
| 492 |
+
files names COPYING in subdirectories where applicable.
|
| 493 |
+
|
| 494 |
+
Copyright © 2010-2022 Google, Inc.
|
| 495 |
+
Copyright © 2015-2020 Ebrahim Byagowi
|
| 496 |
+
Copyright © 2019,2020 Facebook, Inc.
|
| 497 |
+
Copyright © 2012,2015 Mozilla Foundation
|
| 498 |
+
Copyright © 2011 Codethink Limited
|
| 499 |
+
Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
|
| 500 |
+
Copyright © 2009 Keith Stribley
|
| 501 |
+
Copyright © 2011 Martin Hosken and SIL International
|
| 502 |
+
Copyright © 2007 Chris Wilson
|
| 503 |
+
Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod
|
| 504 |
+
Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc.
|
| 505 |
+
Copyright © 1998-2005 David Turner and Werner Lemberg
|
| 506 |
+
Copyright © 2016 Igalia S.L.
|
| 507 |
+
Copyright © 2022 Matthias Clasen
|
| 508 |
+
Copyright © 2018,2021 Khaled Hosny
|
| 509 |
+
Copyright © 2018,2019,2020 Adobe, Inc
|
| 510 |
+
Copyright © 2013-2015 Alexei Podtelezhnikov
|
| 511 |
+
|
| 512 |
+
For full copyright notices consult the individual files in the package.
|
| 513 |
+
|
| 514 |
+
|
| 515 |
+
Permission is hereby granted, without written agreement and without
|
| 516 |
+
license or royalty fees, to use, copy, modify, and distribute this
|
| 517 |
+
software and its documentation for any purpose, provided that the
|
| 518 |
+
above copyright notice and the following two paragraphs appear in
|
| 519 |
+
all copies of this software.
|
| 520 |
+
|
| 521 |
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
| 522 |
+
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
| 523 |
+
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
| 524 |
+
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
| 525 |
+
DAMAGE.
|
| 526 |
+
|
| 527 |
+
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
| 528 |
+
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
| 529 |
+
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
| 530 |
+
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
| 531 |
+
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
| 532 |
+
|
| 533 |
+
|
| 534 |
+
Name: JSXTools resize observer
|
| 535 |
+
Files: lib/matplotlib/backends/web_backend/js/mpl.js
|
| 536 |
+
Description: Minimal polyfill for the ResizeObserver API
|
| 537 |
+
License: CC0-1.0
|
| 538 |
+
# CC0 1.0 Universal
|
| 539 |
+
|
| 540 |
+
## Statement of Purpose
|
| 541 |
+
|
| 542 |
+
The laws of most jurisdictions throughout the world automatically confer
|
| 543 |
+
exclusive Copyright and Related Rights (defined below) upon the creator and
|
| 544 |
+
subsequent owner(s) (each and all, an “owner”) of an original work of
|
| 545 |
+
authorship and/or a database (each, a “Work”).
|
| 546 |
+
|
| 547 |
+
Certain owners wish to permanently relinquish those rights to a Work for the
|
| 548 |
+
purpose of contributing to a commons of creative, cultural and scientific works
|
| 549 |
+
(“Commons”) that the public can reliably and without fear of later claims of
|
| 550 |
+
infringement build upon, modify, incorporate in other works, reuse and
|
| 551 |
+
redistribute as freely as possible in any form whatsoever and for any purposes,
|
| 552 |
+
including without limitation commercial purposes. These owners may contribute
|
| 553 |
+
to the Commons to promote the ideal of a free culture and the further
|
| 554 |
+
production of creative, cultural and scientific works, or to gain reputation or
|
| 555 |
+
greater distribution for their Work in part through the use and efforts of
|
| 556 |
+
others.
|
| 557 |
+
|
| 558 |
+
For these and/or other purposes and motivations, and without any expectation of
|
| 559 |
+
additional consideration or compensation, the person associating CC0 with a
|
| 560 |
+
Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
|
| 561 |
+
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
|
| 562 |
+
publicly distribute the Work under its terms, with knowledge of his or her
|
| 563 |
+
Copyright and Related Rights in the Work and the meaning and intended legal
|
| 564 |
+
effect of CC0 on those rights.
|
| 565 |
+
|
| 566 |
+
1. Copyright and Related Rights. A Work made available under CC0 may be
|
| 567 |
+
protected by copyright and related or neighboring rights (“Copyright and
|
| 568 |
+
Related Rights”). Copyright and Related Rights include, but are not limited
|
| 569 |
+
to, the following:
|
| 570 |
+
1. the right to reproduce, adapt, distribute, perform, display, communicate,
|
| 571 |
+
and translate a Work;
|
| 572 |
+
2. moral rights retained by the original author(s) and/or performer(s);
|
| 573 |
+
3. publicity and privacy rights pertaining to a person’s image or likeness
|
| 574 |
+
depicted in a Work;
|
| 575 |
+
4. rights protecting against unfair competition in regards to a Work,
|
| 576 |
+
subject to the limitations in paragraph 4(i), below;
|
| 577 |
+
5. rights protecting the extraction, dissemination, use and reuse of data in
|
| 578 |
+
a Work;
|
| 579 |
+
6. database rights (such as those arising under Directive 96/9/EC of the
|
| 580 |
+
European Parliament and of the Council of 11 March 1996 on the legal
|
| 581 |
+
protection of databases, and under any national implementation thereof,
|
| 582 |
+
including any amended or successor version of such directive); and
|
| 583 |
+
7. other similar, equivalent or corresponding rights throughout the world
|
| 584 |
+
based on applicable law or treaty, and any national implementations
|
| 585 |
+
thereof.
|
| 586 |
+
|
| 587 |
+
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
| 588 |
+
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
| 589 |
+
unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
|
| 590 |
+
and Related Rights and associated claims and causes of action, whether now
|
| 591 |
+
known or unknown (including existing as well as future claims and causes of
|
| 592 |
+
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
| 593 |
+
duration provided by applicable law or treaty (including future time
|
| 594 |
+
extensions), (iii) in any current or future medium and for any number of
|
| 595 |
+
copies, and (iv) for any purpose whatsoever, including without limitation
|
| 596 |
+
commercial, advertising or promotional purposes (the “Waiver”). Affirmer
|
| 597 |
+
makes the Waiver for the benefit of each member of the public at large and
|
| 598 |
+
to the detriment of Affirmer’s heirs and successors, fully intending that
|
| 599 |
+
such Waiver shall not be subject to revocation, rescission, cancellation,
|
| 600 |
+
termination, or any other legal or equitable action to disrupt the quiet
|
| 601 |
+
enjoyment of the Work by the public as contemplated by Affirmer’s express
|
| 602 |
+
Statement of Purpose.
|
| 603 |
+
|
| 604 |
+
3. Public License Fallback. Should any part of the Waiver for any reason be
|
| 605 |
+
judged legally invalid or ineffective under applicable law, then the Waiver
|
| 606 |
+
shall be preserved to the maximum extent permitted taking into account
|
| 607 |
+
Affirmer’s express Statement of Purpose. In addition, to the extent the
|
| 608 |
+
Waiver is so judged Affirmer hereby grants to each affected person a
|
| 609 |
+
royalty-free, non transferable, non sublicensable, non exclusive,
|
| 610 |
+
irrevocable and unconditional license to exercise Affirmer’s Copyright and
|
| 611 |
+
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
| 612 |
+
maximum duration provided by applicable law or treaty (including future time
|
| 613 |
+
extensions), (iii) in any current or future medium and for any number of
|
| 614 |
+
copies, and (iv) for any purpose whatsoever, including without limitation
|
| 615 |
+
commercial, advertising or promotional purposes (the “License”). The License
|
| 616 |
+
shall be deemed effective as of the date CC0 was applied by Affirmer to the
|
| 617 |
+
Work. Should any part of the License for any reason be judged legally
|
| 618 |
+
invalid or ineffective under applicable law, such partial invalidity or
|
| 619 |
+
ineffectiveness shall not invalidate the remainder of the License, and in
|
| 620 |
+
such case Affirmer hereby affirms that he or she will not (i) exercise any
|
| 621 |
+
of his or her remaining Copyright and Related Rights in the Work or (ii)
|
| 622 |
+
assert any associated claims and causes of action with respect to the Work,
|
| 623 |
+
in either case contrary to Affirmer’s express Statement of Purpose.
|
| 624 |
+
|
| 625 |
+
4. Limitations and Disclaimers.
|
| 626 |
+
1. No trademark or patent rights held by Affirmer are waived, abandoned,
|
| 627 |
+
surrendered, licensed or otherwise affected by this document.
|
| 628 |
+
2. Affirmer offers the Work as-is and makes no representations or warranties
|
| 629 |
+
of any kind concerning the Work, express, implied, statutory or
|
| 630 |
+
otherwise, including without limitation warranties of title,
|
| 631 |
+
merchantability, fitness for a particular purpose, non infringement, or
|
| 632 |
+
the absence of latent or other defects, accuracy, or the present or
|
| 633 |
+
absence of errors, whether or not discoverable, all to the greatest
|
| 634 |
+
extent permissible under applicable law.
|
| 635 |
+
3. Affirmer disclaims responsibility for clearing rights of other persons
|
| 636 |
+
that may apply to the Work or any use thereof, including without
|
| 637 |
+
limitation any person’s Copyright and Related Rights in the Work.
|
| 638 |
+
Further, Affirmer disclaims responsibility for obtaining any necessary
|
| 639 |
+
consents, permissions or other rights required for any use of the Work.
|
| 640 |
+
4. Affirmer understands and acknowledges that Creative Commons is not a
|
| 641 |
+
party to this document and has no duty or obligation with respect to this
|
| 642 |
+
CC0 or use of the Work.
|
| 643 |
+
|
| 644 |
+
For more information, please see
|
| 645 |
+
http://creativecommons.org/publicdomain/zero/1.0/.
|
| 646 |
+
|
| 647 |
+
|
| 648 |
+
Name: Last Resort fonts
|
| 649 |
+
Files: matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf
|
| 650 |
+
Description: Last Resort High-Efficiency Font
|
| 651 |
+
License: OFL-1.1
|
| 652 |
+
This Font Software is licensed under the SIL Open Font License,
|
| 653 |
+
Version 1.1.
|
| 654 |
+
|
| 655 |
+
This license is copied below, and is also available with a FAQ at:
|
| 656 |
+
http://scripts.sil.org/OFL
|
| 657 |
+
|
| 658 |
+
-----------------------------------------------------------
|
| 659 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 660 |
+
-----------------------------------------------------------
|
| 661 |
+
|
| 662 |
+
PREAMBLE
|
| 663 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 664 |
+
development of collaborative font projects, to support the font
|
| 665 |
+
creation efforts of academic and linguistic communities, and to
|
| 666 |
+
provide a free and open framework in which fonts may be shared and
|
| 667 |
+
improved in partnership with others.
|
| 668 |
+
|
| 669 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 670 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 671 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 672 |
+
redistributed and/or sold with any software provided that any reserved
|
| 673 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 674 |
+
however, cannot be released under any other type of license. The
|
| 675 |
+
requirement for fonts to remain under this license does not apply to
|
| 676 |
+
any document created using the fonts or their derivatives.
|
| 677 |
+
|
| 678 |
+
DEFINITIONS
|
| 679 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 680 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 681 |
+
include source files, build scripts and documentation.
|
| 682 |
+
|
| 683 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 684 |
+
copyright statement(s).
|
| 685 |
+
|
| 686 |
+
"Original Version" refers to the collection of Font Software
|
| 687 |
+
components as distributed by the Copyright Holder(s).
|
| 688 |
+
|
| 689 |
+
"Modified Version" refers to any derivative made by adding to,
|
| 690 |
+
deleting, or substituting -- in part or in whole -- any of the
|
| 691 |
+
components of the Original Version, by changing formats or by porting
|
| 692 |
+
the Font Software to a new environment.
|
| 693 |
+
|
| 694 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 695 |
+
writer or other person who contributed to the Font Software.
|
| 696 |
+
|
| 697 |
+
PERMISSION & CONDITIONS
|
| 698 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 699 |
+
a copy of the Font Software, to use, study, copy, merge, embed,
|
| 700 |
+
modify, redistribute, and sell modified and unmodified copies of the
|
| 701 |
+
Font Software, subject to the following conditions:
|
| 702 |
+
|
| 703 |
+
1) Neither the Font Software nor any of its individual components, in
|
| 704 |
+
Original or Modified Versions, may be sold by itself.
|
| 705 |
+
|
| 706 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 707 |
+
redistributed and/or sold with any software, provided that each copy
|
| 708 |
+
contains the above copyright notice and this license. These can be
|
| 709 |
+
included either as stand-alone text files, human-readable headers or
|
| 710 |
+
in the appropriate machine-readable metadata fields within text or
|
| 711 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 712 |
+
|
| 713 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 714 |
+
Name(s) unless explicit written permission is granted by the
|
| 715 |
+
corresponding Copyright Holder. This restriction only applies to the
|
| 716 |
+
primary font name as presented to the users.
|
| 717 |
+
|
| 718 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 719 |
+
Software shall not be used to promote, endorse or advertise any
|
| 720 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 721 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 722 |
+
permission.
|
| 723 |
+
|
| 724 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 725 |
+
must be distributed entirely under this license, and must not be
|
| 726 |
+
distributed under any other license. The requirement for fonts to
|
| 727 |
+
remain under this license does not apply to any document created using
|
| 728 |
+
the Font Software.
|
| 729 |
+
|
| 730 |
+
TERMINATION
|
| 731 |
+
This license becomes null and void if any of the above conditions are
|
| 732 |
+
not met.
|
| 733 |
+
|
| 734 |
+
DISCLAIMER
|
| 735 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 736 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 737 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 738 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 739 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 740 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 741 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 742 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 743 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 744 |
+
|
| 745 |
+
SPDX-License-Identifier: OFL-1.1
|
| 746 |
+
|
| 747 |
+
|
| 748 |
+
Name: libraqm
|
| 749 |
+
Files: matplotlib/ft2font.*.so
|
| 750 |
+
Description: Complex text layout library
|
| 751 |
+
License: MIT
|
| 752 |
+
The MIT License (MIT)
|
| 753 |
+
|
| 754 |
+
Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
|
| 755 |
+
Copyright © 2016-2023 Khaled Hosny <khaled@aliftype.com>
|
| 756 |
+
|
| 757 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 758 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 759 |
+
in the Software without restriction, including without limitation the rights
|
| 760 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 761 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 762 |
+
furnished to do so, subject to the following conditions:
|
| 763 |
+
|
| 764 |
+
The above copyright notice and this permission notice shall be included in all
|
| 765 |
+
copies or substantial portions of the Software.
|
| 766 |
+
|
| 767 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 768 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 769 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 770 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 771 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 772 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 773 |
+
SOFTWARE.
|
| 774 |
+
|
| 775 |
+
|
| 776 |
+
Name: QHull
|
| 777 |
+
Files: matplotlib/_qhull.*.so
|
| 778 |
+
Description: Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection
|
| 779 |
+
License: Qhull
|
| 780 |
+
Qhull, Copyright (c) 1993-2020
|
| 781 |
+
|
| 782 |
+
C.B. Barber
|
| 783 |
+
Arlington, MA
|
| 784 |
+
|
| 785 |
+
and
|
| 786 |
+
|
| 787 |
+
The National Science and Technology Research Center for
|
| 788 |
+
Computation and Visualization of Geometric Structures
|
| 789 |
+
(The Geometry Center)
|
| 790 |
+
University of Minnesota
|
| 791 |
+
|
| 792 |
+
email: qhull@qhull.org
|
| 793 |
+
|
| 794 |
+
This software includes Qhull from C.B. Barber and The Geometry Center.
|
| 795 |
+
Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The
|
| 796 |
+
remaining files are copyrighted by C.B. Barber. Qhull is free software
|
| 797 |
+
and may be obtained via http from www.qhull.org. It may be freely copied,
|
| 798 |
+
modified, and redistributed under the following conditions:
|
| 799 |
+
|
| 800 |
+
1. All copyright notices must remain intact in all files.
|
| 801 |
+
|
| 802 |
+
2. A copy of this text file must be distributed along with any copies
|
| 803 |
+
of Qhull that you redistribute; this includes copies that you have
|
| 804 |
+
modified, or copies of programs or other software products that
|
| 805 |
+
include Qhull.
|
| 806 |
+
|
| 807 |
+
3. If you modify Qhull, you must include a notice giving the
|
| 808 |
+
name of the person performing the modification, the date of
|
| 809 |
+
modification, and the reason for such modification.
|
| 810 |
+
|
| 811 |
+
4. When distributing modified versions of Qhull, or other software
|
| 812 |
+
products that include Qhull, you must provide notice that the original
|
| 813 |
+
source code may be obtained as noted above.
|
| 814 |
+
|
| 815 |
+
5. There is no warranty or other guarantee of fitness for Qhull, it is
|
| 816 |
+
provided solely "as is". Bug reports or fixes may be sent to
|
| 817 |
+
qhull_bug@qhull.org; the authors may or may not act on them as
|
| 818 |
+
they desire.
|
| 819 |
+
|
| 820 |
+
|
| 821 |
+
Name: Qt4 Editor
|
| 822 |
+
Files: matplotlib/backends/qt_editor
|
| 823 |
+
Description: Module creating PyQt4 form dialogs/layouts to edit various type of parameters
|
| 824 |
+
License: MIT
|
| 825 |
+
Module creating PyQt4 form dialogs/layouts to edit various type of parameters
|
| 826 |
+
|
| 827 |
+
|
| 828 |
+
formlayout License Agreement (MIT License)
|
| 829 |
+
------------------------------------------
|
| 830 |
+
|
| 831 |
+
Copyright (c) 2009 Pierre Raybaut
|
| 832 |
+
|
| 833 |
+
Permission is hereby granted, free of charge, to any person
|
| 834 |
+
obtaining a copy of this software and associated documentation
|
| 835 |
+
files (the "Software"), to deal in the Software without
|
| 836 |
+
restriction, including without limitation the rights to use,
|
| 837 |
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 838 |
+
copies of the Software, and to permit persons to whom the
|
| 839 |
+
Software is furnished to do so, subject to the following
|
| 840 |
+
conditions:
|
| 841 |
+
|
| 842 |
+
The above copyright notice and this permission notice shall be
|
| 843 |
+
included in all copies or substantial portions of the Software.
|
| 844 |
+
|
| 845 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 846 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
| 847 |
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
| 848 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
| 849 |
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 850 |
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 851 |
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
| 852 |
+
OTHER DEALINGS IN THE SOFTWARE.
|
| 853 |
+
|
| 854 |
+
|
| 855 |
+
Name: SheenBidi
|
| 856 |
+
Files: matplotlib/ft2font.*.so
|
| 857 |
+
Description: Unicode Bidirectional Algorithm implementation
|
| 858 |
+
License: Apache-2.0
|
| 859 |
+
Apache License
|
| 860 |
+
Version 2.0, January 2004
|
| 861 |
+
http://www.apache.org/licenses/
|
| 862 |
+
|
| 863 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 864 |
+
|
| 865 |
+
1. Definitions.
|
| 866 |
+
|
| 867 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 868 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 869 |
+
|
| 870 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 871 |
+
the copyright owner that is granting the License.
|
| 872 |
+
|
| 873 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 874 |
+
other entities that control, are controlled by, or are under common
|
| 875 |
+
control with that entity. For the purposes of this definition,
|
| 876 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 877 |
+
direction or management of such entity, whether by contract or
|
| 878 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 879 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 880 |
+
|
| 881 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 882 |
+
exercising permissions granted by this License.
|
| 883 |
+
|
| 884 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 885 |
+
including but not limited to software source code, documentation
|
| 886 |
+
source, and configuration files.
|
| 887 |
+
|
| 888 |
+
"Object" form shall mean any form resulting from mechanical
|
| 889 |
+
transformation or translation of a Source form, including but
|
| 890 |
+
not limited to compiled object code, generated documentation,
|
| 891 |
+
and conversions to other media types.
|
| 892 |
+
|
| 893 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 894 |
+
Object form, made available under the License, as indicated by a
|
| 895 |
+
copyright notice that is included in or attached to the work
|
| 896 |
+
(an example is provided in the Appendix below).
|
| 897 |
+
|
| 898 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 899 |
+
form, that is based on (or derived from) the Work and for which the
|
| 900 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 901 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 902 |
+
of this License, Derivative Works shall not include works that remain
|
| 903 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 904 |
+
the Work and Derivative Works thereof.
|
| 905 |
+
|
| 906 |
+
"Contribution" shall mean any work of authorship, including
|
| 907 |
+
the original version of the Work and any modifications or additions
|
| 908 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 909 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 910 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 911 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 912 |
+
means any form of electronic, verbal, or written communication sent
|
| 913 |
+
to the Licensor or its representatives, including but not limited to
|
| 914 |
+
communication on electronic mailing lists, source code control systems,
|
| 915 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 916 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 917 |
+
excluding communication that is conspicuously marked or otherwise
|
| 918 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 919 |
+
|
| 920 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 921 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 922 |
+
subsequently incorporated within the Work.
|
| 923 |
+
|
| 924 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 925 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 926 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 927 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 928 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 929 |
+
Work and such Derivative Works in Source or Object form.
|
| 930 |
+
|
| 931 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 932 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 933 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 934 |
+
(except as stated in this section) patent license to make, have made,
|
| 935 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 936 |
+
where such license applies only to those patent claims licensable
|
| 937 |
+
by such Contributor that are necessarily infringed by their
|
| 938 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 939 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 940 |
+
institute patent litigation against any entity (including a
|
| 941 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 942 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 943 |
+
or contributory patent infringement, then any patent licenses
|
| 944 |
+
granted to You under this License for that Work shall terminate
|
| 945 |
+
as of the date such litigation is filed.
|
| 946 |
+
|
| 947 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 948 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 949 |
+
modifications, and in Source or Object form, provided that You
|
| 950 |
+
meet the following conditions:
|
| 951 |
+
|
| 952 |
+
(a) You must give any other recipients of the Work or
|
| 953 |
+
Derivative Works a copy of this License; and
|
| 954 |
+
|
| 955 |
+
(b) You must cause any modified files to carry prominent notices
|
| 956 |
+
stating that You changed the files; and
|
| 957 |
+
|
| 958 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 959 |
+
that You distribute, all copyright, patent, trademark, and
|
| 960 |
+
attribution notices from the Source form of the Work,
|
| 961 |
+
excluding those notices that do not pertain to any part of
|
| 962 |
+
the Derivative Works; and
|
| 963 |
+
|
| 964 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 965 |
+
distribution, then any Derivative Works that You distribute must
|
| 966 |
+
include a readable copy of the attribution notices contained
|
| 967 |
+
within such NOTICE file, excluding those notices that do not
|
| 968 |
+
pertain to any part of the Derivative Works, in at least one
|
| 969 |
+
of the following places: within a NOTICE text file distributed
|
| 970 |
+
as part of the Derivative Works; within the Source form or
|
| 971 |
+
documentation, if provided along with the Derivative Works; or,
|
| 972 |
+
within a display generated by the Derivative Works, if and
|
| 973 |
+
wherever such third-party notices normally appear. The contents
|
| 974 |
+
of the NOTICE file are for informational purposes only and
|
| 975 |
+
do not modify the License. You may add Your own attribution
|
| 976 |
+
notices within Derivative Works that You distribute, alongside
|
| 977 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 978 |
+
that such additional attribution notices cannot be construed
|
| 979 |
+
as modifying the License.
|
| 980 |
+
|
| 981 |
+
You may add Your own copyright statement to Your modifications and
|
| 982 |
+
may provide additional or different license terms and conditions
|
| 983 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 984 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 985 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 986 |
+
the conditions stated in this License.
|
| 987 |
+
|
| 988 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 989 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 990 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 991 |
+
this License, without any additional terms or conditions.
|
| 992 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 993 |
+
the terms of any separate license agreement you may have executed
|
| 994 |
+
with Licensor regarding such Contributions.
|
| 995 |
+
|
| 996 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 997 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 998 |
+
except as required for reasonable and customary use in describing the
|
| 999 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 1000 |
+
|
| 1001 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 1002 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 1003 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 1004 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 1005 |
+
implied, including, without limitation, any warranties or conditions
|
| 1006 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 1007 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 1008 |
+
appropriateness of using or redistributing the Work and assume any
|
| 1009 |
+
risks associated with Your exercise of permissions under this License.
|
| 1010 |
+
|
| 1011 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 1012 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 1013 |
+
unless required by applicable law (such as deliberate and grossly
|
| 1014 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 1015 |
+
liable to You for damages, including any direct, indirect, special,
|
| 1016 |
+
incidental, or consequential damages of any character arising as a
|
| 1017 |
+
result of this License or out of the use or inability to use the
|
| 1018 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 1019 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 1020 |
+
other commercial damages or losses), even if such Contributor
|
| 1021 |
+
has been advised of the possibility of such damages.
|
| 1022 |
+
|
| 1023 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 1024 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 1025 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 1026 |
+
or other liability obligations and/or rights consistent with this
|
| 1027 |
+
License. However, in accepting such obligations, You may act only
|
| 1028 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 1029 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 1030 |
+
defend, and hold each Contributor harmless for any liability
|
| 1031 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 1032 |
+
of your accepting any such warranty or additional liability.
|
| 1033 |
+
|
| 1034 |
+
END OF TERMS AND CONDITIONS
|
| 1035 |
+
|
| 1036 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 1037 |
+
|
| 1038 |
+
To apply the Apache License to your work, attach the following
|
| 1039 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 1040 |
+
replaced with your own identifying information. (Don't include
|
| 1041 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 1042 |
+
comment syntax for the file format. We also recommend that a
|
| 1043 |
+
file or class name and description of purpose be included on the
|
| 1044 |
+
same "printed page" as the copyright notice for easier
|
| 1045 |
+
identification within third-party archives.
|
| 1046 |
+
|
| 1047 |
+
Copyright [yyyy] [name of copyright owner]
|
| 1048 |
+
|
| 1049 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 1050 |
+
you may not use this file except in compliance with the License.
|
| 1051 |
+
You may obtain a copy of the License at
|
| 1052 |
+
|
| 1053 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 1054 |
+
|
| 1055 |
+
Unless required by applicable law or agreed to in writing, software
|
| 1056 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 1057 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 1058 |
+
See the License for the specific language governing permissions and
|
| 1059 |
+
limitations under the License.
|
| 1060 |
+
|
| 1061 |
+
|
| 1062 |
+
Name: Solarized
|
| 1063 |
+
Files: matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle
|
| 1064 |
+
Description: Solarized color scheme/style
|
| 1065 |
+
License: MIT
|
| 1066 |
+
https://github.com/altercation/solarized/blob/master/LICENSE
|
| 1067 |
+
Copyright (c) 2011 Ethan Schoonover
|
| 1068 |
+
|
| 1069 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 1070 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 1071 |
+
in the Software without restriction, including without limitation the rights
|
| 1072 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 1073 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 1074 |
+
furnished to do so, subject to the following conditions:
|
| 1075 |
+
|
| 1076 |
+
The above copyright notice and this permission notice shall be included in
|
| 1077 |
+
all copies or substantial portions of the Software.
|
| 1078 |
+
|
| 1079 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 1080 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 1081 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 1082 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 1083 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 1084 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
| 1085 |
+
THE SOFTWARE.
|
| 1086 |
+
|
| 1087 |
+
|
| 1088 |
+
Name: Stix fonts
|
| 1089 |
+
Files: matplotlib/mpl-data/fonts/ttf/STIX*.ttf
|
| 1090 |
+
Description: STIX fonts
|
| 1091 |
+
License: OFL-1.1
|
| 1092 |
+
STIX Font License
|
| 1093 |
+
|
| 1094 |
+
24 May 2010
|
| 1095 |
+
|
| 1096 |
+
Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American
|
| 1097 |
+
Institute of Physics, the American Chemical Society, the American Mathematical
|
| 1098 |
+
Society, the American Physical Society, Elsevier, Inc., and The Institute of
|
| 1099 |
+
Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved
|
| 1100 |
+
Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of
|
| 1101 |
+
Electrical and Electronics Engineers, Inc.
|
| 1102 |
+
|
| 1103 |
+
Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com),
|
| 1104 |
+
with Reserved Font Name TM Math. To obtain additional mathematical fonts, please
|
| 1105 |
+
contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA,
|
| 1106 |
+
Phone: (718) 575-1816.
|
| 1107 |
+
|
| 1108 |
+
Portions copyright (c) 1990 by Elsevier, Inc.
|
| 1109 |
+
|
| 1110 |
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
| 1111 |
+
This license is copied below, and is also available with a FAQ at:
|
| 1112 |
+
https://scripts.sil.org/OFL
|
| 1113 |
+
|
| 1114 |
+
-----------------------------------------------------------
|
| 1115 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 1116 |
+
-----------------------------------------------------------
|
| 1117 |
+
|
| 1118 |
+
PREAMBLE
|
| 1119 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 1120 |
+
development of collaborative font projects, to support the font creation
|
| 1121 |
+
efforts of academic and linguistic communities, and to provide a free and
|
| 1122 |
+
open framework in which fonts may be shared and improved in partnership
|
| 1123 |
+
with others.
|
| 1124 |
+
|
| 1125 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 1126 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 1127 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 1128 |
+
redistributed and/or sold with any software provided that any reserved
|
| 1129 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 1130 |
+
however, cannot be released under any other type of license. The
|
| 1131 |
+
requirement for fonts to remain under this license does not apply
|
| 1132 |
+
to any document created using the fonts or their derivatives.
|
| 1133 |
+
|
| 1134 |
+
DEFINITIONS
|
| 1135 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 1136 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 1137 |
+
include source files, build scripts and documentation.
|
| 1138 |
+
|
| 1139 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 1140 |
+
copyright statement(s).
|
| 1141 |
+
|
| 1142 |
+
"Original Version" refers to the collection of Font Software components as
|
| 1143 |
+
distributed by the Copyright Holder(s).
|
| 1144 |
+
|
| 1145 |
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
| 1146 |
+
or substituting -- in part or in whole -- any of the components of the
|
| 1147 |
+
Original Version, by changing formats or by porting the Font Software to a
|
| 1148 |
+
new environment.
|
| 1149 |
+
|
| 1150 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 1151 |
+
writer or other person who contributed to the Font Software.
|
| 1152 |
+
|
| 1153 |
+
PERMISSION & CONDITIONS
|
| 1154 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 1155 |
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
| 1156 |
+
redistribute, and sell modified and unmodified copies of the Font
|
| 1157 |
+
Software, subject to the following conditions:
|
| 1158 |
+
|
| 1159 |
+
1) Neither the Font Software nor any of its individual components,
|
| 1160 |
+
in Original or Modified Versions, may be sold by itself.
|
| 1161 |
+
|
| 1162 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 1163 |
+
redistributed and/or sold with any software, provided that each copy
|
| 1164 |
+
contains the above copyright notice and this license. These can be
|
| 1165 |
+
included either as stand-alone text files, human-readable headers or
|
| 1166 |
+
in the appropriate machine-readable metadata fields within text or
|
| 1167 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 1168 |
+
|
| 1169 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 1170 |
+
Name(s) unless explicit written permission is granted by the corresponding
|
| 1171 |
+
Copyright Holder. This restriction only applies to the primary font name as
|
| 1172 |
+
presented to the users.
|
| 1173 |
+
|
| 1174 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 1175 |
+
Software shall not be used to promote, endorse or advertise any
|
| 1176 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 1177 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 1178 |
+
permission.
|
| 1179 |
+
|
| 1180 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 1181 |
+
must be distributed entirely under this license, and must not be
|
| 1182 |
+
distributed under any other license. The requirement for fonts to
|
| 1183 |
+
remain under this license does not apply to any document created
|
| 1184 |
+
using the Font Software.
|
| 1185 |
+
|
| 1186 |
+
TERMINATION
|
| 1187 |
+
This license becomes null and void if any of the above conditions are
|
| 1188 |
+
not met.
|
| 1189 |
+
|
| 1190 |
+
DISCLAIMER
|
| 1191 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 1192 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 1193 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 1194 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 1195 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 1196 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 1197 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 1198 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 1199 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 1200 |
+
|
| 1201 |
+
Name: Yorick Colormaps
|
| 1202 |
+
Files: lib/matplotlib/_cm.py
|
| 1203 |
+
Description: Gist/Yorick colormaps
|
| 1204 |
+
License:
|
| 1205 |
+
BSD-style license for gist/yorick colormaps.
|
| 1206 |
+
|
| 1207 |
+
Copyright:
|
| 1208 |
+
|
| 1209 |
+
Copyright (c) 1996. The Regents of the University of California.
|
| 1210 |
+
All rights reserved.
|
| 1211 |
+
|
| 1212 |
+
Permission to use, copy, modify, and distribute this software for any
|
| 1213 |
+
purpose without fee is hereby granted, provided that this entire
|
| 1214 |
+
notice is included in all copies of any software which is or includes
|
| 1215 |
+
a copy or modification of this software and in all copies of the
|
| 1216 |
+
supporting documentation for such software.
|
| 1217 |
+
|
| 1218 |
+
This work was produced at the University of California, Lawrence
|
| 1219 |
+
Livermore National Laboratory under contract no. W-7405-ENG-48 between
|
| 1220 |
+
the U.S. Department of Energy and The Regents of the University of
|
| 1221 |
+
California for the operation of UC LLNL.
|
| 1222 |
+
|
| 1223 |
+
|
| 1224 |
+
DISCLAIMER
|
| 1225 |
+
|
| 1226 |
+
This software was prepared as an account of work sponsored by an
|
| 1227 |
+
agency of the United States Government. Neither the United States
|
| 1228 |
+
Government nor the University of California nor any of their
|
| 1229 |
+
employees, makes any warranty, express or implied, or assumes any
|
| 1230 |
+
liability or responsibility for the accuracy, completeness, or
|
| 1231 |
+
usefulness of any information, apparatus, product, or process
|
| 1232 |
+
disclosed, or represents that its use would not infringe
|
| 1233 |
+
privately-owned rights. Reference herein to any specific commercial
|
| 1234 |
+
products, process, or service by trade name, trademark, manufacturer,
|
| 1235 |
+
or otherwise, does not necessarily constitute or imply its
|
| 1236 |
+
endorsement, recommendation, or favoring by the United States
|
| 1237 |
+
Government or the University of California. The views and opinions of
|
| 1238 |
+
authors expressed herein do not necessarily state or reflect those of
|
| 1239 |
+
the United States Government or the University of California, and
|
| 1240 |
+
shall not be used for advertising or product endorsement purposes.
|
| 1241 |
+
|
| 1242 |
+
|
| 1243 |
+
AUTHOR
|
| 1244 |
+
|
| 1245 |
+
David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated
|
| 1246 |
+
the Yorick parser. The routines in Math are from LAPACK and FFTPACK;
|
| 1247 |
+
MathC contains C translations by David H. Munro. The algorithms for
|
| 1248 |
+
Yorick's random number generator and several special functions in
|
| 1249 |
+
Yorick/include were taken from Numerical Recipes by Press, et. al.,
|
| 1250 |
+
although the Yorick implementations are unrelated to those in
|
| 1251 |
+
Numerical Recipes. A small amount of code in Gist was adapted from
|
| 1252 |
+
the X11R4 release, copyright M.I.T. -- the complete copyright notice
|
| 1253 |
+
may be found in the (unused) file Gist/host.c.
|
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/METADATA
ADDED
|
@@ -0,0 +1,1366 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.1
|
| 2 |
+
Name: matplotlib
|
| 3 |
+
Version: 3.11.2
|
| 4 |
+
Summary: Python plotting package
|
| 5 |
+
Author: John D. Hunter, Michael Droettboom
|
| 6 |
+
Author-Email: Unknown <matplotlib-users@python.org>
|
| 7 |
+
License: License agreement for matplotlib versions 1.3.0 and later
|
| 8 |
+
=========================================================
|
| 9 |
+
|
| 10 |
+
1. This LICENSE AGREEMENT is between the Matplotlib Development Team
|
| 11 |
+
("MDT"), and the Individual or Organization ("Licensee") accessing and
|
| 12 |
+
otherwise using matplotlib software in source or binary form and its
|
| 13 |
+
associated documentation.
|
| 14 |
+
|
| 15 |
+
2. Subject to the terms and conditions of this License Agreement, MDT
|
| 16 |
+
hereby grants Licensee a nonexclusive, royalty-free, world-wide license
|
| 17 |
+
to reproduce, analyze, test, perform and/or display publicly, prepare
|
| 18 |
+
derivative works, distribute, and otherwise use matplotlib
|
| 19 |
+
alone or in any derivative version, provided, however, that MDT's
|
| 20 |
+
License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
|
| 21 |
+
2012- Matplotlib Development Team; All Rights Reserved" are retained in
|
| 22 |
+
matplotlib alone or in any derivative version prepared by
|
| 23 |
+
Licensee.
|
| 24 |
+
|
| 25 |
+
3. In the event Licensee prepares a derivative work that is based on or
|
| 26 |
+
incorporates matplotlib or any part thereof, and wants to
|
| 27 |
+
make the derivative work available to others as provided herein, then
|
| 28 |
+
Licensee hereby agrees to include in any such work a brief summary of
|
| 29 |
+
the changes made to matplotlib .
|
| 30 |
+
|
| 31 |
+
4. MDT is making matplotlib available to Licensee on an "AS
|
| 32 |
+
IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
| 33 |
+
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
|
| 34 |
+
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
| 35 |
+
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
|
| 36 |
+
WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
| 37 |
+
|
| 38 |
+
5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
|
| 39 |
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
|
| 40 |
+
LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
|
| 41 |
+
MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
|
| 42 |
+
THE POSSIBILITY THEREOF.
|
| 43 |
+
|
| 44 |
+
6. This License Agreement will automatically terminate upon a material
|
| 45 |
+
breach of its terms and conditions.
|
| 46 |
+
|
| 47 |
+
7. Nothing in this License Agreement shall be deemed to create any
|
| 48 |
+
relationship of agency, partnership, or joint venture between MDT and
|
| 49 |
+
Licensee. This License Agreement does not grant permission to use MDT
|
| 50 |
+
trademarks or trade name in a trademark sense to endorse or promote
|
| 51 |
+
products or services of Licensee, or any third party.
|
| 52 |
+
|
| 53 |
+
8. By copying, installing or otherwise using matplotlib ,
|
| 54 |
+
Licensee agrees to be bound by the terms and conditions of this License
|
| 55 |
+
Agreement.
|
| 56 |
+
|
| 57 |
+
License agreement for matplotlib versions prior to 1.3.0
|
| 58 |
+
========================================================
|
| 59 |
+
|
| 60 |
+
1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
|
| 61 |
+
Individual or Organization ("Licensee") accessing and otherwise using
|
| 62 |
+
matplotlib software in source or binary form and its associated
|
| 63 |
+
documentation.
|
| 64 |
+
|
| 65 |
+
2. Subject to the terms and conditions of this License Agreement, JDH
|
| 66 |
+
hereby grants Licensee a nonexclusive, royalty-free, world-wide license
|
| 67 |
+
to reproduce, analyze, test, perform and/or display publicly, prepare
|
| 68 |
+
derivative works, distribute, and otherwise use matplotlib
|
| 69 |
+
alone or in any derivative version, provided, however, that JDH's
|
| 70 |
+
License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
|
| 71 |
+
2002-2011 John D. Hunter; All Rights Reserved" are retained in
|
| 72 |
+
matplotlib alone or in any derivative version prepared by
|
| 73 |
+
Licensee.
|
| 74 |
+
|
| 75 |
+
3. In the event Licensee prepares a derivative work that is based on or
|
| 76 |
+
incorporates matplotlib or any part thereof, and wants to
|
| 77 |
+
make the derivative work available to others as provided herein, then
|
| 78 |
+
Licensee hereby agrees to include in any such work a brief summary of
|
| 79 |
+
the changes made to matplotlib.
|
| 80 |
+
|
| 81 |
+
4. JDH is making matplotlib available to Licensee on an "AS
|
| 82 |
+
IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
| 83 |
+
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
|
| 84 |
+
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
| 85 |
+
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
|
| 86 |
+
WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
| 87 |
+
|
| 88 |
+
5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
|
| 89 |
+
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
|
| 90 |
+
LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
|
| 91 |
+
MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
|
| 92 |
+
THE POSSIBILITY THEREOF.
|
| 93 |
+
|
| 94 |
+
6. This License Agreement will automatically terminate upon a material
|
| 95 |
+
breach of its terms and conditions.
|
| 96 |
+
|
| 97 |
+
7. Nothing in this License Agreement shall be deemed to create any
|
| 98 |
+
relationship of agency, partnership, or joint venture between JDH and
|
| 99 |
+
Licensee. This License Agreement does not grant permission to use JDH
|
| 100 |
+
trademarks or trade name in a trademark sense to endorse or promote
|
| 101 |
+
products or services of Licensee, or any third party.
|
| 102 |
+
|
| 103 |
+
8. By copying, installing or otherwise using matplotlib,
|
| 104 |
+
Licensee agrees to be bound by the terms and conditions of this License
|
| 105 |
+
Agreement.
|
| 106 |
+
----
|
| 107 |
+
|
| 108 |
+
This binary distrubution of Matplotlib can also bundle the following software
|
| 109 |
+
(depending on the build):
|
| 110 |
+
|
| 111 |
+
Name: AMS Fonts
|
| 112 |
+
Files: matplotlib/tests/cmr10.pfb
|
| 113 |
+
Description: Type-1 version of one of Knuth's Computer Modern fonts
|
| 114 |
+
License: OFL-1.1
|
| 115 |
+
The cmr10.pfb file is a Type-1 version of one of Knuth's Computer Modern fonts.
|
| 116 |
+
It is included here as test data only, but the following license applies.
|
| 117 |
+
|
| 118 |
+
Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org).
|
| 119 |
+
All Rights Reserved.
|
| 120 |
+
|
| 121 |
+
"cmb10" is a Reserved Font Name for this Font Software.
|
| 122 |
+
"cmbsy10" is a Reserved Font Name for this Font Software.
|
| 123 |
+
"cmbsy5" is a Reserved Font Name for this Font Software.
|
| 124 |
+
"cmbsy6" is a Reserved Font Name for this Font Software.
|
| 125 |
+
"cmbsy7" is a Reserved Font Name for this Font Software.
|
| 126 |
+
"cmbsy8" is a Reserved Font Name for this Font Software.
|
| 127 |
+
"cmbsy9" is a Reserved Font Name for this Font Software.
|
| 128 |
+
"cmbx10" is a Reserved Font Name for this Font Software.
|
| 129 |
+
"cmbx12" is a Reserved Font Name for this Font Software.
|
| 130 |
+
"cmbx5" is a Reserved Font Name for this Font Software.
|
| 131 |
+
"cmbx6" is a Reserved Font Name for this Font Software.
|
| 132 |
+
"cmbx7" is a Reserved Font Name for this Font Software.
|
| 133 |
+
"cmbx8" is a Reserved Font Name for this Font Software.
|
| 134 |
+
"cmbx9" is a Reserved Font Name for this Font Software.
|
| 135 |
+
"cmbxsl10" is a Reserved Font Name for this Font Software.
|
| 136 |
+
"cmbxti10" is a Reserved Font Name for this Font Software.
|
| 137 |
+
"cmcsc10" is a Reserved Font Name for this Font Software.
|
| 138 |
+
"cmcsc8" is a Reserved Font Name for this Font Software.
|
| 139 |
+
"cmcsc9" is a Reserved Font Name for this Font Software.
|
| 140 |
+
"cmdunh10" is a Reserved Font Name for this Font Software.
|
| 141 |
+
"cmex10" is a Reserved Font Name for this Font Software.
|
| 142 |
+
"cmex7" is a Reserved Font Name for this Font Software.
|
| 143 |
+
"cmex8" is a Reserved Font Name for this Font Software.
|
| 144 |
+
"cmex9" is a Reserved Font Name for this Font Software.
|
| 145 |
+
"cmff10" is a Reserved Font Name for this Font Software.
|
| 146 |
+
"cmfi10" is a Reserved Font Name for this Font Software.
|
| 147 |
+
"cmfib8" is a Reserved Font Name for this Font Software.
|
| 148 |
+
"cminch" is a Reserved Font Name for this Font Software.
|
| 149 |
+
"cmitt10" is a Reserved Font Name for this Font Software.
|
| 150 |
+
"cmmi10" is a Reserved Font Name for this Font Software.
|
| 151 |
+
"cmmi12" is a Reserved Font Name for this Font Software.
|
| 152 |
+
"cmmi5" is a Reserved Font Name for this Font Software.
|
| 153 |
+
"cmmi6" is a Reserved Font Name for this Font Software.
|
| 154 |
+
"cmmi7" is a Reserved Font Name for this Font Software.
|
| 155 |
+
"cmmi8" is a Reserved Font Name for this Font Software.
|
| 156 |
+
"cmmi9" is a Reserved Font Name for this Font Software.
|
| 157 |
+
"cmmib10" is a Reserved Font Name for this Font Software.
|
| 158 |
+
"cmmib5" is a Reserved Font Name for this Font Software.
|
| 159 |
+
"cmmib6" is a Reserved Font Name for this Font Software.
|
| 160 |
+
"cmmib7" is a Reserved Font Name for this Font Software.
|
| 161 |
+
"cmmib8" is a Reserved Font Name for this Font Software.
|
| 162 |
+
"cmmib9" is a Reserved Font Name for this Font Software.
|
| 163 |
+
"cmr10" is a Reserved Font Name for this Font Software.
|
| 164 |
+
"cmr12" is a Reserved Font Name for this Font Software.
|
| 165 |
+
"cmr17" is a Reserved Font Name for this Font Software.
|
| 166 |
+
"cmr5" is a Reserved Font Name for this Font Software.
|
| 167 |
+
"cmr6" is a Reserved Font Name for this Font Software.
|
| 168 |
+
"cmr7" is a Reserved Font Name for this Font Software.
|
| 169 |
+
"cmr8" is a Reserved Font Name for this Font Software.
|
| 170 |
+
"cmr9" is a Reserved Font Name for this Font Software.
|
| 171 |
+
"cmsl10" is a Reserved Font Name for this Font Software.
|
| 172 |
+
"cmsl12" is a Reserved Font Name for this Font Software.
|
| 173 |
+
"cmsl8" is a Reserved Font Name for this Font Software.
|
| 174 |
+
"cmsl9" is a Reserved Font Name for this Font Software.
|
| 175 |
+
"cmsltt10" is a Reserved Font Name for this Font Software.
|
| 176 |
+
"cmss10" is a Reserved Font Name for this Font Software.
|
| 177 |
+
"cmss12" is a Reserved Font Name for this Font Software.
|
| 178 |
+
"cmss17" is a Reserved Font Name for this Font Software.
|
| 179 |
+
"cmss8" is a Reserved Font Name for this Font Software.
|
| 180 |
+
"cmss9" is a Reserved Font Name for this Font Software.
|
| 181 |
+
"cmssbx10" is a Reserved Font Name for this Font Software.
|
| 182 |
+
"cmssdc10" is a Reserved Font Name for this Font Software.
|
| 183 |
+
"cmssi10" is a Reserved Font Name for this Font Software.
|
| 184 |
+
"cmssi12" is a Reserved Font Name for this Font Software.
|
| 185 |
+
"cmssi17" is a Reserved Font Name for this Font Software.
|
| 186 |
+
"cmssi8" is a Reserved Font Name for this Font Software.
|
| 187 |
+
"cmssi9" is a Reserved Font Name for this Font Software.
|
| 188 |
+
"cmssq8" is a Reserved Font Name for this Font Software.
|
| 189 |
+
"cmssqi8" is a Reserved Font Name for this Font Software.
|
| 190 |
+
"cmsy10" is a Reserved Font Name for this Font Software.
|
| 191 |
+
"cmsy5" is a Reserved Font Name for this Font Software.
|
| 192 |
+
"cmsy6" is a Reserved Font Name for this Font Software.
|
| 193 |
+
"cmsy7" is a Reserved Font Name for this Font Software.
|
| 194 |
+
"cmsy8" is a Reserved Font Name for this Font Software.
|
| 195 |
+
"cmsy9" is a Reserved Font Name for this Font Software.
|
| 196 |
+
"cmtcsc10" is a Reserved Font Name for this Font Software.
|
| 197 |
+
"cmtex10" is a Reserved Font Name for this Font Software.
|
| 198 |
+
"cmtex8" is a Reserved Font Name for this Font Software.
|
| 199 |
+
"cmtex9" is a Reserved Font Name for this Font Software.
|
| 200 |
+
"cmti10" is a Reserved Font Name for this Font Software.
|
| 201 |
+
"cmti12" is a Reserved Font Name for this Font Software.
|
| 202 |
+
"cmti7" is a Reserved Font Name for this Font Software.
|
| 203 |
+
"cmti8" is a Reserved Font Name for this Font Software.
|
| 204 |
+
"cmti9" is a Reserved Font Name for this Font Software.
|
| 205 |
+
"cmtt10" is a Reserved Font Name for this Font Software.
|
| 206 |
+
"cmtt12" is a Reserved Font Name for this Font Software.
|
| 207 |
+
"cmtt8" is a Reserved Font Name for this Font Software.
|
| 208 |
+
"cmtt9" is a Reserved Font Name for this Font Software.
|
| 209 |
+
"cmu10" is a Reserved Font Name for this Font Software.
|
| 210 |
+
"cmvtt10" is a Reserved Font Name for this Font Software.
|
| 211 |
+
"euex10" is a Reserved Font Name for this Font Software.
|
| 212 |
+
"euex7" is a Reserved Font Name for this Font Software.
|
| 213 |
+
"euex8" is a Reserved Font Name for this Font Software.
|
| 214 |
+
"euex9" is a Reserved Font Name for this Font Software.
|
| 215 |
+
"eufb10" is a Reserved Font Name for this Font Software.
|
| 216 |
+
"eufb5" is a Reserved Font Name for this Font Software.
|
| 217 |
+
"eufb7" is a Reserved Font Name for this Font Software.
|
| 218 |
+
"eufm10" is a Reserved Font Name for this Font Software.
|
| 219 |
+
"eufm5" is a Reserved Font Name for this Font Software.
|
| 220 |
+
"eufm7" is a Reserved Font Name for this Font Software.
|
| 221 |
+
"eurb10" is a Reserved Font Name for this Font Software.
|
| 222 |
+
"eurb5" is a Reserved Font Name for this Font Software.
|
| 223 |
+
"eurb7" is a Reserved Font Name for this Font Software.
|
| 224 |
+
"eurm10" is a Reserved Font Name for this Font Software.
|
| 225 |
+
"eurm5" is a Reserved Font Name for this Font Software.
|
| 226 |
+
"eurm7" is a Reserved Font Name for this Font Software.
|
| 227 |
+
"eusb10" is a Reserved Font Name for this Font Software.
|
| 228 |
+
"eusb5" is a Reserved Font Name for this Font Software.
|
| 229 |
+
"eusb7" is a Reserved Font Name for this Font Software.
|
| 230 |
+
"eusm10" is a Reserved Font Name for this Font Software.
|
| 231 |
+
"eusm5" is a Reserved Font Name for this Font Software.
|
| 232 |
+
"eusm7" is a Reserved Font Name for this Font Software.
|
| 233 |
+
"lasy10" is a Reserved Font Name for this Font Software.
|
| 234 |
+
"lasy5" is a Reserved Font Name for this Font Software.
|
| 235 |
+
"lasy6" is a Reserved Font Name for this Font Software.
|
| 236 |
+
"lasy7" is a Reserved Font Name for this Font Software.
|
| 237 |
+
"lasy8" is a Reserved Font Name for this Font Software.
|
| 238 |
+
"lasy9" is a Reserved Font Name for this Font Software.
|
| 239 |
+
"lasyb10" is a Reserved Font Name for this Font Software.
|
| 240 |
+
"lcircle1" is a Reserved Font Name for this Font Software.
|
| 241 |
+
"lcirclew" is a Reserved Font Name for this Font Software.
|
| 242 |
+
"lcmss8" is a Reserved Font Name for this Font Software.
|
| 243 |
+
"lcmssb8" is a Reserved Font Name for this Font Software.
|
| 244 |
+
"lcmssi8" is a Reserved Font Name for this Font Software.
|
| 245 |
+
"line10" is a Reserved Font Name for this Font Software.
|
| 246 |
+
"linew10" is a Reserved Font Name for this Font Software.
|
| 247 |
+
"msam10" is a Reserved Font Name for this Font Software.
|
| 248 |
+
"msam5" is a Reserved Font Name for this Font Software.
|
| 249 |
+
"msam6" is a Reserved Font Name for this Font Software.
|
| 250 |
+
"msam7" is a Reserved Font Name for this Font Software.
|
| 251 |
+
"msam8" is a Reserved Font Name for this Font Software.
|
| 252 |
+
"msam9" is a Reserved Font Name for this Font Software.
|
| 253 |
+
"msbm10" is a Reserved Font Name for this Font Software.
|
| 254 |
+
"msbm5" is a Reserved Font Name for this Font Software.
|
| 255 |
+
"msbm6" is a Reserved Font Name for this Font Software.
|
| 256 |
+
"msbm7" is a Reserved Font Name for this Font Software.
|
| 257 |
+
"msbm8" is a Reserved Font Name for this Font Software.
|
| 258 |
+
"msbm9" is a Reserved Font Name for this Font Software.
|
| 259 |
+
"wncyb10" is a Reserved Font Name for this Font Software.
|
| 260 |
+
"wncyi10" is a Reserved Font Name for this Font Software.
|
| 261 |
+
"wncyr10" is a Reserved Font Name for this Font Software.
|
| 262 |
+
"wncysc10" is a Reserved Font Name for this Font Software.
|
| 263 |
+
"wncyss10" is a Reserved Font Name for this Font Software.
|
| 264 |
+
|
| 265 |
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
| 266 |
+
This license is copied below, and is also available with a FAQ at:
|
| 267 |
+
http://scripts.sil.org/OFL
|
| 268 |
+
|
| 269 |
+
-----------------------------------------------------------
|
| 270 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 271 |
+
-----------------------------------------------------------
|
| 272 |
+
|
| 273 |
+
PREAMBLE
|
| 274 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 275 |
+
development of collaborative font projects, to support the font creation
|
| 276 |
+
efforts of academic and linguistic communities, and to provide a free and
|
| 277 |
+
open framework in which fonts may be shared and improved in partnership
|
| 278 |
+
with others.
|
| 279 |
+
|
| 280 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 281 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 282 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 283 |
+
redistributed and/or sold with any software provided that any reserved
|
| 284 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 285 |
+
however, cannot be released under any other type of license. The
|
| 286 |
+
requirement for fonts to remain under this license does not apply
|
| 287 |
+
to any document created using the fonts or their derivatives.
|
| 288 |
+
|
| 289 |
+
DEFINITIONS
|
| 290 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 291 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 292 |
+
include source files, build scripts and documentation.
|
| 293 |
+
|
| 294 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 295 |
+
copyright statement(s).
|
| 296 |
+
|
| 297 |
+
"Original Version" refers to the collection of Font Software components as
|
| 298 |
+
distributed by the Copyright Holder(s).
|
| 299 |
+
|
| 300 |
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
| 301 |
+
or substituting -- in part or in whole -- any of the components of the
|
| 302 |
+
Original Version, by changing formats or by porting the Font Software to a
|
| 303 |
+
new environment.
|
| 304 |
+
|
| 305 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 306 |
+
writer or other person who contributed to the Font Software.
|
| 307 |
+
|
| 308 |
+
PERMISSION & CONDITIONS
|
| 309 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 310 |
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
| 311 |
+
redistribute, and sell modified and unmodified copies of the Font
|
| 312 |
+
Software, subject to the following conditions:
|
| 313 |
+
|
| 314 |
+
1) Neither the Font Software nor any of its individual components,
|
| 315 |
+
in Original or Modified Versions, may be sold by itself.
|
| 316 |
+
|
| 317 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 318 |
+
redistributed and/or sold with any software, provided that each copy
|
| 319 |
+
contains the above copyright notice and this license. These can be
|
| 320 |
+
included either as stand-alone text files, human-readable headers or
|
| 321 |
+
in the appropriate machine-readable metadata fields within text or
|
| 322 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 323 |
+
|
| 324 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 325 |
+
Name(s) unless explicit written permission is granted by the corresponding
|
| 326 |
+
Copyright Holder. This restriction only applies to the primary font name as
|
| 327 |
+
presented to the users.
|
| 328 |
+
|
| 329 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 330 |
+
Software shall not be used to promote, endorse or advertise any
|
| 331 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 332 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 333 |
+
permission.
|
| 334 |
+
|
| 335 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 336 |
+
must be distributed entirely under this license, and must not be
|
| 337 |
+
distributed under any other license. The requirement for fonts to
|
| 338 |
+
remain under this license does not apply to any document created
|
| 339 |
+
using the Font Software.
|
| 340 |
+
|
| 341 |
+
TERMINATION
|
| 342 |
+
This license becomes null and void if any of the above conditions are
|
| 343 |
+
not met.
|
| 344 |
+
|
| 345 |
+
DISCLAIMER
|
| 346 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 347 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 348 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 349 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 350 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 351 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 352 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 353 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 354 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 355 |
+
|
| 356 |
+
|
| 357 |
+
|
| 358 |
+
Name: BaKoMa Fonts
|
| 359 |
+
Files: matplotlib/mpl-data/fonts/ttf/cm*.ttf matplotlib/mpl-data/fonts/afm/cm*.afm
|
| 360 |
+
Description: Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
|
| 361 |
+
License: BaKoMa Fonts Licence
|
| 362 |
+
BaKoMa Fonts Licence
|
| 363 |
+
--------------------
|
| 364 |
+
|
| 365 |
+
This licence covers two font packs (known as BaKoMa Fonts Collection,
|
| 366 |
+
which is available at `CTAN:fonts/cm/ps-type1/bakoma/'):
|
| 367 |
+
|
| 368 |
+
1) BaKoMa-CM (1.1/12-Nov-94)
|
| 369 |
+
Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
|
| 370 |
+
|
| 371 |
+
2) BaKoMa-AMS (1.2/19-Jan-95)
|
| 372 |
+
AMS TeX fonts in PostScript Type 1 and TrueType font formats.
|
| 373 |
+
|
| 374 |
+
Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved.
|
| 375 |
+
|
| 376 |
+
Permission to copy and distribute these fonts for any purpose is
|
| 377 |
+
hereby granted without fee, provided that the above copyright notice,
|
| 378 |
+
author statement and this permission notice appear in all copies of
|
| 379 |
+
these fonts and related documentation.
|
| 380 |
+
|
| 381 |
+
Permission to modify and distribute modified fonts for any purpose is
|
| 382 |
+
hereby granted without fee, provided that the copyright notice,
|
| 383 |
+
author statement, this permission notice and location of original
|
| 384 |
+
fonts (http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma)
|
| 385 |
+
appear in all copies of modified fonts and related documentation.
|
| 386 |
+
|
| 387 |
+
Permission to use these fonts (embedding into PostScript, PDF, SVG
|
| 388 |
+
and printing by using any software) is hereby granted without fee.
|
| 389 |
+
It is not required to provide any notices about using these fonts.
|
| 390 |
+
|
| 391 |
+
Basil K. Malyshev
|
| 392 |
+
INSTITUTE FOR HIGH ENERGY PHYSICS
|
| 393 |
+
IHEP, OMVT
|
| 394 |
+
Moscow Region
|
| 395 |
+
142281 PROTVINO
|
| 396 |
+
RUSSIA
|
| 397 |
+
|
| 398 |
+
E-Mail: bakoma@mail.ru
|
| 399 |
+
or malyshev@mail.ihep.ru
|
| 400 |
+
|
| 401 |
+
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
Name: ColorBrewer Color Schemes
|
| 405 |
+
Files: lib/matplotlib/_cm.py
|
| 406 |
+
Description: Color schemes from ColorBrewer
|
| 407 |
+
License: Apache-2.0
|
| 408 |
+
Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes
|
| 409 |
+
|
| 410 |
+
Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University.
|
| 411 |
+
|
| 412 |
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
|
| 413 |
+
You may obtain a copy of the License at
|
| 414 |
+
|
| 415 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 416 |
+
|
| 417 |
+
Unless required by applicable law or agreed to in writing, software distributed
|
| 418 |
+
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
| 419 |
+
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
| 420 |
+
specific language governing permissions and limitations under the License.
|
| 421 |
+
|
| 422 |
+
|
| 423 |
+
Name: Courier 10
|
| 424 |
+
Files: matplotlib/tests/Courier10PitchBT-Bold.pfb
|
| 425 |
+
Description: Courier 10 font, used in tests.
|
| 426 |
+
License: Bitstream-Charter
|
| 427 |
+
The Courier10PitchBT-Bold.pfb file is a Type-1 version of
|
| 428 |
+
Courier 10 Pitch BT Bold by Bitstream, obtained from
|
| 429 |
+
<https://ctan.org/tex-archive/fonts/courierten>. It is included
|
| 430 |
+
here as test data only, but the following license applies.
|
| 431 |
+
|
| 432 |
+
|
| 433 |
+
(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
|
| 434 |
+
|
| 435 |
+
You are hereby granted permission under all Bitstream propriety rights
|
| 436 |
+
to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
|
| 437 |
+
Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
|
| 438 |
+
for any purpose and without restriction; provided, that this notice is
|
| 439 |
+
left intact on all copies of such fonts and that Bitstream's trademark
|
| 440 |
+
is acknowledged as shown below on all unmodified copies of the 4 Charter
|
| 441 |
+
Type 1 fonts.
|
| 442 |
+
|
| 443 |
+
BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
|
| 444 |
+
|
| 445 |
+
|
| 446 |
+
Name: FreeType
|
| 447 |
+
Files: matplotlib/ft2font.*.so
|
| 448 |
+
Description: Font rendering library
|
| 449 |
+
License: FTL OR GPL-2.0-or-later
|
| 450 |
+
The FreeType 2 font engine is copyrighted work and cannot be used
|
| 451 |
+
legally without a software license. In order to make this project
|
| 452 |
+
usable to a vast majority of developers, we distribute it under two
|
| 453 |
+
mutually exclusive open-source licenses.
|
| 454 |
+
|
| 455 |
+
This means that *you* must choose *one* of the two licenses described
|
| 456 |
+
below, then obey all its terms and conditions when using FreeType 2 in
|
| 457 |
+
any of your projects or products.
|
| 458 |
+
|
| 459 |
+
- The FreeType License, found in the file `docs/FTL.TXT`, which is
|
| 460 |
+
similar to the original BSD license *with* an advertising clause
|
| 461 |
+
that forces you to explicitly cite the FreeType project in your
|
| 462 |
+
product's documentation. All details are in the license file.
|
| 463 |
+
This license is suited to products which don't use the GNU General
|
| 464 |
+
Public License.
|
| 465 |
+
|
| 466 |
+
Note that this license is compatible to the GNU General Public
|
| 467 |
+
License version 3, but not version 2.
|
| 468 |
+
|
| 469 |
+
- The GNU General Public License version 2, found in
|
| 470 |
+
`docs/GPLv2.TXT` (any later version can be used also), for
|
| 471 |
+
programs which already use the GPL. Note that the FTL is
|
| 472 |
+
incompatible with GPLv2 due to its advertisement clause.
|
| 473 |
+
|
| 474 |
+
The contributed BDF and PCF drivers come with a license similar to
|
| 475 |
+
that of the X Window System. It is compatible to the above two
|
| 476 |
+
licenses (see files `src/bdf/README` and `src/pcf/README`). The same
|
| 477 |
+
holds for the source code files `src/base/fthash.c` and
|
| 478 |
+
`include/freetype/internal/fthash.h`; they were part of the BDF driver
|
| 479 |
+
in earlier FreeType versions.
|
| 480 |
+
|
| 481 |
+
The gzip module uses the zlib license (see `src/gzip/zlib.h`) which
|
| 482 |
+
too is compatible to the above two licenses.
|
| 483 |
+
|
| 484 |
+
The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code
|
| 485 |
+
taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses
|
| 486 |
+
the 'Old MIT' license, compatible to the above two licenses.
|
| 487 |
+
|
| 488 |
+
The MD5 checksum support (only used for debugging in development
|
| 489 |
+
builds) is in the public domain.
|
| 490 |
+
|
| 491 |
+
|
| 492 |
+
Name: HarfBuzz
|
| 493 |
+
Files: matplotlib/ft2font.*.so
|
| 494 |
+
Description: Text shaping library
|
| 495 |
+
License: MIT-Modern-Variant
|
| 496 |
+
HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
|
| 497 |
+
For parts of HarfBuzz that are licensed under different licenses see individual
|
| 498 |
+
files names COPYING in subdirectories where applicable.
|
| 499 |
+
|
| 500 |
+
Copyright © 2010-2022 Google, Inc.
|
| 501 |
+
Copyright © 2015-2020 Ebrahim Byagowi
|
| 502 |
+
Copyright © 2019,2020 Facebook, Inc.
|
| 503 |
+
Copyright © 2012,2015 Mozilla Foundation
|
| 504 |
+
Copyright © 2011 Codethink Limited
|
| 505 |
+
Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
|
| 506 |
+
Copyright © 2009 Keith Stribley
|
| 507 |
+
Copyright © 2011 Martin Hosken and SIL International
|
| 508 |
+
Copyright © 2007 Chris Wilson
|
| 509 |
+
Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod
|
| 510 |
+
Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc.
|
| 511 |
+
Copyright © 1998-2005 David Turner and Werner Lemberg
|
| 512 |
+
Copyright © 2016 Igalia S.L.
|
| 513 |
+
Copyright © 2022 Matthias Clasen
|
| 514 |
+
Copyright © 2018,2021 Khaled Hosny
|
| 515 |
+
Copyright © 2018,2019,2020 Adobe, Inc
|
| 516 |
+
Copyright © 2013-2015 Alexei Podtelezhnikov
|
| 517 |
+
|
| 518 |
+
For full copyright notices consult the individual files in the package.
|
| 519 |
+
|
| 520 |
+
|
| 521 |
+
Permission is hereby granted, without written agreement and without
|
| 522 |
+
license or royalty fees, to use, copy, modify, and distribute this
|
| 523 |
+
software and its documentation for any purpose, provided that the
|
| 524 |
+
above copyright notice and the following two paragraphs appear in
|
| 525 |
+
all copies of this software.
|
| 526 |
+
|
| 527 |
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
| 528 |
+
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
| 529 |
+
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
| 530 |
+
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
| 531 |
+
DAMAGE.
|
| 532 |
+
|
| 533 |
+
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
| 534 |
+
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
| 535 |
+
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
| 536 |
+
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
| 537 |
+
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
| 538 |
+
|
| 539 |
+
|
| 540 |
+
Name: JSXTools resize observer
|
| 541 |
+
Files: lib/matplotlib/backends/web_backend/js/mpl.js
|
| 542 |
+
Description: Minimal polyfill for the ResizeObserver API
|
| 543 |
+
License: CC0-1.0
|
| 544 |
+
# CC0 1.0 Universal
|
| 545 |
+
|
| 546 |
+
## Statement of Purpose
|
| 547 |
+
|
| 548 |
+
The laws of most jurisdictions throughout the world automatically confer
|
| 549 |
+
exclusive Copyright and Related Rights (defined below) upon the creator and
|
| 550 |
+
subsequent owner(s) (each and all, an “owner”) of an original work of
|
| 551 |
+
authorship and/or a database (each, a “Work”).
|
| 552 |
+
|
| 553 |
+
Certain owners wish to permanently relinquish those rights to a Work for the
|
| 554 |
+
purpose of contributing to a commons of creative, cultural and scientific works
|
| 555 |
+
(“Commons”) that the public can reliably and without fear of later claims of
|
| 556 |
+
infringement build upon, modify, incorporate in other works, reuse and
|
| 557 |
+
redistribute as freely as possible in any form whatsoever and for any purposes,
|
| 558 |
+
including without limitation commercial purposes. These owners may contribute
|
| 559 |
+
to the Commons to promote the ideal of a free culture and the further
|
| 560 |
+
production of creative, cultural and scientific works, or to gain reputation or
|
| 561 |
+
greater distribution for their Work in part through the use and efforts of
|
| 562 |
+
others.
|
| 563 |
+
|
| 564 |
+
For these and/or other purposes and motivations, and without any expectation of
|
| 565 |
+
additional consideration or compensation, the person associating CC0 with a
|
| 566 |
+
Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
|
| 567 |
+
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
|
| 568 |
+
publicly distribute the Work under its terms, with knowledge of his or her
|
| 569 |
+
Copyright and Related Rights in the Work and the meaning and intended legal
|
| 570 |
+
effect of CC0 on those rights.
|
| 571 |
+
|
| 572 |
+
1. Copyright and Related Rights. A Work made available under CC0 may be
|
| 573 |
+
protected by copyright and related or neighboring rights (“Copyright and
|
| 574 |
+
Related Rights”). Copyright and Related Rights include, but are not limited
|
| 575 |
+
to, the following:
|
| 576 |
+
1. the right to reproduce, adapt, distribute, perform, display, communicate,
|
| 577 |
+
and translate a Work;
|
| 578 |
+
2. moral rights retained by the original author(s) and/or performer(s);
|
| 579 |
+
3. publicity and privacy rights pertaining to a person’s image or likeness
|
| 580 |
+
depicted in a Work;
|
| 581 |
+
4. rights protecting against unfair competition in regards to a Work,
|
| 582 |
+
subject to the limitations in paragraph 4(i), below;
|
| 583 |
+
5. rights protecting the extraction, dissemination, use and reuse of data in
|
| 584 |
+
a Work;
|
| 585 |
+
6. database rights (such as those arising under Directive 96/9/EC of the
|
| 586 |
+
European Parliament and of the Council of 11 March 1996 on the legal
|
| 587 |
+
protection of databases, and under any national implementation thereof,
|
| 588 |
+
including any amended or successor version of such directive); and
|
| 589 |
+
7. other similar, equivalent or corresponding rights throughout the world
|
| 590 |
+
based on applicable law or treaty, and any national implementations
|
| 591 |
+
thereof.
|
| 592 |
+
|
| 593 |
+
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
| 594 |
+
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
| 595 |
+
unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
|
| 596 |
+
and Related Rights and associated claims and causes of action, whether now
|
| 597 |
+
known or unknown (including existing as well as future claims and causes of
|
| 598 |
+
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
| 599 |
+
duration provided by applicable law or treaty (including future time
|
| 600 |
+
extensions), (iii) in any current or future medium and for any number of
|
| 601 |
+
copies, and (iv) for any purpose whatsoever, including without limitation
|
| 602 |
+
commercial, advertising or promotional purposes (the “Waiver”). Affirmer
|
| 603 |
+
makes the Waiver for the benefit of each member of the public at large and
|
| 604 |
+
to the detriment of Affirmer’s heirs and successors, fully intending that
|
| 605 |
+
such Waiver shall not be subject to revocation, rescission, cancellation,
|
| 606 |
+
termination, or any other legal or equitable action to disrupt the quiet
|
| 607 |
+
enjoyment of the Work by the public as contemplated by Affirmer’s express
|
| 608 |
+
Statement of Purpose.
|
| 609 |
+
|
| 610 |
+
3. Public License Fallback. Should any part of the Waiver for any reason be
|
| 611 |
+
judged legally invalid or ineffective under applicable law, then the Waiver
|
| 612 |
+
shall be preserved to the maximum extent permitted taking into account
|
| 613 |
+
Affirmer’s express Statement of Purpose. In addition, to the extent the
|
| 614 |
+
Waiver is so judged Affirmer hereby grants to each affected person a
|
| 615 |
+
royalty-free, non transferable, non sublicensable, non exclusive,
|
| 616 |
+
irrevocable and unconditional license to exercise Affirmer’s Copyright and
|
| 617 |
+
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
| 618 |
+
maximum duration provided by applicable law or treaty (including future time
|
| 619 |
+
extensions), (iii) in any current or future medium and for any number of
|
| 620 |
+
copies, and (iv) for any purpose whatsoever, including without limitation
|
| 621 |
+
commercial, advertising or promotional purposes (the “License”). The License
|
| 622 |
+
shall be deemed effective as of the date CC0 was applied by Affirmer to the
|
| 623 |
+
Work. Should any part of the License for any reason be judged legally
|
| 624 |
+
invalid or ineffective under applicable law, such partial invalidity or
|
| 625 |
+
ineffectiveness shall not invalidate the remainder of the License, and in
|
| 626 |
+
such case Affirmer hereby affirms that he or she will not (i) exercise any
|
| 627 |
+
of his or her remaining Copyright and Related Rights in the Work or (ii)
|
| 628 |
+
assert any associated claims and causes of action with respect to the Work,
|
| 629 |
+
in either case contrary to Affirmer’s express Statement of Purpose.
|
| 630 |
+
|
| 631 |
+
4. Limitations and Disclaimers.
|
| 632 |
+
1. No trademark or patent rights held by Affirmer are waived, abandoned,
|
| 633 |
+
surrendered, licensed or otherwise affected by this document.
|
| 634 |
+
2. Affirmer offers the Work as-is and makes no representations or warranties
|
| 635 |
+
of any kind concerning the Work, express, implied, statutory or
|
| 636 |
+
otherwise, including without limitation warranties of title,
|
| 637 |
+
merchantability, fitness for a particular purpose, non infringement, or
|
| 638 |
+
the absence of latent or other defects, accuracy, or the present or
|
| 639 |
+
absence of errors, whether or not discoverable, all to the greatest
|
| 640 |
+
extent permissible under applicable law.
|
| 641 |
+
3. Affirmer disclaims responsibility for clearing rights of other persons
|
| 642 |
+
that may apply to the Work or any use thereof, including without
|
| 643 |
+
limitation any person’s Copyright and Related Rights in the Work.
|
| 644 |
+
Further, Affirmer disclaims responsibility for obtaining any necessary
|
| 645 |
+
consents, permissions or other rights required for any use of the Work.
|
| 646 |
+
4. Affirmer understands and acknowledges that Creative Commons is not a
|
| 647 |
+
party to this document and has no duty or obligation with respect to this
|
| 648 |
+
CC0 or use of the Work.
|
| 649 |
+
|
| 650 |
+
For more information, please see
|
| 651 |
+
http://creativecommons.org/publicdomain/zero/1.0/.
|
| 652 |
+
|
| 653 |
+
|
| 654 |
+
Name: Last Resort fonts
|
| 655 |
+
Files: matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf
|
| 656 |
+
Description: Last Resort High-Efficiency Font
|
| 657 |
+
License: OFL-1.1
|
| 658 |
+
This Font Software is licensed under the SIL Open Font License,
|
| 659 |
+
Version 1.1.
|
| 660 |
+
|
| 661 |
+
This license is copied below, and is also available with a FAQ at:
|
| 662 |
+
http://scripts.sil.org/OFL
|
| 663 |
+
|
| 664 |
+
-----------------------------------------------------------
|
| 665 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 666 |
+
-----------------------------------------------------------
|
| 667 |
+
|
| 668 |
+
PREAMBLE
|
| 669 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 670 |
+
development of collaborative font projects, to support the font
|
| 671 |
+
creation efforts of academic and linguistic communities, and to
|
| 672 |
+
provide a free and open framework in which fonts may be shared and
|
| 673 |
+
improved in partnership with others.
|
| 674 |
+
|
| 675 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 676 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 677 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 678 |
+
redistributed and/or sold with any software provided that any reserved
|
| 679 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 680 |
+
however, cannot be released under any other type of license. The
|
| 681 |
+
requirement for fonts to remain under this license does not apply to
|
| 682 |
+
any document created using the fonts or their derivatives.
|
| 683 |
+
|
| 684 |
+
DEFINITIONS
|
| 685 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 686 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 687 |
+
include source files, build scripts and documentation.
|
| 688 |
+
|
| 689 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 690 |
+
copyright statement(s).
|
| 691 |
+
|
| 692 |
+
"Original Version" refers to the collection of Font Software
|
| 693 |
+
components as distributed by the Copyright Holder(s).
|
| 694 |
+
|
| 695 |
+
"Modified Version" refers to any derivative made by adding to,
|
| 696 |
+
deleting, or substituting -- in part or in whole -- any of the
|
| 697 |
+
components of the Original Version, by changing formats or by porting
|
| 698 |
+
the Font Software to a new environment.
|
| 699 |
+
|
| 700 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 701 |
+
writer or other person who contributed to the Font Software.
|
| 702 |
+
|
| 703 |
+
PERMISSION & CONDITIONS
|
| 704 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 705 |
+
a copy of the Font Software, to use, study, copy, merge, embed,
|
| 706 |
+
modify, redistribute, and sell modified and unmodified copies of the
|
| 707 |
+
Font Software, subject to the following conditions:
|
| 708 |
+
|
| 709 |
+
1) Neither the Font Software nor any of its individual components, in
|
| 710 |
+
Original or Modified Versions, may be sold by itself.
|
| 711 |
+
|
| 712 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 713 |
+
redistributed and/or sold with any software, provided that each copy
|
| 714 |
+
contains the above copyright notice and this license. These can be
|
| 715 |
+
included either as stand-alone text files, human-readable headers or
|
| 716 |
+
in the appropriate machine-readable metadata fields within text or
|
| 717 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 718 |
+
|
| 719 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 720 |
+
Name(s) unless explicit written permission is granted by the
|
| 721 |
+
corresponding Copyright Holder. This restriction only applies to the
|
| 722 |
+
primary font name as presented to the users.
|
| 723 |
+
|
| 724 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 725 |
+
Software shall not be used to promote, endorse or advertise any
|
| 726 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 727 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 728 |
+
permission.
|
| 729 |
+
|
| 730 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 731 |
+
must be distributed entirely under this license, and must not be
|
| 732 |
+
distributed under any other license. The requirement for fonts to
|
| 733 |
+
remain under this license does not apply to any document created using
|
| 734 |
+
the Font Software.
|
| 735 |
+
|
| 736 |
+
TERMINATION
|
| 737 |
+
This license becomes null and void if any of the above conditions are
|
| 738 |
+
not met.
|
| 739 |
+
|
| 740 |
+
DISCLAIMER
|
| 741 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 742 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 743 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 744 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 745 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 746 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 747 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 748 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 749 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 750 |
+
|
| 751 |
+
SPDX-License-Identifier: OFL-1.1
|
| 752 |
+
|
| 753 |
+
|
| 754 |
+
Name: libraqm
|
| 755 |
+
Files: matplotlib/ft2font.*.so
|
| 756 |
+
Description: Complex text layout library
|
| 757 |
+
License: MIT
|
| 758 |
+
The MIT License (MIT)
|
| 759 |
+
|
| 760 |
+
Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
|
| 761 |
+
Copyright © 2016-2023 Khaled Hosny <khaled@aliftype.com>
|
| 762 |
+
|
| 763 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 764 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 765 |
+
in the Software without restriction, including without limitation the rights
|
| 766 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 767 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 768 |
+
furnished to do so, subject to the following conditions:
|
| 769 |
+
|
| 770 |
+
The above copyright notice and this permission notice shall be included in all
|
| 771 |
+
copies or substantial portions of the Software.
|
| 772 |
+
|
| 773 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 774 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 775 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 776 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 777 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 778 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 779 |
+
SOFTWARE.
|
| 780 |
+
|
| 781 |
+
|
| 782 |
+
Name: QHull
|
| 783 |
+
Files: matplotlib/_qhull.*.so
|
| 784 |
+
Description: Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection
|
| 785 |
+
License: Qhull
|
| 786 |
+
Qhull, Copyright (c) 1993-2020
|
| 787 |
+
|
| 788 |
+
C.B. Barber
|
| 789 |
+
Arlington, MA
|
| 790 |
+
|
| 791 |
+
and
|
| 792 |
+
|
| 793 |
+
The National Science and Technology Research Center for
|
| 794 |
+
Computation and Visualization of Geometric Structures
|
| 795 |
+
(The Geometry Center)
|
| 796 |
+
University of Minnesota
|
| 797 |
+
|
| 798 |
+
email: qhull@qhull.org
|
| 799 |
+
|
| 800 |
+
This software includes Qhull from C.B. Barber and The Geometry Center.
|
| 801 |
+
Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The
|
| 802 |
+
remaining files are copyrighted by C.B. Barber. Qhull is free software
|
| 803 |
+
and may be obtained via http from www.qhull.org. It may be freely copied,
|
| 804 |
+
modified, and redistributed under the following conditions:
|
| 805 |
+
|
| 806 |
+
1. All copyright notices must remain intact in all files.
|
| 807 |
+
|
| 808 |
+
2. A copy of this text file must be distributed along with any copies
|
| 809 |
+
of Qhull that you redistribute; this includes copies that you have
|
| 810 |
+
modified, or copies of programs or other software products that
|
| 811 |
+
include Qhull.
|
| 812 |
+
|
| 813 |
+
3. If you modify Qhull, you must include a notice giving the
|
| 814 |
+
name of the person performing the modification, the date of
|
| 815 |
+
modification, and the reason for such modification.
|
| 816 |
+
|
| 817 |
+
4. When distributing modified versions of Qhull, or other software
|
| 818 |
+
products that include Qhull, you must provide notice that the original
|
| 819 |
+
source code may be obtained as noted above.
|
| 820 |
+
|
| 821 |
+
5. There is no warranty or other guarantee of fitness for Qhull, it is
|
| 822 |
+
provided solely "as is". Bug reports or fixes may be sent to
|
| 823 |
+
qhull_bug@qhull.org; the authors may or may not act on them as
|
| 824 |
+
they desire.
|
| 825 |
+
|
| 826 |
+
|
| 827 |
+
Name: Qt4 Editor
|
| 828 |
+
Files: matplotlib/backends/qt_editor
|
| 829 |
+
Description: Module creating PyQt4 form dialogs/layouts to edit various type of parameters
|
| 830 |
+
License: MIT
|
| 831 |
+
Module creating PyQt4 form dialogs/layouts to edit various type of parameters
|
| 832 |
+
|
| 833 |
+
|
| 834 |
+
formlayout License Agreement (MIT License)
|
| 835 |
+
------------------------------------------
|
| 836 |
+
|
| 837 |
+
Copyright (c) 2009 Pierre Raybaut
|
| 838 |
+
|
| 839 |
+
Permission is hereby granted, free of charge, to any person
|
| 840 |
+
obtaining a copy of this software and associated documentation
|
| 841 |
+
files (the "Software"), to deal in the Software without
|
| 842 |
+
restriction, including without limitation the rights to use,
|
| 843 |
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 844 |
+
copies of the Software, and to permit persons to whom the
|
| 845 |
+
Software is furnished to do so, subject to the following
|
| 846 |
+
conditions:
|
| 847 |
+
|
| 848 |
+
The above copyright notice and this permission notice shall be
|
| 849 |
+
included in all copies or substantial portions of the Software.
|
| 850 |
+
|
| 851 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 852 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
| 853 |
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
| 854 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
| 855 |
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 856 |
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 857 |
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
| 858 |
+
OTHER DEALINGS IN THE SOFTWARE.
|
| 859 |
+
|
| 860 |
+
|
| 861 |
+
Name: SheenBidi
|
| 862 |
+
Files: matplotlib/ft2font.*.so
|
| 863 |
+
Description: Unicode Bidirectional Algorithm implementation
|
| 864 |
+
License: Apache-2.0
|
| 865 |
+
Apache License
|
| 866 |
+
Version 2.0, January 2004
|
| 867 |
+
http://www.apache.org/licenses/
|
| 868 |
+
|
| 869 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 870 |
+
|
| 871 |
+
1. Definitions.
|
| 872 |
+
|
| 873 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 874 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 875 |
+
|
| 876 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 877 |
+
the copyright owner that is granting the License.
|
| 878 |
+
|
| 879 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 880 |
+
other entities that control, are controlled by, or are under common
|
| 881 |
+
control with that entity. For the purposes of this definition,
|
| 882 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 883 |
+
direction or management of such entity, whether by contract or
|
| 884 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 885 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 886 |
+
|
| 887 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 888 |
+
exercising permissions granted by this License.
|
| 889 |
+
|
| 890 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 891 |
+
including but not limited to software source code, documentation
|
| 892 |
+
source, and configuration files.
|
| 893 |
+
|
| 894 |
+
"Object" form shall mean any form resulting from mechanical
|
| 895 |
+
transformation or translation of a Source form, including but
|
| 896 |
+
not limited to compiled object code, generated documentation,
|
| 897 |
+
and conversions to other media types.
|
| 898 |
+
|
| 899 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 900 |
+
Object form, made available under the License, as indicated by a
|
| 901 |
+
copyright notice that is included in or attached to the work
|
| 902 |
+
(an example is provided in the Appendix below).
|
| 903 |
+
|
| 904 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 905 |
+
form, that is based on (or derived from) the Work and for which the
|
| 906 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 907 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 908 |
+
of this License, Derivative Works shall not include works that remain
|
| 909 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 910 |
+
the Work and Derivative Works thereof.
|
| 911 |
+
|
| 912 |
+
"Contribution" shall mean any work of authorship, including
|
| 913 |
+
the original version of the Work and any modifications or additions
|
| 914 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 915 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 916 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 917 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 918 |
+
means any form of electronic, verbal, or written communication sent
|
| 919 |
+
to the Licensor or its representatives, including but not limited to
|
| 920 |
+
communication on electronic mailing lists, source code control systems,
|
| 921 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 922 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 923 |
+
excluding communication that is conspicuously marked or otherwise
|
| 924 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 925 |
+
|
| 926 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 927 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 928 |
+
subsequently incorporated within the Work.
|
| 929 |
+
|
| 930 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 931 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 932 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 933 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 934 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 935 |
+
Work and such Derivative Works in Source or Object form.
|
| 936 |
+
|
| 937 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 938 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 939 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 940 |
+
(except as stated in this section) patent license to make, have made,
|
| 941 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 942 |
+
where such license applies only to those patent claims licensable
|
| 943 |
+
by such Contributor that are necessarily infringed by their
|
| 944 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 945 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 946 |
+
institute patent litigation against any entity (including a
|
| 947 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 948 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 949 |
+
or contributory patent infringement, then any patent licenses
|
| 950 |
+
granted to You under this License for that Work shall terminate
|
| 951 |
+
as of the date such litigation is filed.
|
| 952 |
+
|
| 953 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 954 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 955 |
+
modifications, and in Source or Object form, provided that You
|
| 956 |
+
meet the following conditions:
|
| 957 |
+
|
| 958 |
+
(a) You must give any other recipients of the Work or
|
| 959 |
+
Derivative Works a copy of this License; and
|
| 960 |
+
|
| 961 |
+
(b) You must cause any modified files to carry prominent notices
|
| 962 |
+
stating that You changed the files; and
|
| 963 |
+
|
| 964 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 965 |
+
that You distribute, all copyright, patent, trademark, and
|
| 966 |
+
attribution notices from the Source form of the Work,
|
| 967 |
+
excluding those notices that do not pertain to any part of
|
| 968 |
+
the Derivative Works; and
|
| 969 |
+
|
| 970 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 971 |
+
distribution, then any Derivative Works that You distribute must
|
| 972 |
+
include a readable copy of the attribution notices contained
|
| 973 |
+
within such NOTICE file, excluding those notices that do not
|
| 974 |
+
pertain to any part of the Derivative Works, in at least one
|
| 975 |
+
of the following places: within a NOTICE text file distributed
|
| 976 |
+
as part of the Derivative Works; within the Source form or
|
| 977 |
+
documentation, if provided along with the Derivative Works; or,
|
| 978 |
+
within a display generated by the Derivative Works, if and
|
| 979 |
+
wherever such third-party notices normally appear. The contents
|
| 980 |
+
of the NOTICE file are for informational purposes only and
|
| 981 |
+
do not modify the License. You may add Your own attribution
|
| 982 |
+
notices within Derivative Works that You distribute, alongside
|
| 983 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 984 |
+
that such additional attribution notices cannot be construed
|
| 985 |
+
as modifying the License.
|
| 986 |
+
|
| 987 |
+
You may add Your own copyright statement to Your modifications and
|
| 988 |
+
may provide additional or different license terms and conditions
|
| 989 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 990 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 991 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 992 |
+
the conditions stated in this License.
|
| 993 |
+
|
| 994 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 995 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 996 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 997 |
+
this License, without any additional terms or conditions.
|
| 998 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 999 |
+
the terms of any separate license agreement you may have executed
|
| 1000 |
+
with Licensor regarding such Contributions.
|
| 1001 |
+
|
| 1002 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 1003 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 1004 |
+
except as required for reasonable and customary use in describing the
|
| 1005 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 1006 |
+
|
| 1007 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 1008 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 1009 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 1010 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 1011 |
+
implied, including, without limitation, any warranties or conditions
|
| 1012 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 1013 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 1014 |
+
appropriateness of using or redistributing the Work and assume any
|
| 1015 |
+
risks associated with Your exercise of permissions under this License.
|
| 1016 |
+
|
| 1017 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 1018 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 1019 |
+
unless required by applicable law (such as deliberate and grossly
|
| 1020 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 1021 |
+
liable to You for damages, including any direct, indirect, special,
|
| 1022 |
+
incidental, or consequential damages of any character arising as a
|
| 1023 |
+
result of this License or out of the use or inability to use the
|
| 1024 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 1025 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 1026 |
+
other commercial damages or losses), even if such Contributor
|
| 1027 |
+
has been advised of the possibility of such damages.
|
| 1028 |
+
|
| 1029 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 1030 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 1031 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 1032 |
+
or other liability obligations and/or rights consistent with this
|
| 1033 |
+
License. However, in accepting such obligations, You may act only
|
| 1034 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 1035 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 1036 |
+
defend, and hold each Contributor harmless for any liability
|
| 1037 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 1038 |
+
of your accepting any such warranty or additional liability.
|
| 1039 |
+
|
| 1040 |
+
END OF TERMS AND CONDITIONS
|
| 1041 |
+
|
| 1042 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 1043 |
+
|
| 1044 |
+
To apply the Apache License to your work, attach the following
|
| 1045 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 1046 |
+
replaced with your own identifying information. (Don't include
|
| 1047 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 1048 |
+
comment syntax for the file format. We also recommend that a
|
| 1049 |
+
file or class name and description of purpose be included on the
|
| 1050 |
+
same "printed page" as the copyright notice for easier
|
| 1051 |
+
identification within third-party archives.
|
| 1052 |
+
|
| 1053 |
+
Copyright [yyyy] [name of copyright owner]
|
| 1054 |
+
|
| 1055 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 1056 |
+
you may not use this file except in compliance with the License.
|
| 1057 |
+
You may obtain a copy of the License at
|
| 1058 |
+
|
| 1059 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 1060 |
+
|
| 1061 |
+
Unless required by applicable law or agreed to in writing, software
|
| 1062 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 1063 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 1064 |
+
See the License for the specific language governing permissions and
|
| 1065 |
+
limitations under the License.
|
| 1066 |
+
|
| 1067 |
+
|
| 1068 |
+
Name: Solarized
|
| 1069 |
+
Files: matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle
|
| 1070 |
+
Description: Solarized color scheme/style
|
| 1071 |
+
License: MIT
|
| 1072 |
+
https://github.com/altercation/solarized/blob/master/LICENSE
|
| 1073 |
+
Copyright (c) 2011 Ethan Schoonover
|
| 1074 |
+
|
| 1075 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 1076 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 1077 |
+
in the Software without restriction, including without limitation the rights
|
| 1078 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 1079 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 1080 |
+
furnished to do so, subject to the following conditions:
|
| 1081 |
+
|
| 1082 |
+
The above copyright notice and this permission notice shall be included in
|
| 1083 |
+
all copies or substantial portions of the Software.
|
| 1084 |
+
|
| 1085 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 1086 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 1087 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 1088 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 1089 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 1090 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
| 1091 |
+
THE SOFTWARE.
|
| 1092 |
+
|
| 1093 |
+
|
| 1094 |
+
Name: Stix fonts
|
| 1095 |
+
Files: matplotlib/mpl-data/fonts/ttf/STIX*.ttf
|
| 1096 |
+
Description: STIX fonts
|
| 1097 |
+
License: OFL-1.1
|
| 1098 |
+
STIX Font License
|
| 1099 |
+
|
| 1100 |
+
24 May 2010
|
| 1101 |
+
|
| 1102 |
+
Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American
|
| 1103 |
+
Institute of Physics, the American Chemical Society, the American Mathematical
|
| 1104 |
+
Society, the American Physical Society, Elsevier, Inc., and The Institute of
|
| 1105 |
+
Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved
|
| 1106 |
+
Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of
|
| 1107 |
+
Electrical and Electronics Engineers, Inc.
|
| 1108 |
+
|
| 1109 |
+
Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com),
|
| 1110 |
+
with Reserved Font Name TM Math. To obtain additional mathematical fonts, please
|
| 1111 |
+
contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA,
|
| 1112 |
+
Phone: (718) 575-1816.
|
| 1113 |
+
|
| 1114 |
+
Portions copyright (c) 1990 by Elsevier, Inc.
|
| 1115 |
+
|
| 1116 |
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
| 1117 |
+
This license is copied below, and is also available with a FAQ at:
|
| 1118 |
+
https://scripts.sil.org/OFL
|
| 1119 |
+
|
| 1120 |
+
-----------------------------------------------------------
|
| 1121 |
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
| 1122 |
+
-----------------------------------------------------------
|
| 1123 |
+
|
| 1124 |
+
PREAMBLE
|
| 1125 |
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
| 1126 |
+
development of collaborative font projects, to support the font creation
|
| 1127 |
+
efforts of academic and linguistic communities, and to provide a free and
|
| 1128 |
+
open framework in which fonts may be shared and improved in partnership
|
| 1129 |
+
with others.
|
| 1130 |
+
|
| 1131 |
+
The OFL allows the licensed fonts to be used, studied, modified and
|
| 1132 |
+
redistributed freely as long as they are not sold by themselves. The
|
| 1133 |
+
fonts, including any derivative works, can be bundled, embedded,
|
| 1134 |
+
redistributed and/or sold with any software provided that any reserved
|
| 1135 |
+
names are not used by derivative works. The fonts and derivatives,
|
| 1136 |
+
however, cannot be released under any other type of license. The
|
| 1137 |
+
requirement for fonts to remain under this license does not apply
|
| 1138 |
+
to any document created using the fonts or their derivatives.
|
| 1139 |
+
|
| 1140 |
+
DEFINITIONS
|
| 1141 |
+
"Font Software" refers to the set of files released by the Copyright
|
| 1142 |
+
Holder(s) under this license and clearly marked as such. This may
|
| 1143 |
+
include source files, build scripts and documentation.
|
| 1144 |
+
|
| 1145 |
+
"Reserved Font Name" refers to any names specified as such after the
|
| 1146 |
+
copyright statement(s).
|
| 1147 |
+
|
| 1148 |
+
"Original Version" refers to the collection of Font Software components as
|
| 1149 |
+
distributed by the Copyright Holder(s).
|
| 1150 |
+
|
| 1151 |
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
| 1152 |
+
or substituting -- in part or in whole -- any of the components of the
|
| 1153 |
+
Original Version, by changing formats or by porting the Font Software to a
|
| 1154 |
+
new environment.
|
| 1155 |
+
|
| 1156 |
+
"Author" refers to any designer, engineer, programmer, technical
|
| 1157 |
+
writer or other person who contributed to the Font Software.
|
| 1158 |
+
|
| 1159 |
+
PERMISSION & CONDITIONS
|
| 1160 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
| 1161 |
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
| 1162 |
+
redistribute, and sell modified and unmodified copies of the Font
|
| 1163 |
+
Software, subject to the following conditions:
|
| 1164 |
+
|
| 1165 |
+
1) Neither the Font Software nor any of its individual components,
|
| 1166 |
+
in Original or Modified Versions, may be sold by itself.
|
| 1167 |
+
|
| 1168 |
+
2) Original or Modified Versions of the Font Software may be bundled,
|
| 1169 |
+
redistributed and/or sold with any software, provided that each copy
|
| 1170 |
+
contains the above copyright notice and this license. These can be
|
| 1171 |
+
included either as stand-alone text files, human-readable headers or
|
| 1172 |
+
in the appropriate machine-readable metadata fields within text or
|
| 1173 |
+
binary files as long as those fields can be easily viewed by the user.
|
| 1174 |
+
|
| 1175 |
+
3) No Modified Version of the Font Software may use the Reserved Font
|
| 1176 |
+
Name(s) unless explicit written permission is granted by the corresponding
|
| 1177 |
+
Copyright Holder. This restriction only applies to the primary font name as
|
| 1178 |
+
presented to the users.
|
| 1179 |
+
|
| 1180 |
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
| 1181 |
+
Software shall not be used to promote, endorse or advertise any
|
| 1182 |
+
Modified Version, except to acknowledge the contribution(s) of the
|
| 1183 |
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
| 1184 |
+
permission.
|
| 1185 |
+
|
| 1186 |
+
5) The Font Software, modified or unmodified, in part or in whole,
|
| 1187 |
+
must be distributed entirely under this license, and must not be
|
| 1188 |
+
distributed under any other license. The requirement for fonts to
|
| 1189 |
+
remain under this license does not apply to any document created
|
| 1190 |
+
using the Font Software.
|
| 1191 |
+
|
| 1192 |
+
TERMINATION
|
| 1193 |
+
This license becomes null and void if any of the above conditions are
|
| 1194 |
+
not met.
|
| 1195 |
+
|
| 1196 |
+
DISCLAIMER
|
| 1197 |
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 1198 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
| 1199 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
| 1200 |
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
| 1201 |
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| 1202 |
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
| 1203 |
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
| 1204 |
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
| 1205 |
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
| 1206 |
+
|
| 1207 |
+
Name: Yorick Colormaps
|
| 1208 |
+
Files: lib/matplotlib/_cm.py
|
| 1209 |
+
Description: Gist/Yorick colormaps
|
| 1210 |
+
License:
|
| 1211 |
+
BSD-style license for gist/yorick colormaps.
|
| 1212 |
+
|
| 1213 |
+
Copyright:
|
| 1214 |
+
|
| 1215 |
+
Copyright (c) 1996. The Regents of the University of California.
|
| 1216 |
+
All rights reserved.
|
| 1217 |
+
|
| 1218 |
+
Permission to use, copy, modify, and distribute this software for any
|
| 1219 |
+
purpose without fee is hereby granted, provided that this entire
|
| 1220 |
+
notice is included in all copies of any software which is or includes
|
| 1221 |
+
a copy or modification of this software and in all copies of the
|
| 1222 |
+
supporting documentation for such software.
|
| 1223 |
+
|
| 1224 |
+
This work was produced at the University of California, Lawrence
|
| 1225 |
+
Livermore National Laboratory under contract no. W-7405-ENG-48 between
|
| 1226 |
+
the U.S. Department of Energy and The Regents of the University of
|
| 1227 |
+
California for the operation of UC LLNL.
|
| 1228 |
+
|
| 1229 |
+
|
| 1230 |
+
DISCLAIMER
|
| 1231 |
+
|
| 1232 |
+
This software was prepared as an account of work sponsored by an
|
| 1233 |
+
agency of the United States Government. Neither the United States
|
| 1234 |
+
Government nor the University of California nor any of their
|
| 1235 |
+
employees, makes any warranty, express or implied, or assumes any
|
| 1236 |
+
liability or responsibility for the accuracy, completeness, or
|
| 1237 |
+
usefulness of any information, apparatus, product, or process
|
| 1238 |
+
disclosed, or represents that its use would not infringe
|
| 1239 |
+
privately-owned rights. Reference herein to any specific commercial
|
| 1240 |
+
products, process, or service by trade name, trademark, manufacturer,
|
| 1241 |
+
or otherwise, does not necessarily constitute or imply its
|
| 1242 |
+
endorsement, recommendation, or favoring by the United States
|
| 1243 |
+
Government or the University of California. The views and opinions of
|
| 1244 |
+
authors expressed herein do not necessarily state or reflect those of
|
| 1245 |
+
the United States Government or the University of California, and
|
| 1246 |
+
shall not be used for advertising or product endorsement purposes.
|
| 1247 |
+
|
| 1248 |
+
|
| 1249 |
+
AUTHOR
|
| 1250 |
+
|
| 1251 |
+
David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated
|
| 1252 |
+
the Yorick parser. The routines in Math are from LAPACK and FFTPACK;
|
| 1253 |
+
MathC contains C translations by David H. Munro. The algorithms for
|
| 1254 |
+
Yorick's random number generator and several special functions in
|
| 1255 |
+
Yorick/include were taken from Numerical Recipes by Press, et. al.,
|
| 1256 |
+
although the Yorick implementations are unrelated to those in
|
| 1257 |
+
Numerical Recipes. A small amount of code in Gist was adapted from
|
| 1258 |
+
the X11R4 release, copyright M.I.T. -- the complete copyright notice
|
| 1259 |
+
may be found in the (unused) file Gist/host.c.
|
| 1260 |
+
|
| 1261 |
+
Classifier: Development Status :: 5 - Production/Stable
|
| 1262 |
+
Classifier: Framework :: Matplotlib
|
| 1263 |
+
Classifier: Intended Audience :: Science/Research
|
| 1264 |
+
Classifier: Intended Audience :: Education
|
| 1265 |
+
Classifier: License :: OSI Approved :: Python Software Foundation License
|
| 1266 |
+
Classifier: Programming Language :: Python
|
| 1267 |
+
Classifier: Programming Language :: Python :: 3
|
| 1268 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 1269 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 1270 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 1271 |
+
Classifier: Programming Language :: Python :: 3.14
|
| 1272 |
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
| 1273 |
+
Project-URL: Homepage, https://matplotlib.org
|
| 1274 |
+
Project-URL: Download, https://matplotlib.org/stable/install/index.html
|
| 1275 |
+
Project-URL: Documentation, https://matplotlib.org
|
| 1276 |
+
Project-URL: Source Code, https://github.com/matplotlib/matplotlib
|
| 1277 |
+
Project-URL: Bug Tracker, https://github.com/matplotlib/matplotlib/issues
|
| 1278 |
+
Project-URL: Forum, https://discourse.matplotlib.org/
|
| 1279 |
+
Project-URL: Donate, https://numfocus.org/donate-to-matplotlib
|
| 1280 |
+
Requires-Python: >=3.11
|
| 1281 |
+
Requires-Dist: contourpy>=1.0.1
|
| 1282 |
+
Requires-Dist: cycler>=0.10
|
| 1283 |
+
Requires-Dist: fonttools>=4.28.2
|
| 1284 |
+
Requires-Dist: kiwisolver>=1.3.1
|
| 1285 |
+
Requires-Dist: numpy>=1.25
|
| 1286 |
+
Requires-Dist: packaging>=20.0
|
| 1287 |
+
Requires-Dist: pillow>=9
|
| 1288 |
+
Requires-Dist: pyparsing>=3
|
| 1289 |
+
Requires-Dist: python-dateutil>=2.7
|
| 1290 |
+
Description-Content-Type: text/markdown
|
| 1291 |
+
|
| 1292 |
+
[](https://pypi.org/project/matplotlib/)
|
| 1293 |
+
[](https://anaconda.org/conda-forge/matplotlib)
|
| 1294 |
+
[](https://pypi.org/project/matplotlib)
|
| 1295 |
+
[](https://numfocus.org)
|
| 1296 |
+
[](https://insights.linuxfoundation.org/project/matplotlib)
|
| 1297 |
+
|
| 1298 |
+
[](https://discourse.matplotlib.org)
|
| 1299 |
+
[](https://discourse.matplotlib.org/chat/c/matplotlib/2)
|
| 1300 |
+
[](https://github.com/matplotlib/matplotlib/issues)
|
| 1301 |
+
[](https://matplotlib.org/stable/devel/index.html)
|
| 1302 |
+
|
| 1303 |
+
[](https://github.com/matplotlib/matplotlib/actions?query=workflow%3ATests)
|
| 1304 |
+
[](https://dev.azure.com/matplotlib/matplotlib/_build/latest?definitionId=1&branchName=main)
|
| 1305 |
+
[](https://ci.appveyor.com/project/matplotlib/matplotlib)
|
| 1306 |
+
[](https://app.codecov.io/gh/matplotlib/matplotlib)
|
| 1307 |
+
[](https://jacobtomlinson.dev/effver)
|
| 1308 |
+
|
| 1309 |
+

|
| 1310 |
+
|
| 1311 |
+
Matplotlib is a comprehensive library for creating static, animated, and
|
| 1312 |
+
interactive visualizations in Python.
|
| 1313 |
+
|
| 1314 |
+
Check out our [home page](https://matplotlib.org/) for more information.
|
| 1315 |
+
|
| 1316 |
+

|
| 1317 |
+
|
| 1318 |
+
Matplotlib produces publication-quality figures in a variety of hardcopy
|
| 1319 |
+
formats and interactive environments across platforms. Matplotlib can be
|
| 1320 |
+
used in Python scripts, Python/IPython shells, web application servers,
|
| 1321 |
+
and various graphical user interface toolkits.
|
| 1322 |
+
|
| 1323 |
+
## Install
|
| 1324 |
+
|
| 1325 |
+
See the [install
|
| 1326 |
+
documentation](https://matplotlib.org/stable/users/installing/index.html),
|
| 1327 |
+
which is generated from `/doc/install/index.rst`
|
| 1328 |
+
|
| 1329 |
+
## Contribute
|
| 1330 |
+
|
| 1331 |
+
You've discovered a bug or something else you want to change — excellent!
|
| 1332 |
+
|
| 1333 |
+
You've worked out a way to fix it — even better!
|
| 1334 |
+
|
| 1335 |
+
You want to tell us about it — best of all!
|
| 1336 |
+
|
| 1337 |
+
Start at the [contributing
|
| 1338 |
+
guide](https://matplotlib.org/devdocs/devel/contribute.html)!
|
| 1339 |
+
|
| 1340 |
+
## Contact
|
| 1341 |
+
|
| 1342 |
+
[Discourse](https://discourse.matplotlib.org/) is the discussion forum
|
| 1343 |
+
for general questions and discussions and our recommended starting
|
| 1344 |
+
point.
|
| 1345 |
+
|
| 1346 |
+
Our active mailing lists (which are mirrored on Discourse) are:
|
| 1347 |
+
|
| 1348 |
+
- [Users](https://mail.python.org/mailman/listinfo/matplotlib-users)
|
| 1349 |
+
mailing list: <matplotlib-users@python.org>
|
| 1350 |
+
- [Announcement](https://mail.python.org/mailman/listinfo/matplotlib-announce)
|
| 1351 |
+
mailing list: <matplotlib-announce@python.org>
|
| 1352 |
+
- [Development](https://mail.python.org/mailman/listinfo/matplotlib-devel)
|
| 1353 |
+
mailing list: <matplotlib-devel@python.org>
|
| 1354 |
+
|
| 1355 |
+
[Discourse Chat](https://discourse.matplotlib.org/chat/c/matplotlib/2) is for
|
| 1356 |
+
coordinating development and asking questions directly related to contributing
|
| 1357 |
+
to matplotlib.
|
| 1358 |
+
|
| 1359 |
+
## Citing Matplotlib
|
| 1360 |
+
|
| 1361 |
+
If Matplotlib contributes to a project that leads to publication, please
|
| 1362 |
+
acknowledge this by citing Matplotlib.
|
| 1363 |
+
|
| 1364 |
+
[A ready-made citation
|
| 1365 |
+
entry](https://matplotlib.org/stable/users/project/citing.html) is
|
| 1366 |
+
available.
|
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/RECORD
ADDED
|
@@ -0,0 +1,891 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
__pycache__/pylab.cpython-312.pyc,,
|
| 2 |
+
matplotlib-3.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 3 |
+
matplotlib-3.11.2.dist-info/LICENSE,sha256=gi6OUoFHVppBl1WSruGcEZkqtme6UEUc2SkDHV_HRJE,63442
|
| 4 |
+
matplotlib-3.11.2.dist-info/METADATA,sha256=5fUyIm0QJa8t0V_5Ud8nOR9m1GQDuCROph5rjrPk2AY,80264
|
| 5 |
+
matplotlib-3.11.2.dist-info/RECORD,,
|
| 6 |
+
matplotlib-3.11.2.dist-info/WHEEL,sha256=3qIDcXCk577AXiK3pDifO-gE9U_MYWYGgtD78gLa2_U,137
|
| 7 |
+
matplotlib/__init__.py,sha256=N6u3jnTp4AhaTjBqkZYG_6j_PCY974CuL02TjPp5zTI,56239
|
| 8 |
+
matplotlib/__init__.pyi,sha256=hnkSJbatbDbjIU0O9Nb_8uALpyt7XmJmlua1Z9ti1xs,3648
|
| 9 |
+
matplotlib/__pycache__/__init__.cpython-312.pyc,,
|
| 10 |
+
matplotlib/__pycache__/_afm.cpython-312.pyc,,
|
| 11 |
+
matplotlib/__pycache__/_animation_data.cpython-312.pyc,,
|
| 12 |
+
matplotlib/__pycache__/_blocking_input.cpython-312.pyc,,
|
| 13 |
+
matplotlib/__pycache__/_cm.cpython-312.pyc,,
|
| 14 |
+
matplotlib/__pycache__/_cm_bivar.cpython-312.pyc,,
|
| 15 |
+
matplotlib/__pycache__/_cm_listed.cpython-312.pyc,,
|
| 16 |
+
matplotlib/__pycache__/_cm_multivar.cpython-312.pyc,,
|
| 17 |
+
matplotlib/__pycache__/_color_data.cpython-312.pyc,,
|
| 18 |
+
matplotlib/__pycache__/_constrained_layout.cpython-312.pyc,,
|
| 19 |
+
matplotlib/__pycache__/_docstring.cpython-312.pyc,,
|
| 20 |
+
matplotlib/__pycache__/_enums.cpython-312.pyc,,
|
| 21 |
+
matplotlib/__pycache__/_fontconfig_pattern.cpython-312.pyc,,
|
| 22 |
+
matplotlib/__pycache__/_internal_utils.cpython-312.pyc,,
|
| 23 |
+
matplotlib/__pycache__/_layoutgrid.cpython-312.pyc,,
|
| 24 |
+
matplotlib/__pycache__/_mathtext.cpython-312.pyc,,
|
| 25 |
+
matplotlib/__pycache__/_mathtext_data.cpython-312.pyc,,
|
| 26 |
+
matplotlib/__pycache__/_pylab_helpers.cpython-312.pyc,,
|
| 27 |
+
matplotlib/__pycache__/_style_helpers.cpython-312.pyc,,
|
| 28 |
+
matplotlib/__pycache__/_text_helpers.cpython-312.pyc,,
|
| 29 |
+
matplotlib/__pycache__/_tight_bbox.cpython-312.pyc,,
|
| 30 |
+
matplotlib/__pycache__/_tight_layout.cpython-312.pyc,,
|
| 31 |
+
matplotlib/__pycache__/_type1font.cpython-312.pyc,,
|
| 32 |
+
matplotlib/__pycache__/_version.cpython-312.pyc,,
|
| 33 |
+
matplotlib/__pycache__/animation.cpython-312.pyc,,
|
| 34 |
+
matplotlib/__pycache__/artist.cpython-312.pyc,,
|
| 35 |
+
matplotlib/__pycache__/axis.cpython-312.pyc,,
|
| 36 |
+
matplotlib/__pycache__/backend_bases.cpython-312.pyc,,
|
| 37 |
+
matplotlib/__pycache__/backend_managers.cpython-312.pyc,,
|
| 38 |
+
matplotlib/__pycache__/backend_tools.cpython-312.pyc,,
|
| 39 |
+
matplotlib/__pycache__/bezier.cpython-312.pyc,,
|
| 40 |
+
matplotlib/__pycache__/category.cpython-312.pyc,,
|
| 41 |
+
matplotlib/__pycache__/cbook.cpython-312.pyc,,
|
| 42 |
+
matplotlib/__pycache__/cm.cpython-312.pyc,,
|
| 43 |
+
matplotlib/__pycache__/collections.cpython-312.pyc,,
|
| 44 |
+
matplotlib/__pycache__/colorbar.cpython-312.pyc,,
|
| 45 |
+
matplotlib/__pycache__/colorizer.cpython-312.pyc,,
|
| 46 |
+
matplotlib/__pycache__/colors.cpython-312.pyc,,
|
| 47 |
+
matplotlib/__pycache__/container.cpython-312.pyc,,
|
| 48 |
+
matplotlib/__pycache__/contour.cpython-312.pyc,,
|
| 49 |
+
matplotlib/__pycache__/dates.cpython-312.pyc,,
|
| 50 |
+
matplotlib/__pycache__/dviread.cpython-312.pyc,,
|
| 51 |
+
matplotlib/__pycache__/figure.cpython-312.pyc,,
|
| 52 |
+
matplotlib/__pycache__/font_manager.cpython-312.pyc,,
|
| 53 |
+
matplotlib/__pycache__/gridspec.cpython-312.pyc,,
|
| 54 |
+
matplotlib/__pycache__/hatch.cpython-312.pyc,,
|
| 55 |
+
matplotlib/__pycache__/image.cpython-312.pyc,,
|
| 56 |
+
matplotlib/__pycache__/inset.cpython-312.pyc,,
|
| 57 |
+
matplotlib/__pycache__/layout_engine.cpython-312.pyc,,
|
| 58 |
+
matplotlib/__pycache__/legend.cpython-312.pyc,,
|
| 59 |
+
matplotlib/__pycache__/legend_handler.cpython-312.pyc,,
|
| 60 |
+
matplotlib/__pycache__/lines.cpython-312.pyc,,
|
| 61 |
+
matplotlib/__pycache__/markers.cpython-312.pyc,,
|
| 62 |
+
matplotlib/__pycache__/mathtext.cpython-312.pyc,,
|
| 63 |
+
matplotlib/__pycache__/mlab.cpython-312.pyc,,
|
| 64 |
+
matplotlib/__pycache__/offsetbox.cpython-312.pyc,,
|
| 65 |
+
matplotlib/__pycache__/patches.cpython-312.pyc,,
|
| 66 |
+
matplotlib/__pycache__/path.cpython-312.pyc,,
|
| 67 |
+
matplotlib/__pycache__/patheffects.cpython-312.pyc,,
|
| 68 |
+
matplotlib/__pycache__/pylab.cpython-312.pyc,,
|
| 69 |
+
matplotlib/__pycache__/pyplot.cpython-312.pyc,,
|
| 70 |
+
matplotlib/__pycache__/quiver.cpython-312.pyc,,
|
| 71 |
+
matplotlib/__pycache__/rcsetup.cpython-312.pyc,,
|
| 72 |
+
matplotlib/__pycache__/sankey.cpython-312.pyc,,
|
| 73 |
+
matplotlib/__pycache__/scale.cpython-312.pyc,,
|
| 74 |
+
matplotlib/__pycache__/spines.cpython-312.pyc,,
|
| 75 |
+
matplotlib/__pycache__/stackplot.cpython-312.pyc,,
|
| 76 |
+
matplotlib/__pycache__/streamplot.cpython-312.pyc,,
|
| 77 |
+
matplotlib/__pycache__/table.cpython-312.pyc,,
|
| 78 |
+
matplotlib/__pycache__/texmanager.cpython-312.pyc,,
|
| 79 |
+
matplotlib/__pycache__/text.cpython-312.pyc,,
|
| 80 |
+
matplotlib/__pycache__/textpath.cpython-312.pyc,,
|
| 81 |
+
matplotlib/__pycache__/ticker.cpython-312.pyc,,
|
| 82 |
+
matplotlib/__pycache__/transforms.cpython-312.pyc,,
|
| 83 |
+
matplotlib/__pycache__/typing.cpython-312.pyc,,
|
| 84 |
+
matplotlib/__pycache__/units.cpython-312.pyc,,
|
| 85 |
+
matplotlib/__pycache__/widgets.cpython-312.pyc,,
|
| 86 |
+
matplotlib/_afm.py,sha256=l46JeOQkEGId4DblorgmEekC8yHG26pfGDZKbkJZJzY,16637
|
| 87 |
+
matplotlib/_animation_data.py,sha256=JJJbbc-fMdPjkbQ7ng9BHL5i91VTDHQVTtEdWOvWBAI,7986
|
| 88 |
+
matplotlib/_api/__init__.py,sha256=fiYs7djOGhZgwuLKpjresHjCnja9VBuOb3c8_tTDx4I,17391
|
| 89 |
+
matplotlib/_api/__init__.pyi,sha256=2DfbEED4eeE5pEjHUFo9EgSN1UnediUYcYlwG8dCzMc,2322
|
| 90 |
+
matplotlib/_api/__pycache__/__init__.cpython-312.pyc,,
|
| 91 |
+
matplotlib/_api/__pycache__/deprecation.cpython-312.pyc,,
|
| 92 |
+
matplotlib/_api/deprecation.py,sha256=Nk0GmpvN8rEPL2QSIHF7qqTlybjiX74VDNmJXy-FQtI,20733
|
| 93 |
+
matplotlib/_api/deprecation.pyi,sha256=A8De57amX2GlZSrDYwVYCMxHFb8AsYGrH0k_bCxuJus,2217
|
| 94 |
+
matplotlib/_blocking_input.py,sha256=VHNsxvX2mTx_xBknd30MSicVlRXS4dCDe9hDctbV5rk,1224
|
| 95 |
+
matplotlib/_c_internal_utils.cpython-312-x86_64-linux-gnu.so,sha256=ekdE5NTdHv6MNv8pKP9oEcPwzCule8suhszoKFhtLH4,266840
|
| 96 |
+
matplotlib/_c_internal_utils.pyi,sha256=Z3bLs9pMGXrmZjt-4_A-x4321bLP-B54xDbr4PIgUfc,377
|
| 97 |
+
matplotlib/_cm.py,sha256=RNyeDygB0aBKSryfiLvqZy688uH9nvxPrEno_qntT5Y,70285
|
| 98 |
+
matplotlib/_cm_bivar.py,sha256=RSIt5eWusEBkKSEYFq5h6MGlViWbEd7UQJLRlr8hz9w,95704
|
| 99 |
+
matplotlib/_cm_listed.py,sha256=3a02mPUSnOsXkqRFNxKGwIvJCAKY5lezBUrqGcllnvk,135004
|
| 100 |
+
matplotlib/_cm_multivar.py,sha256=0UjNFW7Sytj1t31QD99ebfr-al7NmCpWhKUOyq9VzK8,6630
|
| 101 |
+
matplotlib/_color_data.py,sha256=k-wdTi6ArJxksqBfMT-7Uy2qWz8XX4Th5gsjf32CwmM,34780
|
| 102 |
+
matplotlib/_color_data.pyi,sha256=RdBRk01yuf3jYVlCwG351tIBCxehizkZMnKs9c8gnOw,170
|
| 103 |
+
matplotlib/_constrained_layout.py,sha256=uEH1lnCZz_FRmp2aGtt3iDPHGUw6Sdb38r-Gve82tR4,33041
|
| 104 |
+
matplotlib/_docstring.py,sha256=u9yJorJidI8k1W8S01SIMqNmh5VOMVc-AqyES66EEdk,4435
|
| 105 |
+
matplotlib/_docstring.pyi,sha256=Tr9ApmZkmt5HjoTf1IC4X13Nvjna_eW-yLQd5llCK8g,725
|
| 106 |
+
matplotlib/_enums.py,sha256=ERb2JYSEfGdxqXqDlF97WGP4LT-B79k3rDu0KimVeWk,6175
|
| 107 |
+
matplotlib/_enums.pyi,sha256=EqmZXhvqknq8WKey2susXmbIzq07O114jJ0RoWo6Qfg,302
|
| 108 |
+
matplotlib/_fontconfig_pattern.py,sha256=LdC1dyLFbYFGcvpr6K_YcFpC8imHXOgJhli1Db-eaKQ,4368
|
| 109 |
+
matplotlib/_image.cpython-312-x86_64-linux-gnu.so,sha256=Z2y1oTZWjA5ero3xsJobGmL9yFKcJKGNM9O7GcRWL1Y,602368
|
| 110 |
+
matplotlib/_image.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 111 |
+
matplotlib/_internal_utils.py,sha256=nhK6LLWYW93fBcsFiO09JmqFj2rgHEsGYFOeaC7HRKw,2140
|
| 112 |
+
matplotlib/_layoutgrid.py,sha256=mFB9asZVol2aV9hLBpdntuG5x1isKUrajF-3TUhCgso,21676
|
| 113 |
+
matplotlib/_mathtext.py,sha256=_2bkK1whMKjj8EJJ2BkcJPQzxCiS-KDF1m1VJnSNYTI,118542
|
| 114 |
+
matplotlib/_mathtext_data.py,sha256=kNTK1Yzh8bJoLqeFEDrVqG4qNDltAqqzhqDM8ZORC2w,68787
|
| 115 |
+
matplotlib/_path.cpython-312-x86_64-linux-gnu.so,sha256=pXZiJlZbSmX7WMnB32C7FPxdIz3kG-W8TShCk2B-uIk,506712
|
| 116 |
+
matplotlib/_path.pyi,sha256=YQm2xn97KT0x2sieHfZJqd3Qz2bxpgDPMzjWmtlxxzs,261
|
| 117 |
+
matplotlib/_pylab_helpers.py,sha256=7Wcmb39shcllnTI_uICKW0vMB7kI8cZr8mQ8xgh70IM,4424
|
| 118 |
+
matplotlib/_pylab_helpers.pyi,sha256=7OZKr-OL3ipVt1EDZ6e-tRwHASz-ijYfcIdlPczXhvQ,1012
|
| 119 |
+
matplotlib/_qhull.cpython-312-x86_64-linux-gnu.so,sha256=47QOUdYua5EdnBWS6KSt0znhTjCXw4GNXXdKNQWacHo,755864
|
| 120 |
+
matplotlib/_qhull.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 121 |
+
matplotlib/_style_helpers.py,sha256=LeTjS0RQLrTo5PosTsFXg1zukGCSMpzJLWiRCUHGPow,1781
|
| 122 |
+
matplotlib/_text_helpers.py,sha256=CxOPGLxlj0xcI9mZPS0G6pJiHWlShVjnHSF05RqPzK0,1600
|
| 123 |
+
matplotlib/_tight_bbox.py,sha256=sswNaE9IcVwIvhUQfAUq3CdJZYusKWeXKz-Dw0JXy2s,2821
|
| 124 |
+
matplotlib/_tight_layout.py,sha256=A3vZKBmxci7w35OO9lxgfUqrRKgTr-N_dUza0M05WxE,12675
|
| 125 |
+
matplotlib/_tri.cpython-312-x86_64-linux-gnu.so,sha256=I3MjU7yHCOV9arqu7PFJos_hX6V0xS3qT8VNmPdHk_s,439264
|
| 126 |
+
matplotlib/_tri.pyi,sha256=bFnu97pIlSboJT3ijQBw4YlZdlR1UzXYtI3DkEPVzeM,1429
|
| 127 |
+
matplotlib/_type1font.py,sha256=3n-dlsUP35U4CLBTmx28P7Tsdc4rxNnaURZi9xIFzr8,41640
|
| 128 |
+
matplotlib/_version.py,sha256=KMmUcoybTFMzT_WAH2Kkg4xeBOm8OGLzSre1hxnJMwg,19
|
| 129 |
+
matplotlib/animation.py,sha256=ZKnd2PEj-yq_3fXdSwgzpH0UDup4Uiwn7U1_L6IhTdI,74106
|
| 130 |
+
matplotlib/animation.pyi,sha256=Uf4_f8vqu585xcpppq4__MwQgy9k6VIFltI_tcQXcMA,6833
|
| 131 |
+
matplotlib/artist.py,sha256=xVqB2G22CreyL81ucEAaqEVY3l0bpuQKFsYPbx8Dvno,65786
|
| 132 |
+
matplotlib/artist.pyi,sha256=cdWcuxzI_0BWm1Ij4XtPanAhClmXJywV2eYdEwBUgro,7321
|
| 133 |
+
matplotlib/axes/__init__.py,sha256=aHE_zIjphIJkW4_1fyoFuEWTb7gCRewK5jNZWJHEdgM,351
|
| 134 |
+
matplotlib/axes/__init__.pyi,sha256=HP1z2v-PboHQS4dQjvJ7XjUjX-zw6taZRTTB9oVKwYE,303
|
| 135 |
+
matplotlib/axes/__pycache__/__init__.cpython-312.pyc,,
|
| 136 |
+
matplotlib/axes/__pycache__/_axes.cpython-312.pyc,,
|
| 137 |
+
matplotlib/axes/__pycache__/_base.cpython-312.pyc,,
|
| 138 |
+
matplotlib/axes/__pycache__/_secondary_axes.cpython-312.pyc,,
|
| 139 |
+
matplotlib/axes/_axes.py,sha256=9h4ctDV17KcLAcnIDxbTAV6RqBAf6c4Mw_3D2ARByKc,372902
|
| 140 |
+
matplotlib/axes/_axes.pyi,sha256=DwqzbqB89ftBVvsboIBVK45nRfQmhy8whwPEEvfy_Ec,27942
|
| 141 |
+
matplotlib/axes/_base.py,sha256=zv9NL6m9mesUUaJ4Er7zQ5AjhN1ZKpuEgvMbLqxV82s,197935
|
| 142 |
+
matplotlib/axes/_base.pyi,sha256=76nYL7r3HGwbyjMs_95fzvAuZsiPi2Bxdqjo1t4uysU,17533
|
| 143 |
+
matplotlib/axes/_secondary_axes.py,sha256=sqqq4HfgP_ZTjRpL-KacNHbu0OJxIKpWfeE4x5RZmpM,12922
|
| 144 |
+
matplotlib/axes/_secondary_axes.pyi,sha256=SygaC_w29AbGAfBnwSKcltPBkaZUQclS42XDB9OmGaU,1782
|
| 145 |
+
matplotlib/axis.py,sha256=97_5nSz_rnfnXuoPuUKi3Q0PwoxwLsy1QGkbynNkMrA,111990
|
| 146 |
+
matplotlib/axis.pyi,sha256=pztTaGoPJ424AHZyE9iHo5NPvl_EjERgykTIgr5osbU,10246
|
| 147 |
+
matplotlib/backend_bases.py,sha256=orFH-xSdiGL62HSZH3mmHPdto0d9_VivmXVaj5-AwHQ,138490
|
| 148 |
+
matplotlib/backend_bases.pyi,sha256=233bGo5OUYb9mQxKw5yArCzPwPCKcD8X0dSbyYAftt4,17357
|
| 149 |
+
matplotlib/backend_managers.py,sha256=RQheCO_cQBlaWsYMbAmswu0UPKU7bmLTI5LEFgotklA,11795
|
| 150 |
+
matplotlib/backend_managers.pyi,sha256=agnuM0wiZRqSgqti2AgbKJijRLvEPNLOrSY8PEwLjFE,2253
|
| 151 |
+
matplotlib/backend_tools.py,sha256=CvRSLGYETQAs8ryoJ4gizeJOj7QLzbWPfSlT17AciHY,33379
|
| 152 |
+
matplotlib/backend_tools.pyi,sha256=T6q9_VHSF9Ca7yY2FJT6Fqbp0e5flzXFPU4g6UmjraU,4142
|
| 153 |
+
matplotlib/backends/__init__.py,sha256=JowJe-tDrUBMNJTiJATgiEuACpgdxsKnRCYa-nC255A,206
|
| 154 |
+
matplotlib/backends/__pycache__/__init__.cpython-312.pyc,,
|
| 155 |
+
matplotlib/backends/__pycache__/_backend_gtk.cpython-312.pyc,,
|
| 156 |
+
matplotlib/backends/__pycache__/_backend_pdf_ps.cpython-312.pyc,,
|
| 157 |
+
matplotlib/backends/__pycache__/_backend_tk.cpython-312.pyc,,
|
| 158 |
+
matplotlib/backends/__pycache__/backend_agg.cpython-312.pyc,,
|
| 159 |
+
matplotlib/backends/__pycache__/backend_cairo.cpython-312.pyc,,
|
| 160 |
+
matplotlib/backends/__pycache__/backend_gtk3.cpython-312.pyc,,
|
| 161 |
+
matplotlib/backends/__pycache__/backend_gtk3agg.cpython-312.pyc,,
|
| 162 |
+
matplotlib/backends/__pycache__/backend_gtk3cairo.cpython-312.pyc,,
|
| 163 |
+
matplotlib/backends/__pycache__/backend_gtk4.cpython-312.pyc,,
|
| 164 |
+
matplotlib/backends/__pycache__/backend_gtk4agg.cpython-312.pyc,,
|
| 165 |
+
matplotlib/backends/__pycache__/backend_gtk4cairo.cpython-312.pyc,,
|
| 166 |
+
matplotlib/backends/__pycache__/backend_macosx.cpython-312.pyc,,
|
| 167 |
+
matplotlib/backends/__pycache__/backend_mixed.cpython-312.pyc,,
|
| 168 |
+
matplotlib/backends/__pycache__/backend_nbagg.cpython-312.pyc,,
|
| 169 |
+
matplotlib/backends/__pycache__/backend_pdf.cpython-312.pyc,,
|
| 170 |
+
matplotlib/backends/__pycache__/backend_pgf.cpython-312.pyc,,
|
| 171 |
+
matplotlib/backends/__pycache__/backend_ps.cpython-312.pyc,,
|
| 172 |
+
matplotlib/backends/__pycache__/backend_qt.cpython-312.pyc,,
|
| 173 |
+
matplotlib/backends/__pycache__/backend_qt5.cpython-312.pyc,,
|
| 174 |
+
matplotlib/backends/__pycache__/backend_qt5agg.cpython-312.pyc,,
|
| 175 |
+
matplotlib/backends/__pycache__/backend_qt5cairo.cpython-312.pyc,,
|
| 176 |
+
matplotlib/backends/__pycache__/backend_qtagg.cpython-312.pyc,,
|
| 177 |
+
matplotlib/backends/__pycache__/backend_qtcairo.cpython-312.pyc,,
|
| 178 |
+
matplotlib/backends/__pycache__/backend_svg.cpython-312.pyc,,
|
| 179 |
+
matplotlib/backends/__pycache__/backend_template.cpython-312.pyc,,
|
| 180 |
+
matplotlib/backends/__pycache__/backend_tkagg.cpython-312.pyc,,
|
| 181 |
+
matplotlib/backends/__pycache__/backend_tkcairo.cpython-312.pyc,,
|
| 182 |
+
matplotlib/backends/__pycache__/backend_webagg.cpython-312.pyc,,
|
| 183 |
+
matplotlib/backends/__pycache__/backend_webagg_core.cpython-312.pyc,,
|
| 184 |
+
matplotlib/backends/__pycache__/backend_wx.cpython-312.pyc,,
|
| 185 |
+
matplotlib/backends/__pycache__/backend_wxagg.cpython-312.pyc,,
|
| 186 |
+
matplotlib/backends/__pycache__/backend_wxcairo.cpython-312.pyc,,
|
| 187 |
+
matplotlib/backends/__pycache__/qt_compat.cpython-312.pyc,,
|
| 188 |
+
matplotlib/backends/__pycache__/registry.cpython-312.pyc,,
|
| 189 |
+
matplotlib/backends/_backend_agg.cpython-312-x86_64-linux-gnu.so,sha256=7MZKr6D1ttC5KrSaEQkl3E8eqPkGiTVcd9lsCNjIYTo,789856
|
| 190 |
+
matplotlib/backends/_backend_agg.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 191 |
+
matplotlib/backends/_backend_gtk.py,sha256=73YLOI6Ztewd_c0cPkvBPxA2FFXeHJKtv9ie8F_HTBg,11318
|
| 192 |
+
matplotlib/backends/_backend_pdf_ps.py,sha256=8nd42_khjFna-WORMUEZ_9w634YF5-GkLmL3FSePiJQ,15792
|
| 193 |
+
matplotlib/backends/_backend_tk.py,sha256=mmVLWw8cmDyahEUocxnBcKPriG2cbhrM8NgHeuW-h7s,45650
|
| 194 |
+
matplotlib/backends/_macosx.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 195 |
+
matplotlib/backends/_tkagg.cpython-312-x86_64-linux-gnu.so,sha256=S_Oz4ha4SRKrhKPgA96d4I5ssGdVYRUA2d1GDd9mzXI,291288
|
| 196 |
+
matplotlib/backends/_tkagg.pyi,sha256=1yKnYKSgNFesrb0ZI5RQCyTO4zONgHW5MrJ9vq4HzyI,379
|
| 197 |
+
matplotlib/backends/backend_agg.py,sha256=P5kuN0MFrkD7qjap2ndigyGWGWpeQHJMHOii4GuC5GM,23121
|
| 198 |
+
matplotlib/backends/backend_cairo.py,sha256=Dv6HQX1fsNXAsKF3_28iXT8cuGbsPpL1CiRIXeYOFHQ,18623
|
| 199 |
+
matplotlib/backends/backend_gtk3.py,sha256=qWjAZOCIM6tppqd2qpS2JfRtSpHAN2sVvaCu_7UeqKE,22399
|
| 200 |
+
matplotlib/backends/backend_gtk3agg.py,sha256=aFJw05L5V-FyFSj_20l_FuC5piPf8fhKzft_m1NMhYc,2463
|
| 201 |
+
matplotlib/backends/backend_gtk3cairo.py,sha256=zPsJzVm750if2LiQ9ybzsbX0rBhkP05XVvR9Lhz65so,1392
|
| 202 |
+
matplotlib/backends/backend_gtk4.py,sha256=9hbYj5P6-bA2_3iLPUue1cdT0BvMzeSWA6bwXsWgG-o,23690
|
| 203 |
+
matplotlib/backends/backend_gtk4agg.py,sha256=00i3qpIt9Tcf_S74GOWbeckiPlfVJoQ2pBbhXDMthF0,1262
|
| 204 |
+
matplotlib/backends/backend_gtk4cairo.py,sha256=sqWm3WgfNO8EsBjqzsD4U4cAc0f4q5SufYx7ZJacDf0,1125
|
| 205 |
+
matplotlib/backends/backend_macosx.py,sha256=Gjbu1MKXIZpCM_luMG6U7qDgwotcGSegCvYw-NNWxeQ,7397
|
| 206 |
+
matplotlib/backends/backend_mixed.py,sha256=qfuFnC8FrlwUnjh13krzLbW3KoSsC4KmeOfmnuXXWg8,4837
|
| 207 |
+
matplotlib/backends/backend_nbagg.py,sha256=ubhMhxfsv6-6cy8ip8SvGEn2pc9XgqilvH_MVYYdbKE,8026
|
| 208 |
+
matplotlib/backends/backend_pdf.py,sha256=gSxmt_P6-pxdUr1BSvn5g4Wvt2LmP5yYT81c-numCS0,102799
|
| 209 |
+
matplotlib/backends/backend_pgf.py,sha256=XYfcRUAABOAS_REh8gQLEZsEK7fSL-VSzJBWtx2WwBk,40667
|
| 210 |
+
matplotlib/backends/backend_ps.py,sha256=oXyXS-pGBrF8ik5EnwNjRhk0miaQZ4ESVeYmzkuCheU,52915
|
| 211 |
+
matplotlib/backends/backend_qt.py,sha256=L07xkywLyhyan2uG-upPrqsHqQjC4WTkBJAoUhjcP0U,46470
|
| 212 |
+
matplotlib/backends/backend_qt5.py,sha256=kzfoo2ksEGsiWAa2LGtZYzKvfzqJJWyGOohohcRAu1g,787
|
| 213 |
+
matplotlib/backends/backend_qt5agg.py,sha256=Vh7H8kqWH4X8a3VX2XZ2Vze9srwJavkNHAZxdJUz_bk,352
|
| 214 |
+
matplotlib/backends/backend_qt5cairo.py,sha256=Go2Y0GVkXh1xh6x4F255_e5Xbwwws-OiD1Fc0805E78,292
|
| 215 |
+
matplotlib/backends/backend_qtagg.py,sha256=ZjPtp5wR6tZGjbngPXRdVXYRhiPPrc5C0q2DmtdRkpY,3413
|
| 216 |
+
matplotlib/backends/backend_qtcairo.py,sha256=e3SUG50VGqo68eS_8ebTCVQPa4AaxLxuo1JiWX4TIWg,1770
|
| 217 |
+
matplotlib/backends/backend_svg.py,sha256=xIl3W5iR8Yv7MbcG5yQG2iZ6m1IDOl0f1g5ZIwxI1WU,51636
|
| 218 |
+
matplotlib/backends/backend_template.py,sha256=qhWvXGiPeO2jvH61L3NCRYLReo--d4WJrQYanIaEmiE,8012
|
| 219 |
+
matplotlib/backends/backend_tkagg.py,sha256=z9gB16fq2d-DUNpbeSDDLWaYmc0Jz3cDqNlBKhnQg0c,592
|
| 220 |
+
matplotlib/backends/backend_tkcairo.py,sha256=OZWmYs0nvs1qp0OEkhZhhIbXkwBbK6frP0VDik7fu78,859
|
| 221 |
+
matplotlib/backends/backend_webagg.py,sha256=jQhB9JA5tXcRwm6_7qlBg2-Q8_y-5hnv2IUNBPpCSbA,11014
|
| 222 |
+
matplotlib/backends/backend_webagg_core.py,sha256=xJDU2egrWAGvHf9DU7HNP_HB_HLIY5I5aWyITjFN_o8,19622
|
| 223 |
+
matplotlib/backends/backend_wx.py,sha256=lxysP5Z1cnw5ccbgoacQ5xIUiu4KJ8bEtbPlKvFe5hA,51826
|
| 224 |
+
matplotlib/backends/backend_wxagg.py,sha256=tzcwYyW34j4LPfHm9uhuHwepwZIcspi3y8oPC8FJkdk,1468
|
| 225 |
+
matplotlib/backends/backend_wxcairo.py,sha256=7pojY9Q9So6bShbiZgjzAo3cP3cBX0iGT6u8c_h94zc,868
|
| 226 |
+
matplotlib/backends/qt_compat.py,sha256=hwZ78jPuXdKuU71aqqDZqCXYBEeNnfwzkZaGQeaH_9c,5381
|
| 227 |
+
matplotlib/backends/qt_editor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 228 |
+
matplotlib/backends/qt_editor/__pycache__/__init__.cpython-312.pyc,,
|
| 229 |
+
matplotlib/backends/qt_editor/__pycache__/_formlayout.cpython-312.pyc,,
|
| 230 |
+
matplotlib/backends/qt_editor/__pycache__/figureoptions.cpython-312.pyc,,
|
| 231 |
+
matplotlib/backends/qt_editor/_formlayout.py,sha256=QmqqqLO6waqeSGOKjDNUwjvon53Z7yqil5AfqfftDWY,20953
|
| 232 |
+
matplotlib/backends/qt_editor/figureoptions.py,sha256=foEm2WLOjiephUZwGT3XjPJ3Q4IGHC2GMcxzMgrQQ50,9855
|
| 233 |
+
matplotlib/backends/registry.py,sha256=M2BHhBKbUJ8E2B2QExfVf8NbAK4ZFhJtmKRelBZZDh4,15480
|
| 234 |
+
matplotlib/backends/web_backend/all_figures.html,sha256=44Y-GvIJbNlqQaKSW3kwVKpTxBSG1WsdYz3ZmYHlUsA,1753
|
| 235 |
+
matplotlib/backends/web_backend/css/boilerplate.css,sha256=qui16QXRnQFNJDbcMasfH6KtN9hLjv8883U9cJmsVCE,2310
|
| 236 |
+
matplotlib/backends/web_backend/css/fbm.css,sha256=wa4vNkNv7fQ_TufjJjecFZEzPMR6W8x6uXJga_wQILw,1456
|
| 237 |
+
matplotlib/backends/web_backend/css/mpl.css,sha256=ruca_aA5kNnP-MZmLkriu8teVP1nIgwcFEpoB16j8Z4,1611
|
| 238 |
+
matplotlib/backends/web_backend/css/page.css,sha256=ca3nO3TaPw7865PN5SlGJBTc2H3rBXQCMaFPywX29y4,1623
|
| 239 |
+
matplotlib/backends/web_backend/ipython_inline_figure.html,sha256=wgSxUh3xpPAxOnZgSMnrhDM5hYncOfWRGgaCUezvedY,1311
|
| 240 |
+
matplotlib/backends/web_backend/js/mpl.js,sha256=OMt_21axoqQKoVf9ttijR_2M1jOH7id0Q69sQfwZ_y4,25140
|
| 241 |
+
matplotlib/backends/web_backend/js/mpl_tornado.js,sha256=Zs2Uzs7YUilG765nYvanCo-IK8HkHDtIum1KAq6bQ_w,302
|
| 242 |
+
matplotlib/backends/web_backend/js/nbagg_mpl.js,sha256=F-By4ZjOSmwpNAkxUUxUk35qCjGlf0B28Z0aOyfpxDM,9514
|
| 243 |
+
matplotlib/backends/web_backend/single_figure.html,sha256=wEBwF602JLHErBUEXiS6jXqmxYAIzHpa3MMFrnev6rs,1357
|
| 244 |
+
matplotlib/bezier.py,sha256=Y8NbgCpFxxR6PGJoPygGbA_IXsYyLwIlfvLAAfi4pU4,21728
|
| 245 |
+
matplotlib/bezier.pyi,sha256=k3lxqCXHmi2fEb5M1spj1WVsxvswA_pKdzN0obDbXYw,2646
|
| 246 |
+
matplotlib/category.py,sha256=UsZ8rbADAH96YfpjD-N1DLTcS_cQwlszIIQ2ZRaiWm4,7377
|
| 247 |
+
matplotlib/cbook.py,sha256=5__IsdXDiSqyi7LcznGSTfYZLQZ0AjyNiR-ZmUuGNkM,85524
|
| 248 |
+
matplotlib/cbook.pyi,sha256=TCYTGVX6XTW9FEm2wq34NhkUPS1PisfUmrXw7POMrxQ,6398
|
| 249 |
+
matplotlib/cm.py,sha256=pdc7wmRcuzs0FJD2j5BCaDznEM1qie_UwL9QUtJ066o,8206
|
| 250 |
+
matplotlib/cm.pyi,sha256=PorGgiFbQOUvgzzAHe7OKQK7wk65sUoPRH9jNNeZMzg,5412
|
| 251 |
+
matplotlib/collections.py,sha256=x33nwk7hg1OgUasmeWW2uHKwHEcoSbBoviiWyMPjoKI,103408
|
| 252 |
+
matplotlib/collections.pyi,sha256=3GZ2nE8BJ2EfmwZjs9uAqqWccExx_JJUjjvm-A-Z314,11039
|
| 253 |
+
matplotlib/colorbar.py,sha256=Cn8ku-sSVcwrim5Lit4UZJOXohozTnABfIIJOfEkrZM,61667
|
| 254 |
+
matplotlib/colorbar.pyi,sha256=1o4F2DlVXp-roRz6Ko3f9STcW5U_QKLFolhtRHItgdk,4968
|
| 255 |
+
matplotlib/colorizer.py,sha256=-WhzNI0-iVuctG72HSn6Chmy608o0q2JB2LYC3a3eGg,33983
|
| 256 |
+
matplotlib/colorizer.pyi,sha256=tnMrZDj_AZgs3kYDmhnD4YcRdcJ4S0kaWG9wpWab2EI,3245
|
| 257 |
+
matplotlib/colors.py,sha256=70Fz-egxC8dXFOMsOFVxnCeRbGxlG1yU458AFjhCzwQ,159006
|
| 258 |
+
matplotlib/colors.pyi,sha256=FELbV30Fwm1dq39H8Zmc05RniFLoDZ2ykDu2aDgcVkg,17918
|
| 259 |
+
matplotlib/container.py,sha256=Uex9WGmNxaBu8znJ4IlYMrEF0POmE7uAnCWpSe3kRuQ,8132
|
| 260 |
+
matplotlib/container.pyi,sha256=7CZg-lyczPGuT0XRxhES4TDoWYyVwzpH8yQXLmbzXG0,2461
|
| 261 |
+
matplotlib/contour.py,sha256=R1r2-rHgzXi-QPQ1OvqnZovOW2HZUVMKkXNlKKdNksg,70635
|
| 262 |
+
matplotlib/contour.pyi,sha256=X6v5bBOSDIBYkFss9ODtbIdbHS5oHFytLHrwHyvLQRc,5284
|
| 263 |
+
matplotlib/dates.py,sha256=-41nP7xXwkmfLdE4yHxslSClmzi2CwGm1Z1etlQO8jM,66406
|
| 264 |
+
matplotlib/dviread.py,sha256=ek7fK2K9RUxhulY2jbcN4SBWwr6crxPpi9-qR0r5dXE,53612
|
| 265 |
+
matplotlib/dviread.pyi,sha256=165jDLJDuF1TMze11sh2fKBodwMQZkyzu-vELHfVxms,3364
|
| 266 |
+
matplotlib/figure.py,sha256=tECrClvgPLObE1KaL-xJfS2W3rCD4-VtYiBZPj7FZ9o,144757
|
| 267 |
+
matplotlib/figure.pyi,sha256=NsPxdMKxpiLR0oz9eflrYeku5hRChommeeZqm_1287w,15662
|
| 268 |
+
matplotlib/font_manager.py,sha256=0ORkvRr_jhgV03Wqi_xt0yhpl5s0jY7DuC7dYbgoh4g,65673
|
| 269 |
+
matplotlib/font_manager.pyi,sha256=uMp62Capj9kXcu2XOhclF90Y3NRgSGLxI8o0V_5GmDE,6172
|
| 270 |
+
matplotlib/ft2font.cpython-312-x86_64-linux-gnu.so,sha256=nNgs1I0jLgut5DXP8jM_x7HqANWVx3qxHnwoSCFYDZQ,2999496
|
| 271 |
+
matplotlib/ft2font.pyi,sha256=wbja6PlzzMyM20vX9Q-L2Ic3XHzaBPnKl45m6MECQvk,11081
|
| 272 |
+
matplotlib/gridspec.py,sha256=34OVMGdl2bk_mNay6GeDapsrB4bPWzmiYQMwnEMxr94,30513
|
| 273 |
+
matplotlib/gridspec.pyi,sha256=iw2KNGeJ8W5ggYZbF5OHxXsX0pMczHcDMaGxJbv18BY,5495
|
| 274 |
+
matplotlib/hatch.py,sha256=0E7gMZaFMF_vLYjjUG7sPq36e2w2eDIDuCPLj4cRyA0,8206
|
| 275 |
+
matplotlib/hatch.pyi,sha256=OEFkNe8TgrBli_MDMW99Tvhr44S4ySPaYQomjVXpUUA,2098
|
| 276 |
+
matplotlib/image.py,sha256=bh9hpUezcdqb07ILZZkakOxzs3BQT9SofRHRKTsuKnc,73960
|
| 277 |
+
matplotlib/image.pyi,sha256=XkbGOsJR7nIzRFgFBzivi6WU-PlHvC-9yukWiq7RYpk,7065
|
| 278 |
+
matplotlib/inset.py,sha256=KO-82520LcdcCaB68d3GeFdUJGgNtkvx6cDB4NZ0g9c,11281
|
| 279 |
+
matplotlib/inset.pyi,sha256=c-IVW14bpqb3qu7bz0EabvNXJnZwJAXEXoQoIcrL8ns,968
|
| 280 |
+
matplotlib/layout_engine.py,sha256=mwRNh13mIQ-wpjQVgBaB_LWKN1AiQTWldg-X9nLmVok,11433
|
| 281 |
+
matplotlib/layout_engine.pyi,sha256=9cKFTFPCvwmKIygTUvrvOq1iWnFYme9Shniiv2QbC74,1788
|
| 282 |
+
matplotlib/legend.py,sha256=F6C70yrOPrgXIWDupV-7PBSSxlnQ-AXs8DEm68sHKkQ,56894
|
| 283 |
+
matplotlib/legend.pyi,sha256=kfp-f2PFzqYmH61HjaoRtdyI_7JAqXIkGaB1E5qdn38,5393
|
| 284 |
+
matplotlib/legend_handler.py,sha256=Vy1ez79DsUnsondDgOMsqnevwL4Bh3KvjWWWEeXZv6w,29820
|
| 285 |
+
matplotlib/legend_handler.pyi,sha256=3VEfeioGIAxhd3mhg4PXETZjCKf4OlXL0jz1MAFGtos,7655
|
| 286 |
+
matplotlib/lines.py,sha256=6ShRHOwfnOGUVQCMGGPTN7Db0ccawrjUAiTI1cBp4Fw,60047
|
| 287 |
+
matplotlib/lines.pyi,sha256=3tG7tD8GZ8YPphw4nmkgS9SfdLV8icW36bv61jb9RlU,6081
|
| 288 |
+
matplotlib/markers.py,sha256=9cNxE0NveYpnr7uFXhD3Acw-aQ_J8a7A7zhDVtf8VA0,33695
|
| 289 |
+
matplotlib/markers.pyi,sha256=FFFBsvilnbd8-5L04U70kfVoyBwc18w_fZ6DysTj9p0,1678
|
| 290 |
+
matplotlib/mathtext.py,sha256=Q2PXhf35TAYkS_JElreyRBTFhmsdqDcWXKx8ICUkZ1c,5108
|
| 291 |
+
matplotlib/mathtext.pyi,sha256=RCVxYGQ_CJ6wC7v_HkqoouU2PhtcvlJ1ffIyxzAC-so,1045
|
| 292 |
+
matplotlib/mlab.py,sha256=57B_GKW0UgKb_HtGCCj0cJ2LOmw_zcIeRu4rZkxbswo,30951
|
| 293 |
+
matplotlib/mlab.pyi,sha256=mkR7wbJS9eCQfCFsUWoXnqrAy0kcE3cVqpFZCeOGC_Q,3583
|
| 294 |
+
matplotlib/mpl-data/fonts/afm/cmex10.afm,sha256=blR3ERmrVBV5XKkAnDCj4NMeYVgzH7cXtJ3u59u9GuE,12070
|
| 295 |
+
matplotlib/mpl-data/fonts/afm/cmmi10.afm,sha256=5qwEOpedEo76bDUahyuuF1q0cD84tRrX-VQ4p3MlfBo,10416
|
| 296 |
+
matplotlib/mpl-data/fonts/afm/cmr10.afm,sha256=WDvgC_D3UkGJg9u-J0U6RaT02lF4oz3lQxHtg1r3lYw,10101
|
| 297 |
+
matplotlib/mpl-data/fonts/afm/cmsy10.afm,sha256=AbmzvCVWBceHRfmRfeJ9E6xzOQTFLk0U1zDfpf3_MaM,8295
|
| 298 |
+
matplotlib/mpl-data/fonts/afm/cmti10.afm,sha256=BNnf_3S1lJdOB2RTn7pSIWaM8qBWR6Cilzw92iUzNw8,9645
|
| 299 |
+
matplotlib/mpl-data/fonts/afm/cmtt10.afm,sha256=4ji7_mTpeWMa93o_UHBWPKCnqsBfhJJNllat1lJArP4,6501
|
| 300 |
+
matplotlib/mpl-data/fonts/afm/pagd8a.afm,sha256=jjFrigwkTpYLqa26cpzZvKQNBo-PuF4bmDVqaM4pMWw,17183
|
| 301 |
+
matplotlib/mpl-data/fonts/afm/pagdo8a.afm,sha256=sgNQdeYyx8J-itGw9h31y95aMBiTCRvmNSPTXwwS7xg,17255
|
| 302 |
+
matplotlib/mpl-data/fonts/afm/pagk8a.afm,sha256=ZUtfHPloNqcvGMHMxaKDSlshhOcjwheUx143RwpGdIU,17241
|
| 303 |
+
matplotlib/mpl-data/fonts/afm/pagko8a.afm,sha256=Yj1wBg6Jsqqz1KBfhRoJ3ACR-CMQol8Fj_ZM5NZ1gDk,17346
|
| 304 |
+
matplotlib/mpl-data/fonts/afm/pbkd8a.afm,sha256=Zl5o6J_di9Y5j2EpHtjew-_sfg7-WoeVmO9PzOYSTUc,15157
|
| 305 |
+
matplotlib/mpl-data/fonts/afm/pbkdi8a.afm,sha256=JAOno930iTyfZILMf11vWtiaTgrJcPpP6FRTRhEMMD4,15278
|
| 306 |
+
matplotlib/mpl-data/fonts/afm/pbkl8a.afm,sha256=UJqJjOJ6xQDgDBLX157mKpohIJFVmHM-N6x2-DiGv14,15000
|
| 307 |
+
matplotlib/mpl-data/fonts/afm/pbkli8a.afm,sha256=AWislZ2hDbs0ox_qOWREugsbS8_8lpL48LPMR40qpi0,15181
|
| 308 |
+
matplotlib/mpl-data/fonts/afm/pcrb8a.afm,sha256=6j1TS2Uc7DWSc-8l42TGDc1u0Fg8JspeWfxFayjUwi8,15352
|
| 309 |
+
matplotlib/mpl-data/fonts/afm/pcrbo8a.afm,sha256=smg3mjl9QaBDtQIt06ko5GvaxLsO9QtTvYANuE5hfG0,15422
|
| 310 |
+
matplotlib/mpl-data/fonts/afm/pcrr8a.afm,sha256=7nxFr0Ehz4E5KG_zSE5SZOhxRH8MyfnCbw-7x5wu7tw,15339
|
| 311 |
+
matplotlib/mpl-data/fonts/afm/pcrro8a.afm,sha256=NKEz7XtdFkh9cA8MvY-S3UOZlV2Y_J3tMEWFFxj7QSg,15443
|
| 312 |
+
matplotlib/mpl-data/fonts/afm/phvb8a.afm,sha256=NAx4M4HjL7vANCJbc-tk04Vkol-T0oaXeQ3T2h-XUvM,17155
|
| 313 |
+
matplotlib/mpl-data/fonts/afm/phvb8an.afm,sha256=8e_myD-AQkNF7q9XNLb2m76_lX2TUr3a5wog_LIE1sk,17086
|
| 314 |
+
matplotlib/mpl-data/fonts/afm/phvbo8a.afm,sha256=8fkBRmJ-SWY2YrBg8fFyjJyrJp8daQ6JPO6LvhM8xPI,17230
|
| 315 |
+
matplotlib/mpl-data/fonts/afm/phvbo8an.afm,sha256=aeVRvV4r15BBvxuRJ0MG8ZHuH2HViuIiCYkvuapmkmM,17195
|
| 316 |
+
matplotlib/mpl-data/fonts/afm/phvl8a.afm,sha256=IyMYM-bgl-gI6rG0EuZZ2OLzlxJfGeSh8xqsh0t-eJQ,15627
|
| 317 |
+
matplotlib/mpl-data/fonts/afm/phvlo8a.afm,sha256=s12C-eNnIDHJ_UVbuiprjxBjCiHIbS3Y8ORTC-qTpuI,15729
|
| 318 |
+
matplotlib/mpl-data/fonts/afm/phvr8a.afm,sha256=Kt8KaRidts89EBIK29X2JomDUEDxvroeaJz_RNTi6r4,17839
|
| 319 |
+
matplotlib/mpl-data/fonts/afm/phvr8an.afm,sha256=lL5fAHTRwODl-sB5mH7IfsD1tnnea4yRUK-_Ca2bQHM,17781
|
| 320 |
+
matplotlib/mpl-data/fonts/afm/phvro8a.afm,sha256=3KqK3eejiR4hIFBUynuSX_4lMdE2V2T58xOF8lX-fwc,17919
|
| 321 |
+
matplotlib/mpl-data/fonts/afm/phvro8an.afm,sha256=Vx9rRf3YfasMY7tz-njSxz67xHKk-fNkN7yBi0X2IP0,17877
|
| 322 |
+
matplotlib/mpl-data/fonts/afm/pncb8a.afm,sha256=aoXepTcDQtQa_mspflMJkEFKefzXHoyjz6ioJVI0YNc,16028
|
| 323 |
+
matplotlib/mpl-data/fonts/afm/pncbi8a.afm,sha256=pCWW1MYgy0EmvwaYsaYJaAI_LfrsKmDANHu7Pk0RaiU,17496
|
| 324 |
+
matplotlib/mpl-data/fonts/afm/pncr8a.afm,sha256=0CIB2BLe9r-6_Wl5ObRTTf98UOrezmGQ8ZOuBX5kLks,16665
|
| 325 |
+
matplotlib/mpl-data/fonts/afm/pncri8a.afm,sha256=5R-pLZOnaHNG8pjV6MP3Ai-d2OTQYR_cYCb5zQhzfSU,16920
|
| 326 |
+
matplotlib/mpl-data/fonts/afm/pplb8a.afm,sha256=3EzUbNnXr5Ft5eFLY00W9oWu59rHORgDXUuJaOoKN58,15662
|
| 327 |
+
matplotlib/mpl-data/fonts/afm/pplbi8a.afm,sha256=X_9tVspvrcMer3OS8qvdwjFFqpAXYZneyCL2NHA902g,15810
|
| 328 |
+
matplotlib/mpl-data/fonts/afm/pplr8a.afm,sha256=ijMb497FDJ9nVdVMb21F7W3-cu9sb_9nF0oriFpSn8k,15752
|
| 329 |
+
matplotlib/mpl-data/fonts/afm/pplri8a.afm,sha256=8KITbarcUUMi_hdoRLLmNHtlqs0TtOSKqtPFft7X5nY,15733
|
| 330 |
+
matplotlib/mpl-data/fonts/afm/psyr.afm,sha256=Iyt8ajE4B2Tm34oBj2pKtctIf9kPfq05suQefq8p3Ro,9644
|
| 331 |
+
matplotlib/mpl-data/fonts/afm/ptmb8a.afm,sha256=bL1fA1NC4_nW14Zrnxz4nHlXJb4dzELJPvodqKnYeMg,17983
|
| 332 |
+
matplotlib/mpl-data/fonts/afm/ptmbi8a.afm,sha256=-_Ui6XlKaFTHEnkoS_-1GtIr5VtGa3gFQ2ezLOYHs08,18070
|
| 333 |
+
matplotlib/mpl-data/fonts/afm/ptmr8a.afm,sha256=IEcsWcmzJyjCwkgsw4o6hIMmzlyXUglJat9s1PZNnEU,17942
|
| 334 |
+
matplotlib/mpl-data/fonts/afm/ptmri8a.afm,sha256=49fQMg5fIGguZ7rgc_2styMK55Pv5bPTs7wCzqpcGpk,18068
|
| 335 |
+
matplotlib/mpl-data/fonts/afm/putb8a.afm,sha256=qMaHTdpkrNL-m4DWhjpxJCSmgYkCv1qIzLlFfM0rl40,21532
|
| 336 |
+
matplotlib/mpl-data/fonts/afm/putbi8a.afm,sha256=g7AVJyiTxeMpNk_1cSfmYgM09uNUfPlZyWGv3D1vcAk,21931
|
| 337 |
+
matplotlib/mpl-data/fonts/afm/putr8a.afm,sha256=XYmNC5GQgSVAZKTIYdYeNksE6znNm9GF_0SmQlriqx0,22148
|
| 338 |
+
matplotlib/mpl-data/fonts/afm/putri8a.afm,sha256=i7fVe-iLyLtQxCfAa4IxdxH-ufcHmMk7hbCGG5TxAY4,21891
|
| 339 |
+
matplotlib/mpl-data/fonts/afm/pzcmi8a.afm,sha256=wyuoIWEZOcoXrSl1tPzLkEahik7kGi91JJj-tkFRG4A,16250
|
| 340 |
+
matplotlib/mpl-data/fonts/afm/pzdr.afm,sha256=MyjLAnzKYRdQBfof1W3k_hf30MvqOkqL__G22mQ5xww,9467
|
| 341 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Courier-Bold.afm,sha256=sIDDI-B82VZ3C0mI_mHFITCZ7PVn37AIYMv1CrHX4sE,15333
|
| 342 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Courier-BoldOblique.afm,sha256=zg61QobD3YU9UBfCXmvmhBNaFKno-xj8sY0b2RpgfLw,15399
|
| 343 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Courier-Oblique.afm,sha256=vRQm5j1sTUN4hicT1PcVZ9P9DTTUHhEzfPXqUUzVZhE,15441
|
| 344 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Courier.afm,sha256=Mdcq2teZEBJrIqVXnsnhee7oZnTs6-P8_292kWGTrw4,15335
|
| 345 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-Bold.afm,sha256=i2l4gcjuYXoXf28uK7yIVwuf0rnw6J7PwPVQeHj5iPw,69269
|
| 346 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-BoldOblique.afm,sha256=Um5O6qK11DXLt8uj_0IoWkc84TKqHK3bObSKUswQqvY,69365
|
| 347 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-Oblique.afm,sha256=hVYDg2b52kqtbVeCzmiv25bW1yYdpkZS-LXlGREN2Rs,74392
|
| 348 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica.afm,sha256=23cvKDD7bQAJB3kdjSahJSTZaUOppznlIO6FXGslyW8,74292
|
| 349 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Symbol.afm,sha256=P5UaoXr4y0qh4SiMa5uqijDT6ZDr2-jPmj1ayry593E,9740
|
| 350 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Times-Bold.afm,sha256=cQTmr2LFPwKQE_sGQageMcmFicjye16mKJslsJLHQyE,64251
|
| 351 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Times-BoldItalic.afm,sha256=pzWOdycm6RqocBWgAVY5Jq0z3Fp7LuqWgLNMx4q6OFw,59642
|
| 352 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Times-Italic.afm,sha256=bK5puSMpGT_YUILwyJrXoxjfj7XJOdfv5TQ_iKsJRzw,66328
|
| 353 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/Times-Roman.afm,sha256=hhNrUnpazuDDKD1WpraPxqPWCYLrO7D7bMVOg-zI13o,60460
|
| 354 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/ZapfDingbats.afm,sha256=ZuOmt9GcKofjdOq8kqhPhtAIhOwkL2rTJTmZxAjFakA,9527
|
| 355 |
+
matplotlib/mpl-data/fonts/pdfcorefonts/readme.txt,sha256=MRv8ppSITYYAb7lt5EOw9DWWNZIblfxsFhu5TQE7cpI,828
|
| 356 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf,sha256=sYS4njwQdfIva3FXW2_CDUlys8_TsjMiym_Vltyu8Wc,704128
|
| 357 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSans-BoldOblique.ttf,sha256=bt8CgxYBhq9FHL7nHnuEXy5Mq_Jku5ks5mjIPCVGXm8,641720
|
| 358 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf,sha256=zN90s1DxH9PdV3TeUOXmNGoaXaH1t9X7g1kGZel6UhM,633840
|
| 359 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf,sha256=P99pyr8GBJ6nCgC1kZNA4s4ebQKwzDxLRPtoAb0eDSI,756072
|
| 360 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSansDisplay.ttf,sha256=ggmdz7paqGjN_CdFGYlSX-MpL3N_s8ngMozpzvWWUvY,25712
|
| 361 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Bold.ttf,sha256=uq2ppRcv4giGJRr_BDP8OEYZEtXa8HKH577lZiCo2pY,331536
|
| 362 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-BoldOblique.ttf,sha256=ppCBwVx2yCfgonpaf1x0thNchDSZlVSV_6jCDTqYKIs,253116
|
| 363 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Oblique.ttf,sha256=KAUoE_enCfyJ9S0ZLcmV708P3Fw9e3OknWhJsZFtDNA,251472
|
| 364 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf,sha256=YC7Ia4lIz82VZIL-ZPlMNshndwFJ7y95HUYT9EO87LM,340240
|
| 365 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Bold.ttf,sha256=w3U_Lta8Zz8VhG3EWt2-s7nIcvMvsY_VOiHxvvHtdnY,355692
|
| 366 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSerif-BoldItalic.ttf,sha256=2T7-x6nS6CZ2jRou6VuVhw4V4pWZqE80hK8d4c7C4YE,347064
|
| 367 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Italic.ttf,sha256=PnmU-8VPoQzjNSpC1Uj63X2crbacsRCbydlg9trFfwQ,345612
|
| 368 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSerif.ttf,sha256=EHJElW6ZYrnpb6zNxVGCXgrgiYrhNzcTPhuSGi_TX_o,379740
|
| 369 |
+
matplotlib/mpl-data/fonts/ttf/DejaVuSerifDisplay.ttf,sha256=KRTzLkfHd8J75Wd6-ufbTeefnkXeb8kJfZlJwjwU99U,14300
|
| 370 |
+
matplotlib/mpl-data/fonts/ttf/LICENSE_DEJAVU,sha256=11k43sCY8G8Kw8AIUwZdlPAgvhw8Yu8dwpdboVtNmw4,4816
|
| 371 |
+
matplotlib/mpl-data/fonts/ttf/LICENSE_STIX,sha256=urPTHf7wf0g2JPL2XycR52BluOcnMnixwHHt4QQcmVk,5476
|
| 372 |
+
matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf,sha256=YMSKv8BenyujNZnE3LpAEF0eznHTdh8LJvdaOLWxeJU,564228
|
| 373 |
+
matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf,sha256=FnN4Ax4t3cYhbWeBnJJg6aBv_ExHjk4jy5im_USxg8I,448228
|
| 374 |
+
matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf,sha256=6FM9xwg_o0a9oZM9YOpKg7Z9CUW86vGzVB-CtKDixqA,237360
|
| 375 |
+
matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf,sha256=mHiP1LpI37sr0CbA4gokeosGxzcoeWKLemuw1bsJc2w,181152
|
| 376 |
+
matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf,sha256=bPyzM9IrfDxiO9_UAXTxTIXD1nMcphZsHtyAFA6uhSc,175040
|
| 377 |
+
matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf,sha256=Ulb34CEzWsSFTRgPDovxmJZOwvyCAXYnbhaqvGU3u1c,59108
|
| 378 |
+
matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf,sha256=XRBqW3jR_8MBdFU0ObhiV7-kXwiBIMs7QVClHcT5tgs,30512
|
| 379 |
+
matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf,sha256=pb22DnbDf2yQqizotc3wBDqFGC_g27YcCGJivH9-Le8,41272
|
| 380 |
+
matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf,sha256=BMr9pWiBv2YIZdq04X4c3CgL6NPLUPrl64aV1N4w9Ug,46752
|
| 381 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf,sha256=wYuH1gYUpCuusqItRH5kf9p_s6mUD-9X3L5RvRtKSxs,13656
|
| 382 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf,sha256=yNdvjUoSmsZCULmD7SVq9HabndG9P4dPhboL1JpAf0s,12228
|
| 383 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf,sha256=-9xVMYL4_1rcO8FiCKrCfR4PaSmKtA42ddLGqwtei1w,15972
|
| 384 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf,sha256=cYexyo8rZcdqMlpa9fNF5a2IoXLUTZuIvh0JD1Qp0i4,12556
|
| 385 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf,sha256=0lbHzpndzJmO8S42mlkhsz5NbvJLQCaH5Mcc7QZRDzc,19760
|
| 386 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf,sha256=3eBc-VtYbhQU3BnxiypfO6eAzEu8BdDvtIJSFbkS2oY,12192
|
| 387 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf,sha256=XFSKCptbESM8uxHtUFSAV2cybwxhSjd8dWVByq6f3w0,15836
|
| 388 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf,sha256=MUCYHrA0ZqFiSE_PjIGlJZgMuv79aUgQqE7Dtu3kuo0,12116
|
| 389 |
+
matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf,sha256=_sdxDuEwBDtADpu9CyIXQxV7sIqA2TZVBCUiUjq5UCk,15704
|
| 390 |
+
matplotlib/mpl-data/fonts/ttf/cmb10.ttf,sha256=B0SXtQxD6ldZcYFZH5iT04_BKofpUQT1ZX_CSB9hojo,25680
|
| 391 |
+
matplotlib/mpl-data/fonts/ttf/cmex10.ttf,sha256=ryjwwXByOsd2pxv6WVrKCemNFa5cPVTOGa_VYZyWqQU,21092
|
| 392 |
+
matplotlib/mpl-data/fonts/ttf/cmmi10.ttf,sha256=MJKWW4gR_WpnZXmWZIRRgfwd0TMLk3-RWAjEhdMWI00,32560
|
| 393 |
+
matplotlib/mpl-data/fonts/ttf/cmr10.ttf,sha256=Tdl2GwWMAJ25shRfVe5mF9CTwnPdPWxbPkP_YRD6m_Y,26348
|
| 394 |
+
matplotlib/mpl-data/fonts/ttf/cmss10.ttf,sha256=ffkag9BbLkcexjjLC0NaNgo8eSsJ_EKn2mfpHy55EVo,20376
|
| 395 |
+
matplotlib/mpl-data/fonts/ttf/cmsy10.ttf,sha256=uyJu2TLz8QDNDlL15JEu5VO0G2nnv9uNOFTbDrZgUjI,29396
|
| 396 |
+
matplotlib/mpl-data/fonts/ttf/cmti10.ttf,sha256=-fH59lQwiugve-REGuibCAiWs0zCILvqFzxemtz-Pvc,32808
|
| 397 |
+
matplotlib/mpl-data/fonts/ttf/cmtt10.ttf,sha256=YhHwmuk1mZka_alwwkZp2tGnfiU9kVYk-_IS9wLwcdc,28136
|
| 398 |
+
matplotlib/mpl-data/images/back-symbolic.svg,sha256=Okj_ressZkfe6Ewv_o7GF5toc5qWCeFkQ2cHQ25BdVE,1532
|
| 399 |
+
matplotlib/mpl-data/images/back.pdf,sha256=ZR7CJo_dAeCM-KlaGvskgtHQyRtrPIolc8REOmcoqJk,1623
|
| 400 |
+
matplotlib/mpl-data/images/back.png,sha256=E4dGf4Gnz1xJ1v2tMygHV0YNQgShreDeVApaMb-74mU,380
|
| 401 |
+
matplotlib/mpl-data/images/back.svg,sha256=Okj_ressZkfe6Ewv_o7GF5toc5qWCeFkQ2cHQ25BdVE,1532
|
| 402 |
+
matplotlib/mpl-data/images/back_large.png,sha256=9A6hUSQeszhYONE4ZuH3kvOItM0JfDVu6tkfromCbsQ,620
|
| 403 |
+
matplotlib/mpl-data/images/filesave-symbolic.svg,sha256=dMGXvLSOHPu44kiWgZx-B_My_tLWaP6J6GgxJfL4FW0,2049
|
| 404 |
+
matplotlib/mpl-data/images/filesave.pdf,sha256=P1EPPV2g50WTt8UaX-6kFoTZM1xVqo6S2H6FJ6Zd1ec,1734
|
| 405 |
+
matplotlib/mpl-data/images/filesave.png,sha256=b7ctucrM_F2mG-DycTedG_a_y4pHkx3F-zM7l18GLhk,458
|
| 406 |
+
matplotlib/mpl-data/images/filesave.svg,sha256=dMGXvLSOHPu44kiWgZx-B_My_tLWaP6J6GgxJfL4FW0,2049
|
| 407 |
+
matplotlib/mpl-data/images/filesave_large.png,sha256=LNbRD5KZ3Kf7nbp-stx_a1_6XfGBSWUfDdpgmnzoRvk,720
|
| 408 |
+
matplotlib/mpl-data/images/forward-symbolic.svg,sha256=kOiKq3a4mieMRLVCwQBdOMTRrWG2NOX_5-rbAFHpdmQ,1551
|
| 409 |
+
matplotlib/mpl-data/images/forward.pdf,sha256=KIqIL4YId43LkcOxV_TT5uvz1SP8k5iUNUeJmAElMV8,1630
|
| 410 |
+
matplotlib/mpl-data/images/forward.png,sha256=pKbLepgGiGeyY2TCBl8svjvm7Z4CS3iysFxcq4GR-wk,357
|
| 411 |
+
matplotlib/mpl-data/images/forward.svg,sha256=kOiKq3a4mieMRLVCwQBdOMTRrWG2NOX_5-rbAFHpdmQ,1551
|
| 412 |
+
matplotlib/mpl-data/images/forward_large.png,sha256=36h7m7DZDHql6kkdpNPckyi2LKCe_xhhyavWARz_2kQ,593
|
| 413 |
+
matplotlib/mpl-data/images/hand.pdf,sha256=hspwkNY915KPD7AMWnVQs7LFPOtlcj0VUiLu76dMabQ,4172
|
| 414 |
+
matplotlib/mpl-data/images/hand.png,sha256=2cchRETGKa0hYNKUxnJABwkyYXEBPqJy_VqSPlT0W2Q,979
|
| 415 |
+
matplotlib/mpl-data/images/hand.svg,sha256=hxxBtakaVFA7mpZOGakvo0QUcb2x06rojeS5gnVmyuc,4906
|
| 416 |
+
matplotlib/mpl-data/images/help-symbolic.svg,sha256=XVcFcuzcL3SQ3LjfSbtdLYDjoB5YUkj2jk2Gk8vaZF8,1890
|
| 417 |
+
matplotlib/mpl-data/images/help.pdf,sha256=CeE978IMi0YWznWKjIT1R8IrP4KhZ0S7usPUvreSgcA,1813
|
| 418 |
+
matplotlib/mpl-data/images/help.png,sha256=s4pQrqaQ0py8I7vc9hv3BI3DO_tky-7YBMpaHuBDCBY,472
|
| 419 |
+
matplotlib/mpl-data/images/help.svg,sha256=XVcFcuzcL3SQ3LjfSbtdLYDjoB5YUkj2jk2Gk8vaZF8,1890
|
| 420 |
+
matplotlib/mpl-data/images/help_large.png,sha256=1IwEyWfGRgnoCWM-r9CJHEogTJVD5n1c8LXTK4AJ4RE,747
|
| 421 |
+
matplotlib/mpl-data/images/home-symbolic.svg,sha256=ptrus8h5PZTi9ahYfnaz-uZ8MAHCr72aPeMW48TBR9Q,1911
|
| 422 |
+
matplotlib/mpl-data/images/home.pdf,sha256=e0e0pI-XRtPmvUCW2VTKL1DeYu1pvPmUUeRSgEbWmik,1737
|
| 423 |
+
matplotlib/mpl-data/images/home.png,sha256=IcFdAAUa6_A0qt8IO3I8p4rpXpQgAlJ8ndBECCh7C1w,468
|
| 424 |
+
matplotlib/mpl-data/images/home.svg,sha256=ptrus8h5PZTi9ahYfnaz-uZ8MAHCr72aPeMW48TBR9Q,1911
|
| 425 |
+
matplotlib/mpl-data/images/home_large.png,sha256=uxS2O3tWOHh1iau7CaVV4ermIJaZ007ibm5Z3i8kXYg,790
|
| 426 |
+
matplotlib/mpl-data/images/matplotlib.pdf,sha256=BkSUf-2xoij-eXfpV2t7y1JFKG1zD1gtV6aAg3Xi_wE,22852
|
| 427 |
+
matplotlib/mpl-data/images/matplotlib.png,sha256=w8KLRYVa-voUZXa41hgJauQuoois23f3NFfdc72pUYY,1283
|
| 428 |
+
matplotlib/mpl-data/images/matplotlib.svg,sha256=QiTIcqlQwGaVPtHsEk-vtmJk1wxwZSvijhqBe_b9VCI,62087
|
| 429 |
+
matplotlib/mpl-data/images/matplotlib_large.png,sha256=ElRoue9grUqkZXJngk-nvh4GKfpvJ4gE69WryjCbX5U,3088
|
| 430 |
+
matplotlib/mpl-data/images/move-symbolic.svg,sha256=_uamLnjQ20iwSuKbd8JvTXUFaRq4206MrpFWvtErr8I,2529
|
| 431 |
+
matplotlib/mpl-data/images/move.pdf,sha256=CXk3PGK9WL5t-5J-G2X5Tl-nb6lcErTBS5oUj2St6aU,1867
|
| 432 |
+
matplotlib/mpl-data/images/move.png,sha256=TmjR41IzSzxGbhiUcV64X0zx2BjrxbWH3cSKvnG2vzc,481
|
| 433 |
+
matplotlib/mpl-data/images/move.svg,sha256=_uamLnjQ20iwSuKbd8JvTXUFaRq4206MrpFWvtErr8I,2529
|
| 434 |
+
matplotlib/mpl-data/images/move_large.png,sha256=Skjz2nW_RTA5s_0g88gdq2hrVbm6DOcfYW4Fu42Fn9U,767
|
| 435 |
+
matplotlib/mpl-data/images/qt4_editor_options.pdf,sha256=2qu6GVyBrJvVHxychQoJUiXPYxBylbH2j90QnytXs_w,1568
|
| 436 |
+
matplotlib/mpl-data/images/qt4_editor_options.png,sha256=EryQjQ5hh2dwmIxtzCFiMN1U6Tnd11p1CDfgH5ZHjNM,380
|
| 437 |
+
matplotlib/mpl-data/images/qt4_editor_options.svg,sha256=sdrNIxYT-BLvJ30ASnaRQ5PxF3SB41-pgdaIJT0KqBg,1264
|
| 438 |
+
matplotlib/mpl-data/images/qt4_editor_options_large.png,sha256=-Pd-9Vh5aIr3PZa8O6Ge_BLo41kiEnpmkdDj8a11JkY,619
|
| 439 |
+
matplotlib/mpl-data/images/subplots-symbolic.svg,sha256=Gq4fDSS99Rv5rbR8_nenV6jcY5VsKPARWeH-BZBk9CU,2150
|
| 440 |
+
matplotlib/mpl-data/images/subplots.pdf,sha256=Q0syPMI5EvtgM-CE-YXKOkL9eFUAZnj_X2Ihoj6R4p4,1714
|
| 441 |
+
matplotlib/mpl-data/images/subplots.png,sha256=MUfCItq3_yzb9yRieGOglpn0Y74h8IA7m5i70B63iRc,445
|
| 442 |
+
matplotlib/mpl-data/images/subplots.svg,sha256=Gq4fDSS99Rv5rbR8_nenV6jcY5VsKPARWeH-BZBk9CU,2150
|
| 443 |
+
matplotlib/mpl-data/images/subplots_large.png,sha256=Edu9SwVMQEXJZ5ogU5cyW7VLcwXJdhdf-EtxxmxdkIs,662
|
| 444 |
+
matplotlib/mpl-data/images/zoom_to_rect-symbolic.svg,sha256=uMmdGkO43ZHlezkpieR3_MiqlEc5vROffRDOhY4sxm4,1499
|
| 445 |
+
matplotlib/mpl-data/images/zoom_to_rect.pdf,sha256=SEvPc24gfZRpl-dHv7nx8KkxPyU66Kq4zgQTvGFm9KA,1609
|
| 446 |
+
matplotlib/mpl-data/images/zoom_to_rect.png,sha256=aNz3QZBrIgxu9E-fFfaQweCVNitGuDUFoC27e5NU2L4,530
|
| 447 |
+
matplotlib/mpl-data/images/zoom_to_rect.svg,sha256=uMmdGkO43ZHlezkpieR3_MiqlEc5vROffRDOhY4sxm4,1499
|
| 448 |
+
matplotlib/mpl-data/images/zoom_to_rect_large.png,sha256=V6pkxmm6VwFExdg_PEJWdK37HB7k3cE_corLa7RbUMk,1016
|
| 449 |
+
matplotlib/mpl-data/kpsewhich.lua,sha256=NlKifCv0ONjA6uH5f3gtpWtDzWT1RQnnIHpDAxZ6tC0,189
|
| 450 |
+
matplotlib/mpl-data/matplotlibrc,sha256=i3bhOM6dyUSoQ9xqoe-e4OiGODWLELryJ80kjScbX1o,45318
|
| 451 |
+
matplotlib/mpl-data/plot_directive/plot_directive.css,sha256=utSJ1oETz0UG6AC9hU134J_JY78ENijqMZXN0JMBUfk,318
|
| 452 |
+
matplotlib/mpl-data/sample_data/Minduka_Present_Blue_Pack.png,sha256=XnKGiCanpDKalQ5anvo5NZSAeDP7fyflzQAaivuc0IE,13634
|
| 453 |
+
matplotlib/mpl-data/sample_data/README.txt,sha256=ABz19VBKfGewdY39QInG9Qccgn1MTYV3bT5Ph7TCy2Y,128
|
| 454 |
+
matplotlib/mpl-data/sample_data/Stocks.csv,sha256=72878aZNXGxd5wLvFUw_rnj-nfg4gqtrucZji-w830c,67924
|
| 455 |
+
matplotlib/mpl-data/sample_data/axes_grid/bivariate_normal.npy,sha256=DpWZ9udAh6ospYqneEa27D6EkRgORFwHosacZXVu98U,1880
|
| 456 |
+
matplotlib/mpl-data/sample_data/data_x_x2_x3.csv,sha256=A0SU3buOUGhT-NI_6LQ6p70fFSIU3iLFdgzvzrKR6SE,132
|
| 457 |
+
matplotlib/mpl-data/sample_data/eeg.dat,sha256=KGVjFt8ABKz7p6XZirNfcxSTOpGGNuyA8JYErRKLRBc,25600
|
| 458 |
+
matplotlib/mpl-data/sample_data/embedding_in_wx3.xrc,sha256=cUqVw5vDHNSZoaO4J0ebZUf5SrJP36775abs7R9Bclg,2186
|
| 459 |
+
matplotlib/mpl-data/sample_data/goog.npz,sha256=QAkXzzDmtmT3sNqT18dFhg06qQCNqLfxYNLdEuajGLE,22845
|
| 460 |
+
matplotlib/mpl-data/sample_data/grace_hopper.jpg,sha256=qMptc0dlcDsJcoq0f-WfRz2Trjln_CTHwCiMPHrbcTA,61306
|
| 461 |
+
matplotlib/mpl-data/sample_data/jacksboro_fault_dem.npz,sha256=1JP1CjPoKkQgSUxU0fyhU50Xe9wnqxkLxf5ukvYvtjc,174061
|
| 462 |
+
matplotlib/mpl-data/sample_data/logo2.png,sha256=DXNx4FXeyqxHy26AmvNELpwezQLxweLQY9HP7ktKIdc,22279
|
| 463 |
+
matplotlib/mpl-data/sample_data/membrane.dat,sha256=q3lbQpIBpbtXXGNw1eFwkN_PwxdDGqk4L46IE2b0M1c,48000
|
| 464 |
+
matplotlib/mpl-data/sample_data/msft.csv,sha256=GArKb0O3DgKZRsKdJf6lX3rMSf-PCekIiBoLNdgF7Mk,3211
|
| 465 |
+
matplotlib/mpl-data/sample_data/s1045.ima.gz,sha256=MrQk1k9it-ccsk0p_VOTitVmTWCAVaZ6srKvQ2n4uJ4,33229
|
| 466 |
+
matplotlib/mpl-data/sample_data/topobathy.npz,sha256=AkTgMpFwLfRQJNy1ysvE89TLMNct-n_TccSsYcQrT78,45224
|
| 467 |
+
matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle,sha256=N4RvRAfKLFr2rIJKE5-WNkjzjpMCqPAfIg4FP0J69zw,1258
|
| 468 |
+
matplotlib/mpl-data/stylelib/_classic_test_patch.mplstyle,sha256=f1vMomTMP9ebxMVnI9N0F8BNfqie4dav32pxKDXPu78,184
|
| 469 |
+
matplotlib/mpl-data/stylelib/_mpl-gallery-nogrid.mplstyle,sha256=1VOL3USqD6iuGQaSynNg1QhyUwvKLnkLyUKdbBMnnqg,489
|
| 470 |
+
matplotlib/mpl-data/stylelib/_mpl-gallery.mplstyle,sha256=MN-q59CiDqHXB8xFKXxzCbJJbJmNDhBe9lDJJAoMTPA,504
|
| 471 |
+
matplotlib/mpl-data/stylelib/bmh.mplstyle,sha256=fB9iVyOPZ6qoP8jUx5nLabzfLisTbwR3S2Dvm5Ak_6k,687
|
| 472 |
+
matplotlib/mpl-data/stylelib/classic.mplstyle,sha256=AK55dvIyzCgrUNlolDrbE4mFl6RnC-3c3f7Z_KteYF0,24591
|
| 473 |
+
matplotlib/mpl-data/stylelib/dark_background.mplstyle,sha256=GzSBD06jvlRYOqu7D5Z5a5x25l9JnTgtObn7S4D9zug,607
|
| 474 |
+
matplotlib/mpl-data/stylelib/fast.mplstyle,sha256=yTa2YEIIP9xi5V_G0p2vSlxghuhNwjRi9gPECMxyRiM,288
|
| 475 |
+
matplotlib/mpl-data/stylelib/fivethirtyeight.mplstyle,sha256=IcBt2DSDz9CtuyCis9JZtT3Nqoh6LVO-dB66AxObUcA,780
|
| 476 |
+
matplotlib/mpl-data/stylelib/ggplot.mplstyle,sha256=u2oPHMLWFtZcpIjHk2swi2Nrt4NgnEtof5lxcwM0RD0,956
|
| 477 |
+
matplotlib/mpl-data/stylelib/grayscale.mplstyle,sha256=KCLg-pXpns9cnKDXKN2WH6mV41OH-6cbT-5zKQotSdw,526
|
| 478 |
+
matplotlib/mpl-data/stylelib/petroff10.mplstyle,sha256=Qj7pPbHh3L25kdsPt1ypwvKR3dPzuOrFzzQTP3Mfilg,298
|
| 479 |
+
matplotlib/mpl-data/stylelib/petroff6.mplstyle,sha256=b0Gtv5I2pSk0T-2tQfLZVqZqUExErabNil7ZkHtemDE,258
|
| 480 |
+
matplotlib/mpl-data/stylelib/petroff8.mplstyle,sha256=a77Xdci5LARRG90BUMomu6G3gnRZFX5sr2UrBIFxoDc,278
|
| 481 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-bright.mplstyle,sha256=pDqn3-NUyVLvlfkYs8n8HzNZvmslVMChkeH-HtZuJIc,144
|
| 482 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-colorblind.mplstyle,sha256=eCSzFj5_2vR6n5qu1rHE46wvSVGZcdVqz85ov40ZsH8,148
|
| 483 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-dark-palette.mplstyle,sha256=p5ABKNQHRG7bk4HXqMQrRBjDlxGAo3RCXHdQmP7g-Ng,142
|
| 484 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-dark.mplstyle,sha256=I4xQ75vE5_9X4k0cNDiqhhnF3OcrZ2xlPX8Ll7OCkoE,667
|
| 485 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-darkgrid.mplstyle,sha256=2bXOSzS5gmPzRBrRmzVWyhg_7ZaBRQ6t_-O-cRuyZoA,670
|
| 486 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-deep.mplstyle,sha256=44dLcXjjRgR-6yaopgGRInaVgz3jk8VJVQTbBIcxRB0,142
|
| 487 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-muted.mplstyle,sha256=T4o3jvqKD_ImXDkp66XFOV_xrBVFUolJU34JDFk1Xkk,143
|
| 488 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-notebook.mplstyle,sha256=PcvZQbYrDdducrNlavBPmQ1g2minio_9GkUUFRdgtoM,382
|
| 489 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-paper.mplstyle,sha256=n0mboUp2C4Usq2j6tNWcu4TZ_YT4-kKgrYO0t-rz1yw,393
|
| 490 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-pastel.mplstyle,sha256=8nV8qRpbUrnFZeyE6VcQ1oRuZPLil2W74M2U37DNMOE,144
|
| 491 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-poster.mplstyle,sha256=dUaKqTE4MRfUq2rWVXbbou7kzD7Z9PE9Ko8aXLza8JA,403
|
| 492 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-talk.mplstyle,sha256=7FnBaBEdWBbncTm6_ER-EQVa_bZgU7dncgez-ez8R74,403
|
| 493 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-ticks.mplstyle,sha256=CITZmZFUFp40MK2Oz8tI8a7WRoCizQU9Z4J172YWfWw,665
|
| 494 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-white.mplstyle,sha256=WjJ6LEU6rlCwUugToawciAbKP9oERFHr9rfFlUrdTx0,665
|
| 495 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8-whitegrid.mplstyle,sha256=ec4BjsNzmOvHptcJ3mdPxULF3S1_U1EUocuqfIpw-Nk,664
|
| 496 |
+
matplotlib/mpl-data/stylelib/seaborn-v0_8.mplstyle,sha256=_Xu6qXKzi4b3GymCOB1b1-ykKTQ8xhDliZ8ezHGTiAs,1130
|
| 497 |
+
matplotlib/mpl-data/stylelib/tableau-colorblind10.mplstyle,sha256=BsirZVd1LmPWT4tBIz6loZPjZcInoQrIGfC7rvzqmJw,190
|
| 498 |
+
matplotlib/offsetbox.py,sha256=5rwJ63D9zBDMzdHQ3HHbDNT_1V3d2W09zcqi25x20Zw,57758
|
| 499 |
+
matplotlib/offsetbox.pyi,sha256=sPUAlKHtZUSO2CCLgMP_QR7ZPuW156tvnxEr3LxVILo,9946
|
| 500 |
+
matplotlib/patches.py,sha256=iYf67E9Ai879OljtdZjPBD_ukcXQUqywkbYImFert5Y,171615
|
| 501 |
+
matplotlib/patches.pyi,sha256=NiO8MyBQwH2ma97thyPNGHjRreE62kyMhHGvHaZCbsY,23267
|
| 502 |
+
matplotlib/path.py,sha256=XHJs8nZcfEVJ3nnTMnravVYT26DdTpvyCPr7SHme4S8,43936
|
| 503 |
+
matplotlib/path.pyi,sha256=VfIuc2KpkcB28uzRjLvkC3Hq5HwH4Zp0Uyj9H9bwcWU,4808
|
| 504 |
+
matplotlib/patheffects.py,sha256=PfGeLejmBx45hJeqsHih1u4Huwpxum1xu2g70Edp8rI,18443
|
| 505 |
+
matplotlib/patheffects.pyi,sha256=7-FhuxGGrer94GtJ1sZ0YxOmK6Nv4oixTmsKb6-ijOg,3664
|
| 506 |
+
matplotlib/projections/__init__.py,sha256=N0uT3oTBHmlnwEtieKznFg23skkDQzX27uyeryBIL2c,4467
|
| 507 |
+
matplotlib/projections/__init__.pyi,sha256=D28dSYmwZcSBFBtNDer-QqE_lqXAhHKersuAlvi89jE,673
|
| 508 |
+
matplotlib/projections/__pycache__/__init__.cpython-312.pyc,,
|
| 509 |
+
matplotlib/projections/__pycache__/geo.cpython-312.pyc,,
|
| 510 |
+
matplotlib/projections/__pycache__/polar.cpython-312.pyc,,
|
| 511 |
+
matplotlib/projections/geo.py,sha256=feR2dybCylhk6xe-MzxBr_e8MdbpVc8tBtCQQJ0V2co,17605
|
| 512 |
+
matplotlib/projections/geo.pyi,sha256=vPfhvj7_e0ZnKjyfDUNC89RGCktycJBPnn5D8w0A7N8,3775
|
| 513 |
+
matplotlib/projections/polar.py,sha256=gcUElfHBjjtjU6lXQncCvN5PNwpjZKSTjpt6FvrFCU8,55135
|
| 514 |
+
matplotlib/projections/polar.pyi,sha256=IWNSLQIo5cXFBJur5VFVDQBwAtq5n1XFZMnrj85mCBg,6636
|
| 515 |
+
matplotlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 516 |
+
matplotlib/pylab.py,sha256=VqUqd2J2-dKtltZtsYP8ePKoX1jsNDpTyqlcmpfC-lo,2369
|
| 517 |
+
matplotlib/pyplot.py,sha256=LCe1c5rRADTyKGbMdkfOloxW-WJc8PeiiLgA6UkX6lE,155847
|
| 518 |
+
matplotlib/quiver.py,sha256=W-zixDWnCs7QnDSJCQeUuCxnN3b4nVYvJdUy0lcH44E,49106
|
| 519 |
+
matplotlib/quiver.pyi,sha256=eMKbg7y0l4J8VBgy1CDpxjDLWhhOYqO6GeVORWg3AqU,5795
|
| 520 |
+
matplotlib/rcsetup.py,sha256=oFLqxK8hzozbWO5Jw6uVKvTC_14Y82zIt0F5P6ebX1k,119207
|
| 521 |
+
matplotlib/rcsetup.pyi,sha256=V_-bIM0vzYVYNjkD2ils9uZmk-qKb31irca7THD-2Ew,4621
|
| 522 |
+
matplotlib/sankey.py,sha256=eKA9DrX96-bpoWRdeNnvC73aJfPtCnB78WmMPCXQ9rc,36151
|
| 523 |
+
matplotlib/sankey.pyi,sha256=u_bHOcMK8LH2GZ6zzqGaJc1UGEtQ8dQcRZvNeQXXye4,1427
|
| 524 |
+
matplotlib/scale.py,sha256=SABIJGmygEVOtuekj4Zq57FGsn0TlWRP_AnfDpHJ18E,35495
|
| 525 |
+
matplotlib/scale.pyi,sha256=cPbMLWU6xL-Py4s4zDxrp1OBEo96BxPWCnlM9hlX31Q,5349
|
| 526 |
+
matplotlib/sphinxext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 527 |
+
matplotlib/sphinxext/__pycache__/__init__.cpython-312.pyc,,
|
| 528 |
+
matplotlib/sphinxext/__pycache__/figmpl_directive.cpython-312.pyc,,
|
| 529 |
+
matplotlib/sphinxext/__pycache__/mathmpl.cpython-312.pyc,,
|
| 530 |
+
matplotlib/sphinxext/__pycache__/plot_directive.cpython-312.pyc,,
|
| 531 |
+
matplotlib/sphinxext/__pycache__/roles.cpython-312.pyc,,
|
| 532 |
+
matplotlib/sphinxext/figmpl_directive.py,sha256=rgoJcGRfLdp4jiOlyBIwG83wcyfzbFVfrlrSCmDHL9g,9308
|
| 533 |
+
matplotlib/sphinxext/mathmpl.py,sha256=CKIocBSV4prRMPR50NL6WxBTULBa1zReoqo7ZtbvCsc,7871
|
| 534 |
+
matplotlib/sphinxext/plot_directive.py,sha256=ZKq2s2AbrZAsPivXMkbzHPeETJGcyWdDmLIIrq4Cnyw,35592
|
| 535 |
+
matplotlib/sphinxext/roles.py,sha256=uAy1sUB1sMapU4B2yFLyW8FYU2mkSDfP7ZG58ElxBrM,5609
|
| 536 |
+
matplotlib/spines.py,sha256=RDqNg1SofC4EqkQbfWfw0NfPTTvv3YR1c3u5KOMZJ0Q,22227
|
| 537 |
+
matplotlib/spines.pyi,sha256=eceCS47bOawgkWdLUMIPt6XX_H-EtWS2t-euz5Bgkbg,2951
|
| 538 |
+
matplotlib/stackplot.py,sha256=3c9ibnBwOOnYn1pBuySxoVnUrHj8RJMe5t7HV86sYK0,4833
|
| 539 |
+
matplotlib/stackplot.pyi,sha256=BX2g3-6dJ4RhjjIguo-gwWhvKZNYqFCQYVw5SKvpM4c,561
|
| 540 |
+
matplotlib/streamplot.py,sha256=tpZB_prP47QaZ8-9g9RFYb9hXQRI6xiZGo74ZvHl6jc,26778
|
| 541 |
+
matplotlib/streamplot.pyi,sha256=jDfNYCh2aYok6GS21PSFlk0ezXopRSyIqbXLEwdjBI8,2815
|
| 542 |
+
matplotlib/style/__init__.py,sha256=P51W3ycAFKVs50eNiWOxLVeDkcGCU5uvsMGwfJie2ik,8970
|
| 543 |
+
matplotlib/style/__init__.pyi,sha256=0RVt0Dk9OknnJ9hewrTyGMfHO_EcJZfney48T9dpTFM,494
|
| 544 |
+
matplotlib/style/__pycache__/__init__.cpython-312.pyc,,
|
| 545 |
+
matplotlib/style/__pycache__/core.cpython-312.pyc,,
|
| 546 |
+
matplotlib/style/core.py,sha256=pgH4fLy-IbLfe2KShTk4_n9frvysPw0mDCqTifRy2jc,799
|
| 547 |
+
matplotlib/style/core.pyi,sha256=QfFnlkPGbrqjW7mc3jWHbG_wR6IQXL6h0aoEK-jJV9s,674
|
| 548 |
+
matplotlib/table.py,sha256=BhM8vZVP4M60z4JXlR9ocIPFNTjl8ljUzPO7Wns1Pb8,28171
|
| 549 |
+
matplotlib/table.pyi,sha256=Q6eMN5SrC0sO0qlZ-045Yn8OqenbTE1PXSxKh6p0tK0,3083
|
| 550 |
+
matplotlib/testing/__init__.py,sha256=9l4ke9-njOZu5hqefgCTHWSjJrfmhQ3S-CKa1DqdDMg,10544
|
| 551 |
+
matplotlib/testing/__init__.pyi,sha256=4mSZWIYwsor9NeM0bdsLMv76fH4phgb6VXEE0LSlzWM,1851
|
| 552 |
+
matplotlib/testing/__pycache__/__init__.cpython-312.pyc,,
|
| 553 |
+
matplotlib/testing/__pycache__/_markers.cpython-312.pyc,,
|
| 554 |
+
matplotlib/testing/__pycache__/compare.cpython-312.pyc,,
|
| 555 |
+
matplotlib/testing/__pycache__/conftest.cpython-312.pyc,,
|
| 556 |
+
matplotlib/testing/__pycache__/decorators.cpython-312.pyc,,
|
| 557 |
+
matplotlib/testing/__pycache__/exceptions.cpython-312.pyc,,
|
| 558 |
+
matplotlib/testing/__pycache__/widgets.cpython-312.pyc,,
|
| 559 |
+
matplotlib/testing/_markers.py,sha256=0iNyOi25XLv_gTfSUqiRizdSqJzozePPBMRo72H2Je4,1419
|
| 560 |
+
matplotlib/testing/compare.py,sha256=e7b_nY97v_5Of4iST-k4nAVluUCWcpNuC1zIUaliceU,20474
|
| 561 |
+
matplotlib/testing/compare.pyi,sha256=IXB7omMIlVS0eInmpzjAQuNzV_rhJMz2o_py49WE_aA,1238
|
| 562 |
+
matplotlib/testing/conftest.py,sha256=ZMH3YTrAdK3bdxzWN1xPN9IH0DdxeHmRk6wrcTBxhes,7335
|
| 563 |
+
matplotlib/testing/conftest.pyi,sha256=EVFVsenji64J83V9tmiZq9zraUexFXJsiVpSNa8iZUQ,490
|
| 564 |
+
matplotlib/testing/decorators.py,sha256=wwREwt0SazjCrO_hxrEn8C4nFX6tsOfeHdHawOE249s,18592
|
| 565 |
+
matplotlib/testing/decorators.pyi,sha256=zC3dBVlAM0BkvpZB0jxaumvdcdUZBP7qvJdH8bYafbk,879
|
| 566 |
+
matplotlib/testing/exceptions.py,sha256=72QmjiHG7DwxSvlJf8mei-hRit5AH3NKh0-osBo4YbY,138
|
| 567 |
+
matplotlib/testing/jpl_units/Duration.py,sha256=9FMBu9uj6orCWtf23cf6_9HCFUC50xAHrCzaxATwQfM,3966
|
| 568 |
+
matplotlib/testing/jpl_units/Epoch.py,sha256=-FGxeq-VvCS9GVPwOEE5ind_G4Tl9ztD-gYcW9CWzjo,6100
|
| 569 |
+
matplotlib/testing/jpl_units/EpochConverter.py,sha256=fhWjyP567bzcTU_oNuJJpucoolqS88Nt-yEFg1-3yEk,2944
|
| 570 |
+
matplotlib/testing/jpl_units/StrConverter.py,sha256=codGw9b_Zc-MG_YK4CiyMrnMR8ahR9hw836O2SsV8QI,2865
|
| 571 |
+
matplotlib/testing/jpl_units/UnitDbl.py,sha256=ASemBFM4LOzn9i0glZUO0fprYvXm0FJqCsaEPLgLyDg,5886
|
| 572 |
+
matplotlib/testing/jpl_units/UnitDblConverter.py,sha256=B8DssrQVyC4mwvSFP78cGL0vCnZgVhDaAbZE-jsXLUg,2828
|
| 573 |
+
matplotlib/testing/jpl_units/UnitDblFormatter.py,sha256=sFPWK4euTSXOC-wUowUNk8SfWmfel-tc_niNKD1fLpI,658
|
| 574 |
+
matplotlib/testing/jpl_units/__init__.py,sha256=p__9RUwrt2LJ2eoT2JPM-42XLxSJrfA4az3rN5uP6d4,2684
|
| 575 |
+
matplotlib/testing/jpl_units/__pycache__/Duration.cpython-312.pyc,,
|
| 576 |
+
matplotlib/testing/jpl_units/__pycache__/Epoch.cpython-312.pyc,,
|
| 577 |
+
matplotlib/testing/jpl_units/__pycache__/EpochConverter.cpython-312.pyc,,
|
| 578 |
+
matplotlib/testing/jpl_units/__pycache__/StrConverter.cpython-312.pyc,,
|
| 579 |
+
matplotlib/testing/jpl_units/__pycache__/UnitDbl.cpython-312.pyc,,
|
| 580 |
+
matplotlib/testing/jpl_units/__pycache__/UnitDblConverter.cpython-312.pyc,,
|
| 581 |
+
matplotlib/testing/jpl_units/__pycache__/UnitDblFormatter.cpython-312.pyc,,
|
| 582 |
+
matplotlib/testing/jpl_units/__pycache__/__init__.cpython-312.pyc,,
|
| 583 |
+
matplotlib/testing/widgets.py,sha256=62mj2cTyoQ-dDOT66ygP8nW3aebqBFeLLTjUIuAN2ao,3671
|
| 584 |
+
matplotlib/testing/widgets.pyi,sha256=Ioau7Q2aPRDZLx8hze2DOe3E1vn7QPxePC74WMR7tFc,831
|
| 585 |
+
matplotlib/tests/__init__.py,sha256=XyXveEAxafB87gnbx0jkC0MggzKO8FvORq_6RtJRwo4,366
|
| 586 |
+
matplotlib/tests/__pycache__/__init__.cpython-312.pyc,,
|
| 587 |
+
matplotlib/tests/__pycache__/conftest.cpython-312.pyc,,
|
| 588 |
+
matplotlib/tests/__pycache__/test_afm.cpython-312.pyc,,
|
| 589 |
+
matplotlib/tests/__pycache__/test_agg.cpython-312.pyc,,
|
| 590 |
+
matplotlib/tests/__pycache__/test_agg_filter.cpython-312.pyc,,
|
| 591 |
+
matplotlib/tests/__pycache__/test_animation.cpython-312.pyc,,
|
| 592 |
+
matplotlib/tests/__pycache__/test_api.cpython-312.pyc,,
|
| 593 |
+
matplotlib/tests/__pycache__/test_arrow_patches.cpython-312.pyc,,
|
| 594 |
+
matplotlib/tests/__pycache__/test_artist.cpython-312.pyc,,
|
| 595 |
+
matplotlib/tests/__pycache__/test_axes.cpython-312.pyc,,
|
| 596 |
+
matplotlib/tests/__pycache__/test_axis.cpython-312.pyc,,
|
| 597 |
+
matplotlib/tests/__pycache__/test_backend_bases.cpython-312.pyc,,
|
| 598 |
+
matplotlib/tests/__pycache__/test_backend_cairo.cpython-312.pyc,,
|
| 599 |
+
matplotlib/tests/__pycache__/test_backend_gtk3.cpython-312.pyc,,
|
| 600 |
+
matplotlib/tests/__pycache__/test_backend_inline.cpython-312.pyc,,
|
| 601 |
+
matplotlib/tests/__pycache__/test_backend_macosx.cpython-312.pyc,,
|
| 602 |
+
matplotlib/tests/__pycache__/test_backend_nbagg.cpython-312.pyc,,
|
| 603 |
+
matplotlib/tests/__pycache__/test_backend_pdf.cpython-312.pyc,,
|
| 604 |
+
matplotlib/tests/__pycache__/test_backend_pgf.cpython-312.pyc,,
|
| 605 |
+
matplotlib/tests/__pycache__/test_backend_ps.cpython-312.pyc,,
|
| 606 |
+
matplotlib/tests/__pycache__/test_backend_qt.cpython-312.pyc,,
|
| 607 |
+
matplotlib/tests/__pycache__/test_backend_registry.cpython-312.pyc,,
|
| 608 |
+
matplotlib/tests/__pycache__/test_backend_svg.cpython-312.pyc,,
|
| 609 |
+
matplotlib/tests/__pycache__/test_backend_template.cpython-312.pyc,,
|
| 610 |
+
matplotlib/tests/__pycache__/test_backend_tk.cpython-312.pyc,,
|
| 611 |
+
matplotlib/tests/__pycache__/test_backend_tools.cpython-312.pyc,,
|
| 612 |
+
matplotlib/tests/__pycache__/test_backend_webagg.cpython-312.pyc,,
|
| 613 |
+
matplotlib/tests/__pycache__/test_backends_interactive.cpython-312.pyc,,
|
| 614 |
+
matplotlib/tests/__pycache__/test_basic.cpython-312.pyc,,
|
| 615 |
+
matplotlib/tests/__pycache__/test_bbox_tight.cpython-312.pyc,,
|
| 616 |
+
matplotlib/tests/__pycache__/test_bezier.cpython-312.pyc,,
|
| 617 |
+
matplotlib/tests/__pycache__/test_category.cpython-312.pyc,,
|
| 618 |
+
matplotlib/tests/__pycache__/test_cbook.cpython-312.pyc,,
|
| 619 |
+
matplotlib/tests/__pycache__/test_collections.cpython-312.pyc,,
|
| 620 |
+
matplotlib/tests/__pycache__/test_colorbar.cpython-312.pyc,,
|
| 621 |
+
matplotlib/tests/__pycache__/test_colors.cpython-312.pyc,,
|
| 622 |
+
matplotlib/tests/__pycache__/test_compare_images.cpython-312.pyc,,
|
| 623 |
+
matplotlib/tests/__pycache__/test_constrainedlayout.cpython-312.pyc,,
|
| 624 |
+
matplotlib/tests/__pycache__/test_container.cpython-312.pyc,,
|
| 625 |
+
matplotlib/tests/__pycache__/test_contour.cpython-312.pyc,,
|
| 626 |
+
matplotlib/tests/__pycache__/test_cycles.cpython-312.pyc,,
|
| 627 |
+
matplotlib/tests/__pycache__/test_dates.cpython-312.pyc,,
|
| 628 |
+
matplotlib/tests/__pycache__/test_datetime.cpython-312.pyc,,
|
| 629 |
+
matplotlib/tests/__pycache__/test_determinism.cpython-312.pyc,,
|
| 630 |
+
matplotlib/tests/__pycache__/test_doc.cpython-312.pyc,,
|
| 631 |
+
matplotlib/tests/__pycache__/test_dviread.cpython-312.pyc,,
|
| 632 |
+
matplotlib/tests/__pycache__/test_figure.cpython-312.pyc,,
|
| 633 |
+
matplotlib/tests/__pycache__/test_font_manager.cpython-312.pyc,,
|
| 634 |
+
matplotlib/tests/__pycache__/test_fontconfig_pattern.cpython-312.pyc,,
|
| 635 |
+
matplotlib/tests/__pycache__/test_ft2font.cpython-312.pyc,,
|
| 636 |
+
matplotlib/tests/__pycache__/test_getattr.cpython-312.pyc,,
|
| 637 |
+
matplotlib/tests/__pycache__/test_gridspec.cpython-312.pyc,,
|
| 638 |
+
matplotlib/tests/__pycache__/test_image.cpython-312.pyc,,
|
| 639 |
+
matplotlib/tests/__pycache__/test_legend.cpython-312.pyc,,
|
| 640 |
+
matplotlib/tests/__pycache__/test_lines.cpython-312.pyc,,
|
| 641 |
+
matplotlib/tests/__pycache__/test_marker.cpython-312.pyc,,
|
| 642 |
+
matplotlib/tests/__pycache__/test_mathtext.cpython-312.pyc,,
|
| 643 |
+
matplotlib/tests/__pycache__/test_matplotlib.cpython-312.pyc,,
|
| 644 |
+
matplotlib/tests/__pycache__/test_mlab.cpython-312.pyc,,
|
| 645 |
+
matplotlib/tests/__pycache__/test_multivariate_colormaps.cpython-312.pyc,,
|
| 646 |
+
matplotlib/tests/__pycache__/test_offsetbox.cpython-312.pyc,,
|
| 647 |
+
matplotlib/tests/__pycache__/test_patches.cpython-312.pyc,,
|
| 648 |
+
matplotlib/tests/__pycache__/test_path.cpython-312.pyc,,
|
| 649 |
+
matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc,,
|
| 650 |
+
matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc,,
|
| 651 |
+
matplotlib/tests/__pycache__/test_png.cpython-312.pyc,,
|
| 652 |
+
matplotlib/tests/__pycache__/test_polar.cpython-312.pyc,,
|
| 653 |
+
matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc,,
|
| 654 |
+
matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc,,
|
| 655 |
+
matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc,,
|
| 656 |
+
matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc,,
|
| 657 |
+
matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc,,
|
| 658 |
+
matplotlib/tests/__pycache__/test_scale.cpython-312.pyc,,
|
| 659 |
+
matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc,,
|
| 660 |
+
matplotlib/tests/__pycache__/test_skew.cpython-312.pyc,,
|
| 661 |
+
matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc,,
|
| 662 |
+
matplotlib/tests/__pycache__/test_spines.cpython-312.pyc,,
|
| 663 |
+
matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc,,
|
| 664 |
+
matplotlib/tests/__pycache__/test_style.cpython-312.pyc,,
|
| 665 |
+
matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc,,
|
| 666 |
+
matplotlib/tests/__pycache__/test_table.cpython-312.pyc,,
|
| 667 |
+
matplotlib/tests/__pycache__/test_testing.cpython-312.pyc,,
|
| 668 |
+
matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc,,
|
| 669 |
+
matplotlib/tests/__pycache__/test_text.cpython-312.pyc,,
|
| 670 |
+
matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc,,
|
| 671 |
+
matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc,,
|
| 672 |
+
matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc,,
|
| 673 |
+
matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc,,
|
| 674 |
+
matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc,,
|
| 675 |
+
matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc,,
|
| 676 |
+
matplotlib/tests/__pycache__/test_units.cpython-312.pyc,,
|
| 677 |
+
matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc,,
|
| 678 |
+
matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc,,
|
| 679 |
+
matplotlib/tests/conftest.py,sha256=-wk-4brT25WVZEZCj59fRBIFW9_groxH7EgYL_b3ZE4,155
|
| 680 |
+
matplotlib/tests/test_afm.py,sha256=WZB9QYtEkBMotwXDZJEgwQXw6i5IWhzU_9FqmRAuYdg,4072
|
| 681 |
+
matplotlib/tests/test_agg.py,sha256=VhwUw_uLwqONIa3UwFEVcOkhKV-Olis4vR5cIbUF6Yw,12561
|
| 682 |
+
matplotlib/tests/test_agg_filter.py,sha256=mknYVGVgI-POUQd_gqP8dQQomKY3O3-Tu7-M3k58rjk,984
|
| 683 |
+
matplotlib/tests/test_animation.py,sha256=9ZvmizKShfyXZIh-lDs65ezIyeMVHIn8d7bWZ6E8u6s,18516
|
| 684 |
+
matplotlib/tests/test_api.py,sha256=MOlSZePFYQvGPVhUYDgkoV8W6K46h2KQwnQQAE-xMFw,6494
|
| 685 |
+
matplotlib/tests/test_arrow_patches.py,sha256=xX6TUk0w9hPV3YsDVd7jOwTDbavgi0-IB1vxNL4Tk9E,7988
|
| 686 |
+
matplotlib/tests/test_artist.py,sha256=K5ag8nugMwqWU--nYvxdyyrobQ4z4zZxArchkA1OUsg,19290
|
| 687 |
+
matplotlib/tests/test_axes.py,sha256=NvKX0AJShCK88pJL6mkKffR3skjY4XCPgiCyc_1RgHo,356880
|
| 688 |
+
matplotlib/tests/test_axis.py,sha256=QAH258GGIigGjy0ndWddiuulLcZSv6FUEsm1h2jVvNQ,5165
|
| 689 |
+
matplotlib/tests/test_backend_bases.py,sha256=WyFbrdDGZSefXTXwKlOr0Lg0gYrjLYzRgPxPcQcTjyQ,22744
|
| 690 |
+
matplotlib/tests/test_backend_cairo.py,sha256=YgEerdgqV7WgBwlHgez7Hiir4CsiHoyOFNqwgpItv4U,1958
|
| 691 |
+
matplotlib/tests/test_backend_gtk3.py,sha256=YPsko8sYsWBT32tGZqbfursB21nXP_CtcbVLf1cyxI0,1154
|
| 692 |
+
matplotlib/tests/test_backend_inline.py,sha256=Jz1kXYX2GxGqXGbDxM7Qf42nSofER3LoXouUeETA5Pc,1613
|
| 693 |
+
matplotlib/tests/test_backend_macosx.py,sha256=spE9GsdCAhyVUTrt8qI-_GiTh8Zxs6yVu_-WeODZF4E,3654
|
| 694 |
+
matplotlib/tests/test_backend_nbagg.py,sha256=nnOBu3CCrOkzNR4J0ip3Z-kwzH1H8KSl0pYJ3JP5jNM,1464
|
| 695 |
+
matplotlib/tests/test_backend_pdf.py,sha256=MqlEOr-6zV_wz-gw48lTFAsbVMjXi4FFsOOhUFbxZVE,25905
|
| 696 |
+
matplotlib/tests/test_backend_pgf.py,sha256=0UOyptCSCfw8cZLz2s-YKjUByF6NPPxscFqqxy1qmJg,14545
|
| 697 |
+
matplotlib/tests/test_backend_ps.py,sha256=ciSempEz1VQi1Z25fkxVUIROb6GgaE9tFITojIK0jCc,14127
|
| 698 |
+
matplotlib/tests/test_backend_qt.py,sha256=lWEszrp1-wLi83-r2iCPgvEOeFTY7M0gU_jfuOaomPk,13083
|
| 699 |
+
matplotlib/tests/test_backend_registry.py,sha256=INoas9_cgejBS9BlFJxjPTeWdEhqxL8XRcuc-isUK7k,5517
|
| 700 |
+
matplotlib/tests/test_backend_svg.py,sha256=Z9ofPheKm8nlK2WAu6qoKnPCzS1fbSHd1SectbFWcGo,23081
|
| 701 |
+
matplotlib/tests/test_backend_template.py,sha256=uuE7oZ9pSBVDWrPL05B0WgCFsgv6HlXyetuPTfJn6a8,2184
|
| 702 |
+
matplotlib/tests/test_backend_tk.py,sha256=ItkWudKTXvXKAzN0CheP3JnSpCqrC6tvRqonRGNyBNk,10729
|
| 703 |
+
matplotlib/tests/test_backend_tools.py,sha256=C-B7NCkyWsQ5KzQEnI5Be16DsAHHZJU9P5v9--wsF-o,501
|
| 704 |
+
matplotlib/tests/test_backend_webagg.py,sha256=xnEMmsz2vBiglpqg9IDh1gCGdGhxotgZpEinZn9W-Bg,2880
|
| 705 |
+
matplotlib/tests/test_backends_interactive.py,sha256=o1pS1bxn-x-kTq5JmTKUM01etYONGnuE1mSLKML3UXs,30051
|
| 706 |
+
matplotlib/tests/test_basic.py,sha256=Z2uMYhSeba3nYenou8utSATSEq4LjYvm_V9V6wKabFk,1117
|
| 707 |
+
matplotlib/tests/test_bbox_tight.py,sha256=u4GzDkXNfKlUM6np2uGxxnhByij2nU_fhrwk7Wuib48,7181
|
| 708 |
+
matplotlib/tests/test_bezier.py,sha256=4p-MnIIGD7Eok0hvYkZkrW0IW3ewa8rDs3epg0pvfoY,1719
|
| 709 |
+
matplotlib/tests/test_category.py,sha256=p95i0_PMP2XiKjgNSkoek-fn_bVajw1TnT7H29o3yTI,12025
|
| 710 |
+
matplotlib/tests/test_cbook.py,sha256=dbRtnPBqQDhjgkiv6NMoCbHm_wcRMfHYDZYHo-ErZCQ,39686
|
| 711 |
+
matplotlib/tests/test_collections.py,sha256=A-IZKijRjS-Ll6qXZngK8dcO5U91msQmBFzqLB-nwOg,55601
|
| 712 |
+
matplotlib/tests/test_colorbar.py,sha256=5JEigSYqmGCbe6-jBrsfYPmy2JmQgcZhxfqZVvLZ2sA,47196
|
| 713 |
+
matplotlib/tests/test_colors.py,sha256=JyesmQZtSznT7MOE_ywLcGczmBevhGOLyB-efxDpqDU,80824
|
| 714 |
+
matplotlib/tests/test_compare_images.py,sha256=JPXiDfFwvu8eso2KYgK6S5UKuVvm5u0hs9dHD8uTaAU,4592
|
| 715 |
+
matplotlib/tests/test_constrainedlayout.py,sha256=ZNJZhikXXzJB-mrXUQZup_OPM5jWHu-p6AB_6kaOYsw,28421
|
| 716 |
+
matplotlib/tests/test_container.py,sha256=H9CeLRsp0dzUboDigZIx9DA-G3npSEkrLxVWWwxEeWI,1957
|
| 717 |
+
matplotlib/tests/test_contour.py,sha256=VPVF6Zl_AObq9vPMm-Verm_naCdaxCrpAa7wrmsoI88,32367
|
| 718 |
+
matplotlib/tests/test_cycles.py,sha256=3KyRmWH29WUgvIXUT06tKVDNCfDWqxuxlLueIp-FIl0,5996
|
| 719 |
+
matplotlib/tests/test_dates.py,sha256=eqHrRKOopQZAQywgiP1YBr8oVJnEVqrrhp9kTviOPqU,56606
|
| 720 |
+
matplotlib/tests/test_datetime.py,sha256=kEiYIr28ubqbOqtxJGfFuHUxlZfObisl06RNHYh6R_o,33143
|
| 721 |
+
matplotlib/tests/test_determinism.py,sha256=o1QtL1reYF0QkT7AXalnycViess_-fEcT8jSPzCWYnM,8453
|
| 722 |
+
matplotlib/tests/test_doc.py,sha256=E76qBVlnA5jCH8Ma4DBozhzrEp9Jzqr3qsITIUIY7bY,1024
|
| 723 |
+
matplotlib/tests/test_dviread.py,sha256=xkAS9zDhVSDbjqeDEI-Tx_xOpxJsEd7kwmOkP5HtZf8,5434
|
| 724 |
+
matplotlib/tests/test_figure.py,sha256=cGWFgSr5bKGfnZ8YD-4ZmCvjKqk15L7mYwH6uHmPhFI,62502
|
| 725 |
+
matplotlib/tests/test_font_manager.py,sha256=cJVzyKUH8zP9hgQGLVc6N05Qk3d_r1IuIoW82-INbPo,23064
|
| 726 |
+
matplotlib/tests/test_fontconfig_pattern.py,sha256=LSR6lWF_0cVOshkGiflYaTCLcISRIJM6mjXm5QtDjX4,2168
|
| 727 |
+
matplotlib/tests/test_ft2font.py,sha256=TqQW2qeOcxYUz5qCAY5CVxtvS844LPsBNxteNmToJuE,45214
|
| 728 |
+
matplotlib/tests/test_getattr.py,sha256=NLejbWy-RCP-Iz5fWPdL3QmMguAL7C1qr-U_fDmKhtA,2065
|
| 729 |
+
matplotlib/tests/test_gridspec.py,sha256=BhItYiH_21kQNZlUNDJoGZXX2Ebq3FhjaaJ4OrHIP1Q,2212
|
| 730 |
+
matplotlib/tests/test_image.py,sha256=Hjxor7o6Io8FpHbgce_-TqGwV6rQPIinBREqkf8c1_A,73411
|
| 731 |
+
matplotlib/tests/test_legend.py,sha256=WT_ILqZ1FLqBmNvHBJCSS-2o7rbnbEqffW-gbYKFP2c,66808
|
| 732 |
+
matplotlib/tests/test_lines.py,sha256=Ygk7Jk-VK-9OwBZ-Mvv72PIw4gVcMi20mQNJB5QipzA,15883
|
| 733 |
+
matplotlib/tests/test_marker.py,sha256=GviPXabZAZ3v3ZJt8dQHz03Unyi_3QscaKK7jSIO7hk,11505
|
| 734 |
+
matplotlib/tests/test_mathtext.py,sha256=HlF0OH_0Yjy_RguZpn0WdETcwa5ftFisDanH5ZPuiQA,28659
|
| 735 |
+
matplotlib/tests/test_matplotlib.py,sha256=oX_W2oqPkYQWtFPHQ3mjI-ELkEN9I9_XfFByHn3xZRs,5321
|
| 736 |
+
matplotlib/tests/test_mlab.py,sha256=3Oz6fSvUYpe-ChSthSB_D1K8AuvLw-2__xx0G0PpVSg,42740
|
| 737 |
+
matplotlib/tests/test_multivariate_colormaps.py,sha256=VaObR7nLIf7oW7xJWaBYnb1MgX3lZ3xN4I7Q7wivBAo,22004
|
| 738 |
+
matplotlib/tests/test_offsetbox.py,sha256=a7cro-a-6zIspkzC7L4r-R9LsDccslTP_iITx6toYp0,18061
|
| 739 |
+
matplotlib/tests/test_patches.py,sha256=bGcMfmb-O2bCTOIyj2IJwGbQTTZ_iUKBcaOBqAscZT4,40579
|
| 740 |
+
matplotlib/tests/test_path.py,sha256=IxNUfgAsfWjJ9kbSD03P9sMFBAmkYMOa55q9pOQrMtQ,25154
|
| 741 |
+
matplotlib/tests/test_patheffects.py,sha256=e6KR0v07Wqpz6qrZik4oU27i_i1ceO1xMR3AeUcnrRI,8611
|
| 742 |
+
matplotlib/tests/test_pickle.py,sha256=9BMlxVkpA1a1z9anAbT12dieNeON33KLlVELzLozZuw,9535
|
| 743 |
+
matplotlib/tests/test_png.py,sha256=Z5ItDAIjJpU0sgZ1xyWfsMFCMFaR9ALraqrOldaappc,1272
|
| 744 |
+
matplotlib/tests/test_polar.py,sha256=q-2dCRGDfNOHHV4-4iiCFG7TPKz0Yw-XUfZ1OFKDRBM,22224
|
| 745 |
+
matplotlib/tests/test_preprocess_data.py,sha256=FNx1TlPNCjkbqwPuGQ_RHbkcwzeNkBemoE-iFh2Glcw,11327
|
| 746 |
+
matplotlib/tests/test_pyplot.py,sha256=k5u9e2RqNbx-sgqe1JfuhXwKWTHRedVYpfUkoc8us5Q,16820
|
| 747 |
+
matplotlib/tests/test_quiver.py,sha256=MTwIhlIhIn6af6y6uB_ySMnhXFa5WfHGgLdE20u0gbA,12193
|
| 748 |
+
matplotlib/tests/test_rcparams.py,sha256=udRLBCz-uYZEHxWJ1E9A0GqLF47hSVV12CZvzcIooSg,27232
|
| 749 |
+
matplotlib/tests/test_sankey.py,sha256=78K4h0A8IW6YOKEIhbUHqbey4TopWi6iXriyr1AjUkA,3883
|
| 750 |
+
matplotlib/tests/test_scale.py,sha256=zwaqvkGiG5x_eCuYA7rsssL0mHHIDYcC9hVPnD6HtHs,15545
|
| 751 |
+
matplotlib/tests/test_simplification.py,sha256=YXbnai9WWzEpQJm8SsyL-EgK6D_EVPaeLCU1dR3B8EY,21852
|
| 752 |
+
matplotlib/tests/test_skew.py,sha256=GGKc9kPpE6z33fl-WlKUr0tL0UzdtWa-Z6Qt4X_dxW8,6397
|
| 753 |
+
matplotlib/tests/test_sphinxext.py,sha256=KNmfXJ8BNisSazyyiUkm3JLVn9lg6wLdHLw-3XenufA,11743
|
| 754 |
+
matplotlib/tests/test_spines.py,sha256=J9ansYiGJOVap5VUlMreASkUONkd3fyjnJUsFO2Gi5Q,6583
|
| 755 |
+
matplotlib/tests/test_streamplot.py,sha256=vWfB02KZhhfXFYFzm00ZkiDk01sF06FZx-ju0ibLIX4,8150
|
| 756 |
+
matplotlib/tests/test_style.py,sha256=a41bWE7aFsSRtzuc6z3LpOF1c2t5i_vK2dWLM0VZ-WE,7040
|
| 757 |
+
matplotlib/tests/test_subplots.py,sha256=Ch-emSStITK9myroAo6PxAqLmCSOm7KrWnqC3YPPvT8,11061
|
| 758 |
+
matplotlib/tests/test_table.py,sha256=d1nHDbzGZH9yQLxNceJMhdGKtUVS55M5RzOSq6nmpjs,8678
|
| 759 |
+
matplotlib/tests/test_testing.py,sha256=ZOiZey8Qvk6UBqRRxtTqP1GLtcQjMF6W__qif_Z2SCQ,865
|
| 760 |
+
matplotlib/tests/test_texmanager.py,sha256=2xae7Qym_PzPh4G7bN3TSXjTRCxtrsOlTctgVryRbuY,2678
|
| 761 |
+
matplotlib/tests/test_text.py,sha256=qvYCJEnZSxxd25SUBEVwWWaecbQVEqswnTJcXjqSzMY,45636
|
| 762 |
+
matplotlib/tests/test_textpath.py,sha256=WLXvT5OzE6Tew4pr87LH-cgioCzM7srgMNRemiMEC5o,271
|
| 763 |
+
matplotlib/tests/test_ticker.py,sha256=sCFNsjJRw5_KJjKClxDLo4CQQgfyUHnShyUPcHQLZOo,78180
|
| 764 |
+
matplotlib/tests/test_tightlayout.py,sha256=_UDO90u3uPC6Yt1D_AJPEjuMj8Xoz1Bt_ViwRk0hriY,13974
|
| 765 |
+
matplotlib/tests/test_transforms.py,sha256=juTMxd6enryTFW1saeDjgYNXLG2otrjNqkctYTXHGJg,49456
|
| 766 |
+
matplotlib/tests/test_triangulation.py,sha256=Km7FiD6ujmmHHw8PvDPeVPFkDr_QWeyx9p_ROa_7Ols,55368
|
| 767 |
+
matplotlib/tests/test_type1font.py,sha256=QidcU7R8kKffHkz1KxBBilRrW9ONN6hhVK5oT46cllg,9151
|
| 768 |
+
matplotlib/tests/test_units.py,sha256=gbADzgyVZNcATjTceMIGr6ced-HlKBYhPiap120kBng,11687
|
| 769 |
+
matplotlib/tests/test_usetex.py,sha256=DZvlXEygFE0E9kNku6DOvR2fYvoIuhw35ytMm5zY1Og,9504
|
| 770 |
+
matplotlib/tests/test_widgets.py,sha256=dO5cK_8dGYmMUSEO-J_u_9cQWw_f8VuwWG3Xd7zemy8,72294
|
| 771 |
+
matplotlib/texmanager.py,sha256=39qbB7wm2OMBcFFDRRBvU6qcjpDj_gX2jE5lcMF9yAY,15489
|
| 772 |
+
matplotlib/texmanager.pyi,sha256=di3gbC9muXKTo5VCrW5ye-e19A1mrOl8e8lvI3b904A,1116
|
| 773 |
+
matplotlib/text.py,sha256=Dh8BXXhD8nr2y-kJu8423I9gL8864H32w-M65UyvC5s,81539
|
| 774 |
+
matplotlib/text.pyi,sha256=fkD1ABkqrkd8BpqmuJdtyY-boaNyO7g5geQ9RVLnboo,7664
|
| 775 |
+
matplotlib/textpath.py,sha256=ZYxTKyPVHEOwHR7RBO723L2CYTqTVPCmGwCxTc6-RhI,12709
|
| 776 |
+
matplotlib/textpath.pyi,sha256=L__fm9BMpxX3IimGbWGWnImzeQukCmYZxxqK8vlzeIo,2740
|
| 777 |
+
matplotlib/ticker.py,sha256=SdRYahikSIOHQRsWjYBku2Dh9Z1HjhOZZeL3zvUJ4q0,114435
|
| 778 |
+
matplotlib/ticker.pyi,sha256=8_I2_U8WR923XMyN4BUltbP3Wn1iLSDoIEo66OM8OtI,10671
|
| 779 |
+
matplotlib/transforms.py,sha256=EJvSwlqoOVzSXBGpSjrHim8MbaPbBFAPSGzDlnpr4Og,102198
|
| 780 |
+
matplotlib/transforms.pyi,sha256=adpr1xkd1U_sUPru2lBHCjTBhkCxfCjYAUxjoAS7D6w,13822
|
| 781 |
+
matplotlib/tri/__init__.py,sha256=asnfefKRpJv7sGbfddCMybnJInVDPwgph7g0mpoh2u4,820
|
| 782 |
+
matplotlib/tri/__pycache__/__init__.cpython-312.pyc,,
|
| 783 |
+
matplotlib/tri/__pycache__/_triangulation.cpython-312.pyc,,
|
| 784 |
+
matplotlib/tri/__pycache__/_tricontour.cpython-312.pyc,,
|
| 785 |
+
matplotlib/tri/__pycache__/_trifinder.cpython-312.pyc,,
|
| 786 |
+
matplotlib/tri/__pycache__/_triinterpolate.cpython-312.pyc,,
|
| 787 |
+
matplotlib/tri/__pycache__/_tripcolor.cpython-312.pyc,,
|
| 788 |
+
matplotlib/tri/__pycache__/_triplot.cpython-312.pyc,,
|
| 789 |
+
matplotlib/tri/__pycache__/_trirefine.cpython-312.pyc,,
|
| 790 |
+
matplotlib/tri/__pycache__/_tritools.cpython-312.pyc,,
|
| 791 |
+
matplotlib/tri/_triangulation.py,sha256=Ur2lKMOx4NrZxwyi0hBeBnVzicuKaCke0NkrZneSklM,9784
|
| 792 |
+
matplotlib/tri/_triangulation.pyi,sha256=pVw1rvpIcl00p7V7E9GcvJSqQWyoxlZXX_p0_VSxTiY,1017
|
| 793 |
+
matplotlib/tri/_tricontour.py,sha256=yxeH8QgBub1nTq9qbO5Iiiz81bcLXDeMcJHUS2Ahmns,10220
|
| 794 |
+
matplotlib/tri/_tricontour.pyi,sha256=jnsAmVRX0-FOUw9ptUgci9J4T4JQRloKeH8fh8aAi-o,1155
|
| 795 |
+
matplotlib/tri/_trifinder.py,sha256=3gUzJZDIwfdsSJUE8hIKso9e1-UGvynUN9HxaqC1EEc,3522
|
| 796 |
+
matplotlib/tri/_trifinder.pyi,sha256=dXcZucacAS3Ch6nrDBPh2e3LYZLfZ7VwqpBUBb-vMPo,405
|
| 797 |
+
matplotlib/tri/_triinterpolate.py,sha256=x4rKdM_W2rpo2o8ZbWKnbStegiISI1kwVfzumdAFEXE,62445
|
| 798 |
+
matplotlib/tri/_triinterpolate.pyi,sha256=nR0o0Jm0uPH-6l0ft1WRHqYlq-6o84X6M0aX1UJ9IvE,1044
|
| 799 |
+
matplotlib/tri/_tripcolor.py,sha256=R6z_Xb18njuLBukDYi5z0HDVOUMfYJd5KM-pSotaUxI,6818
|
| 800 |
+
matplotlib/tri/_tripcolor.pyi,sha256=QsA-A2ohj3r_tAElt2-9pzi47JiU01tNlRPDIptqnh4,1781
|
| 801 |
+
matplotlib/tri/_triplot.py,sha256=jlHSz36Z5S18zBKc639PlSqdhfl7jHol8ExlddJuDI4,3102
|
| 802 |
+
matplotlib/tri/_triplot.pyi,sha256=9USU-BfitrcdQE8yWOUlBX59QBNoHCWivDon9JbDQ0k,446
|
| 803 |
+
matplotlib/tri/_trirefine.py,sha256=ZMlWypiRCO2J55N5Pp9S6m5BlToHx-xqDBFMpFzOsbA,13179
|
| 804 |
+
matplotlib/tri/_trirefine.pyi,sha256=J_PmjbeI6UbLaeecgj1OCvGe_sr9UUsNK9NGBSlQ320,1056
|
| 805 |
+
matplotlib/tri/_tritools.py,sha256=wC9KVE6UqkWVHpyW9FU4hQdqRVRVmJlhaBF1EXsaD8U,10575
|
| 806 |
+
matplotlib/tri/_tritools.pyi,sha256=XWwwvH2nIAmH8k59aRjnLBVQbTwKvd_FzdsRNASCJMw,402
|
| 807 |
+
matplotlib/typing.py,sha256=GUTVrSUUihZUK7e2S46hSI4TLYor8NKYtll3Q4WNs44,16100
|
| 808 |
+
matplotlib/units.py,sha256=7O-llc8k3GpdotUs2tWcEGgoUHHX-Y7o0R7f-1Jve3k,6429
|
| 809 |
+
matplotlib/widgets.py,sha256=C59Pcj4zEttRs0jf3LLO7pU7NO5aRhE_ft0dVNuJZXs,165076
|
| 810 |
+
matplotlib/widgets.pyi,sha256=OSsBf5e6HtB_q_Gy1JKE7AhXK1JhwH_PnhCJ4Lf-sNs,15923
|
| 811 |
+
mpl_toolkits/axes_grid1/__init__.py,sha256=wiuUCQo1g20SW5T3mFOmI9dGCJY6aDmglpQw5DfszEU,371
|
| 812 |
+
mpl_toolkits/axes_grid1/__pycache__/__init__.cpython-312.pyc,,
|
| 813 |
+
mpl_toolkits/axes_grid1/__pycache__/anchored_artists.cpython-312.pyc,,
|
| 814 |
+
mpl_toolkits/axes_grid1/__pycache__/axes_divider.cpython-312.pyc,,
|
| 815 |
+
mpl_toolkits/axes_grid1/__pycache__/axes_grid.cpython-312.pyc,,
|
| 816 |
+
mpl_toolkits/axes_grid1/__pycache__/axes_rgb.cpython-312.pyc,,
|
| 817 |
+
mpl_toolkits/axes_grid1/__pycache__/axes_size.cpython-312.pyc,,
|
| 818 |
+
mpl_toolkits/axes_grid1/__pycache__/inset_locator.cpython-312.pyc,,
|
| 819 |
+
mpl_toolkits/axes_grid1/__pycache__/mpl_axes.cpython-312.pyc,,
|
| 820 |
+
mpl_toolkits/axes_grid1/__pycache__/parasite_axes.cpython-312.pyc,,
|
| 821 |
+
mpl_toolkits/axes_grid1/anchored_artists.py,sha256=ZrOE3RiyT2ryUJ3gVqKxMynwJR28VtOZNKVZLIL29-c,17164
|
| 822 |
+
mpl_toolkits/axes_grid1/axes_divider.py,sha256=1HdcmRGLNJLqzB2P4TnzDLILEgT5OyAE1h0ewLyqrE0,21894
|
| 823 |
+
mpl_toolkits/axes_grid1/axes_grid.py,sha256=-jbfcf4CsKyrDymbkoEO5Nz1J_eytfGjRccD8xfnrU8,22631
|
| 824 |
+
mpl_toolkits/axes_grid1/axes_rgb.py,sha256=pabgaWJuLTCPw2FlT6Zfy5d0_95CEvaLeosWRTElR98,5227
|
| 825 |
+
mpl_toolkits/axes_grid1/axes_size.py,sha256=HRyPYDXlhj426dovCWx6oWng1JJd4t2fpVFN0MLGS2M,7714
|
| 826 |
+
mpl_toolkits/axes_grid1/inset_locator.py,sha256=VzUWJ_CRtx8-tnU0szFzmxoipXS6jr3Aa6F4LlweEVk,19906
|
| 827 |
+
mpl_toolkits/axes_grid1/mpl_axes.py,sha256=vFCttnj9JIgY3Mt2eOi-O_FVvdZ6SW_sBtIBFib6bz4,4251
|
| 828 |
+
mpl_toolkits/axes_grid1/parasite_axes.py,sha256=5X0KNsH2qyquv159imnSqEw_fGUfe2n0L3PZQFK8AMQ,9489
|
| 829 |
+
mpl_toolkits/axes_grid1/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
|
| 830 |
+
mpl_toolkits/axes_grid1/tests/__pycache__/__init__.cpython-312.pyc,,
|
| 831 |
+
mpl_toolkits/axes_grid1/tests/__pycache__/conftest.cpython-312.pyc,,
|
| 832 |
+
mpl_toolkits/axes_grid1/tests/__pycache__/test_axes_grid1.cpython-312.pyc,,
|
| 833 |
+
mpl_toolkits/axes_grid1/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
|
| 834 |
+
mpl_toolkits/axes_grid1/tests/test_axes_grid1.py,sha256=rTTELyuC4pMYXgTW46tcRto1PAg_LCgP3Vy52G74ETY,29149
|
| 835 |
+
mpl_toolkits/axisartist/__init__.py,sha256=RPaNDl22FbmDP7ZRsku1yCqpoNqcclCk0a3rXj3G7fE,631
|
| 836 |
+
mpl_toolkits/axisartist/__pycache__/__init__.cpython-312.pyc,,
|
| 837 |
+
mpl_toolkits/axisartist/__pycache__/angle_helper.cpython-312.pyc,,
|
| 838 |
+
mpl_toolkits/axisartist/__pycache__/axes_divider.cpython-312.pyc,,
|
| 839 |
+
mpl_toolkits/axisartist/__pycache__/axis_artist.cpython-312.pyc,,
|
| 840 |
+
mpl_toolkits/axisartist/__pycache__/axisline_style.cpython-312.pyc,,
|
| 841 |
+
mpl_toolkits/axisartist/__pycache__/axislines.cpython-312.pyc,,
|
| 842 |
+
mpl_toolkits/axisartist/__pycache__/floating_axes.cpython-312.pyc,,
|
| 843 |
+
mpl_toolkits/axisartist/__pycache__/grid_finder.cpython-312.pyc,,
|
| 844 |
+
mpl_toolkits/axisartist/__pycache__/grid_helper_curvelinear.cpython-312.pyc,,
|
| 845 |
+
mpl_toolkits/axisartist/__pycache__/parasite_axes.cpython-312.pyc,,
|
| 846 |
+
mpl_toolkits/axisartist/angle_helper.py,sha256=XWpJgc2aI5TcfMTe8LXCKQo3itMYrFV-N-OqP9qEDU8,13075
|
| 847 |
+
mpl_toolkits/axisartist/axes_divider.py,sha256=65xSCQ9cHSC3KE7J7HxS4bfsDTAbPmwyz1jJ43BqnBs,122
|
| 848 |
+
mpl_toolkits/axisartist/axis_artist.py,sha256=FKZa4dV2XFRUduHUPDFI1bmD9O-HMHnSgowmFpgCmmI,39652
|
| 849 |
+
mpl_toolkits/axisartist/axisline_style.py,sha256=_M3Y-UdwLMTy25rhMnhFQtPRSf9q4czeSCJnh3d2h5I,6698
|
| 850 |
+
mpl_toolkits/axisartist/axislines.py,sha256=0sNXeYuD5ADSSQH445AwXRnY3sbGAetqJkhZL0O_pT4,16217
|
| 851 |
+
mpl_toolkits/axisartist/floating_axes.py,sha256=uFYqo5KvXwzWn1IT8HDIyjG3hK0R04DVifQCOMeDHYo,9995
|
| 852 |
+
mpl_toolkits/axisartist/grid_finder.py,sha256=oiiDAXGt9OUa_geD1Y9zWaLkok6ABZkT-ZP6kFyLawI,12734
|
| 853 |
+
mpl_toolkits/axisartist/grid_helper_curvelinear.py,sha256=aU65Cnj9vEJylDDFpauYIIIJhaQFg1BGVzSuK6zi7so,13506
|
| 854 |
+
mpl_toolkits/axisartist/parasite_axes.py,sha256=Ydi4-0Lbczr6K7Sz1-fRwK4Tm8KlHrOIumx67Xbo_9c,244
|
| 855 |
+
mpl_toolkits/axisartist/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
|
| 856 |
+
mpl_toolkits/axisartist/tests/__pycache__/__init__.cpython-312.pyc,,
|
| 857 |
+
mpl_toolkits/axisartist/tests/__pycache__/conftest.cpython-312.pyc,,
|
| 858 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_angle_helper.cpython-312.pyc,,
|
| 859 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_axis_artist.cpython-312.pyc,,
|
| 860 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_axislines.cpython-312.pyc,,
|
| 861 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_floating_axes.cpython-312.pyc,,
|
| 862 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_grid_finder.cpython-312.pyc,,
|
| 863 |
+
mpl_toolkits/axisartist/tests/__pycache__/test_grid_helper_curvelinear.cpython-312.pyc,,
|
| 864 |
+
mpl_toolkits/axisartist/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
|
| 865 |
+
mpl_toolkits/axisartist/tests/test_angle_helper.py,sha256=PwhJwBm2kk4uMyhdO5arQs8IlqSX2vN0hvUzI7YHqrw,5670
|
| 866 |
+
mpl_toolkits/axisartist/tests/test_axis_artist.py,sha256=wXS2DUOvE6KkJeH6ZtMW6zXOiarfy2leqGKD8A-XGfQ,3707
|
| 867 |
+
mpl_toolkits/axisartist/tests/test_axislines.py,sha256=iIYs5evzQ3BwXetimfXNZ5ELjtIsq8HRojYwaZfvRK0,4619
|
| 868 |
+
mpl_toolkits/axisartist/tests/test_floating_axes.py,sha256=LzcunaAVpCqMIUdKDaO2Pzr6S1OPru86t_9zWgSWpy4,4644
|
| 869 |
+
mpl_toolkits/axisartist/tests/test_grid_finder.py,sha256=cwQLDOdcJbAY2E7dr8595yzuNh1_Yh80r_O8WGT2hMY,1156
|
| 870 |
+
mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py,sha256=MzJcslJ4fvvWEFjxCzh9s9ur173al_U2-KqEuiax1qw,7255
|
| 871 |
+
mpl_toolkits/mplot3d/__init__.py,sha256=fH9HdMfFMvjbIWqy2gjQnm2m3ae1CvLiuH6LwKHo0kI,49
|
| 872 |
+
mpl_toolkits/mplot3d/__pycache__/__init__.cpython-312.pyc,,
|
| 873 |
+
mpl_toolkits/mplot3d/__pycache__/art3d.cpython-312.pyc,,
|
| 874 |
+
mpl_toolkits/mplot3d/__pycache__/axes3d.cpython-312.pyc,,
|
| 875 |
+
mpl_toolkits/mplot3d/__pycache__/axis3d.cpython-312.pyc,,
|
| 876 |
+
mpl_toolkits/mplot3d/__pycache__/proj3d.cpython-312.pyc,,
|
| 877 |
+
mpl_toolkits/mplot3d/art3d.py,sha256=ren1NFwzxWwMNfRNNHPZPBLVaI5R1YrnNy6aGjzp85Q,62109
|
| 878 |
+
mpl_toolkits/mplot3d/axes3d.py,sha256=aCOw5p_lQlXugt45Ku76xeKBPyMgTuyLGtVAoDV67jU,171222
|
| 879 |
+
mpl_toolkits/mplot3d/axis3d.py,sha256=2wqbeC9cjt-rCVKBPTZOo7qcZABEkaRe2IdsCDHngsg,32006
|
| 880 |
+
mpl_toolkits/mplot3d/proj3d.py,sha256=SlJKkliaUhuAJ4VjDU1xMP8V-JiZbcIs6ugtgQUTRM0,8014
|
| 881 |
+
mpl_toolkits/mplot3d/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
|
| 882 |
+
mpl_toolkits/mplot3d/tests/__pycache__/__init__.cpython-312.pyc,,
|
| 883 |
+
mpl_toolkits/mplot3d/tests/__pycache__/conftest.cpython-312.pyc,,
|
| 884 |
+
mpl_toolkits/mplot3d/tests/__pycache__/test_art3d.cpython-312.pyc,,
|
| 885 |
+
mpl_toolkits/mplot3d/tests/__pycache__/test_axes3d.cpython-312.pyc,,
|
| 886 |
+
mpl_toolkits/mplot3d/tests/__pycache__/test_legend3d.cpython-312.pyc,,
|
| 887 |
+
mpl_toolkits/mplot3d/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
|
| 888 |
+
mpl_toolkits/mplot3d/tests/test_art3d.py,sha256=oQlgtY24BEIfE4hpD1-O4GaYwW7Zqj2oKrcSMWNAPj8,3768
|
| 889 |
+
mpl_toolkits/mplot3d/tests/test_axes3d.py,sha256=hELj8LOwuZ629nkuym-Tf3QVmi9urfAC6p0JZNBOGXw,114526
|
| 890 |
+
mpl_toolkits/mplot3d/tests/test_legend3d.py,sha256=RxaPp7UlHHm_WUQYmQapktEh7BN4BrP30VmouGcJycU,4421
|
| 891 |
+
pylab.py,sha256=zUXU0l7e7C5jmDSJbM0GLQxBun3xzuXNf1tuoZYA6Xk,110
|
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: meson
|
| 3 |
+
Root-Is-Purelib: false
|
| 4 |
+
Tag: cp312-cp312-manylinux_2_17_x86_64
|
| 5 |
+
Tag: cp312-cp312-manylinux2014_x86_64
|
| 6 |
+
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patches.cpython-312.pyc
ADDED
|
Binary file (58.9 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_path.cpython-312.pyc
ADDED
|
Binary file (38.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc
ADDED
|
Binary file (14.4 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc
ADDED
|
Binary file (19.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_png.cpython-312.pyc
ADDED
|
Binary file (3.12 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_polar.cpython-312.pyc
ADDED
|
Binary file (36.9 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc
ADDED
|
Binary file (14.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc
ADDED
|
Binary file (29.8 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc
ADDED
|
Binary file (22.4 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc
ADDED
|
Binary file (33.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc
ADDED
|
Binary file (6.04 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_scale.cpython-312.pyc
ADDED
|
Binary file (27.9 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc
ADDED
|
Binary file (34.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_skew.cpython-312.pyc
ADDED
|
Binary file (9.89 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc
ADDED
|
Binary file (13.2 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_spines.cpython-312.pyc
ADDED
|
Binary file (13.5 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc
ADDED
|
Binary file (15.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_style.cpython-312.pyc
ADDED
|
Binary file (13.1 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc
ADDED
|
Binary file (16.3 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_table.cpython-312.pyc
ADDED
|
Binary file (14 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_testing.cpython-312.pyc
ADDED
|
Binary file (2.05 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc
ADDED
|
Binary file (3.81 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_text.cpython-312.pyc
ADDED
|
Binary file (69.1 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc
ADDED
|
Binary file (853 Bytes). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:755eff19528cd066e9654eef25a243298935a7941149f56ad98454ab87735f0c
|
| 3 |
+
size 108683
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc
ADDED
|
Binary file (22.5 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc
ADDED
|
Binary file (80.2 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc
ADDED
|
Binary file (78.4 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc
ADDED
|
Binary file (15 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_units.cpython-312.pyc
ADDED
|
Binary file (22.6 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc
ADDED
|
Binary file (14.8 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc
ADDED
|
Binary file (92.6 kB). View file
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/conftest.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from matplotlib.testing.conftest import ( # noqa
|
| 2 |
+
pytest_configure, pytest_unconfigure,
|
| 3 |
+
high_memory, mpl_test_settings, pd, text_placeholders, xr)
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_afm.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from io import BytesIO
|
| 2 |
+
import pytest
|
| 3 |
+
import logging
|
| 4 |
+
|
| 5 |
+
from matplotlib import _afm
|
| 6 |
+
from matplotlib import font_manager as fm
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
# See note in afm.py re: use of comma as decimal separator in the
|
| 10 |
+
# UnderlineThickness field and re: use of non-ASCII characters in the Notice
|
| 11 |
+
# field.
|
| 12 |
+
AFM_TEST_DATA = b"""StartFontMetrics 2.0
|
| 13 |
+
Comment Comments are ignored.
|
| 14 |
+
Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
|
| 15 |
+
FontName MyFont-Bold
|
| 16 |
+
EncodingScheme FontSpecific
|
| 17 |
+
FullName My Font Bold
|
| 18 |
+
FamilyName Test Fonts
|
| 19 |
+
Weight Bold
|
| 20 |
+
ItalicAngle 0.0
|
| 21 |
+
IsFixedPitch false
|
| 22 |
+
UnderlinePosition -100
|
| 23 |
+
UnderlineThickness 56,789
|
| 24 |
+
Version 001.000
|
| 25 |
+
Notice Copyright \xa9 2017 No one.
|
| 26 |
+
FontBBox 0 -321 1234 369
|
| 27 |
+
StartCharMetrics 3
|
| 28 |
+
C 0 ; WX 250 ; N space ; B 0 0 0 0 ;
|
| 29 |
+
C 42 ; WX 1141 ; N foo ; B 40 60 800 360 ;
|
| 30 |
+
C 99 ; WX 583 ; N bar ; B 40 -10 543 210 ;
|
| 31 |
+
EndCharMetrics
|
| 32 |
+
EndFontMetrics
|
| 33 |
+
"""
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def test_nonascii_str():
|
| 37 |
+
# This tests that we also decode bytes as utf-8 properly.
|
| 38 |
+
# Else, font files with non ascii characters fail to load.
|
| 39 |
+
inp_str = "привет"
|
| 40 |
+
byte_str = inp_str.encode("utf8")
|
| 41 |
+
|
| 42 |
+
ret = _afm._to_str(byte_str)
|
| 43 |
+
assert ret == inp_str
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def test_parse_header():
|
| 47 |
+
fh = BytesIO(AFM_TEST_DATA)
|
| 48 |
+
header = _afm._parse_header(fh)
|
| 49 |
+
assert header == {
|
| 50 |
+
'StartFontMetrics': 2.0,
|
| 51 |
+
'FontName': 'MyFont-Bold',
|
| 52 |
+
'EncodingScheme': 'FontSpecific',
|
| 53 |
+
'FullName': 'My Font Bold',
|
| 54 |
+
'FamilyName': 'Test Fonts',
|
| 55 |
+
'Weight': 'Bold',
|
| 56 |
+
'ItalicAngle': 0.0,
|
| 57 |
+
'IsFixedPitch': False,
|
| 58 |
+
'UnderlinePosition': -100,
|
| 59 |
+
'UnderlineThickness': 56.789,
|
| 60 |
+
'Version': '001.000',
|
| 61 |
+
'Notice': b'Copyright \xa9 2017 No one.',
|
| 62 |
+
'FontBBox': [0, -321, 1234, 369],
|
| 63 |
+
'StartCharMetrics': 3,
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def test_parse_char_metrics():
|
| 68 |
+
fh = BytesIO(AFM_TEST_DATA)
|
| 69 |
+
_afm._parse_header(fh) # position
|
| 70 |
+
metrics = _afm._parse_char_metrics(fh)
|
| 71 |
+
assert metrics == (
|
| 72 |
+
{
|
| 73 |
+
0: _afm.CharMetrics(250.0, 'space', (0, 0, 0, 0)),
|
| 74 |
+
42: _afm.CharMetrics(1141.0, 'foo', (40, 60, 800, 360)),
|
| 75 |
+
99: _afm.CharMetrics(583.0, 'bar', (40, -10, 543, 210)),
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
'space': _afm.CharMetrics(250.0, 'space', (0, 0, 0, 0)),
|
| 79 |
+
'foo': _afm.CharMetrics(1141.0, 'foo', (40, 60, 800, 360)),
|
| 80 |
+
'bar': _afm.CharMetrics(583.0, 'bar', (40, -10, 543, 210)),
|
| 81 |
+
}
|
| 82 |
+
)
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def test_get_familyname_guessed():
|
| 86 |
+
fh = BytesIO(AFM_TEST_DATA)
|
| 87 |
+
font = _afm.AFM(fh)
|
| 88 |
+
del font._header['FamilyName'] # remove FamilyName, so we have to guess
|
| 89 |
+
assert font.get_familyname() == 'My Font'
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
def test_font_manager_weight_normalization():
|
| 93 |
+
font = _afm.AFM(BytesIO(
|
| 94 |
+
AFM_TEST_DATA.replace(b"Weight Bold\n", b"Weight Custom\n")))
|
| 95 |
+
assert fm.afmFontProperty("", font).weight == "normal"
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
@pytest.mark.parametrize(
|
| 99 |
+
"afm_data",
|
| 100 |
+
[
|
| 101 |
+
b"""nope
|
| 102 |
+
really nope""",
|
| 103 |
+
b"""StartFontMetrics 2.0
|
| 104 |
+
Comment Comments are ignored.
|
| 105 |
+
Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
|
| 106 |
+
FontName MyFont-Bold
|
| 107 |
+
EncodingScheme FontSpecific""",
|
| 108 |
+
],
|
| 109 |
+
)
|
| 110 |
+
def test_bad_afm(afm_data):
|
| 111 |
+
fh = BytesIO(afm_data)
|
| 112 |
+
with pytest.raises(RuntimeError):
|
| 113 |
+
_afm._parse_header(fh)
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
@pytest.mark.parametrize(
|
| 117 |
+
"afm_data",
|
| 118 |
+
[
|
| 119 |
+
b"""StartFontMetrics 2.0
|
| 120 |
+
Comment Comments are ignored.
|
| 121 |
+
Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
|
| 122 |
+
Aardvark bob
|
| 123 |
+
FontName MyFont-Bold
|
| 124 |
+
EncodingScheme FontSpecific
|
| 125 |
+
StartCharMetrics 3""",
|
| 126 |
+
b"""StartFontMetrics 2.0
|
| 127 |
+
Comment Comments are ignored.
|
| 128 |
+
Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
|
| 129 |
+
ItalicAngle zero degrees
|
| 130 |
+
FontName MyFont-Bold
|
| 131 |
+
EncodingScheme FontSpecific
|
| 132 |
+
StartCharMetrics 3""",
|
| 133 |
+
],
|
| 134 |
+
)
|
| 135 |
+
def test_malformed_header(afm_data, caplog):
|
| 136 |
+
fh = BytesIO(afm_data)
|
| 137 |
+
with caplog.at_level(logging.ERROR):
|
| 138 |
+
_afm._parse_header(fh)
|
| 139 |
+
|
| 140 |
+
assert len(caplog.records) == 1
|
| 141 |
+
|
| 142 |
+
|
| 143 |
+
def test_afm_kerning():
|
| 144 |
+
fn = fm.findfont("Helvetica", fontext="afm")
|
| 145 |
+
with open(fn, 'rb') as fh:
|
| 146 |
+
afm = _afm.AFM(fh)
|
| 147 |
+
assert afm.get_kern_dist_from_name('A', 'V') == -70.0
|
| 148 |
+
assert afm.get_kern_dist_from_name('V', 'A') == -80.0
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_agg.py
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
import warnings
|
| 3 |
+
|
| 4 |
+
import numpy as np
|
| 5 |
+
from numpy.testing import assert_array_almost_equal
|
| 6 |
+
from PIL import features, Image, TiffTags
|
| 7 |
+
import pytest
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
from matplotlib import (
|
| 11 |
+
collections, patheffects, pyplot as plt, transforms as mtransforms,
|
| 12 |
+
rcParams, rc_context)
|
| 13 |
+
from matplotlib.backends.backend_agg import RendererAgg
|
| 14 |
+
from matplotlib.figure import Figure
|
| 15 |
+
from matplotlib.image import imread
|
| 16 |
+
from matplotlib.path import Path
|
| 17 |
+
from matplotlib.testing.decorators import image_comparison
|
| 18 |
+
from matplotlib.transforms import IdentityTransform
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def require_pillow_feature(name):
|
| 22 |
+
with warnings.catch_warnings():
|
| 23 |
+
warnings.simplefilter('ignore')
|
| 24 |
+
available = features.check(name.lower())
|
| 25 |
+
return pytest.mark.skipif(not available, reason=f"{name} support not available")
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def test_repeated_save_with_alpha():
|
| 29 |
+
# We want an image which has a background color of bluish green, with an
|
| 30 |
+
# alpha of 0.25.
|
| 31 |
+
|
| 32 |
+
fig = Figure([1, 0.4])
|
| 33 |
+
fig.set_facecolor((0, 1, 0.4))
|
| 34 |
+
fig.patch.set_alpha(0.25)
|
| 35 |
+
|
| 36 |
+
# The target color is fig.patch.get_facecolor()
|
| 37 |
+
|
| 38 |
+
buf = io.BytesIO()
|
| 39 |
+
|
| 40 |
+
fig.savefig(buf,
|
| 41 |
+
facecolor=fig.get_facecolor(),
|
| 42 |
+
edgecolor='none')
|
| 43 |
+
|
| 44 |
+
# Save the figure again to check that the
|
| 45 |
+
# colors don't bleed from the previous renderer.
|
| 46 |
+
buf.seek(0)
|
| 47 |
+
fig.savefig(buf,
|
| 48 |
+
facecolor=fig.get_facecolor(),
|
| 49 |
+
edgecolor='none')
|
| 50 |
+
|
| 51 |
+
# Check the first pixel has the desired color & alpha
|
| 52 |
+
# (approx: 0, 1.0, 0.4, 0.25)
|
| 53 |
+
buf.seek(0)
|
| 54 |
+
assert_array_almost_equal(tuple(imread(buf)[0, 0]),
|
| 55 |
+
(0.0, 1.0, 0.4, 0.250),
|
| 56 |
+
decimal=3)
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def test_large_single_path_collection():
|
| 60 |
+
buff = io.BytesIO()
|
| 61 |
+
|
| 62 |
+
# Generates a too-large single path in a path collection that
|
| 63 |
+
# would cause a segfault if the draw_markers optimization is
|
| 64 |
+
# applied.
|
| 65 |
+
f, ax = plt.subplots()
|
| 66 |
+
collection = collections.PathCollection(
|
| 67 |
+
[Path([[-10, 5], [10, 5], [10, -5], [-10, -5], [-10, 5]])])
|
| 68 |
+
ax.add_artist(collection)
|
| 69 |
+
ax.set_xlim(10**-3, 1)
|
| 70 |
+
plt.savefig(buff)
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def test_marker_with_nan():
|
| 74 |
+
# This creates a marker with nans in it, which was segfaulting the
|
| 75 |
+
# Agg backend (see #3722)
|
| 76 |
+
fig, ax = plt.subplots(1)
|
| 77 |
+
steps = 1000
|
| 78 |
+
data = np.arange(steps)
|
| 79 |
+
ax.semilogx(data)
|
| 80 |
+
ax.fill_between(data, data*0.8, data*1.2)
|
| 81 |
+
buf = io.BytesIO()
|
| 82 |
+
fig.savefig(buf, format='png')
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def test_long_path():
|
| 86 |
+
buff = io.BytesIO()
|
| 87 |
+
fig = Figure()
|
| 88 |
+
ax = fig.subplots()
|
| 89 |
+
points = np.ones(100_000)
|
| 90 |
+
points[::2] *= -1
|
| 91 |
+
ax.plot(points)
|
| 92 |
+
fig.savefig(buff, format='png')
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
@image_comparison(['agg_filter.png'], remove_text=True, style='_classic_test')
|
| 96 |
+
def test_agg_filter():
|
| 97 |
+
def smooth1d(x, window_len):
|
| 98 |
+
# copied from https://scipy-cookbook.readthedocs.io/
|
| 99 |
+
s = np.r_[
|
| 100 |
+
2*x[0] - x[window_len:1:-1], x, 2*x[-1] - x[-1:-window_len:-1]]
|
| 101 |
+
w = np.hanning(window_len)
|
| 102 |
+
y = np.convolve(w/w.sum(), s, mode='same')
|
| 103 |
+
return y[window_len-1:-window_len+1]
|
| 104 |
+
|
| 105 |
+
def smooth2d(A, sigma=3):
|
| 106 |
+
window_len = max(int(sigma), 3) * 2 + 1
|
| 107 |
+
A = np.apply_along_axis(smooth1d, 0, A, window_len)
|
| 108 |
+
A = np.apply_along_axis(smooth1d, 1, A, window_len)
|
| 109 |
+
return A
|
| 110 |
+
|
| 111 |
+
class BaseFilter:
|
| 112 |
+
|
| 113 |
+
def get_pad(self, dpi):
|
| 114 |
+
return 0
|
| 115 |
+
|
| 116 |
+
def process_image(self, padded_src, dpi):
|
| 117 |
+
raise NotImplementedError("Should be overridden by subclasses")
|
| 118 |
+
|
| 119 |
+
def __call__(self, im, dpi):
|
| 120 |
+
pad = self.get_pad(dpi)
|
| 121 |
+
padded_src = np.pad(im, [(pad, pad), (pad, pad), (0, 0)],
|
| 122 |
+
"constant")
|
| 123 |
+
tgt_image = self.process_image(padded_src, dpi)
|
| 124 |
+
return tgt_image, -pad, -pad
|
| 125 |
+
|
| 126 |
+
class OffsetFilter(BaseFilter):
|
| 127 |
+
|
| 128 |
+
def __init__(self, offsets=(0, 0)):
|
| 129 |
+
self.offsets = offsets
|
| 130 |
+
|
| 131 |
+
def get_pad(self, dpi):
|
| 132 |
+
return int(max(self.offsets) / 72 * dpi)
|
| 133 |
+
|
| 134 |
+
def process_image(self, padded_src, dpi):
|
| 135 |
+
ox, oy = self.offsets
|
| 136 |
+
a1 = np.roll(padded_src, int(ox / 72 * dpi), axis=1)
|
| 137 |
+
a2 = np.roll(a1, -int(oy / 72 * dpi), axis=0)
|
| 138 |
+
return a2
|
| 139 |
+
|
| 140 |
+
class GaussianFilter(BaseFilter):
|
| 141 |
+
"""Simple Gaussian filter."""
|
| 142 |
+
|
| 143 |
+
def __init__(self, sigma, alpha=0.5, color=(0, 0, 0)):
|
| 144 |
+
self.sigma = sigma
|
| 145 |
+
self.alpha = alpha
|
| 146 |
+
self.color = color
|
| 147 |
+
|
| 148 |
+
def get_pad(self, dpi):
|
| 149 |
+
return int(self.sigma*3 / 72 * dpi)
|
| 150 |
+
|
| 151 |
+
def process_image(self, padded_src, dpi):
|
| 152 |
+
tgt_image = np.empty_like(padded_src)
|
| 153 |
+
tgt_image[:, :, :3] = self.color
|
| 154 |
+
tgt_image[:, :, 3] = smooth2d(padded_src[:, :, 3] * self.alpha,
|
| 155 |
+
self.sigma / 72 * dpi)
|
| 156 |
+
return tgt_image
|
| 157 |
+
|
| 158 |
+
class DropShadowFilter(BaseFilter):
|
| 159 |
+
|
| 160 |
+
def __init__(self, sigma, alpha=0.3, color=(0, 0, 0), offsets=(0, 0)):
|
| 161 |
+
self.gauss_filter = GaussianFilter(sigma, alpha, color)
|
| 162 |
+
self.offset_filter = OffsetFilter(offsets)
|
| 163 |
+
|
| 164 |
+
def get_pad(self, dpi):
|
| 165 |
+
return max(self.gauss_filter.get_pad(dpi),
|
| 166 |
+
self.offset_filter.get_pad(dpi))
|
| 167 |
+
|
| 168 |
+
def process_image(self, padded_src, dpi):
|
| 169 |
+
t1 = self.gauss_filter.process_image(padded_src, dpi)
|
| 170 |
+
t2 = self.offset_filter.process_image(t1, dpi)
|
| 171 |
+
return t2
|
| 172 |
+
|
| 173 |
+
fig, ax = plt.subplots()
|
| 174 |
+
|
| 175 |
+
# draw lines
|
| 176 |
+
line1, = ax.plot([0.1, 0.5, 0.9], [0.1, 0.9, 0.5], "bo-",
|
| 177 |
+
mec="b", mfc="w", lw=5, mew=3, ms=10, label="Line 1")
|
| 178 |
+
line2, = ax.plot([0.1, 0.5, 0.9], [0.5, 0.2, 0.7], "ro-",
|
| 179 |
+
mec="r", mfc="w", lw=5, mew=3, ms=10, label="Line 1")
|
| 180 |
+
|
| 181 |
+
gauss = DropShadowFilter(4)
|
| 182 |
+
|
| 183 |
+
for line in [line1, line2]:
|
| 184 |
+
|
| 185 |
+
# draw shadows with same lines with slight offset.
|
| 186 |
+
xx = line.get_xdata()
|
| 187 |
+
yy = line.get_ydata()
|
| 188 |
+
shadow, = ax.plot(xx, yy)
|
| 189 |
+
shadow.update_from(line)
|
| 190 |
+
|
| 191 |
+
# offset transform
|
| 192 |
+
transform = mtransforms.offset_copy(
|
| 193 |
+
line.get_transform(), fig, x=4.0, y=-6.0, units='points')
|
| 194 |
+
shadow.set_transform(transform)
|
| 195 |
+
|
| 196 |
+
# adjust zorder of the shadow lines so that it is drawn below the
|
| 197 |
+
# original lines
|
| 198 |
+
shadow.set_zorder(line.get_zorder() - 0.5)
|
| 199 |
+
shadow.set_agg_filter(gauss)
|
| 200 |
+
shadow.set_rasterized(True) # to support mixed-mode renderers
|
| 201 |
+
|
| 202 |
+
ax.set_xlim(0., 1.)
|
| 203 |
+
ax.set_ylim(0., 1.)
|
| 204 |
+
|
| 205 |
+
ax.xaxis.set_visible(False)
|
| 206 |
+
ax.yaxis.set_visible(False)
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
def test_too_large_image():
|
| 210 |
+
fig = plt.figure(figsize=(300, 2**25))
|
| 211 |
+
buff = io.BytesIO()
|
| 212 |
+
with pytest.raises(ValueError):
|
| 213 |
+
fig.savefig(buff)
|
| 214 |
+
|
| 215 |
+
|
| 216 |
+
def test_chunksize():
|
| 217 |
+
x = range(200)
|
| 218 |
+
|
| 219 |
+
# Test without chunksize
|
| 220 |
+
fig, ax = plt.subplots()
|
| 221 |
+
ax.plot(x, np.sin(x))
|
| 222 |
+
fig.canvas.draw()
|
| 223 |
+
|
| 224 |
+
# Test with chunksize
|
| 225 |
+
fig, ax = plt.subplots()
|
| 226 |
+
rcParams['agg.path.chunksize'] = 105
|
| 227 |
+
ax.plot(x, np.sin(x))
|
| 228 |
+
fig.canvas.draw()
|
| 229 |
+
|
| 230 |
+
|
| 231 |
+
@pytest.mark.backend('Agg')
|
| 232 |
+
def test_jpeg_dpi():
|
| 233 |
+
# Check that dpi is set correctly in jpg files.
|
| 234 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 235 |
+
buf = io.BytesIO()
|
| 236 |
+
plt.savefig(buf, format="jpg", dpi=200)
|
| 237 |
+
im = Image.open(buf)
|
| 238 |
+
assert im.info['dpi'] == (200, 200)
|
| 239 |
+
|
| 240 |
+
|
| 241 |
+
def test_pil_kwargs_png():
|
| 242 |
+
from PIL.PngImagePlugin import PngInfo
|
| 243 |
+
buf = io.BytesIO()
|
| 244 |
+
pnginfo = PngInfo()
|
| 245 |
+
pnginfo.add_text("Software", "test")
|
| 246 |
+
plt.figure().savefig(buf, format="png", pil_kwargs={"pnginfo": pnginfo})
|
| 247 |
+
im = Image.open(buf)
|
| 248 |
+
assert im.info["Software"] == "test"
|
| 249 |
+
|
| 250 |
+
|
| 251 |
+
def test_pil_kwargs_tiff():
|
| 252 |
+
buf = io.BytesIO()
|
| 253 |
+
pil_kwargs = {"description": "test image"}
|
| 254 |
+
plt.figure().savefig(buf, format="tiff", pil_kwargs=pil_kwargs)
|
| 255 |
+
im = Image.open(buf)
|
| 256 |
+
tags = {TiffTags.TAGS_V2[k].name: v for k, v in im.tag_v2.items()}
|
| 257 |
+
assert tags["ImageDescription"] == "test image"
|
| 258 |
+
|
| 259 |
+
|
| 260 |
+
@require_pillow_feature('WebP')
|
| 261 |
+
def test_pil_kwargs_webp():
|
| 262 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 263 |
+
buf_small = io.BytesIO()
|
| 264 |
+
pil_kwargs_low = {"quality": 1}
|
| 265 |
+
plt.savefig(buf_small, format="webp", pil_kwargs=pil_kwargs_low)
|
| 266 |
+
assert len(pil_kwargs_low) == 1
|
| 267 |
+
buf_large = io.BytesIO()
|
| 268 |
+
pil_kwargs_high = {"quality": 100}
|
| 269 |
+
plt.savefig(buf_large, format="webp", pil_kwargs=pil_kwargs_high)
|
| 270 |
+
assert len(pil_kwargs_high) == 1
|
| 271 |
+
assert buf_large.getbuffer().nbytes > buf_small.getbuffer().nbytes
|
| 272 |
+
|
| 273 |
+
|
| 274 |
+
@require_pillow_feature('AVIF')
|
| 275 |
+
def test_pil_kwargs_avif():
|
| 276 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 277 |
+
buf_small = io.BytesIO()
|
| 278 |
+
pil_kwargs_low = {"quality": 1}
|
| 279 |
+
plt.savefig(buf_small, format="avif", pil_kwargs=pil_kwargs_low)
|
| 280 |
+
assert len(pil_kwargs_low) == 1
|
| 281 |
+
buf_large = io.BytesIO()
|
| 282 |
+
pil_kwargs_high = {"quality": 100}
|
| 283 |
+
plt.savefig(buf_large, format="avif", pil_kwargs=pil_kwargs_high)
|
| 284 |
+
assert len(pil_kwargs_high) == 1
|
| 285 |
+
assert buf_large.getbuffer().nbytes > buf_small.getbuffer().nbytes
|
| 286 |
+
|
| 287 |
+
|
| 288 |
+
def test_gif_no_alpha():
|
| 289 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 290 |
+
buf = io.BytesIO()
|
| 291 |
+
plt.savefig(buf, format="gif", transparent=False)
|
| 292 |
+
im = Image.open(buf)
|
| 293 |
+
assert im.mode == "P"
|
| 294 |
+
assert im.info["transparency"] >= len(im.palette.colors)
|
| 295 |
+
|
| 296 |
+
|
| 297 |
+
def test_gif_alpha():
|
| 298 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 299 |
+
buf = io.BytesIO()
|
| 300 |
+
plt.savefig(buf, format="gif", transparent=True)
|
| 301 |
+
im = Image.open(buf)
|
| 302 |
+
assert im.mode == "P"
|
| 303 |
+
assert im.info["transparency"] < len(im.palette.colors)
|
| 304 |
+
|
| 305 |
+
|
| 306 |
+
@require_pillow_feature('WebP')
|
| 307 |
+
def test_webp_alpha():
|
| 308 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 309 |
+
buf = io.BytesIO()
|
| 310 |
+
plt.savefig(buf, format="webp", transparent=True)
|
| 311 |
+
im = Image.open(buf)
|
| 312 |
+
assert im.mode == "RGBA"
|
| 313 |
+
|
| 314 |
+
|
| 315 |
+
@require_pillow_feature('AVIF')
|
| 316 |
+
def test_avif_alpha():
|
| 317 |
+
plt.plot([0, 1, 2], [0, 1, 0])
|
| 318 |
+
buf = io.BytesIO()
|
| 319 |
+
plt.savefig(buf, format="avif", transparent=True)
|
| 320 |
+
im = Image.open(buf)
|
| 321 |
+
assert im.mode == "RGBA"
|
| 322 |
+
|
| 323 |
+
|
| 324 |
+
def test_draw_path_collection_error_handling():
|
| 325 |
+
fig, ax = plt.subplots()
|
| 326 |
+
ax.scatter([1], [1]).set_paths(Path([(0, 1), (2, 3)]))
|
| 327 |
+
with pytest.raises(TypeError):
|
| 328 |
+
fig.canvas.draw()
|
| 329 |
+
|
| 330 |
+
|
| 331 |
+
def test_chunksize_fails(high_memory):
|
| 332 |
+
# NOTE: This test covers multiple independent test scenarios in a single
|
| 333 |
+
# function, because each scenario uses ~2GB of memory and we don't
|
| 334 |
+
# want parallel test executors to accidentally run multiple of these
|
| 335 |
+
# at the same time.
|
| 336 |
+
|
| 337 |
+
N = 100_000
|
| 338 |
+
dpi = 500
|
| 339 |
+
w = 5*dpi
|
| 340 |
+
h = 6*dpi
|
| 341 |
+
|
| 342 |
+
# make a Path that spans the whole w-h rectangle
|
| 343 |
+
x = np.linspace(0, w, N)
|
| 344 |
+
y = np.ones(N) * h
|
| 345 |
+
y[::2] = 0
|
| 346 |
+
path = Path(np.vstack((x, y)).T)
|
| 347 |
+
# effectively disable path simplification (but leaving it "on")
|
| 348 |
+
path.simplify_threshold = 0
|
| 349 |
+
|
| 350 |
+
# setup the minimal GraphicsContext to draw a Path
|
| 351 |
+
ra = RendererAgg(w, h, dpi)
|
| 352 |
+
gc = ra.new_gc()
|
| 353 |
+
gc.set_linewidth(1)
|
| 354 |
+
gc.set_foreground('r')
|
| 355 |
+
|
| 356 |
+
gc.set_hatch('/')
|
| 357 |
+
with pytest.raises(OverflowError, match='cannot split hatched path'):
|
| 358 |
+
ra.draw_path(gc, path, IdentityTransform())
|
| 359 |
+
gc.set_hatch(None)
|
| 360 |
+
|
| 361 |
+
with pytest.raises(OverflowError, match='cannot split filled path'):
|
| 362 |
+
ra.draw_path(gc, path, IdentityTransform(), (1, 0, 0))
|
| 363 |
+
|
| 364 |
+
# Set to zero to disable, currently defaults to 0, but let's be sure.
|
| 365 |
+
with rc_context({'agg.path.chunksize': 0}):
|
| 366 |
+
with pytest.raises(OverflowError, match='Please set'):
|
| 367 |
+
ra.draw_path(gc, path, IdentityTransform())
|
| 368 |
+
|
| 369 |
+
# Set big enough that we do not try to chunk.
|
| 370 |
+
with rc_context({'agg.path.chunksize': 1_000_000}):
|
| 371 |
+
with pytest.raises(OverflowError, match='Please reduce'):
|
| 372 |
+
ra.draw_path(gc, path, IdentityTransform())
|
| 373 |
+
|
| 374 |
+
# Small enough we will try to chunk, but big enough we will fail to render.
|
| 375 |
+
with rc_context({'agg.path.chunksize': 90_000}):
|
| 376 |
+
with pytest.raises(OverflowError, match='Please reduce'):
|
| 377 |
+
ra.draw_path(gc, path, IdentityTransform())
|
| 378 |
+
|
| 379 |
+
path.should_simplify = False
|
| 380 |
+
with pytest.raises(OverflowError, match="should_simplify is False"):
|
| 381 |
+
ra.draw_path(gc, path, IdentityTransform())
|
| 382 |
+
|
| 383 |
+
|
| 384 |
+
def test_non_tuple_rgbaface():
|
| 385 |
+
# This passes rgbaFace as an ndarray to draw_path.
|
| 386 |
+
fig = plt.figure()
|
| 387 |
+
fig.add_subplot(projection="3d").scatter(
|
| 388 |
+
[0, 1, 2], [0, 1, 2], path_effects=[patheffects.Stroke(linewidth=4)])
|
| 389 |
+
fig.canvas.draw()
|
| 390 |
+
|
| 391 |
+
|
| 392 |
+
def test_rendered_height_floating_point_precision():
|
| 393 |
+
fig = plt.figure(figsize=(1, 2.03), dpi=100)
|
| 394 |
+
assert fig.bbox.height < 203 # due to floating-point precision
|
| 395 |
+
fig.canvas.draw()
|
| 396 |
+
assert fig.canvas.buffer_rgba().shape == (203, 100, 4)
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_agg_filter.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
|
| 3 |
+
import matplotlib.pyplot as plt
|
| 4 |
+
from matplotlib.testing.decorators import image_comparison
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
@image_comparison(baseline_images=['agg_filter_alpha'],
|
| 8 |
+
extensions=['gif', 'png', 'pdf'], style='mpl20')
|
| 9 |
+
def test_agg_filter_alpha():
|
| 10 |
+
ax = plt.axes()
|
| 11 |
+
x, y = np.mgrid[0:7, 0:8]
|
| 12 |
+
data = x**2 - y**2
|
| 13 |
+
mesh = ax.pcolormesh(data, cmap='Reds', zorder=5)
|
| 14 |
+
|
| 15 |
+
def manual_alpha(im, dpi):
|
| 16 |
+
im[:, :, 3] *= 0.6
|
| 17 |
+
print('CALLED')
|
| 18 |
+
return im, 0, 0
|
| 19 |
+
|
| 20 |
+
# Note: Doing alpha like this is not the same as setting alpha on
|
| 21 |
+
# the mesh itself. Currently meshes are drawn as independent patches,
|
| 22 |
+
# and we see fine borders around the blocks of color. See the SO
|
| 23 |
+
# question for an example: https://stackoverflow.com/q/20678817/
|
| 24 |
+
mesh.set_agg_filter(manual_alpha)
|
| 25 |
+
|
| 26 |
+
# Currently we must enable rasterization for this to have an effect in
|
| 27 |
+
# the PDF backend.
|
| 28 |
+
mesh.set_rasterized(True)
|
| 29 |
+
|
| 30 |
+
ax.plot([0, 4, 7], [1, 3, 8])
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_animation.py
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
import platform
|
| 4 |
+
import re
|
| 5 |
+
import shutil
|
| 6 |
+
import subprocess
|
| 7 |
+
import sys
|
| 8 |
+
import weakref
|
| 9 |
+
|
| 10 |
+
import numpy as np
|
| 11 |
+
import pytest
|
| 12 |
+
|
| 13 |
+
import matplotlib as mpl
|
| 14 |
+
from matplotlib import pyplot as plt
|
| 15 |
+
from matplotlib import animation
|
| 16 |
+
from matplotlib.animation import PillowWriter
|
| 17 |
+
from matplotlib.testing.decorators import check_figures_equal
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
@pytest.fixture()
|
| 21 |
+
def anim(request):
|
| 22 |
+
"""Create a simple animation (with options)."""
|
| 23 |
+
fig, ax = plt.subplots()
|
| 24 |
+
line, = ax.plot([], [])
|
| 25 |
+
|
| 26 |
+
ax.set_xlim(0, 10)
|
| 27 |
+
ax.set_ylim(-1, 1)
|
| 28 |
+
|
| 29 |
+
def init():
|
| 30 |
+
line.set_data([], [])
|
| 31 |
+
return line,
|
| 32 |
+
|
| 33 |
+
def animate(i):
|
| 34 |
+
x = np.linspace(0, 10, 100)
|
| 35 |
+
y = np.sin(x + i)
|
| 36 |
+
line.set_data(x, y)
|
| 37 |
+
return line,
|
| 38 |
+
|
| 39 |
+
# "klass" can be passed to determine the class returned by the fixture
|
| 40 |
+
kwargs = dict(getattr(request, 'param', {})) # make a copy
|
| 41 |
+
klass = kwargs.pop('klass', animation.FuncAnimation)
|
| 42 |
+
if 'frames' not in kwargs:
|
| 43 |
+
kwargs['frames'] = 5
|
| 44 |
+
return klass(fig=fig, func=animate, init_func=init, **kwargs)
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def test_invalid_writer():
|
| 48 |
+
# Note, this triggers for Animation.save as well, but this is a lighter test.
|
| 49 |
+
with pytest.raises(ValueError,
|
| 50 |
+
match=r"'pllow' is not a valid value for writer\. "
|
| 51 |
+
r"Did you mean: 'pillow'\?"):
|
| 52 |
+
animation.writers['pllow']
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
class NullMovieWriter(animation.AbstractMovieWriter):
|
| 56 |
+
"""
|
| 57 |
+
A minimal MovieWriter. It doesn't actually write anything.
|
| 58 |
+
It just saves the arguments that were given to the setup() and
|
| 59 |
+
grab_frame() methods as attributes, and counts how many times
|
| 60 |
+
grab_frame() is called.
|
| 61 |
+
|
| 62 |
+
This class doesn't have an __init__ method with the appropriate
|
| 63 |
+
signature, and it doesn't define an isAvailable() method, so
|
| 64 |
+
it cannot be added to the 'writers' registry.
|
| 65 |
+
"""
|
| 66 |
+
|
| 67 |
+
def setup(self, fig, outfile, dpi, *args):
|
| 68 |
+
self.fig = fig
|
| 69 |
+
self.outfile = outfile
|
| 70 |
+
self.dpi = dpi
|
| 71 |
+
self.args = args
|
| 72 |
+
self._count = 0
|
| 73 |
+
|
| 74 |
+
def grab_frame(self, **savefig_kwargs):
|
| 75 |
+
from matplotlib.animation import _validate_grabframe_kwargs
|
| 76 |
+
_validate_grabframe_kwargs(savefig_kwargs)
|
| 77 |
+
self.savefig_kwargs = savefig_kwargs
|
| 78 |
+
self._count += 1
|
| 79 |
+
|
| 80 |
+
def finish(self):
|
| 81 |
+
pass
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
def test_null_movie_writer(anim):
|
| 85 |
+
# Test running an animation with NullMovieWriter.
|
| 86 |
+
plt.rcParams["savefig.facecolor"] = "auto"
|
| 87 |
+
filename = "unused.null"
|
| 88 |
+
dpi = 50
|
| 89 |
+
savefig_kwargs = dict(foo=0)
|
| 90 |
+
writer = NullMovieWriter()
|
| 91 |
+
|
| 92 |
+
anim.save(filename, dpi=dpi, writer=writer,
|
| 93 |
+
savefig_kwargs=savefig_kwargs)
|
| 94 |
+
|
| 95 |
+
assert writer.fig == plt.figure(1) # The figure used by anim fixture
|
| 96 |
+
assert writer.outfile == filename
|
| 97 |
+
assert writer.dpi == dpi
|
| 98 |
+
assert writer.args == ()
|
| 99 |
+
# we enrich the savefig kwargs to ensure we composite transparent
|
| 100 |
+
# output to an opaque background
|
| 101 |
+
for k, v in savefig_kwargs.items():
|
| 102 |
+
assert writer.savefig_kwargs[k] == v
|
| 103 |
+
assert writer._count == anim._save_count
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
def test_frame_size():
|
| 107 |
+
# Test that the frame size is the canvas size and not the figure size
|
| 108 |
+
fig = plt.figure(figsize=(1, 2.03), dpi=100)
|
| 109 |
+
assert fig.bbox.height < 203 # due to floating-point precision
|
| 110 |
+
assert fig.canvas.get_width_height() == (100, 203)
|
| 111 |
+
|
| 112 |
+
anim = animation.FuncAnimation(fig, lambda frame: tuple(), frames=1)
|
| 113 |
+
writer = NullMovieWriter()
|
| 114 |
+
anim.save("unused.null", dpi=100, writer=writer)
|
| 115 |
+
|
| 116 |
+
assert writer.frame_size == fig.canvas.get_width_height()
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 120 |
+
def test_animation_delete(anim):
|
| 121 |
+
if platform.python_implementation() == 'PyPy':
|
| 122 |
+
# Something in the test setup fixture lingers around into the test and
|
| 123 |
+
# breaks pytest.warns on PyPy. This garbage collection fixes it.
|
| 124 |
+
# https://foss.heptapod.net/pypy/pypy/-/issues/3536
|
| 125 |
+
np.testing.break_cycles()
|
| 126 |
+
anim = animation.FuncAnimation(**anim)
|
| 127 |
+
with pytest.warns(Warning, match='Animation was deleted'):
|
| 128 |
+
del anim
|
| 129 |
+
np.testing.break_cycles()
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
def test_movie_writer_dpi_default():
|
| 133 |
+
class DummyMovieWriter(animation.MovieWriter):
|
| 134 |
+
def _run(self):
|
| 135 |
+
pass
|
| 136 |
+
|
| 137 |
+
# Test setting up movie writer with figure.dpi default.
|
| 138 |
+
fig = plt.figure()
|
| 139 |
+
|
| 140 |
+
filename = "unused.null"
|
| 141 |
+
fps = 5
|
| 142 |
+
codec = "unused"
|
| 143 |
+
bitrate = 1
|
| 144 |
+
extra_args = ["unused"]
|
| 145 |
+
|
| 146 |
+
writer = DummyMovieWriter(fps, codec, bitrate, extra_args)
|
| 147 |
+
writer.setup(fig, filename)
|
| 148 |
+
assert writer.dpi == fig.dpi
|
| 149 |
+
|
| 150 |
+
|
| 151 |
+
@animation.writers.register('null')
|
| 152 |
+
class RegisteredNullMovieWriter(NullMovieWriter):
|
| 153 |
+
|
| 154 |
+
# To be able to add NullMovieWriter to the 'writers' registry,
|
| 155 |
+
# we must define an __init__ method with a specific signature,
|
| 156 |
+
# and we must define the class method isAvailable().
|
| 157 |
+
# (These methods are not actually required to use an instance
|
| 158 |
+
# of this class as the 'writer' argument of Animation.save().)
|
| 159 |
+
|
| 160 |
+
def __init__(self, fps=None, codec=None, bitrate=None,
|
| 161 |
+
extra_args=None, metadata=None):
|
| 162 |
+
pass
|
| 163 |
+
|
| 164 |
+
@classmethod
|
| 165 |
+
def isAvailable(cls):
|
| 166 |
+
return True
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
WRITER_OUTPUT = [
|
| 170 |
+
('ffmpeg', 'movie.mp4'),
|
| 171 |
+
('ffmpeg_file', 'movie.mp4'),
|
| 172 |
+
('imagemagick', 'movie.gif'),
|
| 173 |
+
('imagemagick_file', 'movie.gif'),
|
| 174 |
+
('pillow', 'movie.gif'),
|
| 175 |
+
('html', 'movie.html'),
|
| 176 |
+
('null', 'movie.null')
|
| 177 |
+
]
|
| 178 |
+
|
| 179 |
+
|
| 180 |
+
def gen_writers():
|
| 181 |
+
for writer, output in WRITER_OUTPUT:
|
| 182 |
+
if not animation.writers.is_available(writer):
|
| 183 |
+
mark = pytest.mark.skip(f"writer '{writer}' not available on this system")
|
| 184 |
+
yield pytest.param(writer, None, output, marks=[mark])
|
| 185 |
+
yield pytest.param(writer, None, Path(output), marks=[mark])
|
| 186 |
+
continue
|
| 187 |
+
|
| 188 |
+
writer_class = animation.writers[writer]
|
| 189 |
+
for frame_format in getattr(writer_class, 'supported_formats', [None]):
|
| 190 |
+
yield writer, frame_format, output
|
| 191 |
+
yield writer, frame_format, Path(output)
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
# Smoke test for saving animations. In the future, we should probably
|
| 195 |
+
# design more sophisticated tests which compare resulting frames a-la
|
| 196 |
+
# matplotlib.testing.image_comparison
|
| 197 |
+
@pytest.mark.parametrize('writer, frame_format, output', list(gen_writers()))
|
| 198 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 199 |
+
def test_save_animation_smoketest(tmp_path, writer, frame_format, output, anim):
|
| 200 |
+
if frame_format is not None:
|
| 201 |
+
plt.rcParams["animation.frame_format"] = frame_format
|
| 202 |
+
anim = animation.FuncAnimation(**anim)
|
| 203 |
+
dpi = None
|
| 204 |
+
codec = None
|
| 205 |
+
if writer == 'ffmpeg':
|
| 206 |
+
# Issue #8253
|
| 207 |
+
anim._fig.set_size_inches((10.85, 9.21))
|
| 208 |
+
dpi = 100.
|
| 209 |
+
codec = 'h264'
|
| 210 |
+
|
| 211 |
+
anim.save(tmp_path / output, fps=30, writer=writer, bitrate=500, dpi=dpi,
|
| 212 |
+
codec=codec)
|
| 213 |
+
|
| 214 |
+
del anim
|
| 215 |
+
|
| 216 |
+
|
| 217 |
+
@pytest.mark.parametrize('writer, frame_format, output', list(gen_writers()))
|
| 218 |
+
def test_grabframe(tmp_path, writer, frame_format, output):
|
| 219 |
+
WriterClass = animation.writers[writer]
|
| 220 |
+
|
| 221 |
+
if frame_format is not None:
|
| 222 |
+
plt.rcParams["animation.frame_format"] = frame_format
|
| 223 |
+
|
| 224 |
+
fig, ax = plt.subplots()
|
| 225 |
+
|
| 226 |
+
dpi = None
|
| 227 |
+
codec = None
|
| 228 |
+
if writer == 'ffmpeg':
|
| 229 |
+
# Issue #8253
|
| 230 |
+
fig.set_size_inches((10.85, 9.21))
|
| 231 |
+
dpi = 100.
|
| 232 |
+
codec = 'h264'
|
| 233 |
+
|
| 234 |
+
test_writer = WriterClass()
|
| 235 |
+
with test_writer.saving(fig, tmp_path / output, dpi):
|
| 236 |
+
# smoke test it works
|
| 237 |
+
test_writer.grab_frame()
|
| 238 |
+
for k in {'dpi', 'bbox_inches', 'format'}:
|
| 239 |
+
with pytest.raises(
|
| 240 |
+
TypeError,
|
| 241 |
+
match=f"grab_frame got an unexpected keyword argument {k!r}"):
|
| 242 |
+
test_writer.grab_frame(**{k: object()})
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
@pytest.mark.parametrize('writer', [
|
| 246 |
+
pytest.param(
|
| 247 |
+
'ffmpeg', marks=pytest.mark.skipif(
|
| 248 |
+
not animation.FFMpegWriter.isAvailable(),
|
| 249 |
+
reason='Requires FFMpeg')),
|
| 250 |
+
pytest.param(
|
| 251 |
+
'imagemagick', marks=pytest.mark.skipif(
|
| 252 |
+
not animation.ImageMagickWriter.isAvailable(),
|
| 253 |
+
reason='Requires ImageMagick')),
|
| 254 |
+
])
|
| 255 |
+
@pytest.mark.parametrize('html, want', [
|
| 256 |
+
('none', None),
|
| 257 |
+
('html5', '<video width'),
|
| 258 |
+
('jshtml', '<script ')
|
| 259 |
+
])
|
| 260 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 261 |
+
def test_animation_repr_html(writer, html, want, anim):
|
| 262 |
+
if platform.python_implementation() == 'PyPy':
|
| 263 |
+
# Something in the test setup fixture lingers around into the test and
|
| 264 |
+
# breaks pytest.warns on PyPy. This garbage collection fixes it.
|
| 265 |
+
# https://foss.heptapod.net/pypy/pypy/-/issues/3536
|
| 266 |
+
np.testing.break_cycles()
|
| 267 |
+
if (writer == 'imagemagick' and html == 'html5'
|
| 268 |
+
# ImageMagick delegates to ffmpeg for this format.
|
| 269 |
+
and not animation.FFMpegWriter.isAvailable()):
|
| 270 |
+
pytest.skip('Requires FFMpeg')
|
| 271 |
+
# create here rather than in the fixture otherwise we get __del__ warnings
|
| 272 |
+
# about producing no output
|
| 273 |
+
anim = animation.FuncAnimation(**anim)
|
| 274 |
+
with plt.rc_context({'animation.writer': writer,
|
| 275 |
+
'animation.html': html}):
|
| 276 |
+
html = anim._repr_html_()
|
| 277 |
+
if want is None:
|
| 278 |
+
assert html is None
|
| 279 |
+
with pytest.warns(UserWarning):
|
| 280 |
+
del anim # Animation was never run, so will warn on cleanup.
|
| 281 |
+
np.testing.break_cycles()
|
| 282 |
+
else:
|
| 283 |
+
assert want in html
|
| 284 |
+
|
| 285 |
+
|
| 286 |
+
@pytest.mark.parametrize(
|
| 287 |
+
'anim',
|
| 288 |
+
[{'save_count': 10, 'frames': iter(range(5))}],
|
| 289 |
+
indirect=['anim']
|
| 290 |
+
)
|
| 291 |
+
def test_no_length_frames(anim):
|
| 292 |
+
anim.save('unused.null', writer=NullMovieWriter())
|
| 293 |
+
|
| 294 |
+
|
| 295 |
+
@pytest.mark.skipif(sys.platform == 'emscripten',
|
| 296 |
+
reason='emscripten does not support subprocesses')
|
| 297 |
+
def test_movie_writer_registry():
|
| 298 |
+
assert len(animation.writers._registered) > 0
|
| 299 |
+
mpl.rcParams['animation.ffmpeg_path'] = "not_available_ever_xxxx"
|
| 300 |
+
assert not animation.writers.is_available("ffmpeg")
|
| 301 |
+
# something guaranteed to be available in path and exits immediately
|
| 302 |
+
bin = "true" if sys.platform != 'win32' else "where"
|
| 303 |
+
mpl.rcParams['animation.ffmpeg_path'] = bin
|
| 304 |
+
assert animation.writers.is_available("ffmpeg")
|
| 305 |
+
|
| 306 |
+
|
| 307 |
+
@pytest.mark.parametrize(
|
| 308 |
+
"method_name",
|
| 309 |
+
[pytest.param("to_html5_video", marks=pytest.mark.skipif(
|
| 310 |
+
not animation.writers.is_available(mpl.rcParams["animation.writer"]),
|
| 311 |
+
reason="animation writer not installed")),
|
| 312 |
+
"to_jshtml"])
|
| 313 |
+
@pytest.mark.parametrize('anim', [dict(frames=1)], indirect=['anim'])
|
| 314 |
+
def test_embed_limit(method_name, caplog, anim):
|
| 315 |
+
caplog.set_level("WARNING")
|
| 316 |
+
with mpl.rc_context({"animation.embed_limit": 1e-6}): # ~1 byte.
|
| 317 |
+
getattr(anim, method_name)()
|
| 318 |
+
assert len(caplog.records) == 1
|
| 319 |
+
record, = caplog.records
|
| 320 |
+
assert (record.name == "matplotlib.animation"
|
| 321 |
+
and record.levelname == "WARNING")
|
| 322 |
+
|
| 323 |
+
|
| 324 |
+
@pytest.mark.skipif(sys.platform == 'emscripten',
|
| 325 |
+
reason='emscripten does not support subprocesses')
|
| 326 |
+
@pytest.mark.skipif(shutil.which("/bin/sh") is None, reason="requires a POSIX OS")
|
| 327 |
+
def test_failing_ffmpeg(tmp_path, monkeypatch, anim):
|
| 328 |
+
"""
|
| 329 |
+
Test that we correctly raise a CalledProcessError when ffmpeg fails.
|
| 330 |
+
|
| 331 |
+
To do so, mock ffmpeg using a simple executable shell script that
|
| 332 |
+
succeeds when called with no arguments (so that it gets registered by
|
| 333 |
+
`isAvailable`), but fails otherwise, and add it to the $PATH.
|
| 334 |
+
"""
|
| 335 |
+
monkeypatch.setenv("PATH", str(tmp_path), prepend=":")
|
| 336 |
+
exe_path = tmp_path / "ffmpeg"
|
| 337 |
+
exe_path.write_bytes(b"#!/bin/sh\n[[ $@ -eq 0 ]]\n")
|
| 338 |
+
os.chmod(exe_path, 0o755)
|
| 339 |
+
with pytest.raises(subprocess.CalledProcessError):
|
| 340 |
+
anim.save("test.mpeg")
|
| 341 |
+
|
| 342 |
+
|
| 343 |
+
@pytest.mark.parametrize("cache_frame_data", [False, True])
|
| 344 |
+
def test_funcanimation_cache_frame_data(cache_frame_data):
|
| 345 |
+
fig, ax = plt.subplots()
|
| 346 |
+
line, = ax.plot([], [])
|
| 347 |
+
|
| 348 |
+
class Frame(dict):
|
| 349 |
+
# this subclassing enables to use weakref.ref()
|
| 350 |
+
pass
|
| 351 |
+
|
| 352 |
+
def init():
|
| 353 |
+
line.set_data([], [])
|
| 354 |
+
return line,
|
| 355 |
+
|
| 356 |
+
def animate(frame):
|
| 357 |
+
line.set_data(frame['x'], frame['y'])
|
| 358 |
+
return line,
|
| 359 |
+
|
| 360 |
+
frames_generated = []
|
| 361 |
+
|
| 362 |
+
def frames_generator():
|
| 363 |
+
for _ in range(5):
|
| 364 |
+
x = np.linspace(0, 10, 100)
|
| 365 |
+
y = np.random.rand(100)
|
| 366 |
+
|
| 367 |
+
frame = Frame(x=x, y=y)
|
| 368 |
+
|
| 369 |
+
# collect weak references to frames
|
| 370 |
+
# to validate their references later
|
| 371 |
+
frames_generated.append(weakref.ref(frame))
|
| 372 |
+
|
| 373 |
+
yield frame
|
| 374 |
+
|
| 375 |
+
MAX_FRAMES = 100
|
| 376 |
+
anim = animation.FuncAnimation(fig, animate, init_func=init,
|
| 377 |
+
frames=frames_generator,
|
| 378 |
+
cache_frame_data=cache_frame_data,
|
| 379 |
+
save_count=MAX_FRAMES)
|
| 380 |
+
|
| 381 |
+
writer = NullMovieWriter()
|
| 382 |
+
anim.save('unused.null', writer=writer)
|
| 383 |
+
assert len(frames_generated) == 5
|
| 384 |
+
np.testing.break_cycles()
|
| 385 |
+
for f in frames_generated:
|
| 386 |
+
# If cache_frame_data is True, then the weakref should be alive;
|
| 387 |
+
# if cache_frame_data is False, then the weakref should be dead (None).
|
| 388 |
+
assert (f() is None) != cache_frame_data
|
| 389 |
+
|
| 390 |
+
|
| 391 |
+
@pytest.mark.parametrize('return_value', [
|
| 392 |
+
# User forgot to return (returns None).
|
| 393 |
+
None,
|
| 394 |
+
# User returned a string.
|
| 395 |
+
'string',
|
| 396 |
+
# User returned an int.
|
| 397 |
+
1,
|
| 398 |
+
# User returns a sequence of other objects, e.g., string instead of Artist.
|
| 399 |
+
('string', ),
|
| 400 |
+
# User forgot to return a sequence (handled in `animate` below.)
|
| 401 |
+
'artist',
|
| 402 |
+
])
|
| 403 |
+
def test_draw_frame(return_value):
|
| 404 |
+
# test _draw_frame method
|
| 405 |
+
|
| 406 |
+
fig, ax = plt.subplots()
|
| 407 |
+
line, = ax.plot([])
|
| 408 |
+
|
| 409 |
+
def animate(i):
|
| 410 |
+
# general update func
|
| 411 |
+
line.set_data([0, 1], [0, i])
|
| 412 |
+
if return_value == 'artist':
|
| 413 |
+
# *not* a sequence
|
| 414 |
+
return line
|
| 415 |
+
else:
|
| 416 |
+
return return_value
|
| 417 |
+
|
| 418 |
+
with pytest.raises(RuntimeError):
|
| 419 |
+
animation.FuncAnimation(
|
| 420 |
+
fig, animate, blit=True, cache_frame_data=False
|
| 421 |
+
)
|
| 422 |
+
|
| 423 |
+
|
| 424 |
+
def test_exhausted_animation(tmp_path):
|
| 425 |
+
fig, ax = plt.subplots()
|
| 426 |
+
|
| 427 |
+
def update(frame):
|
| 428 |
+
return []
|
| 429 |
+
|
| 430 |
+
anim = animation.FuncAnimation(
|
| 431 |
+
fig, update, frames=iter(range(10)), repeat=False,
|
| 432 |
+
cache_frame_data=False
|
| 433 |
+
)
|
| 434 |
+
|
| 435 |
+
anim.save(tmp_path / "test.gif", writer='pillow')
|
| 436 |
+
|
| 437 |
+
with pytest.warns(UserWarning, match="exhausted"):
|
| 438 |
+
anim._start()
|
| 439 |
+
|
| 440 |
+
|
| 441 |
+
def test_no_frame_warning():
|
| 442 |
+
fig, ax = plt.subplots()
|
| 443 |
+
|
| 444 |
+
def update(frame):
|
| 445 |
+
return []
|
| 446 |
+
|
| 447 |
+
anim = animation.FuncAnimation(
|
| 448 |
+
fig, update, frames=[], repeat=False,
|
| 449 |
+
cache_frame_data=False
|
| 450 |
+
)
|
| 451 |
+
|
| 452 |
+
with pytest.warns(UserWarning, match="exhausted"):
|
| 453 |
+
anim._start()
|
| 454 |
+
|
| 455 |
+
|
| 456 |
+
@check_figures_equal()
|
| 457 |
+
def test_animation_frame(tmp_path, fig_test, fig_ref):
|
| 458 |
+
# Test the expected image after iterating through a few frames
|
| 459 |
+
# we save the animation to get the iteration because we are not
|
| 460 |
+
# in an interactive framework.
|
| 461 |
+
ax = fig_test.add_subplot()
|
| 462 |
+
ax.set_xlim(0, 2 * np.pi)
|
| 463 |
+
ax.set_ylim(-1, 1)
|
| 464 |
+
x = np.linspace(0, 2 * np.pi, 100)
|
| 465 |
+
line, = ax.plot([], [])
|
| 466 |
+
|
| 467 |
+
def init():
|
| 468 |
+
line.set_data([], [])
|
| 469 |
+
return line,
|
| 470 |
+
|
| 471 |
+
def animate(i):
|
| 472 |
+
line.set_data(x, np.sin(x + i / 100))
|
| 473 |
+
return line,
|
| 474 |
+
|
| 475 |
+
anim = animation.FuncAnimation(
|
| 476 |
+
fig_test, animate, init_func=init, frames=5,
|
| 477 |
+
blit=True, repeat=False)
|
| 478 |
+
anim.save(tmp_path / "test.gif")
|
| 479 |
+
|
| 480 |
+
# Reference figure without animation
|
| 481 |
+
ax = fig_ref.add_subplot()
|
| 482 |
+
ax.set_xlim(0, 2 * np.pi)
|
| 483 |
+
ax.set_ylim(-1, 1)
|
| 484 |
+
|
| 485 |
+
# 5th frame's data
|
| 486 |
+
ax.plot(x, np.sin(x + 4 / 100))
|
| 487 |
+
|
| 488 |
+
|
| 489 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 490 |
+
def test_save_count_override_warnings_has_length(anim):
|
| 491 |
+
|
| 492 |
+
save_count = 5
|
| 493 |
+
frames = list(range(2))
|
| 494 |
+
match_target = (
|
| 495 |
+
f'You passed in an explicit {save_count=} '
|
| 496 |
+
"which is being ignored in favor of "
|
| 497 |
+
f"{len(frames)=}."
|
| 498 |
+
)
|
| 499 |
+
|
| 500 |
+
with pytest.warns(UserWarning, match=re.escape(match_target)):
|
| 501 |
+
anim = animation.FuncAnimation(
|
| 502 |
+
**{**anim, 'frames': frames, 'save_count': save_count}
|
| 503 |
+
)
|
| 504 |
+
assert anim._save_count == len(frames)
|
| 505 |
+
anim._init_draw()
|
| 506 |
+
|
| 507 |
+
|
| 508 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 509 |
+
def test_save_count_override_warnings_scaler(anim):
|
| 510 |
+
save_count = 5
|
| 511 |
+
frames = 7
|
| 512 |
+
match_target = (
|
| 513 |
+
f'You passed in an explicit {save_count=} ' +
|
| 514 |
+
"which is being ignored in favor of " +
|
| 515 |
+
f"{frames=}."
|
| 516 |
+
)
|
| 517 |
+
|
| 518 |
+
with pytest.warns(UserWarning, match=re.escape(match_target)):
|
| 519 |
+
anim = animation.FuncAnimation(
|
| 520 |
+
**{**anim, 'frames': frames, 'save_count': save_count}
|
| 521 |
+
)
|
| 522 |
+
|
| 523 |
+
assert anim._save_count == frames
|
| 524 |
+
anim._init_draw()
|
| 525 |
+
|
| 526 |
+
|
| 527 |
+
@pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
|
| 528 |
+
def test_disable_cache_warning(anim):
|
| 529 |
+
cache_frame_data = True
|
| 530 |
+
frames = iter(range(5))
|
| 531 |
+
match_target = (
|
| 532 |
+
f"{frames=!r} which we can infer the length of, "
|
| 533 |
+
"did not pass an explicit *save_count* "
|
| 534 |
+
f"and passed {cache_frame_data=}. To avoid a possibly "
|
| 535 |
+
"unbounded cache, frame data caching has been disabled. "
|
| 536 |
+
"To suppress this warning either pass "
|
| 537 |
+
"`cache_frame_data=False` or `save_count=MAX_FRAMES`."
|
| 538 |
+
)
|
| 539 |
+
with pytest.warns(UserWarning, match=re.escape(match_target)):
|
| 540 |
+
anim = animation.FuncAnimation(
|
| 541 |
+
**{**anim, 'cache_frame_data': cache_frame_data, 'frames': frames}
|
| 542 |
+
)
|
| 543 |
+
assert anim._cache_frame_data is False
|
| 544 |
+
anim._init_draw()
|
| 545 |
+
|
| 546 |
+
|
| 547 |
+
def test_movie_writer_invalid_path(anim):
|
| 548 |
+
if sys.platform == "win32":
|
| 549 |
+
match_str = r"\[WinError 3] .*\\\\foo\\\\bar\\\\aardvark'"
|
| 550 |
+
elif sys.platform == "emscripten":
|
| 551 |
+
match_str = r"\[Errno 44] .*'/foo"
|
| 552 |
+
else:
|
| 553 |
+
match_str = r"\[Errno 2] .*'/foo"
|
| 554 |
+
with pytest.raises(FileNotFoundError, match=match_str):
|
| 555 |
+
anim.save("/foo/bar/aardvark/thiscannotreallyexist.mp4",
|
| 556 |
+
writer=animation.FFMpegFileWriter())
|
| 557 |
+
|
| 558 |
+
|
| 559 |
+
def test_animation_with_transparency():
|
| 560 |
+
"""Test animation exhaustion with transparency using PillowWriter directly"""
|
| 561 |
+
fig, ax = plt.subplots()
|
| 562 |
+
rect = plt.Rectangle((0, 0), 1, 1, color='red', alpha=0.5)
|
| 563 |
+
ax.add_patch(rect)
|
| 564 |
+
ax.set_xlim(0, 1)
|
| 565 |
+
ax.set_ylim(0, 1)
|
| 566 |
+
|
| 567 |
+
writer = PillowWriter(fps=30)
|
| 568 |
+
writer.setup(fig, 'unused.gif', dpi=100)
|
| 569 |
+
writer.grab_frame(transparent=True)
|
| 570 |
+
frame = writer._frames[-1]
|
| 571 |
+
# Check that the alpha channel is not 255, so frame has transparency
|
| 572 |
+
assert frame.getextrema()[3][0] < 255
|
| 573 |
+
plt.close(fig)
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_api.py
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
from collections.abc import Callable
|
| 4 |
+
import re
|
| 5 |
+
import typing
|
| 6 |
+
from typing import Any, TypeVar
|
| 7 |
+
|
| 8 |
+
import numpy as np
|
| 9 |
+
import pytest
|
| 10 |
+
|
| 11 |
+
import matplotlib as mpl
|
| 12 |
+
from matplotlib import _api
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
if typing.TYPE_CHECKING:
|
| 16 |
+
from typing import Self
|
| 17 |
+
|
| 18 |
+
T = TypeVar('T')
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def test_unsupported_method():
|
| 22 |
+
class Base:
|
| 23 |
+
def method_1(self):
|
| 24 |
+
pass
|
| 25 |
+
|
| 26 |
+
def method_2(self):
|
| 27 |
+
pass
|
| 28 |
+
|
| 29 |
+
class Child(Base):
|
| 30 |
+
method_1 = _api.unsupported_method()
|
| 31 |
+
method_2 = _api.unsupported_method(append_message="Sorry!")
|
| 32 |
+
|
| 33 |
+
child = Child()
|
| 34 |
+
with pytest.raises(_api.UnsupportedError,
|
| 35 |
+
match=r"^Child does not support 'method_1'\.$"):
|
| 36 |
+
child.method_1()
|
| 37 |
+
with pytest.raises(_api.UnsupportedError,
|
| 38 |
+
match=r"^Child does not support 'method_2'\. Sorry!$"):
|
| 39 |
+
child.method_2()
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
@pytest.mark.parametrize('target,shape_repr,test_shape',
|
| 43 |
+
[((None, ), "(N,)", (1, 3)),
|
| 44 |
+
((None, 3), "(N, 3)", (1,)),
|
| 45 |
+
((None, 3), "(N, 3)", (1, 2)),
|
| 46 |
+
((1, 5), "(1, 5)", (1, 9)),
|
| 47 |
+
((None, 2, None), "(M, 2, N)", (1, 3, 1))
|
| 48 |
+
])
|
| 49 |
+
def test_check_shape(target: tuple[int | None, ...],
|
| 50 |
+
shape_repr: str,
|
| 51 |
+
test_shape: tuple[int, ...]) -> None:
|
| 52 |
+
error_pattern = "^" + re.escape(
|
| 53 |
+
f"'aardvark' must be {len(target)}D with shape {shape_repr}, but your input "
|
| 54 |
+
f"has shape {test_shape}")
|
| 55 |
+
data = np.zeros(test_shape)
|
| 56 |
+
with pytest.raises(ValueError, match=error_pattern):
|
| 57 |
+
_api.check_shape(target, aardvark=data)
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def test_classproperty_deprecation() -> None:
|
| 61 |
+
class A:
|
| 62 |
+
@_api.deprecated("0.0.0")
|
| 63 |
+
@_api.classproperty
|
| 64 |
+
def f(cls: Self) -> None:
|
| 65 |
+
pass
|
| 66 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 67 |
+
A.f
|
| 68 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 69 |
+
a = A()
|
| 70 |
+
a.f
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def test_warn_deprecated():
|
| 74 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 75 |
+
match=r'foo was deprecated in Matplotlib 3\.10 and will be '
|
| 76 |
+
r'removed in 3\.12\.'):
|
| 77 |
+
_api.warn_deprecated('3.10', name='foo')
|
| 78 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 79 |
+
match=r'The foo class was deprecated in Matplotlib 3\.10 and '
|
| 80 |
+
r'will be removed in 3\.12\.'):
|
| 81 |
+
_api.warn_deprecated('3.10', name='foo', obj_type='class')
|
| 82 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 83 |
+
match=r'foo was deprecated in Matplotlib 3\.10 and will be '
|
| 84 |
+
r'removed in 3\.12\. Use bar instead\.'):
|
| 85 |
+
_api.warn_deprecated('3.10', name='foo', alternative='bar')
|
| 86 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 87 |
+
match=r'foo was deprecated in Matplotlib 3\.10 and will be '
|
| 88 |
+
r'removed in 3\.12\. More information\.'):
|
| 89 |
+
_api.warn_deprecated('3.10', name='foo', addendum='More information.')
|
| 90 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 91 |
+
match=r'foo was deprecated in Matplotlib 3\.10 and will be '
|
| 92 |
+
r'removed in 4\.0\.'):
|
| 93 |
+
_api.warn_deprecated('3.10', name='foo', removal='4.0')
|
| 94 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning,
|
| 95 |
+
match=r'foo was deprecated in Matplotlib 3\.10\.'):
|
| 96 |
+
_api.warn_deprecated('3.10', name='foo', removal=False)
|
| 97 |
+
with pytest.warns(PendingDeprecationWarning,
|
| 98 |
+
match=r'foo will be deprecated in a future version'):
|
| 99 |
+
_api.warn_deprecated('3.10', name='foo', pending=True)
|
| 100 |
+
with pytest.raises(ValueError, match=r'cannot have a scheduled removal'):
|
| 101 |
+
_api.warn_deprecated('3.10', name='foo', pending=True, removal='3.12')
|
| 102 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning, match=r'Complete replacement'):
|
| 103 |
+
_api.warn_deprecated('3.10', message='Complete replacement', name='foo',
|
| 104 |
+
alternative='bar', addendum='More information.',
|
| 105 |
+
obj_type='class', removal='4.0')
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
def test_deprecate_privatize_attribute() -> None:
|
| 109 |
+
class C:
|
| 110 |
+
def __init__(self) -> None: self._attr = 1
|
| 111 |
+
def _meth(self, arg: T) -> T: return arg
|
| 112 |
+
attr: int = _api.deprecate_privatize_attribute("0.0")
|
| 113 |
+
meth: Callable = _api.deprecate_privatize_attribute("0.0")
|
| 114 |
+
|
| 115 |
+
c = C()
|
| 116 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 117 |
+
assert c.attr == 1
|
| 118 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 119 |
+
c.attr = 2
|
| 120 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 121 |
+
assert c.attr == 2
|
| 122 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 123 |
+
assert c.meth(42) == 42
|
| 124 |
+
|
| 125 |
+
|
| 126 |
+
def test_delete_parameter() -> None:
|
| 127 |
+
@_api.delete_parameter("3.0", "foo")
|
| 128 |
+
def func1(foo: Any = None) -> None:
|
| 129 |
+
pass
|
| 130 |
+
|
| 131 |
+
@_api.delete_parameter("3.0", "foo")
|
| 132 |
+
def func2(**kwargs: Any) -> None:
|
| 133 |
+
pass
|
| 134 |
+
|
| 135 |
+
for func in [func1, func2]: # type: ignore[list-item]
|
| 136 |
+
func() # No warning.
|
| 137 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 138 |
+
func(foo="bar")
|
| 139 |
+
|
| 140 |
+
def pyplot_wrapper(foo: Any = _api.deprecation._deprecated_parameter) -> None:
|
| 141 |
+
func1(foo)
|
| 142 |
+
|
| 143 |
+
pyplot_wrapper() # No warning.
|
| 144 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 145 |
+
func(foo="bar")
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
def test_make_keyword_only() -> None:
|
| 149 |
+
@_api.make_keyword_only("3.0", "arg")
|
| 150 |
+
def func(pre: Any, arg: Any, post: Any = None) -> None:
|
| 151 |
+
pass
|
| 152 |
+
|
| 153 |
+
func(1, arg=2) # Check that no warning is emitted.
|
| 154 |
+
|
| 155 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 156 |
+
func(1, 2)
|
| 157 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 158 |
+
func(1, 2, 3)
|
| 159 |
+
|
| 160 |
+
|
| 161 |
+
def test_deprecation_alternative() -> None:
|
| 162 |
+
alternative = "`.f1`, `f2`, `f3(x) <.f3>` or `f4(x)<f4>`"
|
| 163 |
+
@_api.deprecated("1", alternative=alternative)
|
| 164 |
+
def f() -> None:
|
| 165 |
+
pass
|
| 166 |
+
if f.__doc__ is None:
|
| 167 |
+
pytest.skip('Documentation is disabled')
|
| 168 |
+
assert alternative in f.__doc__
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
def test_empty_check_in_list() -> None:
|
| 172 |
+
with pytest.raises(TypeError, match="No argument to check!"):
|
| 173 |
+
_api.check_in_list(["a"])
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
def test_check_in_list_numpy() -> None:
|
| 177 |
+
with pytest.raises(ValueError, match=r"array\(5\) is not a valid value"):
|
| 178 |
+
_api.check_in_list(['a', 'b'], value=np.array(5))
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_arrow_patches.py
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pytest
|
| 2 |
+
import platform
|
| 3 |
+
import matplotlib.pyplot as plt
|
| 4 |
+
from matplotlib.testing.decorators import image_comparison
|
| 5 |
+
import matplotlib.patches as mpatches
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def draw_arrow(ax, t, r):
|
| 9 |
+
ax.annotate('', xy=(0.5, 0.5 + r), xytext=(0.5, 0.5), size=30,
|
| 10 |
+
arrowprops=dict(arrowstyle=t,
|
| 11 |
+
fc="b", ec='k'))
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
@image_comparison(['fancyarrow_test_image.png'], style='_classic_test',
|
| 15 |
+
tol=0 if platform.machine() == 'x86_64' else 0.012)
|
| 16 |
+
def test_fancyarrow():
|
| 17 |
+
# Added 0 to test division by zero error described in issue 3930
|
| 18 |
+
r = [0.4, 0.3, 0.2, 0.1, 0]
|
| 19 |
+
t = ["fancy", "simple", mpatches.ArrowStyle.Fancy()]
|
| 20 |
+
|
| 21 |
+
fig, axs = plt.subplots(len(t), len(r), squeeze=False,
|
| 22 |
+
figsize=(8, 4.5), subplot_kw=dict(aspect=1))
|
| 23 |
+
|
| 24 |
+
for i_r, r1 in enumerate(r):
|
| 25 |
+
for i_t, t1 in enumerate(t):
|
| 26 |
+
ax = axs[i_t, i_r]
|
| 27 |
+
draw_arrow(ax, t1, r1)
|
| 28 |
+
ax.tick_params(labelleft=False, labelbottom=False)
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
@image_comparison(['boxarrow_test_image.png'], style='mpl20')
|
| 32 |
+
def test_boxarrow():
|
| 33 |
+
|
| 34 |
+
styles = mpatches.BoxStyle.get_styles()
|
| 35 |
+
|
| 36 |
+
n = len(styles)
|
| 37 |
+
spacing = 1.2
|
| 38 |
+
|
| 39 |
+
figheight = (n * spacing + .5)
|
| 40 |
+
fig = plt.figure(figsize=(4 / 1.5, figheight / 1.5))
|
| 41 |
+
|
| 42 |
+
fontsize = 0.3 * 72
|
| 43 |
+
|
| 44 |
+
for i, stylename in enumerate(sorted(styles)):
|
| 45 |
+
fig.text(0.5, ((n - i) * spacing - 0.5)/figheight, stylename,
|
| 46 |
+
ha="center",
|
| 47 |
+
size=fontsize,
|
| 48 |
+
transform=fig.transFigure,
|
| 49 |
+
bbox=dict(boxstyle=stylename, fc="w", ec="k"))
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
@image_comparison(['boxarrow_adjustment_test_image.png'], style='mpl20')
|
| 53 |
+
def test_boxarrow_adjustment():
|
| 54 |
+
|
| 55 |
+
styles = ['larrow', 'rarrow', 'darrow']
|
| 56 |
+
|
| 57 |
+
# Cases [head_width, head_angle] to test for each arrow style
|
| 58 |
+
cases = [
|
| 59 |
+
[1.5, 90],
|
| 60 |
+
[1.5, 170], # Test dynamic padding
|
| 61 |
+
[0.75, 30],
|
| 62 |
+
[0.5, -10], # Should just give a rectangle
|
| 63 |
+
[2, -90],
|
| 64 |
+
[2, -15] # None of arrow body is outside of head
|
| 65 |
+
]
|
| 66 |
+
|
| 67 |
+
# Horizontal and vertical spacings of arrow centres
|
| 68 |
+
spacing_horizontal = 3.75
|
| 69 |
+
spacing_vertical = 1.6
|
| 70 |
+
|
| 71 |
+
# Numbers of styles and cases
|
| 72 |
+
m = len(styles)
|
| 73 |
+
n = len(cases)
|
| 74 |
+
|
| 75 |
+
figwidth = (m * spacing_horizontal)
|
| 76 |
+
figheight = (n * spacing_vertical) + .5
|
| 77 |
+
|
| 78 |
+
fig = plt.figure(figsize=(figwidth / 1.5, figheight / 1.5))
|
| 79 |
+
|
| 80 |
+
fontsize = 0.3 * 72
|
| 81 |
+
|
| 82 |
+
for i, stylename in enumerate(styles):
|
| 83 |
+
for j, case in enumerate(cases):
|
| 84 |
+
# Draw arrow
|
| 85 |
+
fig.text(
|
| 86 |
+
((m - i) * spacing_horizontal - 1.5) / figwidth,
|
| 87 |
+
((n - j) * spacing_vertical - 0.5) / figheight,
|
| 88 |
+
stylename, ha='center', va='center',
|
| 89 |
+
size=fontsize, transform=fig.transFigure,
|
| 90 |
+
bbox=dict(boxstyle=f"{stylename}, head_width={case[0]}, \
|
| 91 |
+
head_angle={case[1]}", fc="w", ec="k"))
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
def __prepare_fancyarrow_dpi_cor_test():
|
| 95 |
+
"""
|
| 96 |
+
Convenience function that prepares and returns a FancyArrowPatch. It aims
|
| 97 |
+
at being used to test that the size of the arrow head does not depend on
|
| 98 |
+
the DPI value of the exported picture.
|
| 99 |
+
|
| 100 |
+
NB: this function *is not* a test in itself!
|
| 101 |
+
"""
|
| 102 |
+
fig2 = plt.figure("fancyarrow_dpi_cor_test", figsize=(4, 3), dpi=50)
|
| 103 |
+
ax = fig2.add_subplot()
|
| 104 |
+
ax.set_xlim(0, 1)
|
| 105 |
+
ax.set_ylim(0, 1)
|
| 106 |
+
ax.add_patch(mpatches.FancyArrowPatch(posA=(0.3, 0.4), posB=(0.8, 0.6),
|
| 107 |
+
lw=3, arrowstyle='->',
|
| 108 |
+
mutation_scale=100))
|
| 109 |
+
return fig2
|
| 110 |
+
|
| 111 |
+
|
| 112 |
+
@image_comparison(['fancyarrow_dpi_cor_100dpi.png'], remove_text=True,
|
| 113 |
+
savefig_kwarg=dict(dpi=100), style='_classic_test',
|
| 114 |
+
tol=0 if platform.machine() == 'x86_64' else 0.02)
|
| 115 |
+
def test_fancyarrow_dpi_cor_100dpi():
|
| 116 |
+
"""
|
| 117 |
+
Check the export of a FancyArrowPatch @ 100 DPI. FancyArrowPatch is
|
| 118 |
+
instantiated through a dedicated function because another similar test
|
| 119 |
+
checks a similar export but with a different DPI value.
|
| 120 |
+
|
| 121 |
+
Remark: test only a rasterized format.
|
| 122 |
+
"""
|
| 123 |
+
|
| 124 |
+
__prepare_fancyarrow_dpi_cor_test()
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
@image_comparison(['fancyarrow_dpi_cor_200dpi.png'], remove_text=True,
|
| 128 |
+
savefig_kwarg=dict(dpi=200), style='_classic_test',
|
| 129 |
+
tol=0 if platform.machine() == 'x86_64' else 0.02)
|
| 130 |
+
def test_fancyarrow_dpi_cor_200dpi():
|
| 131 |
+
"""
|
| 132 |
+
As test_fancyarrow_dpi_cor_100dpi, but exports @ 200 DPI. The relative size
|
| 133 |
+
of the arrow head should be the same.
|
| 134 |
+
"""
|
| 135 |
+
|
| 136 |
+
__prepare_fancyarrow_dpi_cor_test()
|
| 137 |
+
|
| 138 |
+
|
| 139 |
+
@image_comparison(['fancyarrow_dash.png'], remove_text=True, style='default')
|
| 140 |
+
def test_fancyarrow_dash():
|
| 141 |
+
fig, ax = plt.subplots()
|
| 142 |
+
e = mpatches.FancyArrowPatch((0, 0), (0.5, 0.5),
|
| 143 |
+
arrowstyle='-|>',
|
| 144 |
+
connectionstyle='angle3,angleA=0,angleB=90',
|
| 145 |
+
mutation_scale=10.0,
|
| 146 |
+
linewidth=2,
|
| 147 |
+
linestyle='dashed',
|
| 148 |
+
color='k')
|
| 149 |
+
e2 = mpatches.FancyArrowPatch((0, 0), (0.5, 0.5),
|
| 150 |
+
arrowstyle='-|>',
|
| 151 |
+
connectionstyle='angle3',
|
| 152 |
+
mutation_scale=10.0,
|
| 153 |
+
linewidth=2,
|
| 154 |
+
linestyle='dotted',
|
| 155 |
+
color='k')
|
| 156 |
+
ax.add_patch(e)
|
| 157 |
+
ax.add_patch(e2)
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
@image_comparison(['arrow_styles.png'], style='mpl20', remove_text=True,
|
| 161 |
+
tol=0 if platform.machine() == 'x86_64' else 0.02)
|
| 162 |
+
def test_arrow_styles():
|
| 163 |
+
styles = mpatches.ArrowStyle.get_styles()
|
| 164 |
+
|
| 165 |
+
n = len(styles)
|
| 166 |
+
fig, ax = plt.subplots(figsize=(8, 8))
|
| 167 |
+
ax.set_xlim(0, 1)
|
| 168 |
+
ax.set_ylim(-1, n)
|
| 169 |
+
fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
|
| 170 |
+
|
| 171 |
+
for i, stylename in enumerate(sorted(styles)):
|
| 172 |
+
patch = mpatches.FancyArrowPatch((0.1 + (i % 2)*0.05, i),
|
| 173 |
+
(0.45 + (i % 2)*0.05, i),
|
| 174 |
+
arrowstyle=stylename,
|
| 175 |
+
mutation_scale=25)
|
| 176 |
+
ax.add_patch(patch)
|
| 177 |
+
|
| 178 |
+
for i, stylename in enumerate([']-[', ']-', '-[', '|-|']):
|
| 179 |
+
style = stylename
|
| 180 |
+
if stylename[0] != '-':
|
| 181 |
+
style += ',angleA=ANGLE'
|
| 182 |
+
if stylename[-1] != '-':
|
| 183 |
+
style += ',angleB=ANGLE'
|
| 184 |
+
|
| 185 |
+
for j, angle in enumerate([-30, 60]):
|
| 186 |
+
arrowstyle = style.replace('ANGLE', str(angle))
|
| 187 |
+
patch = mpatches.FancyArrowPatch((0.55, 2*i + j), (0.9, 2*i + j),
|
| 188 |
+
arrowstyle=arrowstyle,
|
| 189 |
+
mutation_scale=25)
|
| 190 |
+
ax.add_patch(patch)
|
| 191 |
+
|
| 192 |
+
|
| 193 |
+
@image_comparison(['connection_styles.png'], style='mpl20', remove_text=True,
|
| 194 |
+
tol=0 if platform.machine() == 'x86_64' else 0.013)
|
| 195 |
+
def test_connection_styles():
|
| 196 |
+
styles = mpatches.ConnectionStyle.get_styles()
|
| 197 |
+
|
| 198 |
+
n = len(styles)
|
| 199 |
+
fig, ax = plt.subplots(figsize=(6, 10))
|
| 200 |
+
ax.set_xlim(0, 1)
|
| 201 |
+
ax.set_ylim(-1, n)
|
| 202 |
+
|
| 203 |
+
for i, stylename in enumerate(sorted(styles)):
|
| 204 |
+
patch = mpatches.FancyArrowPatch((0.1, i), (0.8, i + 0.5),
|
| 205 |
+
arrowstyle="->",
|
| 206 |
+
connectionstyle=stylename,
|
| 207 |
+
mutation_scale=25)
|
| 208 |
+
ax.add_patch(patch)
|
| 209 |
+
|
| 210 |
+
|
| 211 |
+
def test_invalid_intersection():
|
| 212 |
+
conn_style_1 = mpatches.ConnectionStyle.Angle3(angleA=20, angleB=200)
|
| 213 |
+
p1 = mpatches.FancyArrowPatch((.2, .2), (.5, .5),
|
| 214 |
+
connectionstyle=conn_style_1)
|
| 215 |
+
with pytest.raises(ValueError):
|
| 216 |
+
plt.gca().add_patch(p1)
|
| 217 |
+
|
| 218 |
+
conn_style_2 = mpatches.ConnectionStyle.Angle3(angleA=20, angleB=199.9)
|
| 219 |
+
p2 = mpatches.FancyArrowPatch((.2, .2), (.5, .5),
|
| 220 |
+
connectionstyle=conn_style_2)
|
| 221 |
+
plt.gca().add_patch(p2)
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_artist.py
ADDED
|
@@ -0,0 +1,625 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
from itertools import chain
|
| 3 |
+
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
import pytest
|
| 7 |
+
|
| 8 |
+
import matplotlib.colors as mcolors
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import matplotlib.patches as mpatches
|
| 11 |
+
import matplotlib.lines as mlines
|
| 12 |
+
import matplotlib.path as mpath
|
| 13 |
+
import matplotlib.transforms as mtransforms
|
| 14 |
+
import matplotlib.collections as mcollections
|
| 15 |
+
import matplotlib.artist as martist
|
| 16 |
+
import matplotlib.backend_bases as mbackend_bases
|
| 17 |
+
import matplotlib as mpl
|
| 18 |
+
from matplotlib.testing.decorators import check_figures_equal, image_comparison
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def test_patch_transform_of_none():
|
| 22 |
+
# tests the behaviour of patches added to an Axes with various transform
|
| 23 |
+
# specifications
|
| 24 |
+
|
| 25 |
+
ax = plt.axes()
|
| 26 |
+
ax.set_xlim(1, 3)
|
| 27 |
+
ax.set_ylim(1, 3)
|
| 28 |
+
|
| 29 |
+
# Draw an ellipse over data coord (2, 2) by specifying device coords.
|
| 30 |
+
xy_data = (2, 2)
|
| 31 |
+
xy_pix = ax.transData.transform(xy_data)
|
| 32 |
+
|
| 33 |
+
# Not providing a transform of None puts the ellipse in data coordinates .
|
| 34 |
+
e = mpatches.Ellipse(xy_data, width=1, height=1, fc='yellow', alpha=0.5)
|
| 35 |
+
ax.add_patch(e)
|
| 36 |
+
assert e._transform == ax.transData
|
| 37 |
+
|
| 38 |
+
# Providing a transform of None puts the ellipse in device coordinates.
|
| 39 |
+
e = mpatches.Ellipse(xy_pix, width=120, height=120, fc='coral',
|
| 40 |
+
transform=None, alpha=0.5)
|
| 41 |
+
assert e.is_transform_set()
|
| 42 |
+
ax.add_patch(e)
|
| 43 |
+
assert isinstance(e._transform, mtransforms.IdentityTransform)
|
| 44 |
+
|
| 45 |
+
# Providing an IdentityTransform puts the ellipse in device coordinates.
|
| 46 |
+
e = mpatches.Ellipse(xy_pix, width=100, height=100,
|
| 47 |
+
transform=mtransforms.IdentityTransform(), alpha=0.5)
|
| 48 |
+
ax.add_patch(e)
|
| 49 |
+
assert isinstance(e._transform, mtransforms.IdentityTransform)
|
| 50 |
+
|
| 51 |
+
# Not providing a transform, and then subsequently "get_transform" should
|
| 52 |
+
# not mean that "is_transform_set".
|
| 53 |
+
e = mpatches.Ellipse(xy_pix, width=120, height=120, fc='coral',
|
| 54 |
+
alpha=0.5)
|
| 55 |
+
intermediate_transform = e.get_transform()
|
| 56 |
+
assert not e.is_transform_set()
|
| 57 |
+
ax.add_patch(e)
|
| 58 |
+
assert e.get_transform() != intermediate_transform
|
| 59 |
+
assert e.is_transform_set()
|
| 60 |
+
assert e._transform == ax.transData
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
def test_collection_transform_of_none():
|
| 64 |
+
# tests the behaviour of collections added to an Axes with various
|
| 65 |
+
# transform specifications
|
| 66 |
+
|
| 67 |
+
ax = plt.axes()
|
| 68 |
+
ax.set_xlim(1, 3)
|
| 69 |
+
ax.set_ylim(1, 3)
|
| 70 |
+
|
| 71 |
+
# draw an ellipse over data coord (2, 2) by specifying device coords
|
| 72 |
+
xy_data = (2, 2)
|
| 73 |
+
xy_pix = ax.transData.transform(xy_data)
|
| 74 |
+
|
| 75 |
+
# not providing a transform of None puts the ellipse in data coordinates
|
| 76 |
+
e = mpatches.Ellipse(xy_data, width=1, height=1)
|
| 77 |
+
c = mcollections.PatchCollection([e], facecolor='yellow', alpha=0.5)
|
| 78 |
+
ax.add_collection(c)
|
| 79 |
+
# the collection should be in data coordinates
|
| 80 |
+
assert c.get_offset_transform() + c.get_transform() == ax.transData
|
| 81 |
+
|
| 82 |
+
# providing a transform of None puts the ellipse in device coordinates
|
| 83 |
+
e = mpatches.Ellipse(xy_pix, width=120, height=120)
|
| 84 |
+
c = mcollections.PatchCollection([e], facecolor='coral',
|
| 85 |
+
alpha=0.5)
|
| 86 |
+
c.set_transform(None)
|
| 87 |
+
ax.add_collection(c)
|
| 88 |
+
assert isinstance(c.get_transform(), mtransforms.IdentityTransform)
|
| 89 |
+
|
| 90 |
+
# providing an IdentityTransform puts the ellipse in device coordinates
|
| 91 |
+
e = mpatches.Ellipse(xy_pix, width=100, height=100)
|
| 92 |
+
c = mcollections.PatchCollection([e],
|
| 93 |
+
transform=mtransforms.IdentityTransform(),
|
| 94 |
+
alpha=0.5)
|
| 95 |
+
ax.add_collection(c)
|
| 96 |
+
assert isinstance(c.get_offset_transform(), mtransforms.IdentityTransform)
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
@image_comparison(["clip_path_clipping"], remove_text=True, style='_classic_test')
|
| 100 |
+
def test_clipping():
|
| 101 |
+
exterior = mpath.Path.unit_rectangle().deepcopy()
|
| 102 |
+
exterior.vertices *= 4
|
| 103 |
+
exterior.vertices -= 2
|
| 104 |
+
interior = mpath.Path.unit_circle().deepcopy()
|
| 105 |
+
interior.vertices = interior.vertices[::-1]
|
| 106 |
+
clip_path = mpath.Path.make_compound_path(exterior, interior)
|
| 107 |
+
|
| 108 |
+
star = mpath.Path.unit_regular_star(6).deepcopy()
|
| 109 |
+
star.vertices *= 2.6
|
| 110 |
+
|
| 111 |
+
fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)
|
| 112 |
+
|
| 113 |
+
col = mcollections.PathCollection([star], lw=5, edgecolor='blue',
|
| 114 |
+
facecolor='red', alpha=0.7, hatch='*')
|
| 115 |
+
col.set_clip_path(clip_path, ax1.transData)
|
| 116 |
+
ax1.add_collection(col)
|
| 117 |
+
|
| 118 |
+
patch = mpatches.PathPatch(star, lw=5, edgecolor='blue', facecolor='red',
|
| 119 |
+
alpha=0.7, hatch='*')
|
| 120 |
+
patch.set_clip_path(clip_path, ax2.transData)
|
| 121 |
+
ax2.add_patch(patch)
|
| 122 |
+
|
| 123 |
+
ax1.set_xlim(-3, 3)
|
| 124 |
+
ax1.set_ylim(-3, 3)
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
@check_figures_equal()
|
| 128 |
+
def test_clipping_zoom(fig_test, fig_ref):
|
| 129 |
+
# This test places the Axes and sets its limits such that the clip path is
|
| 130 |
+
# outside the figure entirely. This should not break the clip path.
|
| 131 |
+
ax_test = fig_test.add_axes((0, 0, 1, 1))
|
| 132 |
+
l, = ax_test.plot([-3, 3], [-3, 3])
|
| 133 |
+
# Explicit Path instead of a Rectangle uses clip path processing, instead
|
| 134 |
+
# of a clip box optimization.
|
| 135 |
+
p = mpath.Path([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]])
|
| 136 |
+
p = mpatches.PathPatch(p, transform=ax_test.transData)
|
| 137 |
+
l.set_clip_path(p)
|
| 138 |
+
|
| 139 |
+
ax_ref = fig_ref.add_axes((0, 0, 1, 1))
|
| 140 |
+
ax_ref.plot([-3, 3], [-3, 3])
|
| 141 |
+
|
| 142 |
+
ax_ref.set(xlim=(0.5, 0.75), ylim=(0.5, 0.75))
|
| 143 |
+
ax_test.set(xlim=(0.5, 0.75), ylim=(0.5, 0.75))
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
def test_cull_markers():
|
| 147 |
+
x = np.random.random(20000)
|
| 148 |
+
y = np.random.random(20000)
|
| 149 |
+
|
| 150 |
+
fig, ax = plt.subplots()
|
| 151 |
+
ax.plot(x, y, 'k.')
|
| 152 |
+
ax.set_xlim(2, 3)
|
| 153 |
+
|
| 154 |
+
pdf = io.BytesIO()
|
| 155 |
+
fig.savefig(pdf, format="pdf")
|
| 156 |
+
assert len(pdf.getvalue()) < 8000
|
| 157 |
+
|
| 158 |
+
svg = io.BytesIO()
|
| 159 |
+
fig.savefig(svg, format="svg")
|
| 160 |
+
assert len(svg.getvalue()) < 20000
|
| 161 |
+
|
| 162 |
+
|
| 163 |
+
@image_comparison(['hatching'], remove_text=True, style='default')
|
| 164 |
+
def test_hatching():
|
| 165 |
+
fig, ax = plt.subplots(1, 1)
|
| 166 |
+
|
| 167 |
+
# Default hatch color.
|
| 168 |
+
rect1 = mpatches.Rectangle((0, 0), 3, 4, hatch='/')
|
| 169 |
+
ax.add_patch(rect1)
|
| 170 |
+
|
| 171 |
+
rect2 = mcollections.RegularPolyCollection(
|
| 172 |
+
4, sizes=[16000], offsets=[(1.5, 6.5)], offset_transform=ax.transData,
|
| 173 |
+
hatch='/')
|
| 174 |
+
ax.add_collection(rect2)
|
| 175 |
+
|
| 176 |
+
# Ensure edge color is not applied to hatching.
|
| 177 |
+
rect3 = mpatches.Rectangle((4, 0), 3, 4, hatch='/', edgecolor='C1')
|
| 178 |
+
ax.add_patch(rect3)
|
| 179 |
+
|
| 180 |
+
rect4 = mcollections.RegularPolyCollection(
|
| 181 |
+
4, sizes=[16000], offsets=[(5.5, 6.5)], offset_transform=ax.transData,
|
| 182 |
+
hatch='/', edgecolor='C1')
|
| 183 |
+
ax.add_collection(rect4)
|
| 184 |
+
|
| 185 |
+
ax.set_xlim(0, 7)
|
| 186 |
+
ax.set_ylim(0, 9)
|
| 187 |
+
|
| 188 |
+
|
| 189 |
+
def test_remove():
|
| 190 |
+
fig, ax = plt.subplots()
|
| 191 |
+
im = ax.imshow(np.arange(36).reshape(6, 6))
|
| 192 |
+
ln, = ax.plot(range(5))
|
| 193 |
+
|
| 194 |
+
assert fig.stale
|
| 195 |
+
assert ax.stale
|
| 196 |
+
|
| 197 |
+
fig.canvas.draw()
|
| 198 |
+
assert not fig.stale
|
| 199 |
+
assert not ax.stale
|
| 200 |
+
assert not ln.stale
|
| 201 |
+
|
| 202 |
+
assert im in ax._mouseover_set
|
| 203 |
+
assert ln not in ax._mouseover_set
|
| 204 |
+
assert im.axes is ax
|
| 205 |
+
|
| 206 |
+
im.remove()
|
| 207 |
+
ln.remove()
|
| 208 |
+
|
| 209 |
+
for art in [im, ln]:
|
| 210 |
+
assert art.axes is None
|
| 211 |
+
assert art.get_figure() is None
|
| 212 |
+
|
| 213 |
+
assert im not in ax._mouseover_set
|
| 214 |
+
assert fig.stale
|
| 215 |
+
assert ax.stale
|
| 216 |
+
|
| 217 |
+
|
| 218 |
+
@image_comparison(["default_edges.png"], remove_text=True, style='default')
|
| 219 |
+
def test_default_edges():
|
| 220 |
+
fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2)
|
| 221 |
+
|
| 222 |
+
ax1.plot(np.arange(10), np.arange(10), 'x',
|
| 223 |
+
np.arange(10) + 1, np.arange(10), 'o')
|
| 224 |
+
ax2.bar(np.arange(10), np.arange(10), align='edge')
|
| 225 |
+
ax3.text(0, 0, "BOX", size=24, bbox=dict(boxstyle='sawtooth'))
|
| 226 |
+
ax3.set_xlim(-1, 1)
|
| 227 |
+
ax3.set_ylim(-1, 1)
|
| 228 |
+
pp1 = mpatches.PathPatch(
|
| 229 |
+
mpath.Path([(0, 0), (1, 0), (1, 1), (0, 0)],
|
| 230 |
+
[mpath.Path.MOVETO, mpath.Path.CURVE3,
|
| 231 |
+
mpath.Path.CURVE3, mpath.Path.CLOSEPOLY]),
|
| 232 |
+
fc="none", transform=ax4.transData)
|
| 233 |
+
ax4.add_patch(pp1)
|
| 234 |
+
|
| 235 |
+
|
| 236 |
+
def test_properties():
|
| 237 |
+
ln = mlines.Line2D([], [])
|
| 238 |
+
ln.properties() # Check that no warning is emitted.
|
| 239 |
+
|
| 240 |
+
|
| 241 |
+
def test_setp():
|
| 242 |
+
# Check empty list
|
| 243 |
+
plt.setp([])
|
| 244 |
+
plt.setp([[]])
|
| 245 |
+
|
| 246 |
+
# Check arbitrary iterables
|
| 247 |
+
fig, ax = plt.subplots()
|
| 248 |
+
lines1 = ax.plot(range(3))
|
| 249 |
+
lines2 = ax.plot(range(3))
|
| 250 |
+
martist.setp(chain(lines1, lines2), 'lw', 5)
|
| 251 |
+
plt.setp(ax.spines.values(), color='green')
|
| 252 |
+
|
| 253 |
+
# Check *file* argument
|
| 254 |
+
sio = io.StringIO()
|
| 255 |
+
plt.setp(lines1, 'zorder', file=sio)
|
| 256 |
+
assert sio.getvalue() == ' zorder: float\n'
|
| 257 |
+
|
| 258 |
+
|
| 259 |
+
def test_artist_set():
|
| 260 |
+
line = mlines.Line2D([], [])
|
| 261 |
+
line.set(linewidth=7)
|
| 262 |
+
assert line.get_linewidth() == 7
|
| 263 |
+
|
| 264 |
+
# Property aliases should work
|
| 265 |
+
line.set(lw=5)
|
| 266 |
+
assert line.get_linewidth() == 5
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
def test_artist_set_invalid_property_raises():
|
| 270 |
+
"""
|
| 271 |
+
Test that set() raises AttributeError for invalid property names.
|
| 272 |
+
"""
|
| 273 |
+
line = mlines.Line2D([0, 1], [0, 1])
|
| 274 |
+
|
| 275 |
+
with pytest.raises(AttributeError, match="unexpected keyword argument"):
|
| 276 |
+
line.set(not_a_property=1)
|
| 277 |
+
|
| 278 |
+
|
| 279 |
+
def test_artist_set_duplicate_aliases_raises():
|
| 280 |
+
"""
|
| 281 |
+
Test that set() raises TypeError when both a property and its alias are provided.
|
| 282 |
+
"""
|
| 283 |
+
line = mlines.Line2D([0, 1], [0, 1])
|
| 284 |
+
|
| 285 |
+
with pytest.raises(TypeError, match="aliases of one another"):
|
| 286 |
+
line.set(lw=2, linewidth=3)
|
| 287 |
+
|
| 288 |
+
|
| 289 |
+
def test_None_zorder():
|
| 290 |
+
fig, ax = plt.subplots()
|
| 291 |
+
ln, = ax.plot(range(5), zorder=None)
|
| 292 |
+
assert ln.get_zorder() == mlines.Line2D.zorder
|
| 293 |
+
ln.set_zorder(123456)
|
| 294 |
+
assert ln.get_zorder() == 123456
|
| 295 |
+
ln.set_zorder(None)
|
| 296 |
+
assert ln.get_zorder() == mlines.Line2D.zorder
|
| 297 |
+
|
| 298 |
+
|
| 299 |
+
@pytest.mark.parametrize('accept_clause, expected', [
|
| 300 |
+
('', 'unknown'),
|
| 301 |
+
("ACCEPTS: [ '-' | '--' | '-.' ]", "[ '-' | '--' | '-.' ]"),
|
| 302 |
+
('ACCEPTS: Some description.', 'Some description.'),
|
| 303 |
+
('.. ACCEPTS: Some description.', 'Some description.'),
|
| 304 |
+
('arg : int', 'int'),
|
| 305 |
+
('*arg : int', 'int'),
|
| 306 |
+
('arg : int\nACCEPTS: Something else.', 'Something else. '),
|
| 307 |
+
])
|
| 308 |
+
def test_artist_inspector_get_valid_values(accept_clause, expected):
|
| 309 |
+
class TestArtist(martist.Artist):
|
| 310 |
+
def set_f(self, arg):
|
| 311 |
+
pass
|
| 312 |
+
|
| 313 |
+
TestArtist.set_f.__doc__ = """
|
| 314 |
+
Some text.
|
| 315 |
+
|
| 316 |
+
%s
|
| 317 |
+
""" % accept_clause
|
| 318 |
+
valid_values = martist.ArtistInspector(TestArtist).get_valid_values('f')
|
| 319 |
+
assert valid_values == expected
|
| 320 |
+
|
| 321 |
+
|
| 322 |
+
def test_artist_inspector_get_aliases():
|
| 323 |
+
# test the correct format and type of get_aliases method
|
| 324 |
+
ai = martist.ArtistInspector(mlines.Line2D)
|
| 325 |
+
aliases = ai.get_aliases()
|
| 326 |
+
assert aliases["linewidth"] == {"lw"}
|
| 327 |
+
|
| 328 |
+
|
| 329 |
+
def test_set_alpha():
|
| 330 |
+
art = martist.Artist()
|
| 331 |
+
with pytest.raises(TypeError, match='^alpha must be numeric or None'):
|
| 332 |
+
art.set_alpha('string')
|
| 333 |
+
with pytest.raises(TypeError, match='^alpha must be numeric or None'):
|
| 334 |
+
art.set_alpha([1, 2, 3])
|
| 335 |
+
with pytest.raises(ValueError, match="outside 0-1 range"):
|
| 336 |
+
art.set_alpha(1.1)
|
| 337 |
+
with pytest.raises(ValueError, match="outside 0-1 range"):
|
| 338 |
+
art.set_alpha(np.nan)
|
| 339 |
+
|
| 340 |
+
|
| 341 |
+
def test_set_alpha_for_array():
|
| 342 |
+
art = martist.Artist()
|
| 343 |
+
with pytest.raises(TypeError, match='^alpha must be numeric or None'):
|
| 344 |
+
art._set_alpha_for_array('string')
|
| 345 |
+
with pytest.raises(ValueError, match="outside 0-1 range"):
|
| 346 |
+
art._set_alpha_for_array(1.1)
|
| 347 |
+
with pytest.raises(ValueError, match="outside 0-1 range"):
|
| 348 |
+
art._set_alpha_for_array(np.nan)
|
| 349 |
+
with pytest.raises(ValueError, match="alpha must be between 0 and 1"):
|
| 350 |
+
art._set_alpha_for_array([0.5, 1.1])
|
| 351 |
+
with pytest.raises(ValueError, match="alpha must be between 0 and 1"):
|
| 352 |
+
art._set_alpha_for_array([0.5, np.nan])
|
| 353 |
+
|
| 354 |
+
|
| 355 |
+
def test_callbacks():
|
| 356 |
+
def func(artist):
|
| 357 |
+
func.counter += 1
|
| 358 |
+
|
| 359 |
+
func.counter = 0
|
| 360 |
+
|
| 361 |
+
art = martist.Artist()
|
| 362 |
+
oid = art.add_callback(func)
|
| 363 |
+
assert func.counter == 0
|
| 364 |
+
art.pchanged() # must call the callback
|
| 365 |
+
assert func.counter == 1
|
| 366 |
+
art.set_zorder(10) # setting a property must also call the callback
|
| 367 |
+
assert func.counter == 2
|
| 368 |
+
art.remove_callback(oid)
|
| 369 |
+
art.pchanged() # must not call the callback anymore
|
| 370 |
+
assert func.counter == 2
|
| 371 |
+
|
| 372 |
+
|
| 373 |
+
def test_set_signature():
|
| 374 |
+
"""Test autogenerated ``set()`` for Artist subclasses."""
|
| 375 |
+
class MyArtist1(martist.Artist):
|
| 376 |
+
def set_myparam1(self, val):
|
| 377 |
+
pass
|
| 378 |
+
|
| 379 |
+
assert hasattr(MyArtist1.set, '_autogenerated_signature')
|
| 380 |
+
assert 'myparam1' in MyArtist1.set.__doc__
|
| 381 |
+
|
| 382 |
+
class MyArtist2(MyArtist1):
|
| 383 |
+
def set_myparam2(self, val):
|
| 384 |
+
pass
|
| 385 |
+
|
| 386 |
+
assert hasattr(MyArtist2.set, '_autogenerated_signature')
|
| 387 |
+
assert 'myparam1' in MyArtist2.set.__doc__
|
| 388 |
+
assert 'myparam2' in MyArtist2.set.__doc__
|
| 389 |
+
|
| 390 |
+
|
| 391 |
+
def test_set_is_overwritten():
|
| 392 |
+
"""set() defined in Artist subclasses should not be overwritten."""
|
| 393 |
+
class MyArtist3(martist.Artist):
|
| 394 |
+
|
| 395 |
+
def set(self, **kwargs):
|
| 396 |
+
"""Not overwritten."""
|
| 397 |
+
|
| 398 |
+
assert not hasattr(MyArtist3.set, '_autogenerated_signature')
|
| 399 |
+
assert MyArtist3.set.__doc__ == "Not overwritten."
|
| 400 |
+
|
| 401 |
+
class MyArtist4(MyArtist3):
|
| 402 |
+
pass
|
| 403 |
+
|
| 404 |
+
assert MyArtist4.set is MyArtist3.set
|
| 405 |
+
|
| 406 |
+
|
| 407 |
+
def test_format_cursor_data_BoundaryNorm():
|
| 408 |
+
"""Test if cursor data is correct when using BoundaryNorm."""
|
| 409 |
+
X = np.empty((3, 3))
|
| 410 |
+
X[0, 0] = 0.9
|
| 411 |
+
X[0, 1] = 0.99
|
| 412 |
+
X[0, 2] = 0.999
|
| 413 |
+
X[1, 0] = -1
|
| 414 |
+
X[1, 1] = 0
|
| 415 |
+
X[1, 2] = 1
|
| 416 |
+
X[2, 0] = 0.09
|
| 417 |
+
X[2, 1] = 0.009
|
| 418 |
+
X[2, 2] = 0.0009
|
| 419 |
+
|
| 420 |
+
# map range -1..1 to 0..256 in 0.1 steps
|
| 421 |
+
fig, ax = plt.subplots()
|
| 422 |
+
fig.suptitle("-1..1 to 0..256 in 0.1")
|
| 423 |
+
norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 20), 256)
|
| 424 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 425 |
+
|
| 426 |
+
labels_list = [
|
| 427 |
+
"[0.9]",
|
| 428 |
+
"[1.]",
|
| 429 |
+
"[1.]",
|
| 430 |
+
"[-1.0]",
|
| 431 |
+
"[0.0]",
|
| 432 |
+
"[1.0]",
|
| 433 |
+
"[0.09]",
|
| 434 |
+
"[0.009]",
|
| 435 |
+
"[0.0009]",
|
| 436 |
+
]
|
| 437 |
+
for v, label in zip(X.flat, labels_list):
|
| 438 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.1))
|
| 439 |
+
assert img.format_cursor_data(v) == label
|
| 440 |
+
|
| 441 |
+
plt.close()
|
| 442 |
+
|
| 443 |
+
# map range -1..1 to 0..256 in 0.01 steps
|
| 444 |
+
fig, ax = plt.subplots()
|
| 445 |
+
fig.suptitle("-1..1 to 0..256 in 0.01")
|
| 446 |
+
cmap = mpl.colormaps['RdBu_r'].resampled(200)
|
| 447 |
+
norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 200), 200)
|
| 448 |
+
img = ax.imshow(X, cmap=cmap, norm=norm)
|
| 449 |
+
|
| 450 |
+
labels_list = [
|
| 451 |
+
"[0.90]",
|
| 452 |
+
"[0.99]",
|
| 453 |
+
"[1.0]",
|
| 454 |
+
"[-1.00]",
|
| 455 |
+
"[0.00]",
|
| 456 |
+
"[1.00]",
|
| 457 |
+
"[0.09]",
|
| 458 |
+
"[0.009]",
|
| 459 |
+
"[0.0009]",
|
| 460 |
+
]
|
| 461 |
+
for v, label in zip(X.flat, labels_list):
|
| 462 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.01))
|
| 463 |
+
assert img.format_cursor_data(v) == label
|
| 464 |
+
|
| 465 |
+
plt.close()
|
| 466 |
+
|
| 467 |
+
# map range -1..1 to 0..256 in 0.01 steps
|
| 468 |
+
fig, ax = plt.subplots()
|
| 469 |
+
fig.suptitle("-1..1 to 0..256 in 0.001")
|
| 470 |
+
cmap = mpl.colormaps['RdBu_r'].resampled(2000)
|
| 471 |
+
norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 2000), 2000)
|
| 472 |
+
img = ax.imshow(X, cmap=cmap, norm=norm)
|
| 473 |
+
|
| 474 |
+
labels_list = [
|
| 475 |
+
"[0.900]",
|
| 476 |
+
"[0.990]",
|
| 477 |
+
"[0.999]",
|
| 478 |
+
"[-1.000]",
|
| 479 |
+
"[0.000]",
|
| 480 |
+
"[1.000]",
|
| 481 |
+
"[0.090]",
|
| 482 |
+
"[0.009]",
|
| 483 |
+
"[0.0009]",
|
| 484 |
+
]
|
| 485 |
+
for v, label in zip(X.flat, labels_list):
|
| 486 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.001))
|
| 487 |
+
assert img.format_cursor_data(v) == label
|
| 488 |
+
|
| 489 |
+
plt.close()
|
| 490 |
+
|
| 491 |
+
# different testing data set with
|
| 492 |
+
# out of bounds values for 0..1 range
|
| 493 |
+
X = np.empty((7, 1))
|
| 494 |
+
X[0] = -1.0
|
| 495 |
+
X[1] = 0.0
|
| 496 |
+
X[2] = 0.1
|
| 497 |
+
X[3] = 0.5
|
| 498 |
+
X[4] = 0.9
|
| 499 |
+
X[5] = 1.0
|
| 500 |
+
X[6] = 2.0
|
| 501 |
+
|
| 502 |
+
labels_list = [
|
| 503 |
+
"[-1.0]",
|
| 504 |
+
"[0.0]",
|
| 505 |
+
"[0.1]",
|
| 506 |
+
"[0.5]",
|
| 507 |
+
"[0.9]",
|
| 508 |
+
"[1.0]",
|
| 509 |
+
"[2.0]",
|
| 510 |
+
]
|
| 511 |
+
|
| 512 |
+
fig, ax = plt.subplots()
|
| 513 |
+
fig.suptitle("noclip, neither")
|
| 514 |
+
norm = mcolors.BoundaryNorm(
|
| 515 |
+
np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='neither')
|
| 516 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 517 |
+
for v, label in zip(X.flat, labels_list):
|
| 518 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
|
| 519 |
+
assert img.format_cursor_data(v) == label
|
| 520 |
+
|
| 521 |
+
plt.close()
|
| 522 |
+
|
| 523 |
+
fig, ax = plt.subplots()
|
| 524 |
+
fig.suptitle("noclip, min")
|
| 525 |
+
norm = mcolors.BoundaryNorm(
|
| 526 |
+
np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='min')
|
| 527 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 528 |
+
for v, label in zip(X.flat, labels_list):
|
| 529 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
|
| 530 |
+
assert img.format_cursor_data(v) == label
|
| 531 |
+
|
| 532 |
+
plt.close()
|
| 533 |
+
|
| 534 |
+
fig, ax = plt.subplots()
|
| 535 |
+
fig.suptitle("noclip, max")
|
| 536 |
+
norm = mcolors.BoundaryNorm(
|
| 537 |
+
np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='max')
|
| 538 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 539 |
+
for v, label in zip(X.flat, labels_list):
|
| 540 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
|
| 541 |
+
assert img.format_cursor_data(v) == label
|
| 542 |
+
|
| 543 |
+
plt.close()
|
| 544 |
+
|
| 545 |
+
fig, ax = plt.subplots()
|
| 546 |
+
fig.suptitle("noclip, both")
|
| 547 |
+
norm = mcolors.BoundaryNorm(
|
| 548 |
+
np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='both')
|
| 549 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 550 |
+
for v, label in zip(X.flat, labels_list):
|
| 551 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
|
| 552 |
+
assert img.format_cursor_data(v) == label
|
| 553 |
+
|
| 554 |
+
plt.close()
|
| 555 |
+
|
| 556 |
+
fig, ax = plt.subplots()
|
| 557 |
+
fig.suptitle("clip, neither")
|
| 558 |
+
norm = mcolors.BoundaryNorm(
|
| 559 |
+
np.linspace(0, 1, 4, endpoint=True), 256, clip=True, extend='neither')
|
| 560 |
+
img = ax.imshow(X, cmap='RdBu_r', norm=norm)
|
| 561 |
+
for v, label in zip(X.flat, labels_list):
|
| 562 |
+
# label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
|
| 563 |
+
assert img.format_cursor_data(v) == label
|
| 564 |
+
|
| 565 |
+
plt.close()
|
| 566 |
+
|
| 567 |
+
|
| 568 |
+
def test_auto_no_rasterize():
|
| 569 |
+
class Gen1(martist.Artist):
|
| 570 |
+
...
|
| 571 |
+
|
| 572 |
+
assert 'draw' in Gen1.__dict__
|
| 573 |
+
assert Gen1.__dict__['draw'] is Gen1.draw
|
| 574 |
+
|
| 575 |
+
class Gen2(Gen1):
|
| 576 |
+
...
|
| 577 |
+
|
| 578 |
+
assert 'draw' not in Gen2.__dict__
|
| 579 |
+
assert Gen2.draw is Gen1.draw
|
| 580 |
+
|
| 581 |
+
|
| 582 |
+
def test_draw_wraper_forward_input():
|
| 583 |
+
class TestKlass(martist.Artist):
|
| 584 |
+
def draw(self, renderer, extra):
|
| 585 |
+
return extra
|
| 586 |
+
|
| 587 |
+
art = TestKlass()
|
| 588 |
+
renderer = mbackend_bases.RendererBase()
|
| 589 |
+
|
| 590 |
+
assert 'aardvark' == art.draw(renderer, 'aardvark')
|
| 591 |
+
assert 'aardvark' == art.draw(renderer, extra='aardvark')
|
| 592 |
+
|
| 593 |
+
|
| 594 |
+
def test_get_figure():
|
| 595 |
+
fig = plt.figure()
|
| 596 |
+
sfig1 = fig.subfigures()
|
| 597 |
+
sfig2 = sfig1.subfigures()
|
| 598 |
+
ax = sfig2.subplots()
|
| 599 |
+
|
| 600 |
+
assert fig.get_figure(root=True) is fig
|
| 601 |
+
assert fig.get_figure(root=False) is fig
|
| 602 |
+
|
| 603 |
+
assert ax.get_figure() is sfig2
|
| 604 |
+
assert ax.get_figure(root=False) is sfig2
|
| 605 |
+
assert ax.get_figure(root=True) is fig
|
| 606 |
+
|
| 607 |
+
# SubFigure.get_figure has separate implementation but should give consistent
|
| 608 |
+
# results to other artists.
|
| 609 |
+
assert sfig2.get_figure(root=False) is sfig1
|
| 610 |
+
assert sfig2.get_figure(root=True) is fig
|
| 611 |
+
# Currently different results by default.
|
| 612 |
+
with pytest.warns(mpl.MatplotlibDeprecationWarning):
|
| 613 |
+
assert sfig2.get_figure() is fig
|
| 614 |
+
# No deprecation warning if root and parent figure are the same.
|
| 615 |
+
assert sfig1.get_figure() is fig
|
| 616 |
+
|
| 617 |
+
# An artist not yet attached to anything has no figure.
|
| 618 |
+
ln = mlines.Line2D([], [])
|
| 619 |
+
assert ln.get_figure(root=True) is None
|
| 620 |
+
assert ln.get_figure(root=False) is None
|
| 621 |
+
|
| 622 |
+
# figure attribute is root for (Sub)Figures but parent for other artists.
|
| 623 |
+
assert ax.figure is sfig2
|
| 624 |
+
assert fig.figure is fig
|
| 625 |
+
assert sfig2.figure is fig
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_axes.py
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_axis.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
|
| 3 |
+
import matplotlib.pyplot as plt
|
| 4 |
+
from matplotlib.axis import XTick
|
| 5 |
+
from matplotlib.testing.decorators import check_figures_equal
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def test_tick_labelcolor_array():
|
| 9 |
+
# Smoke test that we can instantiate a Tick with labelcolor as array.
|
| 10 |
+
ax = plt.axes()
|
| 11 |
+
XTick(ax, 0, labelcolor=np.array([1, 0, 0, 1]))
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def test_axis_not_in_layout():
|
| 15 |
+
fig1, (ax1_left, ax1_right) = plt.subplots(ncols=2, layout='constrained')
|
| 16 |
+
fig2, (ax2_left, ax2_right) = plt.subplots(ncols=2, layout='constrained')
|
| 17 |
+
|
| 18 |
+
# 100 label overlapping the end of the axis
|
| 19 |
+
ax1_left.set_xlim(0, 100)
|
| 20 |
+
# 100 label not overlapping the end of the axis
|
| 21 |
+
ax2_left.set_xlim(0, 120)
|
| 22 |
+
|
| 23 |
+
for ax in ax1_left, ax2_left:
|
| 24 |
+
ax.set_xticks([0, 100])
|
| 25 |
+
ax.xaxis.set_in_layout(False)
|
| 26 |
+
|
| 27 |
+
for fig in fig1, fig2:
|
| 28 |
+
fig.draw_without_rendering()
|
| 29 |
+
|
| 30 |
+
# Positions should not be affected by overlapping 100 label
|
| 31 |
+
assert ax1_left.get_position().bounds == ax2_left.get_position().bounds
|
| 32 |
+
assert ax1_right.get_position().bounds == ax2_right.get_position().bounds
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
@check_figures_equal()
|
| 36 |
+
def test_tick_not_in_layout(fig_test, fig_ref):
|
| 37 |
+
# Check that the "very long" ticklabel is ignored from layouting after
|
| 38 |
+
# set_in_layout(False); i.e. the layout is as if the ticklabel was empty.
|
| 39 |
+
# Ticklabels are set to white so that the actual string doesn't matter.
|
| 40 |
+
fig_test.set_layout_engine("constrained")
|
| 41 |
+
ax = fig_test.add_subplot(xticks=[0, 1], xticklabels=["short", "very long"])
|
| 42 |
+
ax.tick_params(labelcolor="w")
|
| 43 |
+
fig_test.draw_without_rendering() # Ensure ticks are correct.
|
| 44 |
+
ax.xaxis.majorTicks[-1].label1.set_in_layout(False)
|
| 45 |
+
fig_ref.set_layout_engine("constrained")
|
| 46 |
+
ax = fig_ref.add_subplot(xticks=[0, 1], xticklabels=["short", ""])
|
| 47 |
+
ax.tick_params(labelcolor="w")
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def test_translate_tick_params_reverse():
|
| 51 |
+
fig, ax = plt.subplots()
|
| 52 |
+
kw = {'label1On': 'a', 'label2On': 'b', 'tick1On': 'c', 'tick2On': 'd'}
|
| 53 |
+
assert (ax.xaxis._translate_tick_params(kw, reverse=True) ==
|
| 54 |
+
{'labelbottom': 'a', 'labeltop': 'b', 'bottom': 'c', 'top': 'd'})
|
| 55 |
+
assert (ax.yaxis._translate_tick_params(kw, reverse=True) ==
|
| 56 |
+
{'labelleft': 'a', 'labelright': 'b', 'left': 'c', 'right': 'd'})
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def test_get_tick_position_rcParams():
|
| 60 |
+
"""Test that get_tick_position() correctly picks up rcParams tick positions."""
|
| 61 |
+
plt.rcParams.update({
|
| 62 |
+
"xtick.top": 1, "xtick.labeltop": 1, "xtick.bottom": 0, "xtick.labelbottom": 0,
|
| 63 |
+
"ytick.right": 1, "ytick.labelright": 1, "ytick.left": 0, "ytick.labelleft": 0,
|
| 64 |
+
})
|
| 65 |
+
ax = plt.figure().add_subplot()
|
| 66 |
+
assert ax.xaxis.get_ticks_position() == "top"
|
| 67 |
+
assert ax.yaxis.get_ticks_position() == "right"
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
def test_get_tick_position_tick_top_tick_right():
|
| 71 |
+
"""Test that get_tick_position() correctly picks up tick_top() / tick_right()."""
|
| 72 |
+
ax = plt.figure().add_subplot()
|
| 73 |
+
ax.xaxis.tick_top()
|
| 74 |
+
ax.yaxis.tick_right()
|
| 75 |
+
assert ax.xaxis.get_ticks_position() == "top"
|
| 76 |
+
assert ax.yaxis.get_ticks_position() == "right"
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
def test_get_tick_position_tick_params():
|
| 80 |
+
"""Test that get_tick_position() correctly picks up tick_params()."""
|
| 81 |
+
ax = plt.figure().add_subplot()
|
| 82 |
+
ax.tick_params(top=True, labeltop=True, bottom=False, labelbottom=False,
|
| 83 |
+
right=True, labelright=True, left=False, labelleft=False)
|
| 84 |
+
assert ax.xaxis.get_ticks_position() == "top"
|
| 85 |
+
assert ax.yaxis.get_ticks_position() == "right"
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
def test_grid_rcparams():
|
| 89 |
+
"""Tests that `grid.major/minor.*` overwrites `grid.*` in rcParams."""
|
| 90 |
+
plt.rcParams.update({
|
| 91 |
+
"axes.grid": True, "axes.grid.which": "both",
|
| 92 |
+
"ytick.minor.visible": True, "xtick.minor.visible": True,
|
| 93 |
+
})
|
| 94 |
+
def_linewidth = plt.rcParams["grid.linewidth"]
|
| 95 |
+
def_linestyle = plt.rcParams["grid.linestyle"]
|
| 96 |
+
def_alpha = plt.rcParams["grid.alpha"]
|
| 97 |
+
|
| 98 |
+
plt.rcParams.update({
|
| 99 |
+
"grid.color": "gray", "grid.minor.color": "red",
|
| 100 |
+
"grid.major.linestyle": ":", "grid.major.linewidth": 2,
|
| 101 |
+
"grid.minor.alpha": 0.6,
|
| 102 |
+
})
|
| 103 |
+
_, ax = plt.subplots()
|
| 104 |
+
ax.plot([0, 1])
|
| 105 |
+
|
| 106 |
+
assert ax.xaxis.get_major_ticks()[0].gridline.get_color() == "gray"
|
| 107 |
+
assert ax.xaxis.get_minor_ticks()[0].gridline.get_color() == "red"
|
| 108 |
+
assert ax.xaxis.get_major_ticks()[0].gridline.get_linewidth() == 2
|
| 109 |
+
assert ax.xaxis.get_minor_ticks()[0].gridline.get_linewidth() == def_linewidth
|
| 110 |
+
assert ax.xaxis.get_major_ticks()[0].gridline.get_linestyle() == ":"
|
| 111 |
+
assert ax.xaxis.get_minor_ticks()[0].gridline.get_linestyle() == def_linestyle
|
| 112 |
+
assert ax.xaxis.get_major_ticks()[0].gridline.get_alpha() == def_alpha
|
| 113 |
+
assert ax.xaxis.get_minor_ticks()[0].gridline.get_alpha() == 0.6
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
def test_set_ticks_emits_lim_changed():
|
| 117 |
+
fig, ax1 = plt.subplots()
|
| 118 |
+
ax1.set_xlim(0.5, 1)
|
| 119 |
+
called_cartesian = []
|
| 120 |
+
ax1.callbacks.connect("xlim_changed", called_cartesian.append)
|
| 121 |
+
ax1.set_xticks([0, 100])
|
| 122 |
+
assert called_cartesian
|
| 123 |
+
|
| 124 |
+
fig = plt.figure()
|
| 125 |
+
ax2 = fig.add_subplot(projection="polar")
|
| 126 |
+
ax2.set_ylim(0.5, 1)
|
| 127 |
+
called_polar = []
|
| 128 |
+
ax2.callbacks.connect("ylim_changed", called_polar.append)
|
| 129 |
+
ax2.set_rticks([1, 2, 3])
|
| 130 |
+
assert called_polar
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_bases.py
ADDED
|
@@ -0,0 +1,589 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import importlib
|
| 2 |
+
|
| 3 |
+
from matplotlib import path, transforms
|
| 4 |
+
from matplotlib.backend_bases import (
|
| 5 |
+
FigureCanvasBase, KeyEvent, LocationEvent, MouseButton, MouseEvent,
|
| 6 |
+
NavigationToolbar2, RendererBase)
|
| 7 |
+
from matplotlib.backend_tools import RubberbandBase
|
| 8 |
+
from matplotlib.figure import Figure
|
| 9 |
+
from matplotlib.testing._markers import needs_pgf_xelatex
|
| 10 |
+
import matplotlib.pyplot as plt
|
| 11 |
+
|
| 12 |
+
import numpy as np
|
| 13 |
+
import pytest
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
_EXPECTED_WARNING_TOOLMANAGER = (
|
| 17 |
+
r"Treat the new Tool classes introduced in "
|
| 18 |
+
r"v[0-9]*.[0-9]* as experimental for now; "
|
| 19 |
+
"the API and rcParam may change in future versions.")
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def test_uses_per_path():
|
| 23 |
+
id = transforms.Affine2D()
|
| 24 |
+
paths = [path.Path.unit_regular_polygon(i) for i in range(3, 7)]
|
| 25 |
+
tforms_matrices = [id.rotate(i).get_matrix().copy() for i in range(1, 5)]
|
| 26 |
+
offsets = np.arange(20).reshape((10, 2))
|
| 27 |
+
facecolors = ['red', 'green']
|
| 28 |
+
edgecolors = ['red', 'green']
|
| 29 |
+
|
| 30 |
+
def check(master_transform, paths, all_transforms,
|
| 31 |
+
offsets, facecolors, edgecolors):
|
| 32 |
+
rb = RendererBase()
|
| 33 |
+
raw_paths = list(rb._iter_collection_raw_paths(
|
| 34 |
+
master_transform, paths, all_transforms))
|
| 35 |
+
gc = rb.new_gc()
|
| 36 |
+
ids = [path_id for xo, yo, path_id, gc0, rgbFace in
|
| 37 |
+
rb._iter_collection(
|
| 38 |
+
gc, range(len(raw_paths)), offsets,
|
| 39 |
+
transforms.AffineDeltaTransform(master_transform),
|
| 40 |
+
facecolors, edgecolors, [], [], [False],
|
| 41 |
+
[], 'screen', hatchcolors=[])]
|
| 42 |
+
uses = rb._iter_collection_uses_per_path(
|
| 43 |
+
paths, all_transforms, offsets, facecolors, edgecolors)
|
| 44 |
+
if raw_paths:
|
| 45 |
+
seen = np.bincount(ids, minlength=len(raw_paths))
|
| 46 |
+
assert set(seen).issubset([uses - 1, uses])
|
| 47 |
+
|
| 48 |
+
check(id, paths, tforms_matrices, offsets, facecolors, edgecolors)
|
| 49 |
+
check(id, paths[0:1], tforms_matrices, offsets, facecolors, edgecolors)
|
| 50 |
+
check(id, [], tforms_matrices, offsets, facecolors, edgecolors)
|
| 51 |
+
check(id, paths, tforms_matrices[0:1], offsets, facecolors, edgecolors)
|
| 52 |
+
check(id, paths, [], offsets, facecolors, edgecolors)
|
| 53 |
+
for n in range(0, offsets.shape[0]):
|
| 54 |
+
check(id, paths, tforms_matrices, offsets[0:n, :],
|
| 55 |
+
facecolors, edgecolors)
|
| 56 |
+
check(id, paths, tforms_matrices, offsets, [], edgecolors)
|
| 57 |
+
check(id, paths, tforms_matrices, offsets, facecolors, [])
|
| 58 |
+
check(id, paths, tforms_matrices, offsets, [], [])
|
| 59 |
+
check(id, paths, tforms_matrices, offsets, facecolors[0:1], edgecolors)
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def test_canvas_ctor():
|
| 63 |
+
assert isinstance(FigureCanvasBase().figure, Figure)
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def test_get_default_filename():
|
| 67 |
+
fig = plt.figure()
|
| 68 |
+
assert fig.canvas.get_default_filename() == "Figure_1.png"
|
| 69 |
+
fig.canvas.manager.set_window_title("0:1/2<3")
|
| 70 |
+
assert fig.canvas.get_default_filename() == "0_1_2_3.png"
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def test_canvas_change():
|
| 74 |
+
fig = plt.figure()
|
| 75 |
+
# Replaces fig.canvas
|
| 76 |
+
canvas = FigureCanvasBase(fig)
|
| 77 |
+
# Should still work.
|
| 78 |
+
plt.close(fig)
|
| 79 |
+
assert not plt.fignum_exists(fig.number)
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
@pytest.mark.backend('pdf')
|
| 83 |
+
def test_non_gui_warning(monkeypatch):
|
| 84 |
+
plt.subplots()
|
| 85 |
+
|
| 86 |
+
monkeypatch.setenv("DISPLAY", ":999")
|
| 87 |
+
|
| 88 |
+
with pytest.warns(UserWarning) as rec:
|
| 89 |
+
plt.show()
|
| 90 |
+
assert len(rec) == 1
|
| 91 |
+
assert ('FigureCanvasPdf is non-interactive, and thus cannot be shown'
|
| 92 |
+
in str(rec[0].message))
|
| 93 |
+
|
| 94 |
+
with pytest.warns(UserWarning) as rec:
|
| 95 |
+
plt.gcf().show()
|
| 96 |
+
assert len(rec) == 1
|
| 97 |
+
assert ('FigureCanvasPdf is non-interactive, and thus cannot be shown'
|
| 98 |
+
in str(rec[0].message))
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
def test_grab_clear():
|
| 102 |
+
fig, ax = plt.subplots()
|
| 103 |
+
|
| 104 |
+
fig.canvas.grab_mouse(ax)
|
| 105 |
+
assert fig.canvas.mouse_grabber == ax
|
| 106 |
+
|
| 107 |
+
fig.clear()
|
| 108 |
+
assert fig.canvas.mouse_grabber is None
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
@pytest.mark.parametrize(
|
| 112 |
+
"x, y", [(42, 24), (None, 42), (None, None), (200, 100.01), (205.75, 2.0)])
|
| 113 |
+
def test_location_event_position(x, y):
|
| 114 |
+
# LocationEvent should cast its x and y arguments to int unless it is None.
|
| 115 |
+
fig, ax = plt.subplots()
|
| 116 |
+
canvas = FigureCanvasBase(fig)
|
| 117 |
+
event = LocationEvent("test_event", canvas, x, y)
|
| 118 |
+
if x is None:
|
| 119 |
+
assert event.x is None
|
| 120 |
+
else:
|
| 121 |
+
assert event.x == int(x)
|
| 122 |
+
assert isinstance(event.x, int)
|
| 123 |
+
if y is None:
|
| 124 |
+
assert event.y is None
|
| 125 |
+
else:
|
| 126 |
+
assert event.y == int(y)
|
| 127 |
+
assert isinstance(event.y, int)
|
| 128 |
+
if x is not None and y is not None:
|
| 129 |
+
assert (ax.format_coord(x, y)
|
| 130 |
+
== f"(x, y) = ({ax.format_xdata(x)}, {ax.format_ydata(y)})")
|
| 131 |
+
ax.fmt_xdata = ax.fmt_ydata = lambda x: "foo"
|
| 132 |
+
assert ax.format_coord(x, y) == "(x, y) = (foo, foo)"
|
| 133 |
+
|
| 134 |
+
|
| 135 |
+
def test_location_event_position_twin():
|
| 136 |
+
fig, ax = plt.subplots()
|
| 137 |
+
ax.set(xlim=(0, 10), ylim=(0, 20))
|
| 138 |
+
assert ax.format_coord(5., 5.) == "(x, y) = (5.00, 5.00)"
|
| 139 |
+
ax.twinx().set(ylim=(0, 40))
|
| 140 |
+
assert ax.format_coord(5., 5.) == "(x, y) = (5.00, 5.00) | (5.00, 10.0)"
|
| 141 |
+
ax.twiny().set(xlim=(0, 5))
|
| 142 |
+
assert (ax.format_coord(5., 5.)
|
| 143 |
+
== "(x, y) = (5.00, 5.00) | (5.00, 10.0) | (2.50, 5.00)")
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
def test_pick():
|
| 147 |
+
fig = plt.figure()
|
| 148 |
+
fig.text(.5, .5, "hello", ha="center", va="center", picker=True)
|
| 149 |
+
fig.canvas.draw()
|
| 150 |
+
|
| 151 |
+
picks = []
|
| 152 |
+
def handle_pick(event):
|
| 153 |
+
assert event.mouseevent.key == "a"
|
| 154 |
+
picks.append(event)
|
| 155 |
+
fig.canvas.mpl_connect("pick_event", handle_pick)
|
| 156 |
+
|
| 157 |
+
KeyEvent("key_press_event", fig.canvas, "a")._process()
|
| 158 |
+
MouseEvent("button_press_event", fig.canvas,
|
| 159 |
+
*fig.transFigure.transform((.5, .5)),
|
| 160 |
+
MouseButton.LEFT)._process()
|
| 161 |
+
KeyEvent("key_release_event", fig.canvas, "a")._process()
|
| 162 |
+
assert len(picks) == 1
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
def test_interactive_zoom():
|
| 166 |
+
fig, ax = plt.subplots()
|
| 167 |
+
ax.set(xscale="logit")
|
| 168 |
+
assert ax.get_navigate_mode() is None
|
| 169 |
+
|
| 170 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 171 |
+
tb.zoom()
|
| 172 |
+
assert ax.get_navigate_mode() == 'ZOOM'
|
| 173 |
+
|
| 174 |
+
xlim0 = ax.get_xlim()
|
| 175 |
+
ylim0 = ax.get_ylim()
|
| 176 |
+
|
| 177 |
+
# Zoom from x=1e-6, y=0.1 to x=1-1e-5, 0.8 (data coordinates, "d").
|
| 178 |
+
d0 = (1e-6, 0.1)
|
| 179 |
+
d1 = (1-1e-5, 0.8)
|
| 180 |
+
# Convert to screen coordinates ("s"). Events are defined only with pixel
|
| 181 |
+
# precision, so round the pixel values, and below, check against the
|
| 182 |
+
# corresponding xdata/ydata, which are close but not equal to d0/d1.
|
| 183 |
+
s0 = ax.transData.transform(d0).astype(int)
|
| 184 |
+
s1 = ax.transData.transform(d1).astype(int)
|
| 185 |
+
|
| 186 |
+
# Zoom in.
|
| 187 |
+
start_event = MouseEvent(
|
| 188 |
+
"button_press_event", fig.canvas, *s0, MouseButton.LEFT)
|
| 189 |
+
fig.canvas.callbacks.process(start_event.name, start_event)
|
| 190 |
+
stop_event = MouseEvent(
|
| 191 |
+
"button_release_event", fig.canvas, *s1, MouseButton.LEFT)
|
| 192 |
+
fig.canvas.callbacks.process(stop_event.name, stop_event)
|
| 193 |
+
assert ax.get_xlim() == (start_event.xdata, stop_event.xdata)
|
| 194 |
+
assert ax.get_ylim() == (start_event.ydata, stop_event.ydata)
|
| 195 |
+
|
| 196 |
+
# Zoom out.
|
| 197 |
+
start_event = MouseEvent(
|
| 198 |
+
"button_press_event", fig.canvas, *s1, MouseButton.RIGHT)
|
| 199 |
+
fig.canvas.callbacks.process(start_event.name, start_event)
|
| 200 |
+
stop_event = MouseEvent(
|
| 201 |
+
"button_release_event", fig.canvas, *s0, MouseButton.RIGHT)
|
| 202 |
+
fig.canvas.callbacks.process(stop_event.name, stop_event)
|
| 203 |
+
# Absolute tolerance much less than original xmin (1e-7).
|
| 204 |
+
assert ax.get_xlim() == pytest.approx(xlim0, rel=0, abs=1e-10)
|
| 205 |
+
assert ax.get_ylim() == pytest.approx(ylim0, rel=0, abs=1e-10)
|
| 206 |
+
|
| 207 |
+
tb.zoom()
|
| 208 |
+
assert ax.get_navigate_mode() is None
|
| 209 |
+
|
| 210 |
+
assert not ax.get_autoscalex_on() and not ax.get_autoscaley_on()
|
| 211 |
+
|
| 212 |
+
|
| 213 |
+
def test_widgetlock_zoompan():
|
| 214 |
+
fig, ax = plt.subplots()
|
| 215 |
+
ax.plot([0, 1], [0, 1])
|
| 216 |
+
fig.canvas.widgetlock(ax)
|
| 217 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 218 |
+
tb.zoom()
|
| 219 |
+
assert ax.get_navigate_mode() is None
|
| 220 |
+
tb.pan()
|
| 221 |
+
assert ax.get_navigate_mode() is None
|
| 222 |
+
|
| 223 |
+
|
| 224 |
+
@pytest.mark.parametrize("plot_func", ["imshow", "contourf"])
|
| 225 |
+
@pytest.mark.parametrize("orientation", ["vertical", "horizontal"])
|
| 226 |
+
@pytest.mark.parametrize("tool,button,expected",
|
| 227 |
+
[("zoom", MouseButton.LEFT, (4, 6)), # zoom in
|
| 228 |
+
("zoom", MouseButton.RIGHT, (-20, 30)), # zoom out
|
| 229 |
+
("pan", MouseButton.LEFT, (-2, 8)),
|
| 230 |
+
("pan", MouseButton.RIGHT, (1.47, 7.78))]) # zoom
|
| 231 |
+
def test_interactive_colorbar(plot_func, orientation, tool, button, expected):
|
| 232 |
+
fig, ax = plt.subplots()
|
| 233 |
+
data = np.arange(12).reshape((4, 3))
|
| 234 |
+
vmin0, vmax0 = 0, 10
|
| 235 |
+
coll = getattr(ax, plot_func)(data, vmin=vmin0, vmax=vmax0)
|
| 236 |
+
|
| 237 |
+
cb = fig.colorbar(coll, ax=ax, orientation=orientation)
|
| 238 |
+
if plot_func == "contourf":
|
| 239 |
+
# Just determine we can't navigate and exit out of the test
|
| 240 |
+
assert not cb.ax.get_navigate()
|
| 241 |
+
return
|
| 242 |
+
|
| 243 |
+
assert cb.ax.get_navigate()
|
| 244 |
+
|
| 245 |
+
# Mouse from 4 to 6 (data coordinates, "d").
|
| 246 |
+
vmin, vmax = 4, 6
|
| 247 |
+
# The y coordinate doesn't matter, it just needs to be between 0 and 1
|
| 248 |
+
# However, we will set d0/d1 to the same y coordinate to test that small
|
| 249 |
+
# pixel changes in that coordinate doesn't cancel the zoom like a normal
|
| 250 |
+
# axes would.
|
| 251 |
+
d0 = (vmin, 0.5)
|
| 252 |
+
d1 = (vmax, 0.5)
|
| 253 |
+
# Swap them if the orientation is vertical
|
| 254 |
+
if orientation == "vertical":
|
| 255 |
+
d0 = d0[::-1]
|
| 256 |
+
d1 = d1[::-1]
|
| 257 |
+
# Convert to screen coordinates ("s"). Events are defined only with pixel
|
| 258 |
+
# precision, so round the pixel values, and below, check against the
|
| 259 |
+
# corresponding xdata/ydata, which are close but not equal to d0/d1.
|
| 260 |
+
s0 = cb.ax.transData.transform(d0).astype(int)
|
| 261 |
+
s1 = cb.ax.transData.transform(d1).astype(int)
|
| 262 |
+
|
| 263 |
+
# Set up the mouse movements
|
| 264 |
+
start_event = MouseEvent(
|
| 265 |
+
"button_press_event", fig.canvas, *s0, button)
|
| 266 |
+
drag_event = MouseEvent(
|
| 267 |
+
"motion_notify_event", fig.canvas, *s1, button, buttons={button})
|
| 268 |
+
stop_event = MouseEvent(
|
| 269 |
+
"button_release_event", fig.canvas, *s1, button)
|
| 270 |
+
|
| 271 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 272 |
+
if tool == "zoom":
|
| 273 |
+
tb.zoom()
|
| 274 |
+
tb.press_zoom(start_event)
|
| 275 |
+
tb.drag_zoom(drag_event)
|
| 276 |
+
tb.release_zoom(stop_event)
|
| 277 |
+
else:
|
| 278 |
+
tb.pan()
|
| 279 |
+
tb.press_pan(start_event)
|
| 280 |
+
tb.drag_pan(drag_event)
|
| 281 |
+
tb.release_pan(stop_event)
|
| 282 |
+
|
| 283 |
+
# Should be close, but won't be exact due to screen integer resolution
|
| 284 |
+
assert (cb.vmin, cb.vmax) == pytest.approx(expected, abs=0.15)
|
| 285 |
+
|
| 286 |
+
|
| 287 |
+
def test_toolbar_zoompan():
|
| 288 |
+
with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
|
| 289 |
+
plt.rcParams['toolbar'] = 'toolmanager'
|
| 290 |
+
ax = plt.gca()
|
| 291 |
+
fig = ax.get_figure()
|
| 292 |
+
assert ax.get_navigate_mode() is None
|
| 293 |
+
fig.canvas.manager.toolmanager.trigger_tool('zoom')
|
| 294 |
+
assert ax.get_navigate_mode() == "ZOOM"
|
| 295 |
+
fig.canvas.manager.toolmanager.trigger_tool('pan')
|
| 296 |
+
assert ax.get_navigate_mode() == "PAN"
|
| 297 |
+
|
| 298 |
+
|
| 299 |
+
def test_toolbar_home_restores_autoscale():
|
| 300 |
+
fig, ax = plt.subplots()
|
| 301 |
+
ax.plot(range(11), range(11))
|
| 302 |
+
|
| 303 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 304 |
+
tb.zoom()
|
| 305 |
+
|
| 306 |
+
# Switch to log.
|
| 307 |
+
KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
|
| 308 |
+
KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
|
| 309 |
+
assert ax.get_xlim() == ax.get_ylim() == (1, 10) # Autolimits excluding 0.
|
| 310 |
+
# Switch back to linear.
|
| 311 |
+
KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
|
| 312 |
+
KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
|
| 313 |
+
assert ax.get_xlim() == ax.get_ylim() == (0, 10) # Autolimits.
|
| 314 |
+
|
| 315 |
+
# Zoom in from (x, y) = (2, 2) to (5, 5).
|
| 316 |
+
start, stop = ax.transData.transform([(2, 2), (5, 5)])
|
| 317 |
+
MouseEvent("button_press_event", fig.canvas, *start, MouseButton.LEFT)._process()
|
| 318 |
+
MouseEvent("button_release_event", fig.canvas, *stop, MouseButton.LEFT)._process()
|
| 319 |
+
# Go back to home.
|
| 320 |
+
KeyEvent("key_press_event", fig.canvas, "h")._process()
|
| 321 |
+
|
| 322 |
+
assert ax.get_xlim() == ax.get_ylim() == (0, 10)
|
| 323 |
+
# Switch to log.
|
| 324 |
+
KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
|
| 325 |
+
KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
|
| 326 |
+
assert ax.get_xlim() == ax.get_ylim() == (1, 10) # Autolimits excluding 0.
|
| 327 |
+
|
| 328 |
+
|
| 329 |
+
@pytest.mark.parametrize(
|
| 330 |
+
"backend", ['svg', 'ps', 'pdf',
|
| 331 |
+
pytest.param('pgf', marks=needs_pgf_xelatex)]
|
| 332 |
+
)
|
| 333 |
+
def test_draw(backend):
|
| 334 |
+
from matplotlib.figure import Figure
|
| 335 |
+
from matplotlib.backends.backend_agg import FigureCanvas
|
| 336 |
+
test_backend = importlib.import_module(f'matplotlib.backends.backend_{backend}')
|
| 337 |
+
TestCanvas = test_backend.FigureCanvas
|
| 338 |
+
fig_test = Figure(constrained_layout=True)
|
| 339 |
+
TestCanvas(fig_test)
|
| 340 |
+
axes_test = fig_test.subplots(2, 2)
|
| 341 |
+
|
| 342 |
+
# defaults to FigureCanvasBase
|
| 343 |
+
fig_agg = Figure(constrained_layout=True)
|
| 344 |
+
# put a backends.backend_agg.FigureCanvas on it
|
| 345 |
+
FigureCanvas(fig_agg)
|
| 346 |
+
axes_agg = fig_agg.subplots(2, 2)
|
| 347 |
+
|
| 348 |
+
init_pos = [ax.get_position() for ax in axes_test.ravel()]
|
| 349 |
+
|
| 350 |
+
fig_test.canvas.draw()
|
| 351 |
+
fig_agg.canvas.draw()
|
| 352 |
+
|
| 353 |
+
layed_out_pos_test = [ax.get_position() for ax in axes_test.ravel()]
|
| 354 |
+
layed_out_pos_agg = [ax.get_position() for ax in axes_agg.ravel()]
|
| 355 |
+
|
| 356 |
+
for init, placed in zip(init_pos, layed_out_pos_test):
|
| 357 |
+
assert not np.allclose(init, placed, atol=0.005)
|
| 358 |
+
|
| 359 |
+
for ref, test in zip(layed_out_pos_agg, layed_out_pos_test):
|
| 360 |
+
np.testing.assert_allclose(ref, test, atol=0.005)
|
| 361 |
+
|
| 362 |
+
|
| 363 |
+
@pytest.mark.parametrize(
|
| 364 |
+
"key,mouseend,expectedxlim,expectedylim",
|
| 365 |
+
[(None, (0.2, 0.2), (3.49, 12.49), (2.7, 11.7)),
|
| 366 |
+
(None, (0.2, 0.5), (3.49, 12.49), (0, 9)),
|
| 367 |
+
(None, (0.5, 0.2), (0, 9), (2.7, 11.7)),
|
| 368 |
+
(None, (0.5, 0.5), (0, 9), (0, 9)), # No move
|
| 369 |
+
(None, (0.8, 0.25), (-3.47, 5.53), (2.25, 11.25)),
|
| 370 |
+
(None, (0.2, 0.25), (3.49, 12.49), (2.25, 11.25)),
|
| 371 |
+
(None, (0.8, 0.85), (-3.47, 5.53), (-3.14, 5.86)),
|
| 372 |
+
(None, (0.2, 0.85), (3.49, 12.49), (-3.14, 5.86)),
|
| 373 |
+
("shift", (0.2, 0.4), (3.49, 12.49), (0, 9)), # snap to x
|
| 374 |
+
("shift", (0.4, 0.2), (0, 9), (2.7, 11.7)), # snap to y
|
| 375 |
+
("shift", (0.2, 0.25), (3.49, 12.49), (3.49, 12.49)), # snap to diagonal
|
| 376 |
+
("shift", (0.8, 0.25), (-3.47, 5.53), (3.47, 12.47)), # snap to diagonal
|
| 377 |
+
("shift", (0.8, 0.9), (-3.58, 5.41), (-3.58, 5.41)), # snap to diagonal
|
| 378 |
+
("shift", (0.2, 0.85), (3.49, 12.49), (-3.49, 5.51)), # snap to diagonal
|
| 379 |
+
("x", (0.2, 0.1), (3.49, 12.49), (0, 9)), # only x
|
| 380 |
+
("y", (0.1, 0.2), (0, 9), (2.7, 11.7)), # only y
|
| 381 |
+
("control", (0.2, 0.2), (3.49, 12.49), (3.49, 12.49)), # diagonal
|
| 382 |
+
("control", (0.4, 0.2), (2.72, 11.72), (2.72, 11.72)), # diagonal
|
| 383 |
+
])
|
| 384 |
+
def test_interactive_pan(key, mouseend, expectedxlim, expectedylim):
|
| 385 |
+
fig, ax = plt.subplots()
|
| 386 |
+
ax.plot(np.arange(10))
|
| 387 |
+
assert ax.get_navigate()
|
| 388 |
+
# Set equal aspect ratio to easier see diagonal snap
|
| 389 |
+
ax.set_aspect('equal')
|
| 390 |
+
|
| 391 |
+
# Mouse move starts from 0.5, 0.5
|
| 392 |
+
mousestart = (0.5, 0.5)
|
| 393 |
+
# Convert to screen coordinates ("s"). Events are defined only with pixel
|
| 394 |
+
# precision, so round the pixel values, and below, check against the
|
| 395 |
+
# corresponding xdata/ydata, which are close but not equal to d0/d1.
|
| 396 |
+
sstart = ax.transData.transform(mousestart).astype(int)
|
| 397 |
+
send = ax.transData.transform(mouseend).astype(int)
|
| 398 |
+
|
| 399 |
+
# Set up the mouse movements
|
| 400 |
+
start_event = MouseEvent(
|
| 401 |
+
"button_press_event", fig.canvas, *sstart, button=MouseButton.LEFT,
|
| 402 |
+
key=key)
|
| 403 |
+
drag_event = MouseEvent(
|
| 404 |
+
"motion_notify_event", fig.canvas, *send, button=MouseButton.LEFT,
|
| 405 |
+
buttons={MouseButton.LEFT}, key=key)
|
| 406 |
+
stop_event = MouseEvent(
|
| 407 |
+
"button_release_event", fig.canvas, *send, button=MouseButton.LEFT,
|
| 408 |
+
key=key)
|
| 409 |
+
|
| 410 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 411 |
+
tb.pan()
|
| 412 |
+
tb.press_pan(start_event)
|
| 413 |
+
tb.drag_pan(drag_event)
|
| 414 |
+
tb.release_pan(stop_event)
|
| 415 |
+
# Should be close, but won't be exact due to screen integer resolution
|
| 416 |
+
assert tuple(ax.get_xlim()) == pytest.approx(expectedxlim, abs=0.02)
|
| 417 |
+
assert tuple(ax.get_ylim()) == pytest.approx(expectedylim, abs=0.02)
|
| 418 |
+
|
| 419 |
+
|
| 420 |
+
def test_toolmanager_remove():
|
| 421 |
+
with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
|
| 422 |
+
plt.rcParams['toolbar'] = 'toolmanager'
|
| 423 |
+
fig = plt.gcf()
|
| 424 |
+
initial_len = len(fig.canvas.manager.toolmanager.tools)
|
| 425 |
+
assert 'forward' in fig.canvas.manager.toolmanager.tools
|
| 426 |
+
fig.canvas.manager.toolmanager.remove_tool('forward')
|
| 427 |
+
assert len(fig.canvas.manager.toolmanager.tools) == initial_len - 1
|
| 428 |
+
assert 'forward' not in fig.canvas.manager.toolmanager.tools
|
| 429 |
+
|
| 430 |
+
|
| 431 |
+
def test_toolmanager_get_tool():
|
| 432 |
+
with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
|
| 433 |
+
plt.rcParams['toolbar'] = 'toolmanager'
|
| 434 |
+
fig = plt.gcf()
|
| 435 |
+
rubberband = fig.canvas.manager.toolmanager.get_tool('rubberband')
|
| 436 |
+
assert isinstance(rubberband, RubberbandBase)
|
| 437 |
+
assert fig.canvas.manager.toolmanager.get_tool(rubberband) is rubberband
|
| 438 |
+
with pytest.warns(UserWarning,
|
| 439 |
+
match="ToolManager does not control tool 'foo'"):
|
| 440 |
+
assert fig.canvas.manager.toolmanager.get_tool('foo') is None
|
| 441 |
+
assert fig.canvas.manager.toolmanager.get_tool('foo', warn=False) is None
|
| 442 |
+
|
| 443 |
+
with pytest.warns(UserWarning,
|
| 444 |
+
match="ToolManager does not control tool 'foo'"):
|
| 445 |
+
assert fig.canvas.manager.toolmanager.trigger_tool('foo') is None
|
| 446 |
+
|
| 447 |
+
|
| 448 |
+
def test_toolmanager_update_keymap():
|
| 449 |
+
with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
|
| 450 |
+
plt.rcParams['toolbar'] = 'toolmanager'
|
| 451 |
+
fig = plt.gcf()
|
| 452 |
+
assert 'v' in fig.canvas.manager.toolmanager.get_tool_keymap('forward')
|
| 453 |
+
with pytest.warns(UserWarning,
|
| 454 |
+
match="Key c changed from back to forward"):
|
| 455 |
+
fig.canvas.manager.toolmanager.update_keymap('forward', 'c')
|
| 456 |
+
assert fig.canvas.manager.toolmanager.get_tool_keymap('forward') == ['c']
|
| 457 |
+
with pytest.raises(KeyError, match="'foo' not in Tools"):
|
| 458 |
+
fig.canvas.manager.toolmanager.update_keymap('foo', 'c')
|
| 459 |
+
|
| 460 |
+
|
| 461 |
+
@pytest.mark.parametrize("tool", ["zoom", "pan"])
|
| 462 |
+
@pytest.mark.parametrize("button", [MouseButton.LEFT, MouseButton.RIGHT])
|
| 463 |
+
@pytest.mark.parametrize("patch_vis", [True, False])
|
| 464 |
+
@pytest.mark.parametrize("forward_nav", [True, False, "auto"])
|
| 465 |
+
@pytest.mark.parametrize("t_s", ["twin", "share"])
|
| 466 |
+
def test_interactive_pan_zoom_events(tool, button, patch_vis, forward_nav, t_s):
|
| 467 |
+
# Bottom axes: ax_b Top axes: ax_t
|
| 468 |
+
fig, ax_b = plt.subplots()
|
| 469 |
+
ax_t = fig.add_subplot(221, zorder=99)
|
| 470 |
+
ax_t.set_forward_navigation_events(forward_nav)
|
| 471 |
+
ax_t.patch.set_visible(patch_vis)
|
| 472 |
+
|
| 473 |
+
# ----------------------------
|
| 474 |
+
if t_s == "share":
|
| 475 |
+
ax_t_twin = fig.add_subplot(222)
|
| 476 |
+
ax_t_twin.sharex(ax_t)
|
| 477 |
+
ax_t_twin.sharey(ax_t)
|
| 478 |
+
|
| 479 |
+
ax_b_twin = fig.add_subplot(223)
|
| 480 |
+
ax_b_twin.sharex(ax_b)
|
| 481 |
+
ax_b_twin.sharey(ax_b)
|
| 482 |
+
elif t_s == "twin":
|
| 483 |
+
ax_t_twin = ax_t.twinx()
|
| 484 |
+
ax_b_twin = ax_b.twinx()
|
| 485 |
+
|
| 486 |
+
# just some styling to simplify manual checks
|
| 487 |
+
ax_t.set_label("ax_t")
|
| 488 |
+
ax_t.patch.set_facecolor((1, 0, 0, 0.5))
|
| 489 |
+
|
| 490 |
+
ax_t_twin.set_label("ax_t_twin")
|
| 491 |
+
ax_t_twin.patch.set_facecolor("r")
|
| 492 |
+
|
| 493 |
+
ax_b.set_label("ax_b")
|
| 494 |
+
ax_b.patch.set_facecolor((0, 0, 1, 0.5))
|
| 495 |
+
|
| 496 |
+
ax_b_twin.set_label("ax_b_twin")
|
| 497 |
+
ax_b_twin.patch.set_facecolor("b")
|
| 498 |
+
|
| 499 |
+
# ----------------------------
|
| 500 |
+
|
| 501 |
+
# Set initial axis limits
|
| 502 |
+
init_xlim, init_ylim = (0, 10), (0, 10)
|
| 503 |
+
for ax in [ax_t, ax_b]:
|
| 504 |
+
ax.set_xlim(*init_xlim)
|
| 505 |
+
ax.set_ylim(*init_ylim)
|
| 506 |
+
|
| 507 |
+
# Mouse from 2 to 1 (in data-coordinates of ax_t).
|
| 508 |
+
xstart_t, xstop_t, ystart_t, ystop_t = 1, 2, 1, 2
|
| 509 |
+
# Convert to screen coordinates ("s"). Events are defined only with pixel
|
| 510 |
+
# precision, so round the pixel values, and below, check against the
|
| 511 |
+
# corresponding xdata/ydata, which are close but not equal to s0/s1.
|
| 512 |
+
s0 = ax_t.transData.transform((xstart_t, ystart_t)).astype(int)
|
| 513 |
+
s1 = ax_t.transData.transform((xstop_t, ystop_t)).astype(int)
|
| 514 |
+
|
| 515 |
+
# Calculate the mouse-distance in data-coordinates of the bottom-axes
|
| 516 |
+
xstart_b, ystart_b = ax_b.transData.inverted().transform(s0)
|
| 517 |
+
xstop_b, ystop_b = ax_b.transData.inverted().transform(s1)
|
| 518 |
+
|
| 519 |
+
# Set up the mouse movements
|
| 520 |
+
start_event = MouseEvent("button_press_event", fig.canvas, *s0, button)
|
| 521 |
+
drag_event = MouseEvent(
|
| 522 |
+
"motion_notify_event", fig.canvas, *s1, button, buttons={button})
|
| 523 |
+
stop_event = MouseEvent("button_release_event", fig.canvas, *s1, button)
|
| 524 |
+
|
| 525 |
+
tb = NavigationToolbar2(fig.canvas)
|
| 526 |
+
|
| 527 |
+
if tool == "zoom":
|
| 528 |
+
# Evaluate expected limits before executing the zoom-event
|
| 529 |
+
direction = ("in" if button == 1 else "out")
|
| 530 |
+
|
| 531 |
+
xlim_t, ylim_t = ax_t._prepare_view_from_bbox([*s0, *s1], direction)
|
| 532 |
+
|
| 533 |
+
if ax_t.get_forward_navigation_events() is True:
|
| 534 |
+
xlim_b, ylim_b = ax_b._prepare_view_from_bbox([*s0, *s1], direction)
|
| 535 |
+
elif ax_t.get_forward_navigation_events() is False:
|
| 536 |
+
xlim_b = init_xlim
|
| 537 |
+
ylim_b = init_ylim
|
| 538 |
+
else:
|
| 539 |
+
if not ax_t.patch.get_visible():
|
| 540 |
+
xlim_b, ylim_b = ax_b._prepare_view_from_bbox([*s0, *s1], direction)
|
| 541 |
+
else:
|
| 542 |
+
xlim_b = init_xlim
|
| 543 |
+
ylim_b = init_ylim
|
| 544 |
+
|
| 545 |
+
tb.zoom()
|
| 546 |
+
|
| 547 |
+
else:
|
| 548 |
+
# Evaluate expected limits
|
| 549 |
+
# (call start_pan to make sure ax._pan_start is set)
|
| 550 |
+
ax_t.start_pan(*s0, button)
|
| 551 |
+
xlim_t, ylim_t = ax_t._get_pan_points(button, None, *s1).T.astype(float)
|
| 552 |
+
ax_t.end_pan()
|
| 553 |
+
|
| 554 |
+
if ax_t.get_forward_navigation_events() is True:
|
| 555 |
+
ax_b.start_pan(*s0, button)
|
| 556 |
+
xlim_b, ylim_b = ax_b._get_pan_points(button, None, *s1).T.astype(float)
|
| 557 |
+
ax_b.end_pan()
|
| 558 |
+
elif ax_t.get_forward_navigation_events() is False:
|
| 559 |
+
xlim_b = init_xlim
|
| 560 |
+
ylim_b = init_ylim
|
| 561 |
+
else:
|
| 562 |
+
if not ax_t.patch.get_visible():
|
| 563 |
+
ax_b.start_pan(*s0, button)
|
| 564 |
+
xlim_b, ylim_b = ax_b._get_pan_points(button, None, *s1).T.astype(float)
|
| 565 |
+
ax_b.end_pan()
|
| 566 |
+
else:
|
| 567 |
+
xlim_b = init_xlim
|
| 568 |
+
ylim_b = init_ylim
|
| 569 |
+
|
| 570 |
+
tb.pan()
|
| 571 |
+
|
| 572 |
+
start_event._process()
|
| 573 |
+
drag_event._process()
|
| 574 |
+
stop_event._process()
|
| 575 |
+
|
| 576 |
+
assert ax_t.get_xlim() == pytest.approx(xlim_t, abs=0.15)
|
| 577 |
+
assert ax_t.get_ylim() == pytest.approx(ylim_t, abs=0.15)
|
| 578 |
+
assert ax_b.get_xlim() == pytest.approx(xlim_b, abs=0.15)
|
| 579 |
+
assert ax_b.get_ylim() == pytest.approx(ylim_b, abs=0.15)
|
| 580 |
+
|
| 581 |
+
# Check if twin-axes are properly triggered
|
| 582 |
+
assert ax_t.get_xlim() == pytest.approx(ax_t_twin.get_xlim(), abs=0.15)
|
| 583 |
+
assert ax_b.get_xlim() == pytest.approx(ax_b_twin.get_xlim(), abs=0.15)
|
| 584 |
+
|
| 585 |
+
|
| 586 |
+
def test_get_width_height_floating_point_precision():
|
| 587 |
+
fig = plt.figure(figsize=(1, 2.03), dpi=100)
|
| 588 |
+
assert fig.bbox.height < 203 # due to floating-point precision
|
| 589 |
+
assert fig.canvas.get_width_height() == (100, 203)
|
hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_cairo.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
|
| 3 |
+
import pytest
|
| 4 |
+
|
| 5 |
+
import matplotlib.pyplot as plt
|
| 6 |
+
from matplotlib.testing.decorators import check_figures_equal
|
| 7 |
+
from matplotlib import (
|
| 8 |
+
collections as mcollections, patches as mpatches, path as mpath)
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@pytest.mark.backend('cairo')
|
| 12 |
+
@check_figures_equal()
|
| 13 |
+
def test_patch_alpha_coloring(fig_test, fig_ref):
|
| 14 |
+
"""
|
| 15 |
+
Test checks that the patch and collection are rendered with the specified
|
| 16 |
+
alpha values in their facecolor and edgecolor.
|
| 17 |
+
"""
|
| 18 |
+
star = mpath.Path.unit_regular_star(6)
|
| 19 |
+
circle = mpath.Path.unit_circle()
|
| 20 |
+
# concatenate the star with an internal cutout of the circle
|
| 21 |
+
verts = np.concatenate([circle.vertices, star.vertices[::-1]])
|
| 22 |
+
codes = np.concatenate([circle.codes, star.codes])
|
| 23 |
+
cut_star1 = mpath.Path(verts, codes)
|
| 24 |
+
cut_star2 = mpath.Path(verts + 1, codes)
|
| 25 |
+
|
| 26 |
+
# Reference: two separate patches
|
| 27 |
+
ax = fig_ref.subplots()
|
| 28 |
+
ax.set_xlim([-1, 2])
|
| 29 |
+
ax.set_ylim([-1, 2])
|
| 30 |
+
patch = mpatches.PathPatch(cut_star1,
|
| 31 |
+
linewidth=5, linestyle='dashdot',
|
| 32 |
+
facecolor=(1, 0, 0, 0.5),
|
| 33 |
+
edgecolor=(0, 0, 1, 0.75))
|
| 34 |
+
ax.add_patch(patch)
|
| 35 |
+
patch = mpatches.PathPatch(cut_star2,
|
| 36 |
+
linewidth=5, linestyle='dashdot',
|
| 37 |
+
facecolor=(1, 0, 0, 0.5),
|
| 38 |
+
edgecolor=(0, 0, 1, 0.75))
|
| 39 |
+
ax.add_patch(patch)
|
| 40 |
+
|
| 41 |
+
# Test: path collection
|
| 42 |
+
ax = fig_test.subplots()
|
| 43 |
+
ax.set_xlim([-1, 2])
|
| 44 |
+
ax.set_ylim([-1, 2])
|
| 45 |
+
col = mcollections.PathCollection([cut_star1, cut_star2],
|
| 46 |
+
linewidth=5, linestyles='dashdot',
|
| 47 |
+
facecolor=(1, 0, 0, 0.5),
|
| 48 |
+
edgecolor=(0, 0, 1, 0.75))
|
| 49 |
+
ax.add_collection(col)
|
| 50 |
+
|
| 51 |
+
# Have pyplot manage the figures to ensure the cairo backend is used
|
| 52 |
+
plt.figure(fig_ref)
|
| 53 |
+
plt.figure(fig_test)
|