1

Having read many of the posts on this site about resizing graphs and setting limits on graph sizes in Jupyter, I am virtually convinced there is something different when it comes to 3D plotting.

This is my 3D scatterplot that Jupyter keeps giving back to me, despite having tried many figsize and dpi= settings (either in plt.figure() or within plt.rcParams()),

enter image description here

This is my data and my current code,

enter image description here

%pylab inline
pylab.rcParams['figure.figsize'] = (20, 16)
pylab.rcParams['figure.dpi'] = 200

import matplotlib.pyplot as plt
import matplotlib

from mpl_toolkits.mplot3d import Axes3D

# data1

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

ax.scatter(data1.a_close, data1.g_close, data1.m_close)

What am I doing wrong?

EDIT: I am using a Mac (10.11) and these are all my pip installed packages, if this provides some detail. I also tried uninstalling and reinstalling jupyter, but that has not helped

alabaster==0.7.12
anaconda-client==1.6.14
anaconda-navigator==1.8.7
anaconda-project==0.8.2
appnope==0.1.0
appscript==1.0.1
argh==0.26.2
asn1crypto==0.24.0
astroid==2.0.4
astropy==3.0.5
atomicwrites==1.2.1
attrs==18.2.0
Babel==2.6.0
backcall==0.1.0
backports.shutil-get-terminal-size==1.0.0
beautifulsoup4==4.6.3
bitarray==0.8.3
bkcharts==0.2
blaze==0.11.3
bleach==3.0.2
blist==1.3.6
bokeh==1.0.0
boto==2.48.0
Bottleneck==1.2.1
certifi==2018.4.16
cffi==1.11.5
chardet==3.0.4
Click==7.0
cloudpickle==0.6.1
clyent==1.2.2
colorama==0.4.0
conda==4.5.9
conda-build==3.0.27
conda-verify==2.0.0
contextlib2==0.5.5
cryptography==2.3.1
CVXcanon==0.1.1
cvxopt==1.2.2
cvxpy==1.0.10
cycler==0.10.0
Cython==0.29
cytoolz==0.9.0.1
dash==0.28.5
dash-core-components==0.35.2
dash-html-components==0.13.2
dash-renderer==0.14.3
dash-table-experiments==0.6.0
dask==0.19.4
datashape==0.5.4
decorator==4.3.0
defusedxml==0.5.0
dill==0.2.8.2
distcan==0.0.1
distributed==1.23.3
Django==2.1.2
docutils==0.14
ecos==2.0.5
entrypoints==0.2.3
et-xmlfile==1.0.1
eventsourcing==6.3.0
fastcache==1.0.2
fastnumbers==2.1.1
feather-format==0.4.0
filelock==3.0.9
fix-yahoo-finance==0.0.22
Flask==1.0.2
Flask-Caching==1.4.0
Flask-Compress==1.4.0
Flask-Cors==3.0.6
future==0.16.0
gevent==1.3.7
glmnet==2.0.0
glmnet-py==0.1.0b2
glob2==0.6
gmpy2==2.0.8
greenlet==0.4.15
h5py==2.8.0
heapdict==1.0.0
html5lib==1.0.1
hupper==1.3.1
idna==2.7
imageio==2.4.1
imagesize==1.1.0
importlib-metadata==0.6
inflection==0.3.1
ipykernel==5.1.0
ipython==7.0.1
ipython-genutils==0.2.0
ipywidgets==7.4.2
isort==4.3.4
ItsDangerous==1.0.0
jdcal==1.4
jedi==0.13.1
Jinja2==2.10
joblib==0.12.5
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.2.3
jupyter-console==6.0.0
jupyter-core==4.4.0
jupyterlab==0.35.2
jupyterlab-launcher==0.13.1
jupyterlab-server==0.2.0
keyring==15.1.0
kiwisolver==1.0.1
lazy-object-proxy==1.3.1
llvmlite==0.25.0
locket==0.2.0
lxml==4.2.5
Markdown==3.0.1
MarkupSafe==1.0
matplotlib==3.0.0
mccabe==0.6.1
mistune==0.8.4
mizani==0.5.2
mlxtend==0.13.0
mock==2.0.0
more-itertools==4.3.0
mpmath==1.0.0
msgpack==0.5.6
msgpack-python==0.5.6
multipledispatch==0.6.0
multiprocess==0.70.6.1
multitasking==0.0.7
natsort==5.4.1
navigator-updater==0.2.1
nbconvert==5.4.0
nbformat==4.4.0
ndg-httpsclient==0.5.1
networkx==2.2
nltk==3.3
nose==1.3.7
notebook==5.7.0
numba==0.40.1
numexpr==2.6.8
numpy==1.15.3
numpydoc==0.8.0
odo==0.5.1
olefile==0.46
openpyxl==2.5.9
osqp==0.4.1
packaging==18.0
palettable==3.1.1
pandas==0.23.4
pandas-datareader==0.7.0
pandocfilters==1.4.2
parso==0.3.1
partd==0.3.9
PasteDeploy==1.5.2
path.py==11.5.0
pathlib2==2.3.2
patsy==0.5.0
pbr==5.1.0
pep8==1.7.1
pexpect==4.6.0
pickleshare==0.7.5
Pillow==5.3.0
pkginfo==1.4.2
plaster==1.0
plaster-pastedeploy==0.6
plotly==3.3.0
pluggy==0.8.0
ply==3.11
prometheus-client==0.4.2
prompt-toolkit==2.0.6
psutil==5.4.7
ptyprocess==0.5.2
py==1.7.0
pyarrow==0.11.1
pyasn1==0.4.4
pycodestyle==2.4.0
pycosat==0.6.3
pycparser==2.19
pycrypto==2.6.1
pycryptodome==3.6.6
pycurl==7.43.0.2
pyflakes==2.0.0
Pygments==2.2.0
pylint==2.1.1
pymc3==3.5
pyodbc==4.0.24
pyOpenSSL==18.0.0
pyparsing==2.2.2
PyQt5==5.11.3
PyQt5-sip==4.19.13
pyramid-arima==0.8.1
PySocks==1.6.8
pystan==2.18.0.0
pytest==3.9.2
python-dateutil==2.7.3
pytz==2018.6
PyWavelets==1.0.1
PyYAML==3.12
pyzmq==17.1.2
qfrm==0.2.0.27
QtAwesome==0.5.1
qtconsole==4.3.1
QtPy==1.5.2
Quandl==3.4.3
redis==2.10.6
repoze.lru==0.7
requests==2.20.0
requests-file==1.4.3
requests-ftp==0.3.1
retrying==1.3.3
rope==0.11.0
rpy2==2.9.4
ruamel-yaml==0.11.14
scikit-image==0.14.1
scikit-learn==0.19.0
scipy==1.1.0
scs==2.0.2
seaborn==0.9.0
Send2Trash==1.5.0
simplegeneric==0.8.1
simplejson==3.16.0
singledispatch==3.4.0.3
sip==4.19.8
six==1.11.0
snowballstemmer==1.2.1
sortedcollections==1.0.1
sortedcontainers==2.0.5
Sphinx==1.8.1
sphinxcontrib-websupport==1.1.0
spyder==3.3.1
spyder-kernels==1.1.0
SQLAlchemy==1.2.12
statistics==1.0.3.5
statsmodels==0.9.0
sympy==1.1.1
tables==3.4.4
tblib==1.3.2
terminado==0.8.1
testpath==0.4.2
Theano==1.0.3
toolz==0.9.0
tornado==5.1.1
tqdm==4.28.1
traitlets==4.3.2
translationstring==1.3
typed-ast==1.1.0
typing==3.6.6
tzlocal==1.5.1
unicodecsv==0.14.1
urllib3==1.24
venusian==1.1.0
wcwidth==0.1.7
webencodings==0.5.1
WebOb==1.8.3
Werkzeug==0.14.1
widgetsnbextension==3.4.2
wrapt==1.10.11
xlrd==1.1.0
XlsxWriter==1.1.2
xlwings==0.13.0
xlwt==1.3.0
yahoo-finance==1.4.0
zict==0.1.3
zope.deprecation==4.3.0
zope.interface==4.6.0
Coolio2654
  • 1,589
  • 3
  • 21
  • 46
  • I tried to reproduce this with random data, and the resulting graph was huge - could you share some sample data and more information about your environment? – Charles Landau Nov 08 '18 at 23:55
  • I added an EDIT to my question with more information. – Coolio2654 Nov 09 '18 at 00:04
  • Does changing the figure size e.g. from `(20, 16)` to `(40, 32)` not change the output at all? – ImportanceOfBeingErnest Nov 09 '18 at 00:49
  • There is a difference, just not in size. See here, https://imgur.com/a/4wyN9pI The data in the graph ends up looking sparser, and the graph calculation takes a lot longer. – Coolio2654 Nov 09 '18 at 01:16
  • That seems logical at this point. I just tested out the jupyter notebook on two other browsers I have (1 completely vanilla with no addons/custom settings), and the same problem is there. Could this be an OS thing? – Coolio2654 Nov 09 '18 at 18:28

