Black Lives Matter. Please consider donating to Black Girls Code today.
Dash HoloViews is now available! Check out the docs.

Multi level tab completion for figure object

In my usual workflow with Plotly and Jupyter Notebook, I create a basic chart using cufflinks like this:

import pandas as pd
import cufflinks as cf
from plotly.offline import init_notebook_mode, iplot
cf.go_offline(connected=True)
init_notebook_mode(connected=True)

df = pd.DataFrame({"y": [1, 5, 6, 7, 9]})
fig = df.iplot(asFigure=True)

Hereby, I set the asFigure-argument to True so that the iplot-function returns a Plotly figure object. With that I can then very easily customize the chart, for example by saying:

fig.layout.paper_bgcolor = "white"
fig.layout.plot_bgcolor = "white"

My problem now is that the multi level tab completion doesn’t work anymore (since I reinstalled Anaconda Distribution and created new environments).

For example, let’s say I know I want to change something about the ticks of the y-axis. What I used to do then was, to type “fig.layout.yaxis.tick” and then I hit tab to see all the properties that are related to ticks. I know I can also just type “fig.layout.yaxis” and then hit shift+tab to see all the properties, but then I still have to type everything out. So, the multi level tab completion is simply way more convenient.

By the way, the regular “one level” tab completion works. So, I can type “fig.” and then hit tab to see the properties of fig.

I know the problem is not really caused by Plotly but by (I guess) the Jupyter Notebook, but maybe someone can give me a hint why the multi level tab completion doesn’t work anymore. The yml-file for the environment where it used to work looks like this:

name: ohnecf
channels:
  - defaults
