def _draw_trees(self): self.grid_items, self.ptrees = [], [] num_trees = len(self.forest_adapter.get_trees()) with self.progressBar(num_trees) as prg, self.disable_ui(): for tree in self.forest_adapter.get_trees(): ptree = PythagorasTreeViewer( None, tree, interactive=False, padding=100, target_class_index=self.target_class_index, weight_adjustment=self.SIZE_CALCULATION[ self.size_calc_idx][1]) grid_item = GridItem(ptree, self.grid, max_size=self._calculate_zoom(self.zoom)) # We don't want to show flickering while the trees are being grid_item.setVisible(False) self.grid_items.append(grid_item) self.ptrees.append(ptree) prg.advance() self.grid.set_items(self.grid_items) # This is necessary when adding items for the first time if self.grid: width = (self.view.width() - self.view.verticalScrollBar().width()) self.grid.reflow(width) self.grid.setPreferredWidth(width) # After drawing is complete, we show the trees for grid_item in self.grid_items: grid_item.setVisible(True)
def data(self, index, role=Qt.DisplayRole): # type: (QModelIndex, Qt.QDisplayRole) -> Any if not index.isValid(): return None idx = index.row() if role == Qt.SizeHintRole: return self.item_scale * QSize(100, 100) if role == Qt.DisplayRole: if 'tree' not in self._other_data[idx]: scene = QGraphicsScene(parent=self) tree = PythagorasTreeViewer( adapter=self._list[idx], weight_adjustment=OWPythagoreanForest.SIZE_CALCULATION[ self.size_calc_idx][1], interactive=False, padding=100, depth_limit=self.depth_limit, target_class_index=self.target_class_idx, ) scene.addItem(tree) self._other_data[idx]['scene'] = scene self._other_data[idx]['tree'] = tree return self._other_data[idx]['scene'] return super().data(index, role)
def _draw_trees(self): self.ui_size_calc_combo.setEnabled(False) self.grid_items, self.ptrees = [], [] with self.progressBar(len(self.forest_adapter.get_trees())) as prg: for tree in self.forest_adapter.get_trees(): ptree = PythagorasTreeViewer( None, tree, node_color_func=self._type_specific('_get_node_color'), interactive=False, padding=100) self.grid_items.append( GridItem(ptree, self.grid, max_size=self._calculate_zoom(self.zoom))) self.ptrees.append(ptree) prg.advance() self.grid.set_items(self.grid_items) # This is necessary when adding items for the first time if self.grid: width = (self.view.width() - self.view.verticalScrollBar().width()) self.grid.reflow(width) self.grid.setPreferredWidth(width) self.ui_size_calc_combo.setEnabled(True)
def __init__(self): super().__init__() # Instance variables self.model = None self.instances = None self.clf_dataset = None # The tree adapter instance which is passed from the outside self.tree_adapter = None self.legend = None self.color_palette = None # Different methods to calculate the size of squares self.SIZE_CALCULATION = [ ('Normal', lambda x: x), ('Square root', lambda x: sqrt(x)), ('Logarithmic', lambda x: log(x * self.size_log_scale + 1)), ] # CONTROL AREA # Tree info area box_info = gui.widgetBox(self.controlArea, 'Tree Info') self.info = gui.widgetLabel(box_info) # Display settings area box_display = gui.widgetBox(self.controlArea, 'Display Settings') self.depth_slider = gui.hSlider(box_display, self, 'depth_limit', label='Depth', ticks=False, callback=self.update_depth) self.target_class_combo = gui.comboBox(box_display, self, 'target_class_index', label='Target class', orientation=Qt.Horizontal, items=[], contentsLength=8, callback=self.update_colors) self.size_calc_combo = gui.comboBox( box_display, self, 'size_calc_idx', label='Size', orientation=Qt.Horizontal, items=list(zip(*self.SIZE_CALCULATION))[0], contentsLength=8, callback=self.update_size_calc) self.log_scale_box = gui.hSlider(box_display, self, 'size_log_scale', label='Log scale factor', minValue=1, maxValue=100, ticks=False, callback=self.invalidate_tree) # Plot properties area box_plot = gui.widgetBox(self.controlArea, 'Plot Properties') self.cb_show_tooltips = gui.checkBox( box_plot, self, 'tooltips_enabled', label='Enable tooltips', callback=self.update_tooltip_enabled) self.cb_show_legend = gui.checkBox(box_plot, self, 'show_legend', label='Show legend', callback=self.update_show_legend) gui.button(self.controlArea, self, label="Redraw", callback=self.redraw) # Stretch to fit the rest of the unsused area gui.rubber(self.controlArea) self.controlArea.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) # MAIN AREA self.scene = TreeGraphicsScene(self) self.scene.selectionChanged.connect(self.commit) self.view = TreeGraphicsView(self.scene, padding=(150, 150)) self.view.setRenderHint(QPainter.Antialiasing, True) self.mainArea.layout().addWidget(self.view) self.ptree = PythagorasTreeViewer(self) self.scene.addItem(self.ptree) self.view.set_central_widget(self.ptree) self.resize(800, 500) # Clear the widget to correctly set the intial values self.clear()
def __init__(self): super().__init__() # Instance variables self.tree_type = self.GENERAL self.model = None self.instances = None self.clf_dataset = None # The tree adapter instance which is passed from the outside self.tree_adapter = None self.legend = None self.color_palette = None # Different methods to calculate the size of squares self.SIZE_CALCULATION = [ ('Normal', lambda x: x), ('Square root', lambda x: sqrt(x)), # The +1 is there so that we don't get division by 0 exceptions ('Logarithmic', lambda x: log(x * self.size_log_scale + 1)), ] # Color modes for regression trees self.REGRESSION_COLOR_CALC = [ ('None', lambda _, __: QtGui.QColor(255, 255, 255)), ('Class mean', self._color_class_mean), ('Standard deviation', self._color_stddev), ] # CONTROL AREA # Tree info area box_info = gui.widgetBox(self.controlArea, 'Tree Info') self.info = gui.widgetLabel(box_info) # Display settings area box_display = gui.widgetBox(self.controlArea, 'Display Settings') self.depth_slider = gui.hSlider( box_display, self, 'depth_limit', label='Depth', ticks=False, callback=self.update_depth) self.target_class_combo = gui.comboBox( box_display, self, 'target_class_index', label='Target class', orientation='horizontal', items=[], contentsLength=8, callback=self.update_colors) self.size_calc_combo = gui.comboBox( box_display, self, 'size_calc_idx', label='Size', orientation='horizontal', items=list(zip(*self.SIZE_CALCULATION))[0], contentsLength=8, callback=self.update_size_calc) self.log_scale_box = gui.hSlider( box_display, self, 'size_log_scale', label='Log scale factor', minValue=1, maxValue=100, ticks=False, callback=self.invalidate_tree) # Plot properties area box_plot = gui.widgetBox(self.controlArea, 'Plot Properties') gui.checkBox( box_plot, self, 'tooltips_enabled', label='Enable tooltips', callback=self.update_tooltip_enabled) gui.checkBox( box_plot, self, 'show_legend', label='Show legend', callback=self.update_show_legend) # Stretch to fit the rest of the unsused area gui.rubber(self.controlArea) self.controlArea.setSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) # MAIN AREA # The QGraphicsScene doesn't actually require a parent, but not linking # the widget to the scene causes errors and a segfault on close due to # the way Qt deallocates memory and deletes objects. self.scene = TreeGraphicsScene(self) self.scene.selectionChanged.connect(self.commit) self.view = TreeGraphicsView(self.scene, padding=(150, 150)) self.view.setRenderHint(QtGui.QPainter.Antialiasing, True) self.mainArea.layout().addWidget(self.view) self.ptree = PythagorasTreeViewer() self.scene.addItem(self.ptree) self.view.set_central_widget(self.ptree) self.resize(800, 500) # Clear the widget to correctly set the intial values self.clear()
def __init__(self): super().__init__() # Instance variables self.model = None self.data = None # The tree adapter instance which is passed from the outside self.tree_adapter = None self.legend = None self.color_palette = None # Different methods to calculate the size of squares self.SIZE_CALCULATION = [ ("Normal", lambda x: x, "正常"), ("Square root", lambda x: sqrt(x), "平方根"), ("Logarithmic", lambda x: log(x * self.size_log_scale + 1), "对数"), ] # CONTROL AREA # Tree info area box_info = gui.widgetBox(self.controlArea, "树信息") self.infolabel = gui.widgetLabel(box_info) # Display settings area box_display = gui.widgetBox(self.controlArea, "显示设置") # maxValue is set to a wide three-digit number to probably ensure the # proper label width. The maximum is later set to match the tree depth self.depth_slider = gui.hSlider( box_display, self, "depth_limit", label="深度", ticks=False, maxValue=900, callback=self.update_depth, ) self.target_class_combo = gui.comboBox( box_display, self, "target_class_index", label="目标类别", orientation=Qt.Horizontal, items=[], contentsLength=8, searchable=True, callback=self.update_colors, ) self.size_calc_combo = gui.comboBox( box_display, self, "size_calc_idx", label="大小", orientation=Qt.Horizontal, items=list(zip(*self.SIZE_CALCULATION))[2], contentsLength=8, callback=self.update_size_calc, ) self.log_scale_box = gui.hSlider( box_display, self, "size_log_scale", label="对数比例因子", minValue=1, maxValue=100, ticks=False, callback=self.invalidate_tree, ) # Plot properties area box_plot = gui.widgetBox(self.controlArea, "绘图属性") self.cb_show_tooltips = gui.checkBox( box_plot, self, "tooltips_enabled", label="启动工具提示", callback=self.update_tooltip_enabled, ) self.cb_show_legend = gui.checkBox( box_plot, self, "show_legend", label="显示图例", callback=self.update_show_legend, ) gui.rubber(self.controlArea) gui.button(self.buttonsArea, self, label="重新绘制", callback=self.redraw) self.controlArea.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) # MAIN AREA self.scene = TreeGraphicsScene(self) self.scene.selectionChanged.connect(self.commit) self.view = TreeGraphicsView(self.scene, padding=(150, 150)) self.view.setRenderHint(QPainter.Antialiasing, True) self.mainArea.layout().addWidget(self.view) self.ptree = PythagorasTreeViewer(self) self.scene.addItem(self.ptree) self.view.set_central_widget(self.ptree) self.resize(800, 500) # Clear the widget to correctly set the intial values self.clear()