Added center check button on lineview
This commit is contained in:
parent
dc7f7dbde2
commit
b35f814ef0
|
@ -5,13 +5,39 @@ fixme:
|
||||||
colorbar, but when adding colors the colorbar shoud be created.
|
colorbar, but when adding colors the colorbar shoud be created.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from matplotlib import cm
|
from matplotlib import cm,patches
|
||||||
import gtk
|
import gtk
|
||||||
import fluents
|
import fluents
|
||||||
from fluents import plots
|
from fluents import plots, main
|
||||||
import scipy
|
import scipy
|
||||||
from scipy import dot,sum,diag,arange,log,mean,newaxis,sqrt,apply_along_axis
|
from scipy import dot,sum,diag,arange,log,mean,newaxis,sqrt,apply_along_axis,empty
|
||||||
|
from scipy.stats import corrcoef
|
||||||
|
|
||||||
|
def correlation_loadings(data, T, test=True):
|
||||||
|
""" Returns correlation loadings.
|
||||||
|
|
||||||
|
:input:
|
||||||
|
- D: [nsamps, nvars], data (non-centered data)
|
||||||
|
- T: [nsamps, a_max], Scores
|
||||||
|
:ouput:
|
||||||
|
- R: [nvars, a_max], Correlation loadings
|
||||||
|
|
||||||
|
:notes:
|
||||||
|
|
||||||
|
"""
|
||||||
|
nsamps, nvars = data.shape
|
||||||
|
nsampsT, a_max = T.shape
|
||||||
|
|
||||||
|
if nsamps!=nsampsT: raise IOError("D/T mismatch")
|
||||||
|
|
||||||
|
# center
|
||||||
|
data = data - data.mean(0)
|
||||||
|
R = empty((nvars, a_max),'d')
|
||||||
|
for a in range(a_max):
|
||||||
|
for k in range(nvars):
|
||||||
|
R[k,a] = corrcoef(data[:,k], T[:,a])[0,1]
|
||||||
|
|
||||||
|
return R
|
||||||
|
|
||||||
class BlmScatterPlot(plots.ScatterPlot):
|
class BlmScatterPlot(plots.ScatterPlot):
|
||||||
"""Scatter plot used for scores and loadings in bilinear models."""
|
"""Scatter plot used for scores and loadings in bilinear models."""
|
||||||
|
@ -31,13 +57,10 @@ class BlmScatterPlot(plots.ScatterPlot):
|
||||||
sel_dim = dataset_1.get_dim_name(1)
|
sel_dim = dataset_1.get_dim_name(1)
|
||||||
id_1, = dataset_1.get_identifiers(sel_dim, [absi])
|
id_1, = dataset_1.get_identifiers(sel_dim, [absi])
|
||||||
id_2, = dataset_1.get_identifiers(sel_dim, [ordi])
|
id_2, = dataset_1.get_identifiers(sel_dim, [ordi])
|
||||||
|
|
||||||
col = 'b'
|
col = 'b'
|
||||||
if model.model.has_key(color_by):
|
if model.model.has_key(color_by):
|
||||||
col = model.model[color_by].ravel()
|
col = model.model[color_by].ravel()
|
||||||
|
|
||||||
plots.ScatterPlot.__init__(self, dataset_1, dataset_1, id_dim, sel_dim, id_1, id_2 ,c=col ,s=40 , name=title)
|
plots.ScatterPlot.__init__(self, dataset_1, dataset_1, id_dim, sel_dim, id_1, id_2 ,c=col ,s=40 , name=title)
|
||||||
|
|
||||||
self._mappable.set_cmap(self._cmap)
|
self._mappable.set_cmap(self._cmap)
|
||||||
self.sc = self._mappable
|
self.sc = self._mappable
|
||||||
self.add_pc_spin_buttons(self._T.shape[1], absi, ordi)
|
self.add_pc_spin_buttons(self._T.shape[1], absi, ordi)
|
||||||
|
@ -200,19 +223,95 @@ class LplsZLoadingPlot(BlmScatterPlot):
|
||||||
title = "Lpls z-loadings (%s)" %model._dataset['Z'].get_name()
|
title = "Lpls z-loadings (%s)" %model._dataset['Z'].get_name()
|
||||||
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='L', color_by='tsqz')
|
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='L', color_by='tsqz')
|
||||||
|
|
||||||
|
class LplsXCorrelationPlot(BlmScatterPlot):
|
||||||
|
def __init__(self, model, absi=0, ordi=1):
|
||||||
|
title = "Lpls x-corr. loads (%s)" %model._dataset['X'].get_name()
|
||||||
|
if not model.model.has_key('Rx'):
|
||||||
|
R = correlation_loadings(model._data['X'], model.model['T'])
|
||||||
|
model.model['Rx'] = R
|
||||||
|
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='Rx')
|
||||||
|
radius = 1
|
||||||
|
center = (0,0)
|
||||||
|
c100 = patches.Circle(center,radius=radius,
|
||||||
|
facecolor='gray',
|
||||||
|
alpha=.1,
|
||||||
|
zorder=1)
|
||||||
|
c50 = patches.Circle(center, radius=radius/2.0,
|
||||||
|
facecolor='gray',
|
||||||
|
alpha=.1,
|
||||||
|
zorder=2)
|
||||||
|
self.axes.add_patch(c100)
|
||||||
|
self.axes.add_patch(c50)
|
||||||
|
self.axes.axhline(lw=1.5,color='k')
|
||||||
|
self.axes.axvline(lw=1.5,color='k')
|
||||||
|
self.axes.set_xlim([-1.05,1.05])
|
||||||
|
self.axes.set_ylim([-1.05, 1.05])
|
||||||
|
self.canvas.show()
|
||||||
|
|
||||||
|
class LplsZCorrelationPlot(BlmScatterPlot):
|
||||||
|
def __init__(self, model, absi=0, ordi=1):
|
||||||
|
title = "Lpls z-corr. loads (%s)" %model._dataset['Z'].get_name()
|
||||||
|
if not model.model.has_key('Rz'):
|
||||||
|
R = correlation_loadings(model._data['Z'].T, model.model['W'])
|
||||||
|
model.model['Rz'] = R
|
||||||
|
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='Rz')
|
||||||
|
radius = 1
|
||||||
|
center = (0,0)
|
||||||
|
c100 = patches.Circle(center,radius=radius,
|
||||||
|
facecolor='gray',
|
||||||
|
alpha=.1,
|
||||||
|
zorder=1)
|
||||||
|
c50 = patches.Circle(center, radius=radius/2.0,
|
||||||
|
facecolor='gray',
|
||||||
|
alpha=.1,
|
||||||
|
zorder=2)
|
||||||
|
self.axes.add_patch(c100)
|
||||||
|
self.axes.add_patch(c50)
|
||||||
|
self.axes.axhline(lw=1.5,color='k')
|
||||||
|
self.axes.axvline(lw=1.5,color='k')
|
||||||
|
self.axes.set_xlim([-1.05,1.05])
|
||||||
|
self.axes.set_ylim([-1.05, 1.05])
|
||||||
|
self.canvas.show()
|
||||||
|
|
||||||
|
|
||||||
class LplsHypoidCorrelationPlot(BlmScatterPlot):
|
class LplsHypoidCorrelationPlot(BlmScatterPlot):
|
||||||
def __init__(self, model, absi=0, ordi=1):
|
def __init__(self, model, absi=0, ordi=1):
|
||||||
title = "Hypoid correlations(%s)" %model._dataset['X'].get_name()
|
title = "Hypoid correlations(%s)" %model._dataset['X'].get_name()
|
||||||
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='W')
|
BlmScatterPlot.__init__(self, title, model, absi, ordi, part_name='W')
|
||||||
|
|
||||||
|
|
||||||
class LineViewXc(plots.LineViewPlot):
|
class LineViewXc(plots.LineViewPlot):
|
||||||
"""A line view of centered raw data
|
"""A line view of centered raw data
|
||||||
"""
|
"""
|
||||||
def __init__(self, model, name='Profiles'):
|
def __init__(self, model, name='Profiles'):
|
||||||
# copy, center, plot
|
dx = model._dataset['X']
|
||||||
x = model._dataset['X'].copy()
|
plots.LineViewPlot.__init__(self, dx, 1, None, False,name)
|
||||||
x._array = x._array - mean(x._array,0)[newaxis]
|
self.add_center_check_button(self.data_is_centered)
|
||||||
plots.LineViewPlot.__init__(self, x, 1, None, name)
|
|
||||||
|
def add_center_check_button(self, ticked):
|
||||||
|
"""Add a checker button for centerd view of data."""
|
||||||
|
cb = gtk.CheckButton("Center")
|
||||||
|
cb.set_active(ticked)
|
||||||
|
cb.connect('toggled', self._toggle_center)
|
||||||
|
toolitem = gtk.ToolItem()
|
||||||
|
toolitem.set_expand(False)
|
||||||
|
toolitem.set_border_width(2)
|
||||||
|
toolitem.add(cb)
|
||||||
|
self._toolbar.insert(toolitem, -1)
|
||||||
|
toolitem.set_tooltip(self._toolbar.tooltips, "Column center the line view")
|
||||||
|
self._toolbar.show_all() #do i need this?
|
||||||
|
|
||||||
|
def _toggle_center(self, active):
|
||||||
|
if self.data_is_centered:
|
||||||
|
self._data = self._data + self._mn_data
|
||||||
|
self.data_is_centered = False
|
||||||
|
else:
|
||||||
|
self._mn_data = self._data.mean(0)
|
||||||
|
self._data = self._data - self._mn_data
|
||||||
|
self.data_is_centered = True
|
||||||
|
self.make_lines()
|
||||||
|
self.set_background()
|
||||||
|
self.set_current_selection(main.project.get_selection())
|
||||||
|
|
||||||
|
|
||||||
class ParalellCoordinates(plots.Plot):
|
class ParalellCoordinates(plots.Plot):
|
||||||
|
|
|
@ -171,7 +171,7 @@ class LineViewPlot(Plot):
|
||||||
fixme: slow
|
fixme: slow
|
||||||
"""
|
"""
|
||||||
@plotlogger
|
@plotlogger
|
||||||
def __init__(self, dataset, major_axis=1, minor_axis=None, name="Line view"):
|
def __init__(self, dataset, major_axis=1, minor_axis=None, center=True,name="Line view"):
|
||||||
Plot.__init__(self, name)
|
Plot.__init__(self, name)
|
||||||
self.dataset = dataset
|
self.dataset = dataset
|
||||||
self._data = dataset.asarray()
|
self._data = dataset.asarray()
|
||||||
|
@ -180,28 +180,48 @@ class LineViewPlot(Plot):
|
||||||
self.major_axis = major_axis
|
self.major_axis = major_axis
|
||||||
self.minor_axis = minor_axis
|
self.minor_axis = minor_axis
|
||||||
self.current_dim = self.dataset.get_dim_name(major_axis)
|
self.current_dim = self.dataset.get_dim_name(major_axis)
|
||||||
|
self.data_is_centered = False
|
||||||
#initial draw
|
self._mn_data = 0
|
||||||
|
if center and len(self._data.shape)==2:
|
||||||
|
if minor_axis==0:
|
||||||
|
self._mn_data = self._data.mean(minor_axis)
|
||||||
|
else:
|
||||||
|
self._mn_data = self._data.mean(minor_axis)[:,newaxis]
|
||||||
|
self._data = self._data - self._mn_data
|
||||||
|
self.data_is_centered = True
|
||||||
|
#initial line collection
|
||||||
self.line_coll = None
|
self.line_coll = None
|
||||||
self.line_segs = []
|
self.make_lines()
|
||||||
x_axis = scipy.arange(self._data.shape[minor_axis])
|
|
||||||
for xi in range(self._data.shape[major_axis]):
|
|
||||||
yi = self._data.take([xi], major_axis).ravel()
|
|
||||||
self.line_segs.append([(xx,yy) for xx,yy in zip(x_axis, yi)])
|
|
||||||
|
|
||||||
# draw background
|
# draw background
|
||||||
self._set_background(self.axes)
|
self.set_background()
|
||||||
|
|
||||||
# Disable selection modes
|
# Disable selection modes
|
||||||
self._toolbar.freeze_button.set_sensitive(False)
|
self._toolbar.freeze_button.set_sensitive(False)
|
||||||
self._toolbar.set_mode_sensitive('select', False)
|
self._toolbar.set_mode_sensitive('select', False)
|
||||||
self._toolbar.set_mode_sensitive('lassoselect', False)
|
self._toolbar.set_mode_sensitive('lassoselect', False)
|
||||||
|
|
||||||
|
def make_lines(self):
|
||||||
|
"""Creates one line for each item along major axis."""
|
||||||
|
if self.line_coll: # remove any previous selection lines, if any
|
||||||
|
self.axes.collections.remove(self.line_coll)
|
||||||
|
self.line_coll = None
|
||||||
|
self.line_segs = []
|
||||||
|
x_axis = scipy.arange(self._data.shape[self.minor_axis])
|
||||||
|
for xi in range(self._data.shape[self.major_axis]):
|
||||||
|
yi = self._data.take([xi], self.major_axis).ravel()
|
||||||
|
self.line_segs.append([(xx,yy) for xx,yy in zip(x_axis, yi)])
|
||||||
|
|
||||||
def _set_background(self, ax):
|
def set_background(self):
|
||||||
"""Add three patches representing [min max],[5,95] and [25,75] percentiles, and a line at the median.
|
"""Add three patches representing [min max],[5,95] and [25,75] percentiles, and a line at the median.
|
||||||
"""
|
"""
|
||||||
if self._data.shape[self.minor_axis]<6:
|
if self._data.shape[self.minor_axis]<6:
|
||||||
return
|
return
|
||||||
|
# clean old patches if any
|
||||||
|
if len(self.axes.patches)>0:
|
||||||
|
self.axes.patches = []
|
||||||
|
# clean old lines (median) if any
|
||||||
|
if len(self.axes.lines)>0:
|
||||||
|
self.axes.lines = []
|
||||||
# settings
|
# settings
|
||||||
patch_color = 'b' #blue
|
patch_color = 'b' #blue
|
||||||
patch_lw = 0 #no edges
|
patch_lw = 0 #no edges
|
||||||
|
@ -240,13 +260,16 @@ class LineViewPlot(Plot):
|
||||||
facecolor=patch_color)
|
facecolor=patch_color)
|
||||||
|
|
||||||
# add polygons to axes
|
# add polygons to axes
|
||||||
ax.add_patch(bck0)
|
self.axes.add_patch(bck0)
|
||||||
ax.add_patch(bck1)
|
self.axes.add_patch(bck1)
|
||||||
ax.add_patch(bck2)
|
self.axes.add_patch(bck2)
|
||||||
# median line
|
# median line
|
||||||
ax.plot(xax, med, median_color, linewidth=median_width)
|
self.axes.plot(xax, med, median_color, linewidth=median_width)
|
||||||
|
|
||||||
|
# set y-limits
|
||||||
|
padding = 0.1
|
||||||
|
self.axes.set_ylim([self._data.min() - padding, self._data.max() + padding])
|
||||||
|
|
||||||
def set_current_selection(self, selection):
|
def set_current_selection(self, selection):
|
||||||
"""Draws the current selection.
|
"""Draws the current selection.
|
||||||
"""
|
"""
|
||||||
|
|
Reference in New Issue