Giter Club home page Giter Club logo

psyplot's Introduction

The psyplot interactive visualization framework

CI Code coverage Latest Release PyPI version Code style: black Imports: isort PEP8 REUSE status

Welcome! psyplot is an open source python project that mainly combines the plotting utilities of matplotlib and the data management of the xarray package. The main purpose is to have a framework that allows a fast, attractive, flexible, easily applicable, easily reproducible and especially an interactive visualization of your data.

The ultimate goal is to help scientists and especially climate model developers in their daily work by providing a flexible visualization tool that can be enhanced by their own visualization scripts. psyplot can be used through the python command line and through the psyplot-gui module which provides a graphical user interface for an easier interactive usage.

The package is very new and there are many features that will be included in the future. So we are very pleased for feedback! Please simply raise an issue on GitHub (see also How to contribute in the docs).

You can see the full documentation on psyplot.github.io/psyplot.

Get in touch

Any quesions? Do not hessitate to get in touch with the psyplot developers.

See also the code of conduct, and our contribution guide for more information and a guide about good bug reports.

How to cite psyplot

When using psyplot, you should at least cite the publication in the Journal of Open Source Software:

Journal of Open Source Software

Sommer, P. S.: The psyplot interactive visualization framework, The Journal of Open Source Software, 2, doi:10.21105/joss.00363, https://doi.org/10.21105/joss.00363, 2017.

Furthermore, each release of psyplot and it's subprojects is associated with a DOI using zenodo.org. If you want to cite a specific version or plugin, please refer to the releases page of psyplot or the releases page of the corresponding subproject.

Acknowledgment

This package is being developed by Philipp S. Sommer at the Helmholtz Coastal Data Center (HCDC) of the Helmholtz-Zentrum Hereon.

I want to thank the developers of the matplotlib, xarray and cartopy packages for their great packages and of course the python developers for their fascinating work on this beautiful language.

A special thanks to Stefan Hagemann and Tobias Stacke from the Max-Planck-Institute of Meteorology in Hamburg, Germany for the motivation on this project and to the people of the Not yet visible agency for their advice in designing the logo and webpage.

Finally the author thanks the Swiss National Science Foundation (SNF) for their support. Funding for the author came from the ACACIA grant (CR10I2_146314) and the HORNET grant (200021_169598).

Note

Commits on github prior to version 1.0 were moved into another repository, the psyplot_old repository. This has been done because prior to version 1.0, the github repository contained all the reference figures used for testing which made the size of the repository too large.

Copyright © 2021 Helmholtz-Zentrum Hereon, 2020-2021 Helmholtz-Zentrum Geesthacht, 2016-2021 University of Lausanne

psyplot is released under the GNU LGPL-3.O license. See COPYING and COPYING.LESSER in the root of the repository for full licensing details.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3.0 as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU LGPL-3.0 license for more details.

You should have received a copy of the GNU LGPL-3.0 license along with this program. If not, see https://www.gnu.org/licenses/.

psyplot's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

psyplot's Issues

ModuleNotFoundError: No module named 'psyplot.compat'

I have the following psyplot packages installed together with python 3.9.16:

psy-maps                  1.5.0            py39hf3d152e_1    conda-forge
psy-reg                   1.4.0            py39hf3d152e_3    conda-forge
psy-simple                1.5.0            py39hf3d152e_1    conda-forge
psy-transect              0.1.0                    pypi_0    pypi
psyplot                   1.5.0            py39hf3d152e_1    conda-forge

When I run import psyplot.project as psy, I get the error:

WARNING:psyplot.config.rcsetup:Failed to import EntryPoint(name='plugin', value='psy_reg.plugin', group='psyplot')!
WARNING:psyplot:Could not import EntryPoint(name='plugin', value='psy_reg.plugin', group='psyplot')
Traceback (most recent call last):
  File "/project/g110/alauber/envs/psyplot/lib/python3.9/site-packages/psyplot/__init__.py", line 132, in get_versions
    mod = ep.load()
  File "/project/g110/alauber/envs/psyplot/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 184, in load
    module = import_module(match.group('module'))
  File "/project/g110/alauber/envs/psyplot/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/envs/psyplot/lib/python3.9/site-packages/psy_reg/plugin.py", line 36, in <module>
    from psyplot.compat.pycompat import map, filter
ModuleNotFoundError: No module named 'psyplot.compat'

Best,
Annika

`FileExistsError` error when `psyplot` is imported from multiple parallel processes

Hello!

First of all, thanks for this great package!!

Problem description

We (the ESMValTool community) found an issue when importing psyplot from different parallel processes in a test environment, which leads to a race condition where the package finds that it has no config file and tries to create that, but two processes try that at the same time, resulting in a FileExistsError: [Errno 17] File exists: '/Users/runner/.config/psyplot'. Note that we only found this behavior for OSX.

Code Sample, a copy-pastable example if possible

An error on our CI machine using the import below is given here,

from psyplot.config.logsetup import _get_home

but we also found the same problem when using

import psyplot.project as psy

Please note that due to the race condition, the error cannot be reproduced consistently.

Expected Output

No error and no race condition.

Full error message

 tests/unit/test_platform.py:4: in <module>
    from psyplot.config.logsetup import _get_home
../../../miniconda3/envs/esmvaltool/lib/python3.9/site-packages/psyplot/__init__.py:30: in <module>
    from psyplot.config.rcsetup import rcParams
