Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit24be778

Browse files
committed
Load style files from third-party packages.
1 parentc54afff commit24be778

File tree

10 files changed

+100
-21
lines changed

10 files changed

+100
-21
lines changed

‎.github/workflows/tests.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ jobs:
162162
163163
# Install dependencies from PyPI.
164164
python -m pip install --upgrade $PRE \
165-
'contourpy>=1.0.1' cycler fonttools kiwisolvernumpy packaging \
166-
pillow pyparsing python-dateutil setuptools-scm \
165+
'contourpy>=1.0.1' cycler fonttools kiwisolverimportlib_resources \
166+
numpy packagingpillow pyparsing python-dateutil setuptools-scm \
167167
-r requirements/testing/all.txt \
168168
${{ matrix.extra-requirements }}
169169
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
importlib_resources>=2.3.0 is now required on Python<3.10
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

‎doc/devel/dependencies.rst‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ reference.
2626
* `Pillow<https://pillow.readthedocs.io/en/latest/>`_ (>= 6.2)
2727
* `pyparsing<https://pypi.org/project/pyparsing/>`_ (>= 2.3.1)
2828
* `setuptools<https://setuptools.readthedocs.io/en/latest/>`_
29+
* `pyparsing<https://pypi.org/project/pyparsing/>`_ (>= 2.3.1)
30+
* `importlib-resources<https://pypi.org/project/importlib-resources/>`_
31+
(>= 3.2.0; only required on Python < 3.10)
2932

3033

3134
.. _optional_dependencies:
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Style files can be imported from third-party packages
2+
-----------------------------------------------------
3+
4+
Third-party packages can now distribute style files that are globally available
5+
as follows. Assume that a package is importable as ``import mypackage``, with
6+
a ``mypackage/__init__.py`` module. Then a ``mypackage/presentation.mplstyle``
7+
style sheet can be used as ``plt.style.use("mypackage.presentation")``.
8+
9+
The implementation does not actually import ``mypackage``, making this process
10+
safe against possible import-time side effects. Subpackages (e.g.
11+
``dotted.package.name``) are also supported.

‎environment.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies:
1212
-contourpy>=1.0.1
1313
-cycler>=0.10.0
1414
-fonttools>=4.22.0
15+
-importlib-resources>=3.2.0
1516
-kiwisolver>=1.0.1
1617
-numpy>=1.19
1718
-pillow>=6.2

‎lib/matplotlib/style/core.py‎

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@
1515
importlogging
1616
importos
1717
frompathlibimportPath
18+
importsys
1819
importwarnings
1920

21+
ifsys.version_info>= (3,10):
22+
importimportlib.resourcesasimportlib_resources
23+
else:
24+
# Even though Py3.9 has importlib.resources, it doesn't properly handle
25+
# modules added in sys.path.
26+
importimportlib_resources
27+
2028
importmatplotlibasmpl
2129
frommatplotlibimport_api,_docstring,_rc_params_in_file,rcParamsDefault
2230

@@ -82,20 +90,28 @@ def use(style):
8290
Parameters
8391
----------
8492
style : str, dict, Path or list
85-
A style specification. Valid options are:
8693
87-
+------+-------------------------------------------------------------+
88-
| str | The name of a style or a path/URL to a style file. For a |
89-
| | list of available style names, see `.style.available`. |
90-
+------+-------------------------------------------------------------+
91-
| dict | Dictionary with valid key/value pairs for |
92-
| | `matplotlib.rcParams`. |
93-
+------+-------------------------------------------------------------+
94-
| Path | A path-like object which is a path to a style file. |
95-
+------+-------------------------------------------------------------+
96-
| list | A list of style specifiers (str, Path or dict) applied from |
97-
| | first to last in the list. |
98-
+------+-------------------------------------------------------------+
94+
A style specification.
95+
96+
- If a str, this can be one of the style names in `.style.available`
97+
(a builtin style or a style installed in the user library path).
98+
99+
This can also be a dotted name of the form "package.style_name"; in
100+
that case, "package" should be an importable Python package name,
101+
e.g. at ``/path/to/package/__init__.py``; the loaded style file is
102+
``/path/to/package/style_name.mplstyle``. (Style files in
103+
subpackages are likewise supported.)
104+
105+
This can also be the path or URL to a style file, which gets loaded
106+
by `.rc_params_from_file`.
107+
108+
- If a dict, this is a mapping of key/value pairs for `.rcParams`.
109+
110+
- If a Path, this is the path to a style file, which gets loaded by
111+
`.rc_params_from_file`.
112+
113+
- If a list, this is a list of style specifiers (str, Path or dict),
114+
which get applied from first to last in the list.
99115
100116
Notes
101117
-----
@@ -127,14 +143,28 @@ def use(style):
127143
ifknotinSTYLE_BLACKLIST}
128144
elifstyleinlibrary:
129145
style=library[style]
146+
elif"."instyle:
147+
pkg,_,name=style.rpartition(".")
148+
try:
149+
path= (importlib_resources.files(pkg)
150+
/f"{name}.{STYLE_EXTENSION}")
151+
style=_rc_params_in_file(path)
152+
except (ModuleNotFoundError,IOError)asexc:
153+
# There is an ambiguity whether a dotted name refers to a
154+
# package.style_name or to a dotted file path. Currently,
155+
# we silently try the first form and then the second one;
156+
# in the future, we may consider forcing file paths to
157+
# either use Path objects or be prepended with "./" and use
158+
# the slash as marker for file paths.
159+
pass
130160
ifisinstance(style, (str,Path)):
131161
try:
132162
style=_rc_params_in_file(style)
133163
exceptIOErroraserr:
134164
raiseIOError(
135-
f"{style!r} notfound in the style library and input is "
136-
f"not a valid URLorpath; see `style.available` for the "
137-
f"list of available styles")fromerr
165+
f"{style!r}isnota valid package style, path of style "
166+
f"file, URL of style file,orlibrarystyle name (library "
167+
f"styles are listed in `style.available`)")fromerr
138168
filtered= {}
139169
forkinstyle:# don't trigger RcParams.__getitem__('backend')
140170
ifkinSTYLE_BLACKLIST:

