Projects/laydi
Projects
/
laydi
Archived
7
0
Fork 0

Added center check button on lineview

This commit is contained in:
Arnar Flatberg 2007-07-26 18:26:50 +00:00
parent dc7f7dbde2
commit b35f814ef0
2 changed files with 150 additions and 28 deletions

View File

@ -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):

View File

@ -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.
""" """