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