HistogramWidget.py 4.53 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar  3 13:47:39 2020

@author: pavel
"""

from PyQt5 import QtCore, QtGui, QtWidgets
import network_dep as nwt
import vispy.plot as vp
#import vispy.scene.visuals. as Histogram
from vispy.scene.visuals import Histogram as Histogram

import numpy as np

DEBUG = False


class HistogramWidget(QtWidgets.QWidget):
    def __init__(self):
        super(HistogramWidget, self).__init__()
        box = QtWidgets.QVBoxLayout(self)
        self.resize(500,500)
        self.setLayout(box)
        self.canvas = vp.Fig(show=False)
        self.hist = self.canvas[0, 0].histogram(np.random.rand(100))
        
        #data = np.random.rand(100)
        #self.canvas[0, 0].histogram(data)
        #self.canvas = Histogram()
        self.setUpdatesEnabled(True)
        box.addWidget(self.canvas.native)
        self.G = None
        
        self.canvas.events.mouse_press.connect(self.on_mouse_press)
        #self.canvas.events.mouse_release.connect(self.on_mouse_release)
        #self.canvas.events.mouse_move.connect(self.on_mouse_move)
        #self.canvas.events.mouse_double_click.connect(self.on_mouse_double_click)
        self.current_color = 'clusters'
        
    def on_mouse_press(self, event):
        print("mouse_press")
        if event.button == 2:
            menu = QtWidgets.QMenu(self)
            tmp = menu.addMenu('Histogram Metric')
            edge_properties = self.G.edge_properties.keys()
            edge_actions = []
            for i in range(len(edge_properties)):
                if(edge_properties[i] != "map" or edge_properties[i] != "RGBA"):
                    edge_actions.append(tmp.addAction(edge_properties[i]))
            
            action = menu.exec_(event.native.globalPos())
            for i in range(len(edge_actions)):
                if action == edge_actions[i]:
                    self.set_data(prop=edge_properties[i])
                                   
        print("mouse_press")
        
    def on_mouse_double_click(self, event):
        print("mouse_double")
        
    def on_mouse_release(self, event):
        print("mouse_release")
        
    def on_mouse_move(self, event):
        print("mouse_move")
        
    def set_Graph(self, G):
        self.G = G
        #self.canvas[0, 0].histogram(np.random.rand(10))
        self.set_data()
    
    def gen_mesh(self, data, bins=10, orientation='h'):
        
        data = np.asarray(data)
        if data.ndim != 1:
            raise ValueError('Only 1D data currently supported')
        X, Y = (0, 1) if orientation == 'h' else (1, 0)

        # do the histogramming
        data, bin_edges = np.histogram(data, bins)
        # construct our vertices
        rr = np.zeros((3 * len(bin_edges) - 2, 3), np.float32)
        rr[:, X] = np.repeat(bin_edges, 3)[1:-1]
        rr[1::3, Y] = data
        rr[2::3, Y] = data
        bin_edges.astype(np.float32)
        # and now our tris
        tris = np.zeros((2 * len(bin_edges) - 2, 3), np.uint32)
        offsets = 3 * np.arange(len(bin_edges) - 1,
                                dtype=np.uint32)[:, np.newaxis]
        tri_1 = np.array([0, 2, 1])
        tri_2 = np.array([2, 0, 3])
        tris[::2] = tri_1 + offsets
        tris[1::2] = tri_2 + offsets
        
        return rr, tris
        
    
    def set_data(self, prop = 'length'):
        #self.canvas = vp.Fig(show=False)
        #, xlabel=prop, ylabel='#'
        #self.canvas.clear()
        #self.canvas[0, 0]._configured = False
        p = self.G.ep[prop].get_array().T
        self.canvas.bgcolor = 'w'
        rr, tris = self.gen_mesh(p)
        self.hist.set_data(rr, tris, color = 'b')
        #self.canvas.context.clear(color='w', depth=True)
        #self.canvas.central_widget().context.clear(color='w', depth=True)
    
        self.canvas[0, 0].xlabel.text = prop
        self.canvas[0, 0].ylabel.text = '# of occurances'
        self.canvas[0, 0].title.text = 'edge property distribution'
        for hist, pwidget in zip([self.hist], self.canvas.plot_widgets):
            #x_data = hist._line.pos[:, 0]
            #y_data = hist._line.pos[:, 1]
            #print(hist._bounds, hist._bounds[:, 0], hist._bounds[:, 1])
            x_range = hist._bounds[0][0], hist._bounds[0][1]
            y_range = hist._bounds[1][0], hist._bounds[1][1]
            
            
            pwidget.view.camera.set_range(x=x_range, y=y_range)
        #self.canvas[0, 0]._configured = False
        #self.canvas[0, 0].histogram(p, color = 'b')
        self.canvas.update()
        self.canvas.show()