‎lib/matplotlib/tests/test_style.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,18 @@ def test_deprecated_seaborn_styles():
190190

191191
deftest_up_to_date_blacklist():
192192
assertmpl.style.core.STYLE_BLACKLIST<= {*mpl.rcsetup._validators}
193+
194+
195+
deftest_style_from_module(tmp_path,monkeypatch):
196+
monkeypatch.syspath_prepend(tmp_path)
197+
monkeypatch.chdir(tmp_path)
198+
pkg_path=tmp_path/"mpl_test_style_pkg"
199+
pkg_path.mkdir()
200+
(pkg_path/"test_style.mplstyle").write_text(
201+
"lines.linewidth: 42",encoding="utf-8")
202+
pkg_path.with_suffix(".mplstyle").write_text(
203+
"lines.linewidth: 84",encoding="utf-8")
204+
mpl.style.use("mpl_test_style_pkg.test_style")
205+
assertmpl.rcParams["lines.linewidth"]==42
206+
mpl.style.use("mpl_test_style_pkg.mplstyle")
207+
assertmpl.rcParams["lines.linewidth"]==84

‎requirements/testing/minver.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
contourpy==1.0.1
44
cycler==0.10
55
kiwisolver==1.0.1
6+
importlib-resources==3.2.0
67
numpy==1.19.0
78
packaging==20.0
89
pillow==6.2.1

‎setup.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,11 @@ def make_release_tree(self, base_dir, files):
334334
os.environ.get("CIBUILDWHEEL","0")!="1"
335335
)else []
336336
),
337+
extras_require={
338+
':python_version<"3.10"': [
339+
"importlib-resources>=3.2.0",
340+
],
341+
},
337342
use_scm_version={
338343
"version_scheme":"release-branch-semver",
339344
"local_scheme":"node-and-date",

‎tutorials/introductory/customizing.py‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
1010
There are three ways to customize Matplotlib:
1111
12-
1. :ref:`Setting rcParams at runtime<customizing-with-dynamic-rc-settings>`.
13-
2. :ref:`Using style sheets<customizing-with-style-sheets>`.
14-
3. :ref:`Changing your matplotlibrc file<customizing-with-matplotlibrc-files>`.
12+
1. :ref:`Setting rcParams at runtime<customizing-with-dynamic-rc-settings>`.
13+
2. :ref:`Using style sheets<customizing-with-style-sheets>`.
14+
3. :ref:`Changing your matplotlibrc file<customizing-with-matplotlibrc-files>`.
1515
1616
Setting rcParams at runtime takes precedence over style sheets, style
1717
sheets take precedence over :file:`matplotlibrc` files.
@@ -137,6 +137,17 @@ def plotting_function():
137137
# >>> import matplotlib.pyplot as plt
138138
# >>> plt.style.use('./images/presentation.mplstyle')
139139
#
140+
#
141+
# Distributing styles
142+
# -------------------
143+
#
144+
# You can include style sheets into standard importable Python packages (which
145+
# can be e.g. distributed on PyPI). If your package is importable as
146+
# ``import mypackage``, with a ``mypackage/__init__.py`` module, and you add
147+
# a ``mypackage/presentation.mplstyle`` style sheet, then it can be used as
148+
# ``plt.style.use("mypackage.presentation")``. Subpackages (e.g.
149+
# ``dotted.package.name``) are also supported.
150+
#
140151
# Alternatively, you can make your style known to Matplotlib by placing
141152
# your ``<style-name>.mplstyle`` file into ``mpl_configdir/stylelib``. You
142153
# can then load your custom style sheet with a call to

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp