22#
33from __future__ import print_function
44
5- from matplotlib .dates import num2date
65import datetime
76import six
87
8+ from matplotlib .dates import num2date
9+ import numpy
10+
911from . import color as mycol
1012from . import path as mypath
1113from . import files
@@ -242,8 +244,23 @@ def _marker(
242244
243245
244246def _table (obj , data ):
245- xdata , ydata = obj .get_data ()
246- if not isinstance (xdata [0 ], datetime .datetime ):
247+ # get_xydata() always gives float data, no matter what
248+ xdata , ydata = obj .get_xydata ().T
249+
250+ # get_{x,y}data gives datetime or string objects if so specified in the plotter
251+ xdata_alt = obj .get_xdata ()
252+
253+ ff = data ["float format" ]
254+
255+ if isinstance (xdata_alt [0 ], datetime .datetime ):
256+ xdata = xdata_alt
257+ elif isinstance (xdata_alt [0 ], str ):
258+ data ["current axes" ].axis_options += [
259+ "xtick={{{}}}" .format ("," .join ([ff .format (x ) for x in xdata ])),
260+ "xticklabels={{{}}}" .format ("," .join (xdata_alt ))
261+ ]
262+ xdata , ydata = transform_to_data_coordinates (obj , xdata , ydata )
263+ else :
247264 xdata , ydata = transform_to_data_coordinates (obj , xdata , ydata )
248265
249266 # matplotlib allows plotting of data containing `astropy.units`, but they will break
@@ -258,15 +275,18 @@ def _table(obj, data):
258275 pass
259276
260277 try :
261- has_mask = ydata .mask .any ()
278+ _ , ydata_alt = obj .get_data ()
279+ ydata_mask = ydata_alt .mask
262280 except AttributeError :
263- has_mask = False
281+ ydata_mask = []
282+ else :
283+ if isinstance (ydata_mask , numpy .bool_ ) and not ydata_mask :
284+ ydata_mask = []
264285
265286 axis_options = []
266287
267288 content = []
268289
269- ff = data ["float format" ]
270290 if isinstance (xdata [0 ], datetime .datetime ):
271291 xdata = [date .strftime ("%Y-%m-%d %H:%M" ) for date in xdata ]
272292 xformat = "{}"
@@ -293,13 +313,13 @@ def _table(obj, data):
293313 content .append ("table {%\n " )
294314
295315 plot_table = []
296- if has_mask :
316+ if any ( ydata_mask ) :
297317 # matplotlib jumps at masked images, while PGFPlots by default interpolates.
298318 # Hence, if we have a masked plot, make sure that PGFPlots jumps as well.
299319 if "unbounded coords=jump" not in data ["current axes" ].axis_options :
300320 data ["current axes" ].axis_options .append ("unbounded coords=jump" )
301321
302- for (x , y , is_masked ) in zip (xdata , ydata , ydata . mask ):
322+ for (x , y , is_masked ) in zip (xdata , ydata , ydata_mask ):
303323 if is_masked :
304324 plot_table .append ((xformat + col_sep + "nan\n " ).format (x ))
305325 else :
0 commit comments