Projects/laydi
Projects
/
laydi
Archived
7
0
Fork 0

Dataset to colour of dragndrop in dataset + minor addjustments in networkplot

This commit is contained in:
Arnar Flatberg 2006-10-25 12:56:21 +00:00
parent 0b30aeac6f
commit 438dbd358b
1 changed files with 74 additions and 14 deletions

View File

@ -221,6 +221,13 @@ class ViewFrame (gtk.Frame):
self.set_view(obj) self.set_view(obj)
self.focus() self.focus()
elif isinstance(obj, fluents.dataset.Dataset):
view = self.get_view()
if view.is_mappable_with(obj):
view._update_color_from_dataset(obj)
# add selections below
class MainView (gtk.Notebook): class MainView (gtk.Notebook):
"""The MainView class displays the Views in Fluents. """The MainView class displays the Views in Fluents.
@ -381,6 +388,10 @@ class View (gtk.Frame):
def get_toolbar(self): def get_toolbar(self):
return None return None
def is_mappable_with(self, dataset):
"""Override in individual plots."""
return False
class EmptyView (View): class EmptyView (View):
"""EmptyView is shown in ViewFrames that are unused.""" """EmptyView is shown in ViewFrames that are unused."""
@ -654,12 +665,15 @@ class ScatterPlot(Plot):
self.xaxis_data = dataset_1._array[:, x_index] self.xaxis_data = dataset_1._array[:, x_index]
self.yaxis_data = dataset_2._array[:, y_index] self.yaxis_data = dataset_2._array[:, y_index]
lw = scipy.zeros(self.xaxis_data.shape) lw = scipy.zeros(self.xaxis_data.shape)
sc = self.ax.scatter(self.xaxis_data, self.yaxis_data, s=s, c=c, linewidth=lw, edgecolor='k', alpha=.6, cmap = cm.jet) self.sc = sc = self.ax.scatter(self.xaxis_data, self.yaxis_data,
s=s, c=c, linewidth=lw,
edgecolor='k', alpha=.8,
cmap=cm.jet)
if len(c)>1: if len(c)>1:
self.fig.colorbar(sc,ticks=[], fraction=.05) self.fig.colorbar(sc, fraction=.05)
self.ax.axhline(0, color='k', lw=1., zorder=1) self.ax.axhline(0, color='k', lw=1., zorder=1)
self.ax.axvline(0, color='k', lw=1., zorder=1) self.ax.axvline(0, color='k', lw=1., zorder=1)
#self.ax.set_title(self.get_title())
# collection # collection
self.coll = self.ax.collections[0] self.coll = self.ax.collections[0]
@ -667,6 +681,41 @@ class ScatterPlot(Plot):
self.add(self.canvas) self.add(self.canvas)
self.canvas.show() self.canvas.show()
def is_mappable_with(self, dataset):
"""Returns True if dataset is mappable with this plot.
"""
if self.current_dim in dataset.get_dim_name() and dataset.asarray().shape[0] == self.xaxis_data.shape[0]:
return True
def _update_color_from_dataset(self, data):
"""Updates the facecolors from a dataset.
"""
array = data.asarray()
#only support for 2d-arrays:
try:
m, n = array.shape
except:
raise ValueError, "No support for more tha 2 dimensions."
# is dataset a vector or matrix?
if not n==1:
# we have a category dataset
if isinstance(data, fluents.dataset.CategoryDataset):
map_vec = scipy.dot(array, scipy.diag(scipy.arange(n))).sum(1)
else:
map_vec = array.sum(1)
else:
map_vec = array.ravel()
# normalise mapping vector
map_vec = map_vec - map_vec.min()
map_vec = map_vec/map_vec.max()
# update facecolors
self.sc._facecolors = self.sc.to_rgba(map_vec, self.sc._alpha)
# draw
self.sc._A = None # mean hack
self.ax.draw_artist(self.sc)
self.canvas.draw()
def rectangle_select_callback(self, x1, y1, x2, y2): def rectangle_select_callback(self, x1, y1, x2, y2):
ydata = self.yaxis_data ydata = self.yaxis_data
xdata = self.xaxis_data xdata = self.xaxis_data
@ -714,7 +763,9 @@ class NetworkPlot(Plot):
self.dataset = dataset self.dataset = dataset
self.keywords = kw self.keywords = kw
self.dim_name = self.dataset.get_dim_name(0) self.dim_name = self.dataset.get_dim_name(0)
self.current_dim = self.dim_name
if not kw.has_key('with_labels'):
k w['with_labels'] = False
if not kw.has_key('name'): if not kw.has_key('name'):
kw['name'] = self.dataset.get_name() kw['name'] = self.dataset.get_name()
if not kw.has_key('prog'): if not kw.has_key('prog'):
@ -722,6 +773,7 @@ class NetworkPlot(Plot):
if not kw.has_key('pos') or kw['pos']: if not kw.has_key('pos') or kw['pos']:
kw['pos'] = networkx.pygraphviz_layout(self.graph, kw['prog']) kw['pos'] = networkx.pygraphviz_layout(self.graph, kw['prog'])
Plot.__init__(self, kw['name']) Plot.__init__(self, kw['name'])
self.current_dim = self.dim_name
# Keep node size and color as dicts for fast lookup # Keep node size and color as dicts for fast lookup
self.node_size = {} self.node_size = {}
@ -731,7 +783,7 @@ class NetworkPlot(Plot):
self.node_size[id] = size self.node_size[id] = size
else: else:
for id in dataset[self.dim_name]: for id in dataset[self.dim_name]:
self.node_size[id] = 40 self.node_size[id] = 30
self.node_color = {} self.node_color = {}
if kw.has_key('node_color') and cb.iterable(kw['node_color']): if kw.has_key('node_color') and cb.iterable(kw['node_color']):
@ -747,9 +799,9 @@ class NetworkPlot(Plot):
kw.pop('node_color') kw.pop('node_color')
self.ax = self.fig.add_subplot(111) self.ax = self.fig.add_subplot(111)
self.ax.set_position([0.01,0.01,.99,.99])
self.ax.set_xticks([]) self.ax.set_xticks([])
self.ax.set_yticks([]) self.ax.set_yticks([])
self.ax.grid(False)
# FIXME: ax shouldn't be in kw at all # FIXME: ax shouldn't be in kw at all
if kw.has_key('ax'): if kw.has_key('ax'):
kw.pop('ax') kw.pop('ax')
@ -760,11 +812,13 @@ class NetworkPlot(Plot):
# Initial draw # Initial draw
networkx.draw_networkx(self.graph, ax=self.ax, **kw) networkx.draw_networkx(self.graph, ax=self.ax, **kw)
print "Current dim is now: %s" %self.current_dim
def get_toolbar(self): def get_toolbar(self):
return self._toolbar return self._toolbar
def rectangle_select_callback(self, x1, y1, x2, y2): def rectangle_select_callback(self, x1, y1, x2, y2):
print "In select callbak, current dim is now: %s" %self.current_dim
pos = self.keywords['pos'] pos = self.keywords['pos']
ydata = scipy.zeros((len(pos),), 'l') ydata = scipy.zeros((len(pos),), 'l')
xdata = scipy.zeros((len(pos),), 'l') xdata = scipy.zeros((len(pos),), 'l')
@ -782,9 +836,10 @@ class NetworkPlot(Plot):
if y1 > y2: if y1 > y2:
y1, y2 = y2, y1 y1, y2 = y2, y1
index = scipy.nonzero((xdata>x1) & (xdata<x2) & (ydata>y1) & (ydata<y2))[0] index = scipy.nonzero((xdata>x1) & (xdata<x2) & (ydata>y1) & (ydata<y2))[0]
ids = [node_ids[i] for i in index] ids = [node_ids[i] for i in index]
print "Updating listener from network with dim: %s" %self.current_dim
print "ids: "
print ids
self.selection_listener(self.current_dim, ids) self.selection_listener(self.current_dim, ids)
def set_current_selection(self, selection): def set_current_selection(self, selection):
@ -797,23 +852,28 @@ class NetworkPlot(Plot):
if self.node_color: if self.node_color:
unselected_colors = [self.node_color[x] for x in unselected_nodes] unselected_colors = [self.node_color[x] for x in unselected_nodes]
else: else:
unselected_colors = 'red' unselected_colors = 'gray'
if self.node_size: if self.node_size:
unselected_sizes = [self.node_size[x] for x in unselected_nodes] unselected_sizes = [self.node_size[x] for x in unselected_nodes]
selected_sizes = [self.node_size[x] for x in selected_nodes] selected_sizes = [self.node_size[x] for x in selected_nodes]
self.ax.clear() self.ax.collections=[]
networkx.draw_networkx_edges(self.graph, edge_list=self.graph.edges(), \ networkx.draw_networkx_edges(self.graph,
ax=self.ax, **self.keywords) edge_list=self.graph.edges(),
ax=self.ax,
**self.keywords)
networkx.draw_networkx_labels(self.graph,**self.keywords) networkx.draw_networkx_labels(self.graph,**self.keywords)
if unselected_nodes: if unselected_nodes:
networkx.draw_networkx_nodes(self.graph, nodelist=unselected_nodes, \ networkx.draw_networkx_nodes(self.graph, nodelist=unselected_nodes, \
node_color='r', node_size=unselected_sizes, ax=self.ax, **self.keywords) node_color='gray', node_size=unselected_sizes, ax=self.ax, **self.keywords)
if selected_nodes: if selected_nodes:
networkx.draw_networkx_nodes(self.graph, nodelist=selected_nodes, \ networkx.draw_networkx_nodes(self.graph, nodelist=selected_nodes, \
node_color='k', node_size=selected_sizes, ax=self.ax, **self.keywords) node_color='r', node_size=selected_sizes, ax=self.ax, **self.keywords)
self.ax.collections[-1].set_zorder(3)
self.canvas.draw() self.canvas.draw()