Pandas plot doesn't show
Question:
When using this in a script (not IPython), nothing happens, i.e. the plot window doesn’t appear :
import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
Even when adding time.sleep(5)
, there is still nothing. Why?
Is there a way to do it, without having to manually call matplotlib ?
Answers:
Once you have made your plot, you need to tell matplotlib to show
it. The usual way to do things is to import matplotlib.pyplot
and call show
from there:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
plt.show()
In older versions of pandas
, you were able to find a backdoor to matplotlib, as in the example below. NOTE: This no longer works in modern versions of pandas
, and I still recommend importing matplotlib separately, as in the example above.
import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
pd.tseries.plotting.pylab.show()
But all you are doing there is finding somewhere that matplotlib
has been imported in pandas
, and calling the same show
function from there.
Are you trying to avoid calling matplotlib
in an effort to speed things up? If so then you are really not speeding anything up, since pandas
already imports pyplot
:
python -mtimeit -s 'import pandas as pd'
100000000 loops, best of 3: 0.0122 usec per loop
python -mtimeit -s 'import pandas as pd; import matplotlib.pyplot as plt'
100000000 loops, best of 3: 0.0125 usec per loop
Finally, the reason the example you linked in comments doesn’t need the call to matplotlib
is because it is being run interactively in an iPython notebook
, not in a script.
In case you are using matplotlib,
and still, things don’t show up in iPython notebook (or Jupyter Lab as well) remember to set the inline option for matplotlib
in the notebook.
import matplotlib.pyplot as plt
%matplotlib inline
Then the following code will work flawlessly:
fig, ax = plt.subplots(figsize=(16,9));
change_per_ins.plot(ax=ax, kind='hist')
If you don’t set the inline option it won’t show up and by adding a plt.show()
in the end you will get duplicate outputs.
I did just
import matplotlib.pyplot as plt
%matplotlib inline
and add line
plt.show()
next to df.plot() and it worked well for
The other answers involve importing matplotlib.pyplot
and/or calling some second function manually.
Instead, you can configure matplotlib
to be in interactive mode with its configuration files.
Simply add the line
interactive: True
to a file called matplotlibrc
in one of the following places:
- In the current working directory
- In the platform specific user directory specified by
matplotlib.get_configdir()
- On unix-like system, typically
/home/username/.config/matplotlib/
- On Windows
C:\Documents and Settings\username\.matplotlib\
When using this in a script (not IPython), nothing happens, i.e. the plot window doesn’t appear :
import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
Even when adding time.sleep(5)
, there is still nothing. Why?
Is there a way to do it, without having to manually call matplotlib ?
Once you have made your plot, you need to tell matplotlib to show
it. The usual way to do things is to import matplotlib.pyplot
and call show
from there:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
plt.show()
In older versions of pandas
, you were able to find a backdoor to matplotlib, as in the example below. NOTE: This no longer works in modern versions of pandas
, and I still recommend importing matplotlib separately, as in the example above.
import numpy as np
import pandas as pd
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()
pd.tseries.plotting.pylab.show()
But all you are doing there is finding somewhere that matplotlib
has been imported in pandas
, and calling the same show
function from there.
Are you trying to avoid calling matplotlib
in an effort to speed things up? If so then you are really not speeding anything up, since pandas
already imports pyplot
:
python -mtimeit -s 'import pandas as pd'
100000000 loops, best of 3: 0.0122 usec per loop
python -mtimeit -s 'import pandas as pd; import matplotlib.pyplot as plt'
100000000 loops, best of 3: 0.0125 usec per loop
Finally, the reason the example you linked in comments doesn’t need the call to matplotlib
is because it is being run interactively in an iPython notebook
, not in a script.
In case you are using matplotlib,
and still, things don’t show up in iPython notebook (or Jupyter Lab as well) remember to set the inline option for matplotlib
in the notebook.
import matplotlib.pyplot as plt
%matplotlib inline
Then the following code will work flawlessly:
fig, ax = plt.subplots(figsize=(16,9));
change_per_ins.plot(ax=ax, kind='hist')
If you don’t set the inline option it won’t show up and by adding a plt.show()
in the end you will get duplicate outputs.
I did just
import matplotlib.pyplot as plt
%matplotlib inline
and add line
plt.show()
next to df.plot() and it worked well for
The other answers involve importing matplotlib.pyplot
and/or calling some second function manually.
Instead, you can configure matplotlib
to be in interactive mode with its configuration files.
Simply add the line
interactive: True
to a file called matplotlibrc
in one of the following places:
- In the current working directory
- In the platform specific user directory specified by
matplotlib.get_configdir()
- On unix-like system, typically
/home/username/.config/matplotlib/
- On Windows
C:\Documents and Settings\username\.matplotlib\
- On unix-like system, typically