dependencies:
  - _license=1.1=py36_1
  - alabaster=0.7.10=py36_0
  - anaconda=4.4.0=np112py36_0
  - anaconda-client=1.6.3=py36_0
  - anaconda-navigator=1.6.2=py36_0
  - anaconda-project=0.6.0=py36_0
  - asn1crypto=0.22.0=py36_0
  - astroid=1.4.9=py36_0
  - astropy=1.3.2=np112py36_0
  - babel=2.4.0=py36_0
  - backports=1.0=py36_0
  - beautifulsoup4=4.6.0=py36_0
  - bitarray=0.8.1=py36_1
  - blas=1.0=mkl
  - blaze=0.10.1=py36_0
  - bleach=1.5.0=py36_0
  - bokeh=0.12.5=py36_1
  - boto=2.46.1=py36_0
  - bottleneck=1.2.1=np112py36_0
  - bzip2=1.0.6=vc14_3
  - cffi=1.10.0=py36_0
  - chardet=3.0.3=py36_0
  - click=6.7=py36_0
  - cloudpickle=0.2.2=py36_0
  - clyent=1.2.2=py36_0
  - colorama=0.3.9=py36_0
  - comtypes=1.1.2=py36_0
  - console_shortcut=0.1.1=py36_1
  - contextlib2=0.5.5=py36_0
  - cryptography=1.8.1=py36_0
  - curl=7.52.1=vc14_0
  - cycler=0.10.0=py36_0
  - cython=0.25.2=py36_0
  - cytoolz=0.8.2=py36_0
  - dask=0.14.3=py36_1
  - datashape=0.5.4=py36_0
  - decorator=4.0.11=py36_0
  - distributed=1.16.3=py36_0
  - docutils=0.13.1=py36_0
  - entrypoints=0.2.2=py36_1
  - et_xmlfile=1.0.1=py36_0
  - fastcache=1.0.2=py36_1
  - flask=0.12.2=py36_0
  - flask-cors=3.0.2=py36_0
  - freetype=2.5.5=vc14_2
  - get_terminal_size=1.0.0=py36_0
  - gevent=1.2.1=py36_0
  - greenlet=0.4.12=py36_0
  - h5py=2.7.0=np112py36_0
  - hdf5=1.8.15.1=vc14_4
  - heapdict=1.0.0=py36_1
  - html5lib=0.999=py36_0
  - icu=57.1=vc14_0
  - idna=2.5=py36_0
  - imagesize=0.7.1=py36_0
  - ipykernel=4.6.1=py36_0
  - ipython=5.3.0=py36_0
  - ipython_genutils=0.2.0=py36_0
  - ipywidgets=6.0.0=py36_0
  - isort=4.2.5=py36_0
  - itsdangerous=0.24=py36_0
  - jdcal=1.3=py36_0
  - jedi=0.10.2=py36_2
  - jinja2=2.9.6=py36_0
  - jpeg=9b=vc14_0
  - jsonschema=2.6.0=py36_0
  - jupyter=1.0.0=py36_3
  - jupyter_client=5.0.1=py36_0
  - jupyter_console=5.1.0=py36_0
  - jupyter_core=4.3.0=py36_0
  - jupyterlab=0.35.3=py36_0
  - jupyterlab_server=0.2.0=py36_0
  - lazy-object-proxy=1.2.2=py36_0
  - libpng=1.6.27=vc14_0
  - libtiff=4.0.6=vc14_3
  - llvmlite=0.18.0=py36_0
  - locket=0.2.0=py36_1
  - lxml=3.7.3=py36_0
  - markupsafe=0.23=py36_2
  - matplotlib=2.0.2=np112py36_0
  - menuinst=1.4.7=py36_0
  - mistune=0.7.4=py36_0
  - mkl=2017.0.1=0
  - mkl-service=1.1.2=py36_3
  - mpmath=0.19=py36_1
  - msgpack-python=0.4.8=py36_0
  - multipledispatch=0.4.9=py36_0
  - navigator-updater=0.1.0=py36_0
  - nbconvert=5.1.1=py36_0
  - nbformat=4.3.0=py36_0
  - networkx=1.11=py36_0
  - nltk=3.2.3=py36_0
  - nose=1.3.7=py36_1
  - notebook=5.0.0=py36_0
  - numba=0.33.0=np112py36_0
  - numexpr=2.6.2=np112py36_0
  - numpy=1.12.1=py36_0
  - numpydoc=0.6.0=py36_0
  - odo=0.5.0=py36_1
  - olefile=0.44=py36_0
  - openpyxl=2.4.7=py36_0
  - openssl=1.0.2l=vc14_0
  - packaging=16.8=py36_0
  - pandas=0.20.1=np112py36_0
  - pandocfilters=1.4.1=py36_0
  - partd=0.3.8=py36_0
  - path.py=10.3.1=py36_0
  - pathlib2=2.2.1=py36_0
  - patsy=0.4.1=py36_0
  - pep8=1.7.0=py36_0
  - pickleshare=0.7.4=py36_0
  - pillow=4.1.1=py36_0
  - pip=9.0.1=py36_1
  - ply=3.10=py36_0
  - prompt_toolkit=1.0.14=py36_0
  - psutil=5.2.2=py36_0
  - py=1.4.33=py36_0
  - pycosat=0.6.2=py36_0
  - pycparser=2.17=py36_0
  - pycrypto=2.6.1=py36_6
  - pycurl=7.43.0=py36_2
  - pyflakes=1.5.0=py36_0
  - pygments=2.2.0=py36_0
  - pylint=1.6.4=py36_1
  - pyodbc=4.0.16=py36_0
  - pyopenssl=17.0.0=py36_0
  - pyparsing=2.1.4=py36_0
  - pyqt=5.6.0=py36_2
  - pytables=3.2.2=np112py36_4
  - pytest=3.0.7=py36_0
  - python=3.6.1=2
  - python-dateutil=2.6.0=py36_0
  - pytz=2017.2=py36_0
  - pywavelets=0.5.2=np112py36_0
  - pywin32=220=py36_2
  - pyyaml=3.12=py36_0
  - pyzmq=16.0.2=py36_0
  - qt=5.6.2=vc14_4
  - qtawesome=0.4.4=py36_0
  - qtconsole=4.3.0=py36_0
  - qtpy=1.2.1=py36_0
  - requests=2.14.2=py36_0
  - rope=0.9.4=py36_1
  - ruamel_yaml=0.11.14=py36_1
  - scikit-image=0.13.0=np112py36_0
  - scikit-learn=0.18.1=np112py36_1
  - scipy=0.19.0=np112py36_0
  - seaborn=0.7.1=py36_0
  - setuptools=27.2.0=py36_1
  - simplegeneric=0.8.1=py36_1
  - singledispatch=3.4.0.3=py36_0
  - sip=4.18=py36_0
  - six=1.10.0=py36_0
  - snowballstemmer=1.2.1=py36_0
  - sortedcollections=0.5.3=py36_0
  - sortedcontainers=1.5.7=py36_0
  - sphinx=1.5.6=py36_0
  - spyder=3.1.4=py36_0
  - sqlalchemy=1.1.9=py36_0
  - statsmodels=0.8.0=np112py36_0
  - sympy=1.0=py36_0
  - tblib=1.3.2=py36_0
  - testpath=0.3=py36_0
  - tk=8.5.18=vc14_0
  - toolz=0.8.2=py36_0
  - tornado=4.5.1=py36_0
  - traitlets=4.3.2=py36_0
  - unicodecsv=0.14.1=py36_0
  - vc=14=0
  - vs2015_runtime=14.0.25123=0
  - wcwidth=0.1.7=py36_0
  - werkzeug=0.12.2=py36_0
  - wheel=0.29.0=py36_0
  - widgetsnbextension=2.0.0=py36_0
  - win_unicode_console=0.5=py36_0
  - wrapt=1.10.10=py36_0
  - xlrd=1.0.0=py36_0
  - xlsxwriter=0.9.6=py36_0
  - xlwings=0.10.4=py36_0
  - xlwt=1.2.0=py36_0
  - zict=0.1.2=py36_0
  - zlib=1.2.8=vc14_3
  - pip:
    - backports.shutil-get-terminal-size==1.0.0
    - colorlover==0.2.1
    - cufflinks==0.14.6
    - plotly==3.4.2
    - retrying==1.3.3
    - rope-py3k==0.9.4.post1
    - tables==3.2.2
prefix: C:\Users\mg-ar\Anaconda3\envs\ohnecf

Best for #api:python

I finally found the solution. It had something to do with the ipython module. I downgraded it from 7.2.0 to 7.1.1 and now it works again.

Here is the link where I got the solution from: https://github.com/ipython/ipython/issues/11530

Thanks for following up with the background research and temporary solution of downgrading ipython. I expect that this will be helpful to others as well!
-Jon

1 Like