GUI improvements

This commit is contained in:
Noe Brucy
2020-05-13 18:23:54 +02:00
committed by Noe Brucy
parent 0818372e0c
commit bb6f1091eb
2 changed files with 80 additions and 22 deletions
+65 -20
View File
@@ -1,6 +1,7 @@
import matplotlib as mpl import matplotlib as mpl
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons, LassoSelector, SpanSelector from matplotlib.widgets import Slider, Button, RadioButtons, LassoSelector
from matplotlib.widgets import SpanSelector, PolygonSelector, CheckButtons
import matplotlib.patches as patches import matplotlib.patches as patches
from matplotlib.lines import Line2D from matplotlib.lines import Line2D
from matplotlib.path import Path from matplotlib.path import Path
@@ -219,22 +220,35 @@ class InteractiveGUI:
plt.sca(self.ax_gamma) plt.sca(self.ax_gamma)
# (a, b, r, _, _) = linregress(self.frho_map[self.mask], self.fcs_map[self.mask]) # (a, b, r, _, _) = linregress(self.frho_map[self.mask], self.fcs_map[self.mask])
if self.full_gamma_button.get_status()[0]:
rho = np.log10(self.pp.cells["rho"])
cs = np.log10(np.sqrt(self.pp.cells["P"]))
mask_fin = np.isfinite(rho) & np.isfinite(cs)
rho, cs = rho[mask_fin], cs[mask_fin]
plt.xlabel(r"$\log(\rho)$")
plt.ylabel(r"$\log(P)$")
self.get_gamma = lambda a: a
else:
rho = self.frho_map[self.mask]
cs = self.fcs_map[self.mask]
plt.xlabel(r"$\log(\rho / \bar{\rho})$")
plt.ylabel(r"$\log(c_s / \bar{c_s})$")
self.get_gamma = lambda a: 2 * a + 1
if first: if first:
_, _, _, self.gamma_hist = plt.hist2d( _, _, _, self.gamma_hist = plt.hist2d(
self.frho_map[self.mask], rho,
self.fcs_map[self.mask], cs,
bins=100, bins=100,
norm=mpl.colors.LogNorm(), norm=mpl.colors.LogNorm(),
cmap=plt.get_cmap("plasma"), cmap=plt.get_cmap("plasma"),
) )
plt.xlabel(r"$\log(\rho / \bar{\rho})$")
plt.ylabel(r"$\log(c_s / \bar{c_s})$")
# cbar = plt.colorbar() # cbar = plt.colorbar()
else: else:
self.gamma_hist.remove() self.gamma_hist.remove()
_, _, _, self.gamma_hist = plt.hist2d( _, _, _, self.gamma_hist = plt.hist2d(
self.frho_map[self.mask], rho,
self.fcs_map[self.mask], cs,
bins=100, bins=100,
norm=mpl.colors.LogNorm(), norm=mpl.colors.LogNorm(),
cmap=plt.get_cmap("plasma"), cmap=plt.get_cmap("plasma"),
@@ -244,7 +258,8 @@ class InteractiveGUI:
lps = self.line_gamma.list_points lps = self.line_gamma.list_points
xa, ya, xb, yb = lps[0].x, lps[0].y, lps[1].x, lps[1].y xa, ya, xb, yb = lps[0].x, lps[0].y, lps[1].x, lps[1].y
a = (yb - ya) / (xb - xa) a = (yb - ya) / (xb - xa)
self.ax_gamma.set_title("$\Gamma$ = {:.3g}".format(2 * a + 1))
self.ax_gamma.set_title("$\Gamma$ = {:.3g}".format(self.get_gamma(a)))
## PDF ## PDF
if first or update_map: if first or update_map:
@@ -313,9 +328,24 @@ class InteractiveGUI:
print("Warning in linregress : {}".format(e)) print("Warning in linregress : {}".format(e))
a, b, r = np.nan, np.nan, np.nan a, b, r = np.nan, np.nan, np.nan
xv, yv = float(xa) / self.shape[0], float(ya) / self.shape[1]
mask_vert = (xv >= self.pp.cells["pos"][:, 0]) & (
xv < self.pp.cells["pos"][:, 0] + self.pp.cells["dx"]
)
mask_vert = (
mask_vert
& (yv >= self.pp.cells["pos"][:, 1])
& (yv < self.pp.cells["pos"][:, 1] + self.pp.cells["dx"])
)
rho_vert = np.log10(self.pp.cells["rho"][mask_vert])
z_vert = self.pp.cells["pos"][mask_vert][:, 2] - 0.5
sorter = np.argsort(z_vert)
rho_vert = rho_vert[sorter]
z_vert = z_vert[sorter]
if first: if first:
(self.prof,) = plt.semilogx(x, rho_prof) (self.prof,) = plt.semilogx(x, rho_prof)
plt.xlim([None, None]) (self.prof_z,) = plt.semilogx(z_vert, rho_vert)
plt.title("Profil") plt.title("Profil")
(self.fit_prof,) = plt.plot( (self.fit_prof,) = plt.plot(
x[mask_fit_prof], x[mask_fit_prof],
@@ -328,7 +358,7 @@ class InteractiveGUI:
self.ax_profile.set_ylabel(r"$\log(\rho)$") self.ax_profile.set_ylabel(r"$\log(\rho)$")
else: else:
self.prof.set_data(x, rho_prof) self.prof.set_data(x, rho_prof)
plt.xlim([None, None]) self.prof_z.set_data(z_vert, rho_vert)
self.fit_prof.set_data(x[mask_fit_prof], a * np.log10(x[mask_fit_prof]) + b) self.fit_prof.set_data(x[mask_fit_prof], a * np.log10(x[mask_fit_prof]) + b)
self.fit_prof.set_label(r"a = {:.3g}, $R^2$ = {:.3g}".format(a, r ** 2)) self.fit_prof.set_label(r"a = {:.3g}, $R^2$ = {:.3g}".format(a, r ** 2))
@@ -346,15 +376,15 @@ class InteractiveGUI:
self.mask = self.mask_flat.reshape(self.shape) self.mask = self.mask_flat.reshape(self.shape)
self.draw() self.draw()
def clicked_select(self, val): def clicked_select(self, val, selector, button):
if not self.lasso: if not self.lasso:
self.lasso = LassoSelector( self.lasso = selector(
self.ax_fluct, partial(self.onselect, select_data=self.points) self.ax_fluct, partial(self.onselect, select_data=self.points)
) )
self.lasso_gamma = LassoSelector( self.lasso_gamma = selector(
self.ax_gamma, partial(self.onselect, select_data=self.rhocs) self.ax_gamma, partial(self.onselect, select_data=self.rhocs)
) )
self.lasso_button.color = "0.55" button.color = "0.55"
else: else:
self.unselect_lasso() self.unselect_lasso()
@@ -362,6 +392,7 @@ class InteractiveGUI:
self.lasso = False self.lasso = False
self.lasso_gamma = False self.lasso_gamma = False
self.lasso_button.color = "0.85" self.lasso_button.color = "0.85"
self.poly_button.color = "0.85"
def clicked_reset(self, val): def clicked_reset(self, val):
self.mask = (self.rr > self.rmin) & (self.rr < self.rmax) self.mask = (self.rr > self.rmin) & (self.rr < self.rmax)
@@ -399,6 +430,7 @@ class InteractiveGUI:
self.pp.pdf_coldens("z") self.pp.pdf_coldens("z")
self.pp.pdf_rho("z") self.pp.pdf_rho("z")
self.pp.pdf_T("z") self.pp.pdf_T("z")
self.pp.load_cells()
self.datamap = self.pp.get_value("/maps/" + datamap_key) self.datamap = self.pp.get_value("/maps/" + datamap_key)
self.frho_map = np.log10(self.pp.get_value("/maps/fluct_rho_z")) self.frho_map = np.log10(self.pp.get_value("/maps/fluct_rho_z"))
self.T_map = self.pp.get_value("/maps/T_z") self.T_map = self.pp.get_value("/maps/T_z")
@@ -435,17 +467,30 @@ class InteractiveGUI:
self.mask = (self.rr > self.rmin) & (self.rr < self.rmax) self.mask = (self.rr > self.rmin) & (self.rr < self.rmax)
self.mask_flat = self.mask.flatten() self.mask_flat = self.mask.flatten()
ax_rmax = plt.axes([0.1, 0.03, 0.4, 0.02]) ax_rmax = plt.axes([0.3, 0.03, 0.15, 0.02])
self.srmax = Slider(ax_rmax, r"$r_{max}$", 0, 0.5, valinit=self.rmax) self.srmax = Slider(ax_rmax, r"$r_{max}$", 0, 0.5, valinit=self.rmax)
ax_rmin = plt.axes([0.1, 0.07, 0.4, 0.02]) ax_rmin = plt.axes([0.05, 0.03, 0.15, 0.02])
self.srmin = Slider(ax_rmin, r"$r_{min}$", 0, 0.5, valinit=self.rmin) self.srmin = Slider(ax_rmin, r"$r_{min}$", 0, 0.5, valinit=self.rmin)
ax_lasso = plt.axes([0.6, 0.07, 0.2, 0.02]) ax_lasso = plt.axes([0.6, 0.07, 0.19, 0.02])
ax_poly = plt.axes([0.8, 0.07, 0.19, 0.02])
ax_full_gamma = plt.axes([0.1, 0.07, 0.19, 0.02])
self.full_gamma_button = CheckButtons(ax_full_gamma, ["Full $\Gamma$"], [True])
self.lasso = False self.lasso = False
self.lasso_gamma = False self.lasso_gamma = False
self.lasso_button = Button(ax_lasso, "Select region") self.lasso_button = Button(ax_lasso, "Lasso selector")
self.lasso_button.on_clicked(self.clicked_select) self.poly_button = Button(ax_poly, "Polygon selector")
self.lasso_button.on_clicked(
partial(
self.clicked_select, selector=LassoSelector, button=self.lasso_button
)
)
self.poly_button.on_clicked(
partial(
self.clicked_select, selector=PolygonSelector, button=self.poly_button
)
)
ax_reset = plt.axes([0.6, 0.03, 0.2, 0.02]) ax_reset = plt.axes([0.6, 0.03, 0.19, 0.02])
self.reset_button = Button(ax_reset, "Reset") self.reset_button = Button(ax_reset, "Reset")
self.reset_button.on_clicked(self.clicked_reset) self.reset_button.on_clicked(self.clicked_reset)
+15 -2
View File
@@ -118,7 +118,15 @@ class Plotter(Aggregator, BaseProcessor):
) )
def _process_rule( def _process_rule(
self, name, rule, arg, overwrite=False, ax=None, movie=False, **kwargs self,
name,
rule,
arg,
overwrite=False,
ax=None,
movie=False,
from_cells=False,
**kwargs
): ):
if not arg is None: if not arg is None:
name_full = name + "_" + str(arg) name_full = name + "_" + str(arg)
@@ -143,7 +151,12 @@ class Plotter(Aggregator, BaseProcessor):
for num in nums: for num in nums:
plot_filename = self._find_filename(name_full, run, num) plot_filename = self._find_filename(name_full, run, num)
if rule.kind == "classic": if from_cells or rule.kind == "cells":
if not os.exists(self.pp[run][num].cells_filename):
self.pp[run][num].load_cells()
self.pp[run][num].unload_cells()
save = tables.open_file(self.pp[run][num].cells_filename)
elif rule.kind == "classic":
save = tables.open_file(self.pp[run][num].filename) save = tables.open_file(self.pp[run][num].filename)
else: else:
save = tables.open_file(self.comp.filename, "r") save = tables.open_file(self.comp.filename, "r")