../../../miniconda3/envs/esmvaltool/lib/python3.9/site-packages/psyplot/config/__init__.py:42: in <module>
    config_path = psyplot_fname()
../../../miniconda3/envs/esmvaltool/lib/python3.9/site-packages/psyplot/config/rcsetup.py:978: in psyplot_fname
    configdir = get_configdir()
../../../miniconda3/envs/esmvaltool/lib/python3.9/site-packages/psyplot/config/rcsetup.py:1028: in get_configdir
    os.makedirs(p)
../../../miniconda3/envs/esmvaltool/lib/python3.9/os.py:225: in makedirs
    mkdir(name, mode)
E   FileExistsError: [Errno 17] File exists: '/Users/runner/.config/psyplot'

Output of psyplot -aV

psyplot:
  requirements:
    matplotlib: 3.5.2
    numpy: 1.22.3
    pandas: 1.4.2
    python: 3.8.13 | packaged by conda-forge
    xarray: 2022.3.0
  version: 1.4.2

NOTE

This is a bug report.

For requesting new features, use this template.

For changing existing features, use this template.

lineplot : wrong ylabel ?

Code Sample, a copy-pastable example if possible

import datetime , psyplot , matplotlib.pyplot as plt

nomads2 ='gefs/gefs%Y%m%d/gefs_pgrb2bp5_all_00z' # GFS Ensemble .5 Degree (Additional Parms) # XXX hack : H hardcoded
f0 = 'gustsfc' # ** surface wind speed (gust) [m/s] , nomads gefs-b
f0 = 'presmsl' # ** mean sea level pressure [pa] # nomads gefs-b

dt0 = datetime.datetime.utcnow() - datetime.timedelta(days=2)
ds0 = psyplot.data.open_dataset(dt0.strftime('https://nomads.ncep.noaa.gov/dods/' + nomads2))
line0 = ds0.psy.plot.lineplot(name = f0,
    ylabel="{desc}",
    title = nomads2.split('/')[0],
    lat = 2*(90 + 38), lon = 2*(360 - 122)
)
print('=== line0 : ', line0)
plt.show()

Problem description

I expect the ylabel to be "mean sea level pressure", but it's "ensemble member".

Also, it possible to change the scale on the yaxis to be hectopascal (not pascal) ?

Also, the "lat" & "lon" selects are indexes, not degrees. Is there a way to use degrees ?

Any other tips to make a nice ensemble meteogram are welcome ...

Thanks !

Output of psyplot -aV

psy_maps.plugin: requirements: cartopy: 0.19.0 version: 1.4.0 psy_reg.plugin: requirements: scipy: 1.6.2 statsmodels: 0.12.2 version: 1.4.0 psy_simple.plugin: version: 1.4.0 psyplot: requirements: matplotlib: 3.4.3 numpy: 1.20.1 pandas: 1.2.5 python: 3.9.7 (default, Aug 30 2021, 00:00:00) [GCC 11.2.1 20210728 (Red Hat 11.2.1-1)] xarray: 0.17.0 version: 1.4.0 psyplot_gui: requirements: pyqt: 5.15.0 qt: 5.15.2 qtconsole: 5.0.3 version: 1.4.0

MapPlot for derived variable looks distorted

Code Sample, a copy-pastable example if possible

ds = ds.assign(plotable=(lambda x: x)(ds.data))
ds = ds.assign(not_plotable=(lambda x: x+1e-10)(ds.data))
ds.not_plotable.attrs['CDI_grid_type'] = 'unstructured'

psy.plot.mapplot(ds, name='plotable')     # Works completely fine
psy.plot.mapplot(ds, name='not_plotable')     # Plot is distorted

Problem description

I have some data on a unstructured grid. I want to compute some derived value and plot this but as soon as I change the data just by a tiny bit (adding 10^-10 to it in my example) the resulting plot suddenly looks completely different, distorted, and apparently not attatched to the same grid anymore.
I thought the reason could be that the CDI_grid_type attribute was not set for the new (changed) DataArray, so I changed that. I did the same for all other attributes so that ds.plotable and ds.not_plotable look completely identical on first sight but it does not change the behaviour.

Here is the output of the first mapplot:

Screenshot 2022-03-25 133622

Here is the output of the second mapplot:
Screenshot 2022-03-25 133549

Expected Output

I would have expected basically the same Plot for both methods. I am not sure which attribute is missing for ds.not_plotable in order to tell psyplot to use the same coordinates as for ds.plotable.

A method to achieve the same result which works on the other hand is:

ds = ds.assign(plotable=(lambda x: x)(ds.data))
ds = ds.assign(also_plotable=(lambda x: x)(ds.data))
ds.also_plotable.values += 1e-10

psy.plot.mapplot(ds, name='plotable')     # Works completely fine
psy.plot.mapplot(ds, name='also_plotable')     # Also works

But it seems strange to me that the first mentioned method does not work.

Output of psyplot -aV

psy_maps.plugin:
requirements:
cartopy: 0.20.2
version: 1.4.1
psy_reg.plugin:
requirements:
scipy: 1.8.0
statsmodels: 0.13.2
version: 1.4.0
psy_simple.plugin:
version: 1.4.1
psyplot:
requirements:
matplotlib: 3.5.1
numpy: 1.21.5
pandas: 1.4.1
python: 3.9.12 | packaged by conda-forge | (main, Mar 24 2022, 23:25:59) [GCC
10.3.0]
xarray: 2022.3.0
version: 1.4.2
psyplot_gui:
requirements:
pyqt: 5.12.3
qt: 5.12.9
qtconsole: 5.2.2
version: 1.4.0

