def _read_field_names(self, grid): if grid.filename is None: return [] f = h5py.File(grid.filename, "r") try: group = f["/Grid%08i" % grid.id] except KeyError: group = f fields = [] dtypes = set([]) add_io = "io" in grid.ds.particle_types for name, v in iteritems(group): # NOTE: This won't work with 1D datasets or references. # For all versions of Enzo I know about, we can assume all floats # are of the same size. So, let's grab one. if not hasattr(v, "shape") or v.dtype == "O": continue elif len(v.dims) == 1: if grid.ds.dimensionality == 1: fields.append( ("enzo", str(name)) ) elif add_io: fields.append( ("io", str(name)) ) else: fields.append( ("enzo", str(name)) ) dtypes.add(v.dtype) if len(dtypes) == 1: # Now, if everything we saw was the same dtype, we can go ahead and # set it here. We do this because it is a HUGE savings for 32 bit # floats, since our numpy copying/casting is way faster than # h5py's, for some reason I don't understand. This does *not* need # to be correct -- it will get fixed later -- it just needs to be # okay for now. self._field_dtype = list(dtypes)[0] f.close() return fields
def save(self, name=None, suffix=None, mpl_kwargs=None): r""" Saves a 2d profile plot. Parameters ---------- name : str The output file keyword. suffix : string Specify the image type by its suffix. If not specified, the output type will be inferred from the filename. Defaults to PNG. mpl_kwargs : dict A dict of keyword arguments to be passed to matplotlib. >>> plot.save(mpl_kwargs={'bbox_inches':'tight'}) """ names = [] if not self._plot_valid: self._setup_plots() if mpl_kwargs is None: mpl_kwargs = {} if name is None: name = str(self.profile.ds) name = os.path.expanduser(name) xfn = self.profile.x_field yfn = self.profile.y_field if isinstance(xfn, tuple): xfn = xfn[1] if isinstance(yfn, tuple): yfn = yfn[1] for f in self.profile.field_data: _f = f if isinstance(f, tuple): _f = _f[1] middle = "2d-Profile_%s_%s_%s" % (xfn, yfn, _f) splitname = os.path.split(name) if splitname[0] != '' and not os.path.isdir(splitname[0]): os.makedirs(splitname[0]) if os.path.isdir(name) and name != str(self.profile.ds): prefix = name + (os.sep if name[-1] != os.sep else '') prefix += str(self.profile.ds) else: prefix = name if suffix is None: suffix = get_image_suffix(name) if suffix != '': for k, v in iteritems(self.plots): names.append(v.save(name, mpl_kwargs)) return names else: suffix = "png" fn = "%s_%s.%s" % (prefix, middle, suffix) names.append(fn) self.plots[f].save(fn, mpl_kwargs) return names
def save(self, name=None, suffix=None, mpl_kwargs=None): r""" Saves a 1d profile plot. Parameters ---------- name : str The output file keyword. suffix : string Specify the image type by its suffix. If not specified, the output type will be inferred from the filename. Defaults to PNG. mpl_kwargs : dict A dict of keyword arguments to be passed to matplotlib. """ if not self._plot_valid: self._setup_plots() unique = set(self.plots.values()) if len(unique) < len(self.plots): iters = izip(range(len(unique)), sorted(unique)) else: iters = iteritems(self.plots) if not suffix: suffix = "png" suffix = ".%s" % suffix fullname = False if name is None: if len(self.profiles) == 1: prefix = self.profiles[0].ds else: prefix = "Multi-data" name = "%s%s" % (prefix, suffix) else: sfx = get_image_suffix(name) if sfx != '': suffix = sfx prefix = name[:name.rfind(suffix)] fullname = True else: prefix = name xfn = self.profiles[0].x_field if isinstance(xfn, tuple): xfn = xfn[1] fns = [] for uid, plot in iters: if isinstance(uid, tuple): uid = uid[1] if fullname: fns.append("%s%s" % (prefix, suffix)) else: fns.append("%s_1d-Profile_%s_%s%s" % (prefix, xfn, uid, suffix)) mylog.info("Saving %s", fns[-1]) with matplotlib_style_context(): plot.save(fns[-1], mpl_kwargs=mpl_kwargs) return fns
def from_json(cls, json_text): """ Returns a UnitRegistry object from a json-serialized unit registry """ data = json.loads(json_text) lut = {} for k, v in six.iteritems(data): unsan_v = list(v) unsan_v[1] = sympify(v[1]) lut[k] = tuple(unsan_v) return cls(lut=lut, add_default_symbols=False)
def _send_zmq(self): try: # pre-IPython v1.0 from IPython.zmq.pylab.backend_inline import send_figure as display except ImportError: # IPython v1.0+ from IPython.core.display import display for k, v in sorted(iteritems(self.plots)): # Due to a quirk in the matplotlib API, we need to create # a dummy canvas variable here that is never used. canvas = FigureCanvasAgg(v.figure) # NOQA display(v.figure)
def save(self, name=None, suffix=None): r""" Saves a 1d profile plot. Parameters ---------- name : str The output file keyword. suffix : string Specify the image type by its suffix. If not specified, the output type will be inferred from the filename. Defaults to PNG. """ if not self._plot_valid: self._setup_plots() unique = set(self.figures.values()) if len(unique) < len(self.figures): iters = izip(range(len(unique)), sorted(unique)) else: iters = iteritems(self.figures) if not suffix: suffix = "png" suffix = ".%s" % suffix if name is None: if len(self.profiles) == 1: prefix = self.profiles[0].ds else: prefix = "Multi-data" name = "%s%s" % (prefix, suffix) else: sfx = get_image_suffix(name) if sfx != '': suffix = sfx prefix = name[:name.rfind(suffix)] else: prefix = name xfn = self.profiles[0].x_field if isinstance(xfn, tuple): xfn = xfn[1] canvas_cls = get_canvas(name) fns = [] for uid, fig in iters: if isinstance(uid, tuple): uid = uid[1] canvas = canvas_cls(fig) fns.append("%s_1d-Profile_%s_%s%s" % (prefix, xfn, uid, suffix)) mylog.info("Saving %s", fns[-1]) canvas.print_figure(fns[-1]) return fns
def to_json(self): """ Returns a json-serialized version of the unit registry """ sanitized_lut = {} for k, v in six.iteritems(self.lut): san_v = list(v) repr_dims = srepr(v[1]) if SYMPY_VERSION < LooseVersion("1.0.0"): # see https://github.com/sympy/sympy/issues/6131 repr_dims = re.sub("Symbol\('\([a-z_]*\)'\)", positive_symbol_replacer, repr_dims) san_v[1] = repr_dims sanitized_lut[k] = tuple(san_v) return json.dumps(sanitized_lut)
def _repr_html_(self): """Return an html representation of the plot object. Will display as a png for each WindowPlotMPL instance in self.plots""" ret = '' unique = set(self.plots.values()) if len(unique) < len(self.plots): iters = izip(range(len(unique)), sorted(unique)) else: iters = iteritems(self.plots) for uid, plot in iters: with matplotlib_style_context(): img = plot._repr_png_() img = base64.b64encode(img).decode() ret += r'<img style="max-width:100%%;max-height:100%%;" ' \ r'src="data:image/png;base64,{0}"><br>'.format(img) return ret
def _repr_html_(self): """Return an html representation of the plot object. Will display as a png for each WindowPlotMPL instance in self.plots""" ret = '' unique = set(self.figures.values()) if len(unique) < len(self.figures): iters = izip(range(len(unique)), sorted(unique)) else: iters = iteritems(self.figures) for uid, fig in iters: canvas = mpl.FigureCanvasAgg(fig) f = BytesIO() canvas.print_figure(f) f.seek(0) img = base64.b64encode(f.read()).decode() ret += r'<img style="max-width:100%%;max-height:100%%;" ' \ r'src="data:image/png;base64,{0}"><br>'.format(img) return ret
def _read_field_names(self, grid): if grid.filename is None: return [] f = h5py.File(grid.filename, "r") try: group = f[grid.block_name] except KeyError: raise YTException( message="Grid %s is missing from data file %s." % (grid.block_name, grid.filename), ds=self.ds) fields = [] ptypes = set() dtypes = set() # keep one field for each particle type so we can count later sample_pfields = {} for name, v in iteritems(group): if not hasattr(v, "shape") or v.dtype == "O": continue # mesh fields are "field <name>" if name.startswith("field"): _, fname = name.split(self._sep, 1) fields.append(("enzop", fname)) dtypes.add(v.dtype) # particle fields are "particle <type> <name>" else: _, ftype, fname = name.split(self._sep, 2) fields.append((ftype, fname)) ptypes.add(ftype) dtypes.add(v.dtype) if ftype not in sample_pfields: sample_pfields[ftype] = fname self.sample_pfields = sample_pfields if len(dtypes) == 1: # Now, if everything we saw was the same dtype, we can go ahead and # set it here. We do this because it is a HUGE savings for 32 bit # floats, since our numpy copying/casting is way faster than # h5py's, for some reason I don't understand. This does *not* need # to be correct -- it will get fixed later -- it just needs to be # okay for now. self._field_dtype = list(dtypes)[0] f.close() return fields, ptypes
def _validate(self): r"""Validate the current state of the scene.""" for k, source in iteritems(self.sources): source._validate() return
def save(self, name=None, suffix=None, mpl_kwargs=None): """saves the plot to disk. Parameters ---------- name : string or tuple The base of the filename. If name is a directory or if name is not set, the filename of the dataset is used. For a tuple, the resulting path will be given by joining the elements of the tuple suffix : string Specify the image type by its suffix. If not specified, the output type will be inferred from the filename. Defaults to PNG. mpl_kwargs : dict A dict of keyword arguments to be passed to matplotlib. >>> slc.save(mpl_kwargs={'bbox_inches':'tight'}) """ names = [] if mpl_kwargs is None: mpl_kwargs = {} if isinstance(name, (tuple, list)): name = os.path.join(*name) if name is None: name = str(self.ds) name = os.path.expanduser(name) if name[-1] == os.sep and not os.path.isdir(name): ensure_dir(name) if os.path.isdir(name) and name != str(self.ds): name = name + (os.sep if name[-1] != os.sep else '') + str(self.ds) if suffix is None: suffix = get_image_suffix(name) if suffix != '': for k, v in iteritems(self.plots): names.append(v.save(name, mpl_kwargs)) return names if hasattr(self.data_source, 'axis'): axis = self.ds.coordinates.axis_name.get(self.data_source.axis, '') else: axis = None weight = None type = self._plot_type if type in ['Projection', 'OffAxisProjection']: weight = self.data_source.weight_field if weight is not None: weight = weight[1].replace(' ', '_') if 'Cutting' in self.data_source.__class__.__name__: type = 'OffAxisSlice' for k, v in iteritems(self.plots): if isinstance(k, tuple): k = k[1] if axis: n = "%s_%s_%s_%s" % (name, type, axis, k.replace(' ', '_')) else: # for cutting planes n = "%s_%s_%s" % (name, type, k.replace(' ', '_')) if weight: n += "_%s" % (weight) if suffix != '': n = ".".join([n, suffix]) names.append(v.save(n, mpl_kwargs)) return names
def save(self, name=None, suffix=None, mpl_kwargs=None): """saves the plot to disk. Parameters ---------- name : string The base of the filename. If name is a directory or if name is not set, the filename of the dataset is used. suffix : string Specify the image type by its suffix. If not specified, the output type will be inferred from the filename. Defaults to PNG. mpl_kwargs : dict A dict of keyword arguments to be passed to matplotlib. >>> slc.save(mpl_kwargs={'bbox_inches':'tight'}) """ names = [] if mpl_kwargs is None: mpl_kwargs = {} if name is None: name = str(self.ds) name = os.path.expanduser(name) if name[-1] == os.sep and not os.path.isdir(name): try: os.mkdir(name) except OSError as e: if e.errno == errno.EEXIST: pass else: raise if os.path.isdir(name) and name != str(self.ds): name = name + (os.sep if name[-1] != os.sep else '') + str(self.ds) if suffix is None: suffix = get_image_suffix(name) if suffix != '': for k, v in iteritems(self.plots): names.append(v.save(name, mpl_kwargs)) return names axis = self.ds.coordinates.axis_name.get( self.data_source.axis, '') weight = None type = self._plot_type if type in ['Projection', 'OffAxisProjection']: weight = self.data_source.weight_field if weight is not None: weight = weight[1].replace(' ', '_') if 'Cutting' in self.data_source.__class__.__name__: type = 'OffAxisSlice' for k, v in iteritems(self.plots): if isinstance(k, tuple): k = k[1] if axis: n = "%s_%s_%s_%s" % (name, type, axis, k.replace(' ', '_')) else: # for cutting planes n = "%s_%s_%s" % (name, type, k.replace(' ', '_')) if weight: n += "_%s" % (weight) if suffix != '': n = ".".join([n,suffix]) names.append(v.save(n, mpl_kwargs)) return names