geoviews
geoviews copied to clipboard
`gv.extension("matplotlib")` causes "normal" matplotlib plots to be blank?
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!
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.
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.