def _graph_hole_vs_j(self, x, y, r, reg, refresh): sel = [i for i, a in enumerate(self.analyses) if a.is_omitted()] g = self.graph if not isinstance(g, Graph): g = Graph(container_dict={'bgcolor': self.plotter_options.bgcolor}) self.graph = g po = self.plotter_options xs = arctan2(x, y) ys = reg.ys a = max((abs(min(xs)), abs(max(xs)))) fxs = linspace(-a, a) a = r * sin(fxs) b = r * cos(fxs) pts = vstack((a, b)).T fys = reg.predict(pts) yserr = reg.yserr l, u = reg.calculate_error_envelope([[p] for p in pts], rmodel=fys) lyy = ys - yserr uyy = ys + yserr if not refresh: g.clear() p = g.new_plot(xtitle='Hole (Theta)', ytitle='J', # padding=[90, 5, 5, 40], padding=po.paddings()) p.bgcolor = po.plot_bgcolor p.y_axis.tick_label_formatter = lambda x: floatfmt(x, n=2, s=4, use_scientific=True) scatter, _ = g.new_series(xs, ys, yerror=yserr, type='scatter', marker='circle') ebo = ErrorBarOverlay(component=scatter, orientation='y') scatter.overlays.append(ebo) scatter.error_bars = ebo add_inspector(scatter, self._additional_info) line, _p = g.new_series(fxs, fys) ee = ErrorEnvelopeOverlay(component=line, xs=fxs, lower=l, upper=u) line.error_envelope = ee line.overlays.append(ee) # plot the individual analyses s, iys = self._graph_individual_analyses() s.index.metadata['selections'] = sel # s.index.metadata_changed = True ymi = min(lyy.min(), min(iys)) yma = max(uyy.max(), max(iys)) g.set_x_limits(-3.2, 3.2) else: plot = g.plots[0] s1 = plot.plots['plot0'][0] s1.yerror.set_data(yserr) s1.error_bars.invalidate() l1 = plot.plots['plot1'][0] l1.error_envelope.trait_set(xs=fxs, lower=l, upper=u) l1.error_envelope.invalidate() g.set_data(ys, plotid=0, series=0, axis=1) g.set_data(fys, plotid=0, series=1, axis=1) s2 = plot.plots['plot2'][0] iys = s2.value.get_data() ymi = min(fys.min(), lyy.min(), iys.min()) yma = max(fys.max(), uyy.max(), iys.max()) s2.index.metadata['selections'] = sel g.set_y_limits(ymi, yma, pad='0.1') self._model_sin_flux(fxs, fys)
def _graph_hole_vs_j(self, x, y, r, reg, refresh): if self._individual_analyses_enabled: sel = [ i for i, (a, x, y, e) in enumerate(zip(*self._analyses)) if a.is_omitted() ] g = self.graph if not isinstance(g, Graph): g = Graph(container_dict={'bgcolor': self.plotter_options.bgcolor}) self.graph = g po = self.plotter_options ys = reg.ys xs = arctan2(x, y) yserr = reg.yserr lyy = ys - yserr uyy = ys + yserr a = max((abs(min(xs)), abs(max(xs)))) fxs = linspace(-a, a, 200) a = r * sin(fxs) b = r * cos(fxs) pts = vstack((a, b)).T fys = reg.predict(pts) use_ee = False if po.model_kind not in (MATCHING, BRACKETING, NN): use_ee = True try: l, u = reg.calculate_error_envelope(fxs, rmodel=fys) except BaseException: l, u = reg.calculate_error_envelope(pts, rmodel=fys) if not refresh: g.clear() p = g.new_plot( xtitle='Hole (Theta)', ytitle='J', # padding=[90, 5, 5, 40], padding=po.get_paddings()) p.bgcolor = po.plot_bgcolor add_axes_tools(g, p) def label_fmt(xx): return floatfmt(xx, n=2, s=4, use_scientific=True) p.y_axis.tick_label_formatter = label_fmt # plot fit line # plot0 == line if po.model_kind in (MATCHING, BRACKETING, NN): g.new_series(fxs, fys, render_style='connectedhold') else: line, _p = g.new_series(fxs, fys) if use_ee: ee = ErrorEnvelopeOverlay(component=line, xs=fxs, lower=l, upper=u) line.error_envelope = ee line.underlays.append(ee) miy = 100 may = -1 if self._individual_analyses_enabled: # plot the individual analyses # plot1 == scatter iscatter, iys = self._graph_individual_analyses() miy = min(iys) may = max(iys) # plot means # plot2 == scatter scatter, _ = g.new_series(xs, ys, yerror=yserr, type='scatter', marker_size=4, marker='diamond') ebo = ErrorBarOverlay(component=scatter, orientation='y') scatter.underlays.append(ebo) scatter.error_bars = ebo add_inspector(scatter, self._additional_info) ymi = min(lyy.min(), miy) yma = max(uyy.max(), may) g.set_x_limits(-3.5, 3.5) g.set_y_limits(ymi, yma, pad='0.1') if self._individual_analyses_enabled: # set metadata last because it will trigger a refresh self.suppress_metadata_change = True iscatter.index.metadata['selections'] = sel self.suppress_metadata_change = False if self._individual_analyses_enabled: # add a legend labels = [ ('plot1', 'Individual'), ('plot2', 'Mean'), ('plot0', 'Fit'), ] else: labels = [('plot0', 'Mean')] legend = ExplicitLegend(plots=self.graph.plots[0].plots, labels=labels) p.overlays.append(legend) else: plot = g.plots[0] s1 = plot.plots['plot2'][0] s1.yerror.set_data(yserr) s1.error_bars.invalidate() g.set_data(ys, plotid=0, series=2, axis=1) l1 = plot.plots['plot0'][0] l1.index.metadata['selections'] = sel g.set_data(fys, plotid=0, series=0, axis=1) if use_ee: l1.error_envelope.trait_set(xs=fxs, lower=l, upper=u) l1.error_envelope.invalidate() self.max_j = fys.max() self.min_j = fys.min()
def _graph_hole_vs_j(self, x, y, r, reg, refresh): sel = [i for i, (a, x, y, e) in enumerate(zip(*self._analyses)) if a.is_omitted()] g = self.graph if not isinstance(g, Graph): g = Graph(container_dict={'bgcolor': self.plotter_options.bgcolor}) self.graph = g po = self.plotter_options is_matching = po.model_kind == 'Matching' ys = reg.ys xs = arctan2(x, y) yserr = reg.yserr lyy = ys - yserr uyy = ys + yserr a = max((abs(min(xs)), abs(max(xs)))) fxs = linspace(-a, a) a = r * sin(fxs) b = r * cos(fxs) pts = vstack((a, b)).T fys = reg.predict(pts) if not is_matching: try: l, u = reg.calculate_error_envelope(fxs, rmodel=fys) except BaseException: l, u = reg.calculate_error_envelope(pts, rmodel=fys) if not refresh: g.clear() p = g.new_plot(xtitle='Hole (Theta)', ytitle='J', # padding=[90, 5, 5, 40], padding=po.paddings()) p.bgcolor = po.plot_bgcolor add_axes_tools(g, p) def label_fmt(xx): return floatfmt(xx, n=2, s=4, use_scientific=True) p.y_axis.tick_label_formatter = label_fmt # plot fit line # plot0 == line if not is_matching: line, _p = g.new_series(fxs, fys) ee = ErrorEnvelopeOverlay(component=line, xs=fxs, lower=l, upper=u) line.error_envelope = ee line.underlays.append(ee) # plot the individual analyses # plot1 == scatter iscatter, iys = self._graph_individual_analyses() # plot means # plot2 == scatter scatter, _ = g.new_series(xs, ys, yerror=yserr, type='scatter', marker_size=4, marker='diamond') ebo = ErrorBarOverlay(component=scatter, orientation='y') scatter.underlays.append(ebo) scatter.error_bars = ebo add_inspector(scatter, self._additional_info) ymi = min(lyy.min(), min(iys)) yma = max(uyy.max(), max(iys)) g.set_x_limits(-3.5, 3.5) g.set_y_limits(ymi, yma, pad='0.1') # set metadata last because it will trigger a refresh self.suppress_metadata_change = True iscatter.index.metadata['selections'] = sel self.suppress_metadata_change = False # add a legend if not is_matching: labels = [('plot1', 'Individual'), ('plot2', 'Mean'), ('plot0', 'Fit'), ] else: labels = [('plot0', 'Individual'), ('plot1', 'Mean')] legend = ExplicitLegend(plots=self.graph.plots[0].plots, labels=labels) p.overlays.append(legend) else: plot = g.plots[0] s1 = plot.plots['plot1' if is_matching else 'plot2'][0] s1.yerror.set_data(yserr) s1.error_bars.invalidate() g.set_data(ys, plotid=0, series=1 if is_matching else 2, axis=1) if not is_matching: l1 = plot.plots['plot0'][0] l1.error_envelope.trait_set(xs=fxs, lower=l, upper=u) l1.error_envelope.invalidate() g.set_data(fys, plotid=0, series=0, axis=1) s2 = plot.plots['plot1' if is_matching else 'plot0'][0] s2.index.metadata['selections'] = sel self.max_j = fys.max() self.min_j = fys.min()