Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's wrong with Pandas plot?

I'm following a book by Wes McKinney and in the section introducing pandas, he's given a simple example of plotting a pandas Data Frame. Here're the lines I wrote:

tz_counts = frame['tz'].value_counts() # frame is a Data Frame
tz_counts[:10] # works fine till here. I can see the key-value I wanted
tz_counts[:10].plot(kind='barh', rot=0)

It just prints a line on screen that says

<matplotlib.axes.AxesSubplot object at 0x3d14ed0>

rather than displaying a plot window as I'd expect with matplotlib's plot function. What's wrong here? How can I make it work?

like image 328
Aditya Avatar asked Sep 18 '13 20:09

Aditya


2 Answers

Matplotlib doesn't show the plot until you tell it to, unless you're in "interactive" mode.

Short Answer: Call plt.show() when you're ready to display the plot.

This starts the gui mainloop of whatever backend you're using, so it is blocking. (i.e. execution will stop until you close the window)

If you want it to show up automatically without stopping execution, you can turn on interactive mode either with plt.ion() or by using ipython --pylab.


However, using --pylab mode in ipython will import all of numpy, matplotlib.pyplot, and a few other things into the global namespace. This is convenient for interactive use, but teaches very bad habits and overwrites functions in the standard library (e.g. min, max, etc).

You can still use matplotlib's interactive mode in ipython without using "pylab" mode to avoid the global import. Just call plt.ion()

Matplotlib's default TkAgg backend will work in interactive mode with any python shell (not just ipython). However, other backends can't avoid blocking further execution without the gui mainloop being run in a separate thread. If you're using a different backend, then you'll need to tell ipython this with the --gui=<backend> option.

like image 102
Joe Kington Avatar answered Nov 04 '22 16:11

Joe Kington


Try using:

%matplotlib 
tz_counts = frame['tz'].value_counts()
tz_counts[:10].plot(kind='barh', rot=0)

Using % matplotlib prevents importing * from pylab and numpy which in turn prevents variable clobbering.

like image 34
ujs Avatar answered Nov 04 '22 16:11

ujs