geoviews icon indicating copy to clipboard operation
geoviews copied to clipboard

`gv.extension("matplotlib")` causes "normal" matplotlib plots to be blank?

Open JamesSample opened this issue 3 years ago • 2 comments

ALL software version info

I'm on Windows, but using the Jupyter Docker stacks i.e. JupyterLab running within an Ubuntu Docker container. The following Dockerfile creates an environment to reproduce the problem:

FROM jupyter/minimal-notebook:b9f6ce795cfc

USER root
	
RUN conda install -c conda-forge --yes mamba

RUN mamba install -c conda-forge --strict-channel-priority --override-channels --yes \
    geoviews \
    xarray  && \
    fix-permissions $CONDA_DIR && \
    fix-permissions /home/$NB_USER && \
    rm -rf /tmp/*

USER $NB_UID

Here is the output from conda list for this environment:

Click to expand
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       1_gnu    conda-forge
alembic                   1.6.5              pyhd8ed1ab_0    conda-forge
anyio                     3.3.0            py39hf3d152e_0    conda-forge
argon2-cffi               20.1.0           py39h3811e60_2    conda-forge
async_generator           1.10                       py_0    conda-forge
attrs                     21.2.0             pyhd8ed1ab_0    conda-forge
babel                     2.9.1              pyh44b312d_0    conda-forge
backcall                  0.2.0              pyh9f0ad1d_0    conda-forge
backports                 1.0                        py_2    conda-forge
backports.functools_lru_cache 1.6.4              pyhd8ed1ab_0    conda-forge
bleach                    3.3.1              pyhd8ed1ab_0    conda-forge
blinker                   1.4                        py_1    conda-forge
bokeh                     2.3.3            py39hf3d152e_0    conda-forge
boost-cpp                 1.74.0               hc6e9bd1_3    conda-forge
brotlipy                  0.7.0           py39h3811e60_1001    conda-forge
bzip2                     1.0.8                h7f98852_4    conda-forge
c-ares                    1.17.1               h7f98852_1    conda-forge
ca-certificates           2021.5.30            ha878542_0    conda-forge
cairo                     1.16.0            h6cf1ce9_1008    conda-forge
cartopy                   0.19.0.post1     py39h3b23250_0    conda-forge
certifi                   2021.5.30        py39hf3d152e_0    conda-forge
certipy                   0.1.3                      py_0    conda-forge
cffi                      1.14.6           py39he32792d_0    conda-forge
cfitsio                   3.470                hb418390_7    conda-forge
cftime                    1.5.0            py39hce5d2b2_0    conda-forge
chardet                   4.0.0            py39hf3d152e_1    conda-forge
charset-normalizer        2.0.0              pyhd8ed1ab_0    conda-forge
click                     7.1.2              pyh9f0ad1d_0    conda-forge
click-plugins             1.1.1                      py_0    conda-forge
cligj                     0.7.2              pyhd8ed1ab_0    conda-forge
cloudpickle               1.6.0                      py_0    conda-forge
colorcet                  2.0.6              pyhd8ed1ab_0    conda-forge
conda                     4.10.3           py39hf3d152e_0    conda-forge
conda-package-handling    1.7.3            py39h3811e60_0    conda-forge
configurable-http-proxy   4.5.0           node15_he6ea98c_0    conda-forge
cryptography              3.4.7            py39hbca0aa6_0    conda-forge
curl                      7.77.0               hea6ffbf_0    conda-forge
cycler                    0.10.0                     py_2    conda-forge
cytoolz                   0.11.0           py39h3811e60_3    conda-forge
dask                      2021.7.2           pyhd8ed1ab_0    conda-forge
dask-core                 2021.7.2           pyhd8ed1ab_0    conda-forge
datashader                0.13.0             pyh6c4a22f_0    conda-forge
datashape                 0.5.4                      py_1    conda-forge
debugpy                   1.4.1            py39he80948d_0    conda-forge
decorator                 5.0.9              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
distributed               2021.7.2         py39hf3d152e_0    conda-forge
entrypoints               0.3             pyhd8ed1ab_1003    conda-forge
expat                     2.4.1                h9c3ff4c_0    conda-forge
fiona                     1.8.18           py39h494ca2c_1    conda-forge
fontconfig                2.13.1            hba837de_1005    conda-forge
freetype                  2.10.4               h0708190_1    conda-forge
freexl                    1.0.6                h7f98852_0    conda-forge
fsspec                    2021.7.0           pyhd8ed1ab_0    conda-forge
gdal                      3.2.1            py39h409cc32_7    conda-forge
geopandas                 0.9.0              pyhd8ed1ab_1    conda-forge
geopandas-base            0.9.0              pyhd8ed1ab_1    conda-forge
geos                      3.9.1                h9c3ff4c_2    conda-forge
geotiff                   1.6.0                h2b14fbe_4    conda-forge
geoviews                  1.9.1              pyhd8ed1ab_0    conda-forge
geoviews-core             1.9.1              pyha770c72_0    conda-forge
gettext                   0.19.8.1          h0b5b191_1005    conda-forge
giflib                    5.2.1                h36c2ea0_2    conda-forge
greenlet                  1.1.0            py39he80948d_0    conda-forge
hdf4                      4.2.15               h10796ff_3    conda-forge
hdf5                      1.10.6          nompi_h6a2412b_1114    conda-forge
heapdict                  1.0.1                      py_0    conda-forge
holoviews                 1.14.5             pyhd8ed1ab_0    conda-forge
icu                       68.1                 h58526e2_0    conda-forge
idna                      3.1                pyhd3deb0d_0    conda-forge
importlib-metadata        4.6.1            py39hf3d152e_0    conda-forge
ipykernel                 6.0.3            py39hef51801_0    conda-forge
ipython                   7.25.0           py39hef51801_1    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.18.0           py39hf3d152e_2    conda-forge
jinja2                    3.0.1              pyhd8ed1ab_0    conda-forge
joblib                    1.0.1              pyhd8ed1ab_0    conda-forge
jpeg                      9d                   h36c2ea0_0    conda-forge
json-c                    0.15                 h98cffda_0    conda-forge
json5                     0.9.5              pyh9f0ad1d_0    conda-forge
jsonschema                3.2.0              pyhd8ed1ab_3    conda-forge
jupyter_client            6.1.12             pyhd8ed1ab_0    conda-forge
jupyter_core              4.7.1            py39hf3d152e_0    conda-forge
jupyter_server            1.10.1             pyhd8ed1ab_0    conda-forge
jupyter_telemetry         0.1.0              pyhd8ed1ab_1    conda-forge
jupyterhub                1.4.1            py39hf3d152e_0    conda-forge
jupyterhub-base           1.4.1            py39hf3d152e_0    conda-forge
jupyterlab                3.0.16             pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.1.2              pyh9f0ad1d_0    conda-forge
jupyterlab_server         2.6.1              pyhd8ed1ab_0    conda-forge
kealib                    1.4.14               hcc255d8_2    conda-forge
kiwisolver                1.3.1            py39h1a9c180_1    conda-forge
krb5                      1.19.1               hcc1bbae_0    conda-forge
lcms2                     2.12                 hddcbb42_0    conda-forge
ld_impl_linux-64          2.36.1               hea4e1c9_1    conda-forge
libarchive                3.5.1                h3f442fb_1    conda-forge
libblas                   3.9.0               10_openblas    conda-forge
libcblas                  3.9.0               10_openblas    conda-forge
libcurl                   7.77.0               h2574ce0_0    conda-forge
libdap4                   3.20.6               hd7c4107_2    conda-forge
libedit                   3.1.20191231         he28a2e2_2    conda-forge
libev                     4.33                 h516909a_1    conda-forge
libffi                    3.3                  h58526e2_2    conda-forge
libgcc-ng                 11.1.0               hc902ee8_2    conda-forge
libgdal                   3.2.1                h38ff51b_7    conda-forge
libgfortran-ng            11.1.0               h69a702a_8    conda-forge
libgfortran5              11.1.0               h6c583b3_8    conda-forge
libglib                   2.68.3               h3e27bee_0    conda-forge
libgomp                   11.1.0               hc902ee8_2    conda-forge
libiconv                  1.16                 h516909a_0    conda-forge
libkml                    1.3.0             h238a007_1014    conda-forge
liblapack                 3.9.0               10_openblas    conda-forge
libllvm10                 10.0.1               he513fc3_3    conda-forge
libnetcdf                 4.7.4           nompi_h56d31a8_107    conda-forge
libnghttp2                1.43.0               h812cca2_0    conda-forge
libopenblas               0.3.17          pthreads_h8fe5266_1    conda-forge
libpng                    1.6.37               h21135ba_2    conda-forge
libpq                     13.3                 hd57d9b9_0    conda-forge
librttopo                 1.1.0                h1185371_6    conda-forge
libsodium                 1.0.18               h36c2ea0_1    conda-forge
libsolv                   0.7.19               h780b84a_5    conda-forge
libspatialindex           1.9.3                h9c3ff4c_4    conda-forge
libspatialite             5.0.1                he52d314_3    conda-forge
libssh2                   1.9.0                ha56f1ee_6    conda-forge
libstdcxx-ng              11.1.0               h56837e0_2    conda-forge
libtiff                   4.2.0                hbd63e13_2    conda-forge
libuuid                   2.32.1            h7f98852_1000    conda-forge
libuv                     1.41.1               h7f98852_0    conda-forge
libwebp-base              1.2.0                h7f98852_2    conda-forge
libxcb                    1.13              h7f98852_1003    conda-forge
libxml2                   2.9.12               h72842e0_0    conda-forge
llvmlite                  0.36.0           py39h1bbdace_0    conda-forge
locket                    0.2.0                      py_2    conda-forge
lz4-c                     1.9.3                h9c3ff4c_0    conda-forge
lzo                       2.10              h516909a_1000    conda-forge
mako                      1.1.4              pyh44b312d_0    conda-forge
mamba                     0.15.2           py39h951de11_0    conda-forge
mapclassify               2.4.3              pyhd8ed1ab_0    conda-forge
markdown                  3.3.4              pyhd8ed1ab_0    conda-forge
markupsafe                2.0.1            py39h3811e60_0    conda-forge
matplotlib-base           3.4.2            py39h2fa2bec_0    conda-forge
matplotlib-inline         0.1.2              pyhd8ed1ab_2    conda-forge
mistune                   0.8.4           py39h3811e60_1004    conda-forge
msgpack-python            1.0.2            py39h1a9c180_1    conda-forge
multipledispatch          0.6.0                      py_0    conda-forge
munch                     2.5.0                      py_0    conda-forge
nbclassic                 0.3.1              pyhd8ed1ab_1    conda-forge
nbclient                  0.5.3              pyhd8ed1ab_0    conda-forge
nbconvert                 6.1.0            py39hf3d152e_0    conda-forge
nbformat                  5.1.3              pyhd8ed1ab_0    conda-forge
ncurses                   6.2                  h58526e2_4    conda-forge
nest-asyncio              1.5.1              pyhd8ed1ab_0    conda-forge
netcdf4                   1.5.6           nompi_py39h36800e2_102    conda-forge
networkx                  2.5                        py_0    conda-forge
nodejs                    15.14.0              h92b4a50_0    conda-forge
notebook                  6.4.0              pyha770c72_0    conda-forge
numba                     0.53.1           py39h56b8d98_1    conda-forge
numpy                     1.21.1           py39hdbf815f_0    conda-forge
oauthlib                  3.1.1              pyhd8ed1ab_0    conda-forge
olefile                   0.46               pyh9f0ad1d_1    conda-forge
openjpeg                  2.4.0                hb52868f_1    conda-forge
openssl                   1.1.1k               h7f98852_0    conda-forge
packaging                 21.0               pyhd8ed1ab_0    conda-forge
pamela                    1.0.0                      py_0    conda-forge
pandas                    1.3.1            py39hde0f152_0    conda-forge
pandoc                    2.14.1               h7f98852_0    conda-forge
pandocfilters             1.4.2                      py_1    conda-forge
panel                     0.12.0             pyhd8ed1ab_0    conda-forge
param                     1.11.1             pyh6c4a22f_0    conda-forge
parso                     0.8.2              pyhd8ed1ab_0    conda-forge
partd                     1.2.0              pyhd8ed1ab_0    conda-forge
pcre                      8.45                 h9c3ff4c_0    conda-forge
pexpect                   4.8.0              pyh9f0ad1d_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    8.2.0            py39hf95b381_1    conda-forge
pip                       21.2.1             pyhd8ed1ab_0    conda-forge
pixman                    0.40.0               h36c2ea0_0    conda-forge
poppler                   0.89.0               h2de54a5_5    conda-forge
poppler-data              0.4.10                        0    conda-forge
postgresql                13.3                 h2510834_0    conda-forge
proj                      7.2.0                h277dcde_2    conda-forge
prometheus_client         0.11.0             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.19             pyha770c72_0    conda-forge
psutil                    5.8.0            py39h3811e60_1    conda-forge
pthread-stubs             0.4               h36c2ea0_1001    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pycosat                   0.6.3           py39h3811e60_1006    conda-forge
pycparser                 2.20               pyh9f0ad1d_2    conda-forge
pyct                      0.4.6                      py_0    conda-forge
pyct-core                 0.4.6                      py_0    conda-forge
pycurl                    7.43.0.6         py39h72e3413_1    conda-forge
pygments                  2.9.0              pyhd8ed1ab_0    conda-forge
pyjwt                     2.1.0              pyhd8ed1ab_0    conda-forge
pyopenssl                 20.0.1             pyhd8ed1ab_0    conda-forge
pyparsing                 2.4.7              pyh9f0ad1d_0    conda-forge
pyproj                    3.1.0            py39h50a64a9_3    conda-forge
pyrsistent                0.17.3           py39h3811e60_2    conda-forge
pyshp                     2.1.3              pyh44b312d_0    conda-forge
pysocks                   1.7.1            py39hf3d152e_3    conda-forge
python                    3.9.6           h49503c6_1_cpython    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python-editor             1.0.4                      py_0    conda-forge
python-json-logger        2.0.1              pyh9f0ad1d_0    conda-forge
python_abi                3.9                      2_cp39    conda-forge
pytz                      2021.1             pyhd8ed1ab_0    conda-forge
pyviz_comms               2.1.0              pyhd8ed1ab_0    conda-forge
pyyaml                    5.4.1            py39h3811e60_0    conda-forge
pyzmq                     22.1.0           py39h37b5a0c_0    conda-forge
readline                  8.1                  h46c0cb4_0    conda-forge
reproc                    14.2.1               h36c2ea0_0    conda-forge
reproc-cpp                14.2.1               h58526e2_0    conda-forge
requests                  2.26.0             pyhd8ed1ab_0    conda-forge
requests-unixsocket       0.2.0                      py_0    conda-forge
rtree                     0.9.7            py39hb102c33_2    conda-forge
ruamel.yaml               0.17.10          py39h3811e60_0    conda-forge
ruamel.yaml.clib          0.2.2            py39h3811e60_2    conda-forge
ruamel_yaml               0.15.80         py39h3811e60_1004    conda-forge
scikit-learn              0.24.2           py39h4dfa638_0    conda-forge
scipy                     1.7.1            py39hee8e79c_0    conda-forge
send2trash                1.7.1              pyhd8ed1ab_0    conda-forge
setuptools                49.6.0           py39hf3d152e_3    conda-forge
shapely                   1.7.1            py39ha61afbd_5    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
sniffio                   1.2.0            py39hf3d152e_1    conda-forge
sortedcontainers          2.4.0              pyhd8ed1ab_0    conda-forge
sqlalchemy                1.4.22           py39h3811e60_0    conda-forge
sqlite                    3.36.0               h9cd32fc_0    conda-forge
tblib                     1.7.0              pyhd8ed1ab_0    conda-forge
terminado                 0.10.1           py39hf3d152e_0    conda-forge
testpath                  0.5.0              pyhd8ed1ab_0    conda-forge
threadpoolctl             2.2.0              pyh8a188c0_0    conda-forge
tiledb                    2.2.9                h91fcb0e_0    conda-forge
tk                        8.6.10               h21135ba_1    conda-forge
toolz                     0.11.1                     py_0    conda-forge
tornado                   6.1              py39h3811e60_1    conda-forge
tqdm                      4.61.2             pyhd8ed1ab_1    conda-forge
traitlets                 5.0.5                      py_0    conda-forge
typing_extensions         3.10.0.0           pyha770c72_0    conda-forge
tzcode                    2021a                h7f98852_2    conda-forge
tzdata                    2021a                he74cb21_1    conda-forge
urllib3                   1.26.6             pyhd8ed1ab_0    conda-forge
wcwidth                   0.2.5              pyh9f0ad1d_2    conda-forge
webencodings              0.5.1                      py_1    conda-forge
websocket-client          0.57.0           py39hf3d152e_4    conda-forge
wheel                     0.36.2             pyhd3deb0d_0    conda-forge
xarray                    0.19.0             pyhd8ed1ab_1    conda-forge
xerces-c                  3.2.3                h9d8b166_2    conda-forge
xorg-kbproto              1.0.7             h7f98852_1002    conda-forge
xorg-libice               1.0.10               h7f98852_0    conda-forge
xorg-libsm                1.2.3             hd9c2040_1000    conda-forge
xorg-libx11               1.7.2                h7f98852_0    conda-forge
xorg-libxau               1.0.9                h7f98852_0    conda-forge
xorg-libxdmcp             1.1.3                h7f98852_0    conda-forge
xorg-libxext              1.3.4                h7f98852_1    conda-forge
xorg-libxrender           0.9.10            h7f98852_1003    conda-forge
xorg-renderproto          0.11.1            h7f98852_1002    conda-forge
xorg-xextproto            7.3.0             h7f98852_1002    conda-forge
xorg-xproto               7.0.31            h7f98852_1007    conda-forge
xz                        5.2.5                h516909a_1    conda-forge
yaml                      0.2.5                h516909a_0    conda-forge
zeromq                    4.3.4                h9c3ff4c_0    conda-forge
zict                      2.0.0                      py_0    conda-forge
zipp                      3.5.0              pyhd8ed1ab_0    conda-forge
zlib                      1.2.11            h516909a_1010    conda-forge
zstd                      1.4.9                ha95c52a_0    conda-forge

Description of expected behavior and the observed behavior

After updating my environment from JupyterLab 2 to 3 and to the latest versions of Geoviews, Cartopy etc., I'm experiencing some strange/unexpected behaviour with gv.extension("matplotlib") and gv.extension("bokeh", "matplotlib").

I have a notebook where I'd like to read some simple netCDF files, create some plots using xarray, and then create a timeslice map using Geoviews - pretty similar to the introductory example here.

My code worked fine in the old environment, but now running gv.extension("bokeh", "matplotlib") seems to prevent "normal" matplotlib plots from rendering. I see output like <matplotlib.collections.QuadMesh at 0x7f5c91769f40> immediately under the code cells, but no plots are displayed. Alternatively, if I comment out the gv.extension("bokeh", "matplotlib") line, "normal" plots render fine, but then my Geoviews code later in the notebook fails with Exception: The 'matplotlib' backend is not loaded. Please load the backend using hv.extension.

Complete, minimal, self-contained example code that reproduces the issue

Using the environment built by the Dockerfile above, the following example notebook with four code cells reproduces the issue:

import geoviews as gv
import geoviews.feature as gf
import xarray as xr
import matplotlib.pyplot as plt
gv.extension("bokeh", "matplotlib")
# Basic matplotlib plot
plt.plot(range(10), range(10), 'ro')
# Basic xarray plot
ds = xr.open_mfdataset(r"../data/climate/*.nc")
ds["tas"].sel(time="2006-07-15").plot(figsize=(5, 5))
# Geoviews time-slice map
ds_mon = ds.resample({"time": "M"}).mean()
dataset = gv.Dataset(ds_mon)
ensemble = dataset.to(gv.Image, ["lon", "lat"], "tas")

gv.output(
    ensemble.opts(cmap="viridis", colorbar=True, fig_size=200, backend="matplotlib")
    * gf.coastline(),
    backend="matplotlib",
)

If I run the code exactly as shown above, the output from cells 2 and 3 is blank, except for <matplotlib.lines.Line2D at 0x7f2f8dbdc7c0> and <matplotlib.collections.QuadMesh at 0x7f2f8c615040>, respectively. However, the "timeslice" map in cell 4 will render correctly. The same happens if I just use gv.extension("matplotlib")

Alternatively, if I comment out gv.extension("bokeh", "matplotlib") completely, or use gv.extension("bokeh"), the output from cells 2 and 3 will render correctly, but cell 4 will fail with Exception: The 'matplotlib' backend is not loaded. Please load the backend using hv.extension.

Stack traceback and/or browser JavaScript console output

I don't see any errors, either in the notebook, the console or notebook server, but the plots don't show.

Screenshots or screencasts of the bug in action

Example with gv.extension("bokeh", "matplotlib"):

and cell 4 works fine.

Example with gv.extension("bokeh", "matplotlib") commented out:

but then cell 4 fails because the matplotlib backend is not loaded.

Is this a bug, or should I be doing things differently?

Thanks!

JamesSample avatar Aug 06 '21 21:08 JamesSample

Any updates on this issue? I'm experiencing the same problem, where normal matplotlib figures will not display in a notebook if I have gv.extension('matplotlib') loaded in the environment. The same scripts and figures display normally when gv.extension('matplotlib') is commented out or set to 'bokeh'. I'm happy to provide additional details on my setup and package versions as well if that would be helpful.

durbank avatar Jan 14 '22 19:01 durbank

I'd assume it's to do with setting the Matplotlib backend, which for GeoViews needs to be set to agg for it to work well. I don't recall exactly how it's done in Matplotlib, but what I'd try is to set the backend explicitly before using native matplotlib, then re-run gv.extension to set it how gv needs it before you want to create the geoviews plots. I recall that mpl is finicky about changing the backend, so it might not be easy to get it to work smoothly.

You might also find https://datashader.org/getting_started/Interactivity.html helpful; on that page I combined both mpl holoviews plots and native mpl plots in the same session using %matplotlib inline, but I recall that it wasn't always smooth, and I didn't switch back and forth between the two approaches.

jbednar avatar Jan 14 '22 20:01 jbednar