[Matplotlib-users] two axes
In gnuplot it is quite easy to create two axes, but I can't figure out how to do it in matplotlib. I'm trying this: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt for key1 in keys1: ax1.plot(x, y, style, label=label, color=color, linewidth=3) ax1.set_xlabel(xlabel) ax1.set_ylabel(ylabel1) ax2.set_ylabel(ylabel2) plt.legend(loc='lower right', shadow=True) plt.suptitle(title, fontsize=14, fontweight='bold') axes = plt.gca() axes.set_ylim([0,1]) plt.grid(b=True, which='major', color='k', linestyle='--') plt.savefig('{}.png'.format(key1), dpi=600) plt.close() plt.clf() But I get this error: lib/python3.3/site-packages/matplotlib/axes.py:4749: UserWarning: No labeled objects found. Use label='...' kwarg on individual plots. warnings.warn(No labeled objects found. What am I doing wrong? Thanks. -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
[Matplotlib-users] BrokenBarHCollection with pandas timeseries
Folks, I'm trying to use BrokenBarHCollection with pandas timeseries object. Here's a minimal example: (python 3.3, pandas 0.15.1, matplotlib 1.4.2) #- import pandas as pd import numpy as np from datetime import datetime as dt import matplotlib.pyplot as plt import matplotlib.collections as collections span_where = collections.BrokenBarHCollection.span_where # init the dataframe time = pd.date_range(pd.datetime(1950,1,1), periods=5, freq='MS') df = pd.DataFrame(np.arange(5), index=time, columns=['data']) df['cond'] = df['data'] == 3 # Make the plot fig = plt.figure() ax = fig.add_subplot(111) df['data'].plot(ax=ax, c='black') c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], facecolor='green', alpha=0.5) #- I get the error: TypeError: float() argument must be a string or a number Basically, span_where() is not happy with my x values which are a panda timeserie. I tried several stuffs (df.index.to_*) but there is something I still don't get in the internal representation of dates in matplolib. Any hint? Thanks a lot! Fabien -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
Please provide the full traceback. Could you also show df.info()? In any case, I suspect that the problem is that pandas recently started using datetime64 for their timeseries, and matplotlib hasn't implemented the unit converter for it. There was a post recently showing how to add pandas's converter to matplotlib's unit framework, but I can't find it right now... Cheers! Ben Root On Tue, Dec 2, 2014 at 9:24 AM, Fabien fabien.mauss...@gmail.com wrote: Folks, I'm trying to use BrokenBarHCollection with pandas timeseries object. Here's a minimal example: (python 3.3, pandas 0.15.1, matplotlib 1.4.2) #- import pandas as pd import numpy as np from datetime import datetime as dt import matplotlib.pyplot as plt import matplotlib.collections as collections span_where = collections.BrokenBarHCollection.span_where # init the dataframe time = pd.date_range(pd.datetime(1950,1,1), periods=5, freq='MS') df = pd.DataFrame(np.arange(5), index=time, columns=['data']) df['cond'] = df['data'] == 3 # Make the plot fig = plt.figure() ax = fig.add_subplot(111) df['data'].plot(ax=ax, c='black') c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], facecolor='green', alpha=0.5) #- I get the error: TypeError: float() argument must be a string or a number Basically, span_where() is not happy with my x values which are a panda timeserie. I tried several stuffs (df.index.to_*) but there is something I still don't get in the internal representation of dates in matplolib. Any hint? Thanks a lot! Fabien -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] two axes
You didn't label any of the series that you put on the graph, so the legend has no idea what to call anything thing. Like the warning (not error) says, use the label parameter on your calls to plot, e.g., ax1.plot(..., label='Concentration') or whatever. Note though, that you're mixing up interfaces in your script as written. MPL's many interfaces are kind of mess, but you seem reasonably familiar with the OO interface, so stick to that. What I mean is once you start messing with ax1, and ax2 directly, don't revert back to call to plt. As written, you'll only get a legend on ax2, but you haven't plotted anything there. If you want a legend on ax1, use ax1.legend. -p On Tue, Dec 2, 2014 at 1:59 AM, Tommy Carstensen tommy.carsten...@gmail.com wrote: In gnuplot it is quite easy to create two axes, but I can't figure out how to do it in matplotlib. I'm trying this: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt for key1 in keys1: ax1.plot(x, y, style, label=label, color=color, linewidth=3) ax1.set_xlabel(xlabel) ax1.set_ylabel(ylabel1) ax2.set_ylabel(ylabel2) plt.legend(loc='lower right', shadow=True) plt.suptitle(title, fontsize=14, fontweight='bold') axes = plt.gca() axes.set_ylim([0,1]) plt.grid(b=True, which='major', color='k', linestyle='--') plt.savefig('{}.png'.format(key1), dpi=600) plt.close() plt.clf() But I get this error: lib/python3.3/site-packages/matplotlib/axes.py:4749: UserWarning: No labeled objects found. Use label='...' kwarg on individual plots. warnings.warn(No labeled objects found. What am I doing wrong? Thanks. -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
On 02.12.2014 16:34, Benjamin Root wrote: Please provide the full traceback sure, I pasted the traceback below. Here are the pandas infos: In [17]: df.info() class 'pandas.core.frame.DataFrame' DatetimeIndex: 5 entries, 1950-01-01 00:00:00 to 1950-05-01 00:00:00 Freq: MS Data columns (total 2 columns): data5 non-null int64 cond5 non-null bool dtypes: bool(1), int64(1) memory usage: 85.0 bytes In [18]: df.index Out[18]: class 'pandas.tseries.index.DatetimeIndex' [1950-01-01, ..., 1950-05-01] Length: 5, Freq: MS, Timezone: None In [19]: df.index.values Out[19]: array(['1950-01-01T00:00:00.0Z', '1950-02-01T00:00:00.0Z', '1950-03-01T00:00:00.0Z', '1950-04-01T00:00:00.0Z', '1950-05-01T00:00:00.0Z'], dtype='datetime64[ns]') Traceback: In [16]: c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], color='green') --- TypeError Traceback (most recent call last) ipython-input-16-d033044a6db2 in module() 1 c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], color='green') /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in span_where(x, ymin, ymax, where, **kwargs) 871 872 collection = BrokenBarHCollection( -- 873 xranges, [ymin, ymax - ymin], **kwargs) 874 return collection 875 /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in __init__(self, xranges, yrange, **kwargs) 851 (xmin + xwidth, ymin), 852 (xmin, ymin)] for xmin, xwidth in xranges] -- 853 PolyCollection.__init__(self, verts, **kwargs) 854 855 @staticmethod /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in __init__(self, verts, sizes, closed, **kwargs) 799 Collection.__init__(self, **kwargs) 800 self.set_sizes(sizes) -- 801 self.set_verts(verts, closed) 802 803 def set_verts(self, verts, closed=True): /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in set_verts(self, verts, closed) 819 codes[0] = mpath.Path.MOVETO 820 codes[-1] = mpath.Path.CLOSEPOLY -- 821 self._paths.append(mpath.Path(xy, codes)) 822 else: 823 self._paths.append(mpath.Path(xy)) /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/path.py in __init__(self, vertices, codes, _interpolation_steps, closed, readonly) 135 vertices = vertices.astype(np.float_).filled(np.nan) 136 else: -- 137 vertices = np.asarray(vertices, np.float_) 138 139 if codes is not None: /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 460 461 -- 462 return array(a, dtype, copy=False, order=order) 463 464 def asanyarray(a, dtype=None, order=None): TypeError: float() argument must be a string or a number -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
Does the workaround posted here fix things for you? https://github.com/matplotlib/matplotlib/issues/3727#issuecomment-60899590 On Tue, Dec 2, 2014 at 10:43 AM, Fabien fabien.mauss...@gmail.com wrote: On 02.12.2014 16:34, Benjamin Root wrote: Please provide the full traceback sure, I pasted the traceback below. Here are the pandas infos: In [17]: df.info() class 'pandas.core.frame.DataFrame' DatetimeIndex: 5 entries, 1950-01-01 00:00:00 to 1950-05-01 00:00:00 Freq: MS Data columns (total 2 columns): data5 non-null int64 cond5 non-null bool dtypes: bool(1), int64(1) memory usage: 85.0 bytes In [18]: df.index Out[18]: class 'pandas.tseries.index.DatetimeIndex' [1950-01-01, ..., 1950-05-01] Length: 5, Freq: MS, Timezone: None In [19]: df.index.values Out[19]: array(['1950-01-01T00:00:00.0Z', '1950-02-01T00:00:00.0Z', '1950-03-01T00:00:00.0Z', '1950-04-01T00:00:00.0Z', '1950-05-01T00:00:00.0Z'], dtype='datetime64[ns]') Traceback: In [16]: c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], color='green') --- TypeError Traceback (most recent call last) ipython-input-16-d033044a6db2 in module() 1 c = span_where(df.index, ymin=0, ymax=4, where=df['cond'], color='green') /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in span_where(x, ymin, ymax, where, **kwargs) 871 872 collection = BrokenBarHCollection( -- 873 xranges, [ymin, ymax - ymin], **kwargs) 874 return collection 875 /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in __init__(self, xranges, yrange, **kwargs) 851 (xmin + xwidth, ymin), 852 (xmin, ymin)] for xmin, xwidth in xranges] -- 853 PolyCollection.__init__(self, verts, **kwargs) 854 855 @staticmethod /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in __init__(self, verts, sizes, closed, **kwargs) 799 Collection.__init__(self, **kwargs) 800 self.set_sizes(sizes) -- 801 self.set_verts(verts, closed) 802 803 def set_verts(self, verts, closed=True): /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/collections.py in set_verts(self, verts, closed) 819 codes[0] = mpath.Path.MOVETO 820 codes[-1] = mpath.Path.CLOSEPOLY -- 821 self._paths.append(mpath.Path(xy, codes)) 822 else: 823 self._paths.append(mpath.Path(xy)) /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/matplotlib/path.py in __init__(self, vertices, codes, _interpolation_steps, closed, readonly) 135 vertices = vertices.astype(np.float_).filled(np.nan) 136 else: -- 137 vertices = np.asarray(vertices, np.float_) 138 139 if codes is not None: /home/mowglie/.pyvirtualenvs/py3.3/lib/python3.3/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 460 461 -- 462 return array(a, dtype, copy=False, order=order) 463 464 def asanyarray(a, dtype=None, order=None): TypeError: float() argument must be a string or a number -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
OK I just filled a bug report: https://github.com/matplotlib/matplotlib/issues/3872 my first bug report ever! On 02.12.2014 17:15, Fabien wrote: On 02.12.2014 16:59, Benjamin Root wrote: Does the workaround posted here fix things for you? https://github.com/matplotlib/matplotlib/issues/3727#issuecomment-60899590 sorry it doesn't. I updated the test case below (including the workaround, I hope I got it right). The strange thing is that fill_between() works fine, but pan_where() is the problem. Thanks! #--- import pandas as pd import numpy as np from datetime import datetime as dt import matplotlib.pyplot as plt import matplotlib.collections as collections span_where = collections.BrokenBarHCollection.span_where import matplotlib.units as units units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter() # init the dataframe time = pd.date_range(pd.datetime(1950,1,1), periods=5, freq='MS') df = pd.DataFrame(np.arange(5), index=time, columns=['data']) df['cond'] = df['data'] = 3 # This is working (but its not what I want) x = np.arange(5) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is not x = df.index.values fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is producing an error x = df.index fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #--- -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=164703151iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
On 02.12.2014 16:59, Benjamin Root wrote: Does the workaround posted here fix things for you? https://github.com/matplotlib/matplotlib/issues/3727#issuecomment-60899590 sorry it doesn't. I updated the test case below (including the workaround, I hope I got it right). The strange thing is that fill_between() works fine, but pan_where() is the problem. Thanks! #--- import pandas as pd import numpy as np from datetime import datetime as dt import matplotlib.pyplot as plt import matplotlib.collections as collections span_where = collections.BrokenBarHCollection.span_where import matplotlib.units as units units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter() # init the dataframe time = pd.date_range(pd.datetime(1950,1,1), periods=5, freq='MS') df = pd.DataFrame(np.arange(5), index=time, columns=['data']) df['cond'] = df['data'] = 3 # This is working (but its not what I want) x = np.arange(5) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is not x = df.index.values fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is producing an error x = df.index fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #--- -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] BrokenBarHCollection with pandas timeseries
Ok, then this looks like a legitimate bug in span_where(). It probably isn't applying units, somehow. This isn't really a problem with pandas, it is an issue where we aren't being consistent in applying units for all plotting functions. Could you file a bug report, please? Cheers! Ben Root On Tue, Dec 2, 2014 at 11:15 AM, Fabien fabien.mauss...@gmail.com wrote: On 02.12.2014 16:59, Benjamin Root wrote: Does the workaround posted here fix things for you? https://github.com/matplotlib/matplotlib/issues/3727#issuecomment-60899590 sorry it doesn't. I updated the test case below (including the workaround, I hope I got it right). The strange thing is that fill_between() works fine, but pan_where() is the problem. Thanks! #--- import pandas as pd import numpy as np from datetime import datetime as dt import matplotlib.pyplot as plt import matplotlib.collections as collections span_where = collections.BrokenBarHCollection.span_where import matplotlib.units as units units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter() # init the dataframe time = pd.date_range(pd.datetime(1950,1,1), periods=5, freq='MS') df = pd.DataFrame(np.arange(5), index=time, columns=['data']) df['cond'] = df['data'] = 3 # This is working (but its not what I want) x = np.arange(5) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is not x = df.index.values fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #This is producing an error x = df.index fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, df['data'], 'k') c = span_where(x, ymin=0, ymax=4, where=df['cond'], color='green') ax.add_collection(c) plt.show() #--- -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751iu=/4140/ostg.clktrk ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=164703151iu=/4140/ostg.clktrk___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users