def tree(tr, plane='xy', new_fig=True, subplot=False, **kwargs): '''Generates a 2d figure of the tree. Parameters: tr: Tree \ neurom.Tree object Options: plane: str \ Accepted values: Any pair of of xyz \ Default value is 'xy'.treecolor linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. limits: list or boolean \ List of type: [[xmin, ymin, zmin], [xmax, ymax, zmax]] \ If False the figure will not be scaled. \ If True the figure will be scaled according to tree limits. \ Default value is False. white_space: float \ Defines the white space around \ the boundary box of the morphology. \ Default value is 1. Returns: A 2D matplotlib figure with a tree view, at the selected plane. ''' if plane not in ('xy', 'yx', 'xz', 'zx', 'yz', 'zy'): return None, 'No such plane found! Please select one of: xy, xz, yx, yz, zx, zy.' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, subplot=subplot) # Data needed for the viewer: x,y,z,r bounding_box = get_bounding_box(tr) def _seg_2d(seg): '''2d coordinates needed for the plotting of a segment''' horz = getattr(COLS, plane[0].capitalize()) vert = getattr(COLS, plane[1].capitalize()) parent_point = seg[0] child_point = seg[1] horz1 = parent_point[horz] horz2 = child_point[horz] vert1 = parent_point[vert] vert2 = child_point[vert] return ((horz1, vert1), (horz2, vert2)) segs = [_seg_2d(seg) for seg in val_iter(isegment(tr))] linewidth = get_default('linewidth', **kwargs) # Definition of the linewidth according to diameter, if diameter is True. if get_default('diameter', **kwargs): scale = get_default('diameter_scale', **kwargs) # TODO: This was originally a numpy array. Did it have to be one? linewidth = [2 * d * scale for d in i_segment_radius(tr)] # Plot the collection of lines. collection = LineCollection(segs, color=common.get_color(get_default('treecolor', **kwargs), get_tree_type(tr)), linewidth=linewidth, alpha=get_default('alpha', **kwargs)) ax.add_collection(collection) kwargs['title'] = kwargs.get('title', 'Tree view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) kwargs['xlim'] = kwargs.get('xlim', [bounding_box[0][getattr(COLS, plane[0].capitalize())] - get_default('white_space', **kwargs), bounding_box[1][getattr(COLS, plane[0].capitalize())] + get_default('white_space', **kwargs)]) kwargs['ylim'] = kwargs.get('ylim', [bounding_box[0][getattr(COLS, plane[1].capitalize())] - get_default('white_space', **kwargs), bounding_box[1][getattr(COLS, plane[1].capitalize())] + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def tree3d(tr, new_fig=True, new_axes=True, subplot=False, **kwargs): '''Generates a figure of the tree in 3d. Parameters: tr: Tree neurom.Tree object Options: linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. white_space: float \ Defines the white space around \ the boundary box of the morphology. \ Default value is 1. Returns: A 3D matplotlib figure with a tree view. ''' from mpl_toolkits.mplot3d.art3d import Line3DCollection # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={'projection': '3d'}) # Data needed for the viewer: x,y,z,r bounding_box = get_bounding_box(tr) def _seg_3d(seg): '''2d coordinates needed for the plotting of a segment''' horz = getattr(COLS, 'X') vert = getattr(COLS, 'Y') depth = getattr(COLS, 'Z') parent_point = seg[0] child_point = seg[1] horz1 = parent_point[horz] horz2 = child_point[horz] vert1 = parent_point[vert] vert2 = child_point[vert] depth1 = parent_point[depth] depth2 = child_point[depth] return ((horz1, vert1, depth1), (horz2, vert2, depth2)) segs = [_seg_3d(seg) for seg in val_iter(isegment(tr))] linewidth = get_default('linewidth', **kwargs) # Definition of the linewidth according to diameter, if diameter is True. if get_default('diameter', **kwargs): # TODO: This was originally a numpy array. Did it have to be one? linewidth = [2 * d * get_default('diameter_scale', **kwargs) for d in i_segment_radius(tr)] # Plot the collection of lines. collection = Line3DCollection(segs, color=common.get_color(get_default('treecolor', **kwargs), get_tree_type(tr)), linewidth=linewidth, alpha=get_default('alpha', **kwargs)) ax.add_collection3d(collection) kwargs['title'] = kwargs.get('title', 'Tree 3d-view') kwargs['xlabel'] = kwargs.get('xlabel', 'X') kwargs['ylabel'] = kwargs.get('ylabel', 'Y') kwargs['zlabel'] = kwargs.get('zlabel', 'Z') kwargs['xlim'] = kwargs.get('xlim', [bounding_box[0][0] - get_default('white_space', **kwargs), bounding_box[1][0] + get_default('white_space', **kwargs)]) kwargs['ylim'] = kwargs.get('ylim', [bounding_box[0][1] - get_default('white_space', **kwargs), bounding_box[1][1] + get_default('white_space', **kwargs)]) kwargs['zlim'] = kwargs.get('zlim', [bounding_box[0][2] - get_default('white_space', **kwargs), bounding_box[1][2] + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def neuron3d(nrn, new_fig=True, new_axes=True, subplot=False, **kwargs): '''Generates a figure of the neuron, that contains a soma and a list of trees. Parameters: neuron: Neuron neurom.Neuron object Options: linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. Returns: A 3D matplotlib figure with a neuron view. ''' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={'projection': '3d'}) kwargs['new_fig'] = False kwargs['subplot'] = subplot kwargs['new_axes'] = False kwargs['title'] = kwargs.get('title', 'Neuron view') soma3d(nrn.soma, **kwargs) h = [] v = [] d = [] for temp_tree in nrn.neurites: bounding_box = get_bounding_box(temp_tree) h.append([bounding_box[0][getattr(COLS, 'X')], bounding_box[1][getattr(COLS, 'X')]]) v.append([bounding_box[0][getattr(COLS, 'Y')], bounding_box[1][getattr(COLS, 'Y')]]) d.append([bounding_box[0][getattr(COLS, 'Z')], bounding_box[1][getattr(COLS, 'Z')]]) tree3d(temp_tree, **kwargs) if h: kwargs['xlim'] = kwargs.get('xlim', [np.min(h) - get_default('white_space', **kwargs), np.max(h) + get_default('white_space', **kwargs)]) if v: kwargs['ylim'] = kwargs.get('ylim', [np.min(v) - get_default('white_space', **kwargs), np.max(v) + get_default('white_space', **kwargs)]) if d: kwargs['zlim'] = kwargs.get('zlim', [np.min(d) - get_default('white_space', **kwargs), np.max(d) + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def test_get_bounding_box(): box = np.array([[-33.25305769, -57.600172 , 0. ], [ 0. , 0. , 49.70137991]]) bb = get_bounding_box(tree0) nt.ok_(np.allclose(bb, box))
def neuron(nrn, plane='xy', new_fig=True, subplot=False, **kwargs): '''Generates a 2d figure of the neuron, that contains a soma and a list of trees. Parameters: neuron: Neuron neurom.Neuron object Options: plane: str \ Accepted values: Any pair of of xyz \ Default value is 'xy'.treecolor linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. limits: list or boolean \ List of type: [[xmin, ymin, zmin], [xmax, ymax, zmax]] \ If False the figure will not be scaled. \ If True the figure will be scaled according to tree limits. \ Default value is False. Returns: A 3D matplotlib figure with a tree view, at the selected plane. ''' if plane not in ('xy', 'yx', 'xz', 'zx', 'yz', 'zy'): return None, 'No such plane found! Please select one of: xy, xz, yx, yz, zx, zy.' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, subplot=subplot) kwargs['new_fig'] = False kwargs['subplot'] = subplot soma(nrn.soma, plane=plane, **kwargs) kwargs['title'] = kwargs.get('title', 'Neuron view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) h = [] v = [] for temp_tree in nrn.neurites: bounding_box = get_bounding_box(temp_tree) h.append([bounding_box[0][getattr(COLS, plane[0].capitalize())], bounding_box[1][getattr(COLS, plane[0].capitalize())]]) v.append([bounding_box[0][getattr(COLS, plane[1].capitalize())], bounding_box[1][getattr(COLS, plane[1].capitalize())]]) tree(temp_tree, plane=plane, **kwargs) if h: kwargs['xlim'] = kwargs.get('xlim', [np.min(h) - get_default('white_space', **kwargs), np.max(h) + get_default('white_space', **kwargs)]) if v: kwargs['ylim'] = kwargs.get('ylim', [np.min(v) - get_default('white_space', **kwargs), np.max(v) + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def tree(tr, plane='xy', new_fig=True, subplot=False, **kwargs): ''' Generates a 2d figure of the tree's segments. \ If the tree contains one single point the plot will be empty \ since no segments can be constructed. Parameters: tr: Tree \ neurom.Tree object plane: str \ Accepted values: Any pair of of xyz \ Default value is 'xy'.treecolor linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. limits: list or boolean \ List of type: [[xmin, ymin, zmin], [xmax, ymax, zmax]] \ If False the figure will not be scaled. \ If True the figure will be scaled according to tree limits. \ Default value is False. white_space: float \ Defines the white space around \ the boundary box of the morphology. \ Default value is 1. Returns: A 2D matplotlib figure with a tree view, at the selected plane. ''' if plane not in ('xy', 'yx', 'xz', 'zx', 'yz', 'zy'): return None, 'No such plane found! Please select one of: xy, xz, yx, yz, zx, zy.' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, subplot=subplot) # Data needed for the viewer: x,y,z,r bounding_box = get_bounding_box(tr) def _seg_2d(seg): '''2d coordinates needed for the plotting of a segment''' horz = getattr(COLS, plane[0].capitalize()) vert = getattr(COLS, plane[1].capitalize()) parent_point = seg[0] child_point = seg[1] horz1 = parent_point[horz] horz2 = child_point[horz] vert1 = parent_point[vert] vert2 = child_point[vert] return ((horz1, vert1), (horz2, vert2)) segs = [_seg_2d(seg) for seg in val_iter(isegment(tr))] linewidth = get_default('linewidth', **kwargs) # Definition of the linewidth according to diameter, if diameter is True. if get_default('diameter', **kwargs): scale = get_default('diameter_scale', **kwargs) # TODO: This was originally a numpy array. Did it have to be one? linewidth = [2 * d * scale for d in iter_neurites(tr, segment_radius)] if len(linewidth) == 0: linewidth = get_default('linewidth', **kwargs) # Plot the collection of lines. collection = LineCollection(segs, color=common.get_color(get_default('treecolor', **kwargs), get_tree_type(tr)), linewidth=linewidth, alpha=get_default('alpha', **kwargs)) ax.add_collection(collection) kwargs['title'] = kwargs.get('title', 'Tree view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) kwargs['xlim'] = kwargs.get('xlim', [bounding_box[0][getattr(COLS, plane[0].capitalize())] - get_default('white_space', **kwargs), bounding_box[1][getattr(COLS, plane[0].capitalize())] + get_default('white_space', **kwargs)]) kwargs['ylim'] = kwargs.get('ylim', [bounding_box[0][getattr(COLS, plane[1].capitalize())] - get_default('white_space', **kwargs), bounding_box[1][getattr(COLS, plane[1].capitalize())] + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def neuron3d(nrn, new_fig=True, new_axes=True, subplot=False, **kwargs): ''' Generates a figure of the neuron, that contains a soma and a list of trees. Parameters: neuron: Neuron \ neurom.Neuron object linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. Returns: A 3D matplotlib figure with a neuron view. ''' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={'projection': '3d'}) kwargs['new_fig'] = False kwargs['subplot'] = subplot kwargs['new_axes'] = False kwargs['title'] = kwargs.get('title', 'Neuron view') soma3d(nrn.soma, **kwargs) h = [] v = [] d = [] for temp_tree in nrn.neurites: bounding_box = get_bounding_box(temp_tree) h.append([bounding_box[0][getattr(COLS, 'X')], bounding_box[1][getattr(COLS, 'X')]]) v.append([bounding_box[0][getattr(COLS, 'Y')], bounding_box[1][getattr(COLS, 'Y')]]) d.append([bounding_box[0][getattr(COLS, 'Z')], bounding_box[1][getattr(COLS, 'Z')]]) tree3d(temp_tree, **kwargs) if h: kwargs['xlim'] = kwargs.get('xlim', [np.min(h) - get_default('white_space', **kwargs), np.max(h) + get_default('white_space', **kwargs)]) if v: kwargs['ylim'] = kwargs.get('ylim', [np.min(v) - get_default('white_space', **kwargs), np.max(v) + get_default('white_space', **kwargs)]) if d: kwargs['zlim'] = kwargs.get('zlim', [np.min(d) - get_default('white_space', **kwargs), np.max(d) + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def tree3d(tr, new_fig=True, new_axes=True, subplot=False, **kwargs): ''' Generates a figure of the tree in 3d. If the tree contains one single point the plot will be empty \ since no segments can be constructed. Parameters: tr: Tree \ neurom.Tree object linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean \ If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. white_space: float \ Defines the white space around \ the boundary box of the morphology. \ Default value is 1. Returns: A 3D matplotlib figure with a tree view. ''' from mpl_toolkits.mplot3d.art3d import Line3DCollection # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={'projection': '3d'}) # Data needed for the viewer: x,y,z,r bounding_box = get_bounding_box(tr) def _seg_3d(seg): '''2d coordinates needed for the plotting of a segment''' horz = getattr(COLS, 'X') vert = getattr(COLS, 'Y') depth = getattr(COLS, 'Z') parent_point = seg[0] child_point = seg[1] horz1 = parent_point[horz] horz2 = child_point[horz] vert1 = parent_point[vert] vert2 = child_point[vert] depth1 = parent_point[depth] depth2 = child_point[depth] return ((horz1, vert1, depth1), (horz2, vert2, depth2)) segs = [_seg_3d(seg) for seg in val_iter(isegment(tr))] linewidth = get_default('linewidth', **kwargs) # Definition of the linewidth according to diameter, if diameter is True. if get_default('diameter', **kwargs): # TODO: This was originally a numpy array. Did it have to be one? linewidth = [2 * d * get_default('diameter_scale', **kwargs) for d in iter_neurites(tr, segment_radius)] if len(linewidth) == 0: linewidth = get_default('linewidth', **kwargs) # Plot the collection of lines. collection = Line3DCollection(segs, color=common.get_color(get_default('treecolor', **kwargs), get_tree_type(tr)), linewidth=linewidth, alpha=get_default('alpha', **kwargs)) ax.add_collection3d(collection) kwargs['title'] = kwargs.get('title', 'Tree 3d-view') kwargs['xlabel'] = kwargs.get('xlabel', 'X') kwargs['ylabel'] = kwargs.get('ylabel', 'Y') kwargs['zlabel'] = kwargs.get('zlabel', 'Z') kwargs['xlim'] = kwargs.get('xlim', [bounding_box[0][0] - get_default('white_space', **kwargs), bounding_box[1][0] + get_default('white_space', **kwargs)]) kwargs['ylim'] = kwargs.get('ylim', [bounding_box[0][1] - get_default('white_space', **kwargs), bounding_box[1][1] + get_default('white_space', **kwargs)]) kwargs['zlim'] = kwargs.get('zlim', [bounding_box[0][2] - get_default('white_space', **kwargs), bounding_box[1][2] + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def neuron(nrn, plane='xy', new_fig=True, subplot=False, **kwargs): ''' Generates a 2d figure of the neuron, \ that contains a soma and a list of trees. Parameters: neuron: Neuron \ neurom.Neuron object plane: str \ Accepted values: Any pair of of xyz \ Default value is 'xy'.treecolor linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. limits: list or boolean \ List of type: [[xmin, ymin, zmin], [xmax, ymax, zmax]] \ If False the figure will not be scaled. \ If True the figure will be scaled according to tree limits. \ Default value is False. Returns: A 3D matplotlib figure with a tree view, at the selected plane. ''' if plane not in ('xy', 'yx', 'xz', 'zx', 'yz', 'zy'): return None, 'No such plane found! Please select one of: xy, xz, yx, yz, zx, zy.' # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, subplot=subplot) kwargs['new_fig'] = False kwargs['subplot'] = subplot soma(nrn.soma, plane=plane, **kwargs) kwargs['title'] = kwargs.get('title', 'Neuron view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) h = [] v = [] for temp_tree in nrn.neurites: bounding_box = get_bounding_box(temp_tree) h.append([bounding_box[0][getattr(COLS, plane[0].capitalize())], bounding_box[1][getattr(COLS, plane[0].capitalize())]]) v.append([bounding_box[0][getattr(COLS, plane[1].capitalize())], bounding_box[1][getattr(COLS, plane[1].capitalize())]]) tree(temp_tree, plane=plane, **kwargs) if h: kwargs['xlim'] = kwargs.get('xlim', [np.min(h) - get_default('white_space', **kwargs), np.max(h) + get_default('white_space', **kwargs)]) if v: kwargs['ylim'] = kwargs.get('ylim', [np.min(v) - get_default('white_space', **kwargs), np.max(v) + get_default('white_space', **kwargs)]) return common.plot_style(fig=fig, ax=ax, **kwargs)
def tree3d(tr, new_fig=True, new_axes=True, subplot=False, **kwargs): """Generates a figure of the tree in 3d. Parameters: tr: Tree neurom.Tree object Options: linewidth: float \ Defines the linewidth of the tree, \ if diameter is set to False. \ Default value is 1.2. alpha: float \ Defines throughe transparency of the tree. \ 0.0 transparent through 1.0 opaque. \ Default value is 0.8. treecolor: str or None \ Defines the color of the tree. \ If None the default values will be used, \ depending on the type of tree: \ Basal dendrite: "red" \ Axon : "blue" \ Apical dendrite: "purple" \ Undefined tree: "black" \ Default value is None. new_fig: boolean \ Defines if the tree will be plotted \ in the current figure (False) \ or in a new figure (True) \ Default value is True. subplot: matplotlib subplot value or False \ If False the default subplot 111 will be used. \ For any other value a matplotlib subplot \ will be generated. \ Default value is False. diameter: boolean If True the diameter, scaled with diameter_scale factor, \ will define the width of the tree lines. \ If False use linewidth to select the width of the tree lines. \ Default value is True. diameter_scale: float \ Defines the scale factor that will be multiplied \ with the diameter to define the width of the tree line. \ Default value is 1. white_space: float \ Defines the white space around \ the boundary box of the morphology. \ Default value is 1. Returns: A 3D matplotlib figure with a tree view. """ from mpl_toolkits.mplot3d.art3d import Line3DCollection # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={"projection": "3d"}) # Data needed for the viewer: x,y,z,r bounding_box = get_bounding_box(tr) def _seg_3d(seg): """2d coordinates needed for the plotting of a segment""" horz = getattr(COLS, "X") vert = getattr(COLS, "Y") depth = getattr(COLS, "Z") parent_point = seg[0] child_point = seg[1] horz1 = parent_point[horz] horz2 = child_point[horz] vert1 = parent_point[vert] vert2 = child_point[vert] depth1 = parent_point[depth] depth2 = child_point[depth] return ((horz1, vert1, depth1), (horz2, vert2, depth2)) segs = [_seg_3d(seg) for seg in val_iter(isegment(tr))] linewidth = get_default("linewidth", **kwargs) # Definition of the linewidth according to diameter, if diameter is True. if get_default("diameter", **kwargs): # TODO: This was originally a numpy array. Did it have to be one? linewidth = [2 * d * get_default("diameter_scale", **kwargs) for d in i_segment_radius(tr)] # Plot the collection of lines. collection = Line3DCollection( segs, color=common.get_color(get_default("treecolor", **kwargs), get_tree_type(tr)), linewidth=linewidth, alpha=get_default("alpha", **kwargs), ) ax.add_collection3d(collection) kwargs["title"] = kwargs.get("title", "Tree 3d-view") kwargs["xlabel"] = kwargs.get("xlabel", "X") kwargs["ylabel"] = kwargs.get("ylabel", "Y") kwargs["zlabel"] = kwargs.get("zlabel", "Z") kwargs["xlim"] = kwargs.get( "xlim", [ bounding_box[0][0] - get_default("white_space", **kwargs), bounding_box[1][0] + get_default("white_space", **kwargs), ], ) kwargs["ylim"] = kwargs.get( "ylim", [ bounding_box[0][1] - get_default("white_space", **kwargs), bounding_box[1][1] + get_default("white_space", **kwargs), ], ) kwargs["zlim"] = kwargs.get( "zlim", [ bounding_box[0][2] - get_default("white_space", **kwargs), bounding_box[1][2] + get_default("white_space", **kwargs), ], ) return common.plot_style(fig=fig, ax=ax, **kwargs)