HRRR : Failed to get CRS from crs variable LambertConfor mal_Projection

import psyplot.project
import matplotlib.pyplot as plt

n1 = 'GFS/Global_onedeg'
# n1 = 'HRRR/CONUS_2p5km' # XXX psy_maps/plotters.py:309: UserWarning: Failed to get CRS from crs variable LambertConformal_Projection
#n1 = 'NAM/Polar_90km' # XXX psy_maps/plotters.py:309: UserWarning: Failed to get CRS from crs variable PolarStereographic_Projection
nwp0 = f'https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/{n1}/Best'

map0 = psyplot.project.plot.mapplot(nwp0,
    name = 'Geopotential_height_isobaric',
    clabel='{desc}', title = n1 + ' %FT%H:%M'
)
map0.update(z=500, method='nearest') # XXX KeyError: 'Unknown formatoption keyword lev! Possible similiar frasings are levels.'
map0.update(t = '2021-10-02', method='nearest') # XXX KeyError: 'Unknown formatoption keyword time! Possible similiar frasings are title.'

plt.show()

n0 = 'u-component_of_wind_isobaric'
vectors = psyplot.project.plot.mapvector(nwp0, name=[[n0, n0.replace('u-', 'v-')]])
plt.show()

Problem description

First off : cool software !

However, I've noticed some technical difficulties :

  1. The first plot (w/ GFS) works fine, but if you uncomment the "n1 = 'HRRR/CONUS_2p5km'", it gives a warning :

psy_maps/plotters.py:309: UserWarning: Failed to get CRS from crs variable LambertConformal_Projection

... and then kind of hangs.

  1. The plot.mapvector call dies (after some time) w/ RuntimeError: NetCDF: Access failure

  2. The calls to select time & level don't seem to work. RFE : some way to put the "level" info in the title.

  3. From the command line :

psyplot https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_onedeg/Best -n Pressure_reduced_to_MSL_msl

... seems like it should work, but I get : AttributeError: 'NoneType' object has no attribute 'variables'

FYI, this is on Fedora 34.

Output of psyplot -aV

psy_maps.plugin: requirements: cartopy: 0.19.0 version: 1.4.0 psy_simple.plugin: version: 1.4.0 psyplot: requirements: matplotlib: 3.4.3 numpy: 1.20.1 pandas: 1.2.5 python: 3.9.7 (default, Aug 30 2021, 00:00:00) [GCC 11.2.1 20210728 (Red Hat 11.2.1-1)] xarray: 0.17.0 version: 1.4.0

Implementation missing for UGRID start_index attribute

The UGRID standard allows node connectivities to be specified as zero-based or one-based. The base is indicated by the attribute start_index of the connectivity variable.

Code Sample, a copy-pastable example if possible

	int mesh_element_node_connectivity(mesh_element, ungridded00004) ;
		mesh_element_node_connectivity:long_name = "mesh_element_node_connectivity" ;
		mesh_element_node_connectivity:standard_name = "face_node_connectivity" ;
		mesh_element_node_connectivity:start_index = 1;

Problem description

Currently, psyplot seems to handle only zero-based connectivities and disregards this attribute.

On the above example, an index-out-of-bounds error is thrown.

Workaround

As a workaround, you can decrease the index by one

    ds['mesh_element_node_connectivity'][:] = ds['mesh_element_node_connectivity'][:] - 1
    ds['mesh_element_node_connectivity'].__setitem__('start_index',0)

NOTE

This is a bug report.

For requesting new features, use this template.

For changing existing features, use this template.

WARNING:psyplot:Could not import plugin = psy_simple.plugin

Problem description

I upgraded to Fedora 35, which uses Python 3.10 and psyplot won't start.

It seems to be related to the use of pkg_resources. On this page : https://setuptools.pypa.io/en/latest/pkg_resources.html , I see this : Use of pkg_resources is discouraged in favor of importlib.resources, importlib.metadata.

$ psyplot
INFO:numexpr.utils:NumExpr defaulting to 4 threads.
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_simple.plugin!
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_reg.plugin!
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_maps.plugin!
WARNING:psyplot:Could not import plugin = psy_simple.plugin
Traceback (most recent call last):
  File "/mumble/bin/psyplot", line 8, in <module>
    sys.exit(main())
  File "/mumble/lib/python3.10/site-packages/psyplot/__main__.py", line 73, in main
    parser.parse_known2func(args)
  File "/mumble/lib/python3.10/site-packages/funcargparse/__init__.py", line 963, in parse_known2func
    return func(**kws), remainder
  File "/mumble/lib/python3.10/site-packages/psyplot_gui/__init__.py", line 284, in start_app
    from psyplot_gui.main import MainWindow
  File "/mumble/lib/python3.10/site-packages/psyplot_gui/main.py", line 54, in <module>
    from psyplot_gui.console import ConsoleWidget
  File "/mumble/lib/python3.10/site-packages/psyplot_gui/console.py", line 52, in <module>
    import psyplot.project as psy
  File "/mumble/lib/python3.10/site-packages/psyplot/project.py", line 93, in <module>
    _versions = get_versions(requirements=False)
  File "/mumble/lib/python3.10/site-packages/psyplot/__init__.py", line 139, in get_versions
    ret[str(ep.module_name)] = mod.get_versions(requirements)