3 Answers3

2

This is due to a bug in matplotlib 3.0.0. It should not occur in matplotlib 3.0.1.

Options you have:

  • Update to matplotlib 3.0.1
  • Set the following option in your jupyter notebook before plotting

    %config InlineBackend.print_figure_kwargs = {'bbox_inches':None}
    
  • Use the %matplotlib notebook backend instead of the %matplotlib inline one.

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712
  • The update seems to have done the trick. What threw me off guard is that my version was not that old in the first place (a few months at best, and did not use to exhibit this error). Thanks for tracking it down for me! And also for letting me know of `%matplotlib notebook` for the added graph interaction (assuming that is why you recommended that over `%matplotlib inline`)! – Coolio2654 Nov 12 '18 at 21:57
  • No, the bug should only be present in inline plotting, so using `%matplotlib notebook` would be a third way to get rid of the bug. – ImportanceOfBeingErnest Nov 13 '18 at 11:30
  • ImportanceOfBeingErnest, if you would not mind, would you check out another question I have made, with similar issues as this one except dealing with a `seaborn` function, with the datapoints becoming smaller as the size options get bigger? https://stackoverflow.com/questions/53688816/jupyter-seaborn-pairplot-difficult-to-set-graph-dimensions-for – Coolio2654 Dec 09 '18 at 04:28
  • Due to university restriction, had to stick to matplotlib 3.0.1, and used bbox option. But that leaves huge unnecessary space, wasting the output area. [illustration](https://i.postimg.cc/kGVhmv13/image.png) – Parthiban Rajendran Jan 22 '19 at 10:33
  • @ParthibanRajendran You can always use `tight_layout()` to enlarge your content to the figure boundaries. – ImportanceOfBeingErnest Jan 22 '19 at 11:40
-1

Try replacing

%pylab inline
pylab.rcParams['figure.figsize'] = (20, 16)
pylab.rcParams['figure.dpi'] = 200

import matplotlib.pyplot as plt
import matplotlib

with

%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['figure.figsize'] = (20, 16)
matplotlib.rcParams['figure.dpi'] = 200
HUSMEN
  • 184
  • 2
  • 13
-1

Sometimes that happens to me as well on my Mac.

First use this:

import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline

matplotlib.rcParams['figure.figsize'] = (20, 16)
matplotlib.rcParams['figure.dpi'] = 200

The trick for my case: First import and then use the %matplotlib inline command. However, seems like a bug.

seralouk
  • 30,938
  • 9
  • 118
  • 133
  • 1
    Why do you say "First import and then use the %matplotlib inline command."? Do you have a reference for that? I'm pretty sure this can cause problems and one should rather first define the backend and then import pyplot. Apart, this is pretty unlikely to solve the OP's problem, see my last comment below the question. Because the figure size itself *is* actually correct, it's just the dispayed image which gets scaled wrongly. – ImportanceOfBeingErnest Nov 09 '18 at 15:20
  • I was really hoping this would work, but it didn't :(. Thanks for the answer either way, though. – Coolio2654 Nov 09 '18 at 18:29
  • According to [documentation](https://ipython.readthedocs.io/en/stable/interactive/plotting.html) > before any plotting or import of matplotlib is performed you must execute the `%matplotlib` magic command – HUSMEN Nov 10 '18 at 11:56