UnboundLocalError: local variable 'mod' referenced before assignment

Output of psyplot -aV

This won't start either.

psyplot in 2020

This issue is for discussing new features that we would like to implement within the next year (2020). I'd like to make this open for everyone to poste his or her ideas (pinging @MuellerSeb and @Try2Code) for things that would be nice to be implemented.

As such, this is mainly a collection of ideas, and everything that is posted here will get his own issue under the psyplot in 2020 milestone (but of course you are kindly invited to create such an issue yourself).

This helps me personally to make a plan for this framework and to discuss it with the members in my institute. But I would like to emphasize that I am very much appreciating contributions from other developers. psyplot has a huge potential for interactive data analysis of climate data, but this becomes at some point difficult for a single maintainer...

Here is my personal wishlist and please add, whatever you have:

General features

GUI

  • A more intuitive widget for updating central formatoptions in the GUI (e.g. colorbar, colormap, etc.). This could be implemented as plugins for the GUI in the individual package (psy-simple, psy-maps, etc.) (see psyplot/psyplot-gui#7 (comment))
  • Generate time-series (or any other dimension) by clicking on a grid cell in a map (such as ncview does it, see psyplot/psyplot-gui#7 (comment))

Technical issues

  • The sharing of formatoptions needs to be improved. The strategy within the Project.update method (currently it is using one Thread per array in the project) needs to be revised. My suggestions is to rather update all formatoptions (and dimensions) in one single thread using some kind of dependency graph

Plotting the unstuctured grid data of the WaveWatch III wave model output

First of all, thank you so much for developing this tool.

Summary

I have recently been introduced to psyplot and would like to visualize WAVEWATCH III (WW3) wave model unstructured grid data.

Reason

I have tried to plot the WW3 unstructured grid data (hs or fp) using the code from this website, and my code is as follows:

import psyplot.project as psy
import matplotlib as mpl

psy.rcParams['plotter.maps.xgrid'] = False
psy.rcParams['plotter.maps.ygrid'] = False
mpl.rcParams['figure.figsize'] = [10., 8.]

tsunami = psy.plot.mapplot(
    'ww3.20220815T00Z.nc',
    name='hs',
    load=True,
    cmap='Blues')

#
tsunami.show()

The ww3.20220815T00Z.nc could be downloaded via icloud link.

图片

And the running error is as follows:

>>> tsunami = psy.plot.mapplot(
...     '/media/jincanliu/Elements/MaterialLibrary-20220815-20220829-BeijingHaidianCMA524/NC/2022/20220815/ww3.20220815T00Z.nc', name='hs', load=True,
...     maskleq=0, cmap='Blues',
...     clabel='{desc}', stock_img=True, lsm='50m')
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/project.py", line 1987, in __call__
    six.iteritems(self._default_dims), six.iteritems(kwargs))))
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/project.py", line 1772, in _add_data
    return self.project._add_data(*args, **kwargs)
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/project.py", line 180, in wrapper
    return func(self, *args, **kwargs)
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/project.py", line 803, in _add_data
    project=self, enable_post=enable_post, **fmt)
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/plotter.py", line 1261, in __init__
    make_plot=make_plot)
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/plotter.py", line 1414, in initialize_plot
    self.plot_data = self.data
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psyplot/plotter.py", line 1162, in plot_data
    self._set_data(value)
  File "/1t/Data-Assimilation-for-Ocean-Current-Forecasts/anaconda3/envs/py-ev-psyplot-2/lib/python3.7/site-packages/psy_simple/plotters.py", line 5891, in _set_data
    raise ValueError(f"Can only plot {self.allowed_dims}-dimensional "
ValueError: Can only plot 2-dimensional data!

I know it's probably because the NetCDF data doesn't meet the UGRID Conventions, but I really don't know how to change it to work.

Output of psyplot -aV

# Paste the output of the command ``psyplot -aV`` (ran from the command line)
$ psyplot -aV
INFO:numexpr.utils:Note: NumExpr detected 16 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
INFO:numexpr.utils:NumExpr defaulting to 8 threads.
psy_maps.plugin:
  requirements:
    cartopy: 0.18.0
  version: 1.4.2
psy_reg.plugin:
  requirements:
    scipy: 1.7.3
    statsmodels: 0.13.2
  version: 1.4.0
psy_simple.plugin:
  version: 1.4.1
psyplot:
  requirements:
    matplotlib: 3.5.3
    numpy: 1.21.6
    pandas: 1.3.5
    python: 3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 06:08:53)  [GCC
      9.4.0]
    xarray: 0.20.2
  version: 1.4.3
psyplot_gui:
  requirements:
    pyqt: 5.15.7
    qt: 5.15.4
    qtconsole: 5.3.2
  version: 1.4.0

plotting other non-triangular grids

Hi Philipp!

Today I was looking for a tool to plot the vertex and edge grid of ICON. Vertices a have 5/6 , edges have 4 nighbours. Do you think psyplot could learn to plot this type of thing? I have test data ready .

cheers

CHANGE FEATURE:

Summary

[Describe the requested change in one or two lines.]

Reason

[Why do you think, this is useful?]

Current behaviour

[How is the current behaviour/framework?]

New behaviour

[Provide here some more explanation that goes beyond the summary above
(or delete this paragraph, if everything is explained above),
and describe the changes you would like to see]

Examples

[images, code-snippets or URLs to other repositories]

Error in warning message "The following plotters have already been defined"

Hello,

We are seeing a weird error when trying to import psyplot, it seems the code crash while trying to display a warning regarding "plotters have already been defined":

(climate_science) $ python
Python 3.9.1 | packaged by conda-forge | (default, Jan 26 2021, 01:34:10) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psyplot.project as psy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../anaconda-py3/2020.11/envs/climate_science/lib/python3.9/site-packages/psyplot/__init__.py", line 64, in <module>
    rcParams.load_plugins()
  File "/.../anaconda-py3/2020.11/envs/climate_science/lib/python3.9/site-packages/psyplot/config/rcsetup.py", line 852, in load_plugins
    msg = ("Error while loading psyplot plugin %s! The "
TypeError: not all arguments converted during string formatting

I am not sure why the warning is displayed in the first place. The error itself seems to happen because "%s" % ep is not valid (at least with Python 3.9).

Here is the list of installed psyplot-related Conda packages:

(climate_science) $ conda list | grep psy
psy-maps                  1.4.2            py39hf3d152e_2    conda-forge
psy-reg                   1.4.0            py39hf3d152e_3    conda-forge
psy-simple                1.4.1            py39hf3d152e_2    conda-forge
psy-view                  0.2.0            py39hf3d152e_1    conda-forge
psyplot                   1.4.3            py39hf3d152e_1    conda-forge
psyplot-gui               1.4.0            py39hf3d152e_2    conda-forge

Best regards,
Rémi

show_plot_methods() is empty

I am new to psyplot, so maybe I am doing something fundamentally wrong, but I can't plot anything because if I try

psy.plot.mapplot

I always get

AttributeError: 'ProjectPlotter' object has no attribute 'mapplot'

and if I try

psy.plot.show_plot_methods()

I just get no results.

I am running this in a Jupyter Notebook, WSL, Python 3.11 (but I also tries 3.6, 3.7 and 3.9).

My pip list:
`Package Version


asttokens 2.4.1
blinker 1.4
Cartopy 0.22.0
certifi 2024.2.2
comm 0.2.2
command-not-found 0.3
contourpy 1.2.0
cryptography 3.4.8
cycler 0.12.1
dbus-python 1.2.18
debugpy 1.8.1
decorator 5.1.1
distro 1.7.0
distro-info 1.1+ubuntu0.2
docrep 0.3.2
executing 2.0.1
fonttools 4.50.0
funcargparse 0.2.5
httplib2 0.20.2
importlib-metadata 4.6.4
install 1.3.5
ipykernel 6.29.3
ipython 8.22.2
jedi 0.19.1
jeepney 0.7.1
joblib 1.3.2
jupyter_client 8.6.1
jupyter_core 5.7.2
keyring 23.5.0
kiwisolver 1.4.5
launchpadlib 1.10.16
lazr.restfulclient 0.14.4
lazr.uri 1.0.6
matplotlib 3.8.3
matplotlib-inline 0.1.6
more-itertools 8.10.0
nest-asyncio 1.6.0
netifaces 0.11.0
numpy 1.26.4
oauthlib 3.2.0
packaging 24.0
pandas 2.2.1
parse 1.20.1
parso 0.8.3
pexpect 4.9.0
pillow 10.2.0
pip 22.0.2
platformdirs 4.2.0
prompt-toolkit 3.0.43
psutil 5.9.8
psyplot 1.4.3
ptyprocess 0.7.0
pure-eval 0.2.2
Pygments 2.17.2
PyGObject 3.42.1
PyJWT 2.3.0
pyparsing 2.4.7
pyproj 3.6.1
pyshp 2.3.1
python-apt 2.4.0+ubuntu3
python-dateutil 2.9.0.post0
pytz 2024.1
PyYAML 5.4.1
pyzmq 25.1.2
scikit-learn 1.4.1.post1
scipy 1.12.0
seaborn 0.13.2
SecretStorage 3.3.1
setuptools 59.6.0
shapely 2.0.3
six 1.16.0
stack-data 0.6.3
systemd-python 234
threadpoolctl 3.4.0
tornado 6.4
tqdm 4.66.2
traitlets 5.14.2
tzdata 2024.1
ubuntu-pro-client 8001
ufw 0.36.1
unattended-upgrades 0.1
UNKNOWN 1.4.3+15.gd603bc0
versioneer 0.29
wadllib 1.3.6
wcwidth 0.2.13
wheel 0.37.1
xarray 2024.2.0
zipp 1.0.0`

NEW FEATURE: Export projects as python scripts

Summary

psyplot projects should be exportable directly to python scripts, not only as
pickle files.

Reason

When trying to reproduce a plot created through the GUI, it would be helpful
to have a python script to generate it, such that it can be copy-pasted to
another python script.

Detailed explanation

One strength of psyplot is the short and easy syntax for formatoptions and
the structured data handling. And since anyway most of the formatoption
come in standard python objects like lists, strings, etc. it would be
straight-forward with python repr function to reproduce them in a script.

Challenges

  1. Only datasets that have been stored to disc can be opened in the
    script
  2. The matplotlib axes setup has to be reproduced
  3. Some formatoptions do require more complex data structures, such
    as colormaps or numpy arrays

Proposed methodology to generate the script

  1. open the netCDF dataset from disk (if it is stored on the disk, otherwise leaf that
    empty such that the user can fill this in

    ds1 = xr.open_dataset('nc-file1.nc')
    ds2 = xr.open_dataset('nc-file2.nc')
    ds3 =    # dataset has not been stored on the disc

    The number ds<number> should be determined by the
    psyplot.data.DatasetAccessor.num attribute

  2. We should not use the psyplot.project.plot API directly, since the plot methods
    can have diverse calling signatures. So we extract the data and create the plot for
    each array in the project from scratch. Therefore, for each data object in the project,
    export a script to

    1. reproduce the DataArray (or InteractiveList) from the datasets ds1, ds2, ...
    2. Create the matplotlib axes that is visualized (if there is a plotter)
    3. open the plotter class from psyplot (if there is a plotter)
  3. Concatenate all the extracted data arrays/lists into one project

Proposed API additions:

  1. A new method psyplot.data.ArrayList.to_script() to top-level API method that
    generates the python script to reproduce the list/project. It should create the part
    to open the datasets and call the to_script method of the contents

  2. A new abstract method psyplot.script.InteractiveBase.to_script() that
    generates the string to generate this data structure. If the object has a
    plotter, it should call the to_script method of the plotter

  3. A new abstract method psyplot.plotter.Plotter.to_script() method, that

    1. Creates the matplotlib axes
    2. Creates the plotter by first checking the prepare_string methods of the
      formatoptions and then the as_string method
  4. A new psyplot.plotter.Formatoption.prepare_string method, that returns
    a string with necssary preparations for the formatoption. In case of a
    colormap instance, for example, this could be the example how the colormap is
    created. So by default, this should be an empty string

  5. A new psyplot.plotter.Formatoption.as_string method, that is called after
    the prepare_string method and sets the value for the formatoption in the
    Plotter(...) initialization. By default, this should just be repr(self.value)

Examples

Paraview for example has this functionality with Tools->Start Trace

Runtime error related to docstrings

I encountered the following error when using psyplot-1.2.1 and docrep-0.3.1 in python3.8. The same error occurs when I try psyplot -aV.

(work) chuaxr@elogin1:~$ psyplot
Traceback (most recent call last):
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/bin/psyplot", line 7, in <module>
    from psyplot.__main__ import main
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/lib/python3.8/site-packages/psyplot/__init__.py", line 7, in <module>
    from psyplot.config.rcsetup import rcParams
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/lib/python3.8/site-packages/psyplot/config/__init__.py", line 13, in <module>
    from .rcsetup import psyplot_fname
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/lib/python3.8/site-packages/psyplot/config/rcsetup.py", line 25, in <module>
    @docstrings.get_sectionsf('safe_list')
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/lib/python3.8/site-packages/docrep/decorators.py", line 110, in deprecated
    return func(self, *args, **kwargs)
  File "/home/users/gov/nea/chuaxr/.conda/envs/work/lib/python3.8/site-packages/docrep/__init__.py", line 927, in get_sectionsf
    return self.get_sections(base=args[0], *args[1:], **kwargs)
TypeError: get_sections() missing 1 required positional argument: 's'

NEW FEATURE: Implement an animate method

Summary

The Project class should get an animate method that creates an animation and saves it to disk

Reason

Because sometimes you only see your data when it is animated.

New behaviour

psy-view has this animation support (see psyplot/psy-view#11) but it would be good to formalize this in psyplot a bit more to make it scriptable. This also requires some formality to prevent data-driven formatoptions (such as the bounds formatoption of the mapplot method, or the xlim and ylim formatoptions, to change constantly. Therefore, we need a

  • psyplot.project.Project.animate method
  • psyplot.plotter.Formatoption.prepare_for_animation and psyplot.plotter.Formatoption.stop_animation method

CHANGE FEATURE: Allow a custom template RST for plot methods

Summary

Plot methods should be documented using a template rather than a hard-coded docstring.

Reason

You could easily add more examples and explanation

Current behaviour

Plot methods are registered using psyplot.project.register_plotter and the documentation is generated via the psyplot.project.ProjectPlotter._gen_doc method. This only gives a minimal possibility to modify the plot method, you can only set the example_call and the show_examples
parameter.

New behaviour

Instead of hard-coded keywords, such as example_call and show_examples, one should create a template for the description and another template for the epilog.

Those templates could then be specified in the register_plotter call and the psyplot.project.ProjectPlotter._register_plotter method takes **kwargs that are than used to format the template via template_str.format(**kwargs)

Examples

Default template for the main docstring

{summary}

{description}

To plot data from a netCDF file type::

    >>> psy.plot.{identifier}({example_call})

Default template for the epilog

Examples
--------
To explore the formatoptions and their documentations, use the
``keys``, ``summaries`` and ``docs`` methods. For example::

    >>> import psyplot.project as psy

    # show the keys corresponding to a group or multiple
    # formatopions
    >>> psy.plot.{identifier}.keys('labels')

    # show the summaries of a group of formatoptions or of a
    # formatoption
    >>> psy.plot.{identifier}.summaries('title')

    # show the full documentation
    >>> psy.plot.{identifier}.docs('plot')

    # or access the documentation via the attribute
    >>> psy.plot.%(identifier)s.plot

New function call for ProjectPlotter._register_plotter

def _register_plotter(cls, identifier, module, plotter_name,
                      plotter_cls=None, summary='', prefer_list=False,
                      default_slice=None, default_dims={},
                      example_call="filename, name=['my_variable'], ...",
                      description_template='description.rst',
                      epilog_template='epilog.rst',
                      plugin=None):
                      """show_examples should be depreceated"""

Installation issue in WinPython

Code Sample, a copy-pastable example if possible

import psyplot
import psyplot.project as psy
psy.plot.show_plot_methods()

Problem description

I worked in environmental fluid dynamics using the unstructured grids. Thanks to the great work in visualizing unstructured grid data. That is what I need in the future work.

I am exciting to install psyplot in the WinPython using pip install or from source following the guide. It seems that I have successfully installed psyplot and its dependence, such as psy-map, psy-simple... But, I can not get the right module when I began to test it.
I tested psy.plot.show_plot_methods(). It shows empty. Also I can not get the method of "psy.plot.mapplot"
How can I overcome it? Any help would be appreciated.

Expected Output

WARNING:psyplot.config.rcsetup:Failed to import EntryPoint(name='plugin', value='psy_maps.plugin', group='psyplot')!
WARNING:psyplot.config.rcsetup:Failed to import EntryPoint(name='plugin', value='psy_simple.plugin', group='psyplot')!
WARNING:psyplot:Could not import EntryPoint(name='plugin', value='psy_maps.plugin', group='psyplot')
Traceback (most recent call last):
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psyplot-1.4.0+10.g26e477b-py3.9.egg\psyplot\__init__.py", line 146, in get_versions
    mod = ep.load()
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\importlib_metadata\__init__.py", line 194, in load
    module = import_module(match.group('module'))
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_maps\plugin.py", line 33, in <module>
    from psy_simple.plugin import (
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_simple\plugin.py", line 41, in <module>
    from matplotlib.rcsetup import (
ImportError: cannot import name 'validate_legend_loc' from 'matplotlib.rcsetup' (D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\matplotlib\rcsetup.py)
WARNING:psyplot:Could not import EntryPoint(name='plugin', value='psy_simple.plugin', group='psyplot')
Traceback (most recent call last):
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psyplot-1.4.0+10.g26e477b-py3.9.egg\psyplot\__init__.py", line 146, in get_versions
    mod = ep.load()
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\importlib_metadata\__init__.py", line 194, in load
    module = import_module(match.group('module'))
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_simple\plugin.py", line 41, in <module>
    from matplotlib.rcsetup import (
ImportError: cannot import name 'validate_legend_loc' from 'matplotlib.rcsetup' (D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\matplotlib\rcsetup.py)

Output of psyplot -aV

INFO:numexpr.utils:NumExpr defaulting to 8 threads.
WARNING:psyplot.config.rcsetup:Failed to import EntryPoint(name='plugin', value='psy_maps.plugin', group='psyplot')!
WARNING:psyplot.config.rcsetup:Failed to import EntryPoint(name='plugin', value='psy_simple.plugin', group='psyplot')!
WARNING:psyplot:Could not import EntryPoint(name='plugin', value='psy_maps.plugin', group='psyplot')
Traceback (most recent call last):
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psyplot-1.4.0+10.g26e477b-py3.9.egg\psyplot\__init__.py", line 146, in get_versions
    mod = ep.load()
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\metadata.py", line 77, in load
    module = import_module(match.group('module'))
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_maps\plugin.py", line 33, in <module>
    from psy_simple.plugin import (
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_simple\plugin.py", line 41, in <module>
    from matplotlib.rcsetup import (
ImportError: cannot import name 'validate_legend_loc' from 'matplotlib.rcsetup' (D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\matplotlib\rcsetup.py)
WARNING:psyplot:Could not import EntryPoint(name='plugin', value='psy_simple.plugin', group='psyplot')
Traceback (most recent call last):
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psyplot-1.4.0+10.g26e477b-py3.9.egg\psyplot\__init__.py", line 146, in get_versions
    mod = ep.load()
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\metadata.py", line 77, in load
    module = import_module(match.group('module'))
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\psy_simple\plugin.py", line 41, in <module>
    from matplotlib.rcsetup import (
ImportError: cannot import name 'validate_legend_loc' from 'matplotlib.rcsetup' (D:\Softs\WPy64-39100\python-3.9.10.amd64\lib\site-packages\matplotlib\rcsetup.py)
psyplot:
  requirements:
    matplotlib: 3.5.1
    numpy: 1.21.5
    pandas: 1.4.0
    python: 3.9.10 (tags/v3.9.10:f2f3f53, Jan 17 2022, 15:14:21) [MSC v.1929 64 bit
      (AMD64)]
    xarray: 0.20.2
  version: 1.4.0+10.g26e477b
psyplot_gui:
  requirements:
    pyqt: 5.15.1
    qt: 5.15.1
    qtconsole: 5.2.2
  version: 1.4.0

NEW FEATURE: yaml-string for `-fmt` option

Summary

let -fmt accept yaml-formatted string in addition to filenames

Reason

commandline tools should allow as less additional files as possible. Simple format options should not require the use to write 1- or 2-lines of yaml and store them into a file

Examples

psyplot input.nc -n ta -pm mapplot -o test.png -fmt "{'cmap' : 'RdBu_r'}"

import error when installing psyplot

Code sample and error message

Python 3.9.7 | packaged by conda-forge | (default, Sep 29 2021, 19:20:46) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psyplot.project as psy
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_simple.plugin!
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_maps.plugin!
WARNING:psyplot.config.rcsetup:Failed to import plugin = psy_reg.plugin!
WARNING:psyplot:Could not import plugin = psy_simple.plugin
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/onadja/.conda/envs/psyplot/lib/python3.9/site-packages/psyplot/project.py", line 93, in <module>
    _versions = get_versions(requirements=False)
  File "/home/onadja/.conda/envs/psyplot/lib/python3.9/site-packages/psyplot/__init__.py", line 139, in get_versions
    ret[str(ep.module_name)] = mod.get_versions(requirements)
UnboundLocalError: local variable 'mod' referenced before assignment

Problem description

I tried installing your package according to your very nice documentation. However, when running a simple import (import psyplot.project as psy), I ran into a warning and subsequent UnboundLocalError. I installed the package in a clean conda environment with the required dependencies (first: conda install -c conda-forge psy-view psy-reg, then: conda install -c conda-forge psyplot, followed by the code shown above).

NEW FEATURE: meta-package

Summary

A meta-package that installs the whole psyplot suite.

Reason

Installing everything needed to do map-plots within the GUI took to much reading to find out which packages to install.

Detailed explanation

A small and empty meta-package (maybe psy-suite?) which installs all related packages:

  • psyplot
    • xarray
    • matplotlib
    • PyYAML
    • docrep
    • funcargparse
  • psyplot-gui
    • qtconsole>=4.1.1
    • fasteners
    • PyQt5 (pyqt4 had no updates for more than 12 months)
    • sphinx
  • psy-simple
  • psy-maps
    • cartopy
  • psy-reg
  • cdo
  • gdal
  • netcdf4 / h5netcdf

One could think about selecting extras with an extras_require={...} in the setup.py. Then one could also do:

$ pip install psy-suite[all]

to just get everything, or

$ pip install psy-suite[minimal]

to get a minimal set to work with.

What do you think about that?

plot2d : KeyError: 0

Code Sample :

import datetime , psyplot , matplotlib.pyplot as plt

nomads2 = 'gfs_1p00/gfs%Y%m%d/gfs_1p00_00z' # GFS 1.0 deg # XXX hack : H hardcoded
f0 = 'rhprs' # ** (1000 975 ... 75 50) relative humidity [%]

dt0 = datetime.datetime.utcnow() - datetime.timedelta(days=2)
ds0 = psyplot.data.open_dataset(dt0.strftime('https://nomads.ncep.noaa.gov/dods/' + nomads2))

#p0 = ds0.psy.plot.lineplot(name = f0, lev = 500,
p0 = ds0.psy.plot.plot2d(name = [f0],
    ylabel="{desc}", xlabel = 'time (UTC)',
    title = dt0.strftime(nomads2) + ' ; lat = %(lat)1.2f , lon = %(lon)1.2f',
    lat = 38.0, lon = 360 - 122.0, method="nearest",
)
plt.show()

Problem description

I want to make a plot2d cross section (xaxis is time, yaxis is level). Like this : https://fluid.nccs.nasa.gov/gram/meteo/37.7x-122.4

... but the code above says, "KeyError: 0" . If your swap the plot2d w/ a lineplot, it works, so everything else is OK.

Output of psyplot -aV

psy_maps.plugin: requirements: cartopy: 0.19.0 version: 1.4.0 psy_reg.plugin: requirements: scipy: 1.6.2 statsmodels: 0.12.2 version: 1.4.0 psy_simple.plugin: version: 1.4.0 psyplot: requirements: matplotlib: 3.4.3 numpy: 1.20.1 pandas: 1.2.5 python: 3.9.7 (default, Aug 30 2021, 00:00:00) [GCC 11.2.1 20210728 (Red Hat 11.2.1-1)] xarray: 0.17.0 version: 1.4.0 psyplot_gui: requirements: pyqt: 5.15.0 qt: 5.15.2 qtconsole: 5.0.3 version: 1.4.0

psyplot runtime error

Hi Philipp,
I installed the latest version via pip and typed psyplot -h getting this

% psyplot -h                                                                    [Tue 2018-09-18|16:02:13]
Traceback (most recent call last):
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 83, in safe_modulo
    return s % meta
ValueError: unsupported format character '%' (0x25) at index 188

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 83, in safe_modulo
    return s % meta
ValueError: unsupported format character '%' (0x25) at index 188

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ram/.local/bin/psyplot", line 7, in <module>
    from psyplot.__main__ import main
  File "/home/ram/.local/lib/python3.7/site-packages/psyplot/__init__.py", line 9, in <module>
    from psyplot.data import (
  File "/home/ram/.local/lib/python3.7/site-packages/psyplot/data.py", line 1503, in <module>
    class UGridDecoder(CFDecoder):
  File "/home/ram/.local/lib/python3.7/site-packages/psyplot/data.py", line 1539, in UGridDecoder
    @docstrings.dedent
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 398, in dedent
    doc = func.__doc__ and self.dedents(func.__doc__, stacklevel=4)
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 414, in dedents
    return safe_modulo(s, self.params, stacklevel=stacklevel)
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 98, in safe_modulo
    stacklevel=stacklevel)
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 105, in safe_modulo
    print_warning=print_warning, stacklevel=stacklevel)
  File "/home/ram/.local/lib/python3.7/site-packages/docrep/__init__.py", line 83, in safe_modulo
    return s % meta
ValueError: unsupported format character '%' (0x25) at index 188
<ram@melian:~/src/tmp/psyplot>

Output of psyplot -aV

same output

is this due to python3.7?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.