def test_get_color(): nt.ok_(get_color(None, TreeType.basal_dendrite) == "red") nt.ok_(get_color(None, TreeType.axon) == "blue") nt.ok_(get_color(None, TreeType.apical_dendrite) == "purple") nt.ok_(get_color(None, TreeType.soma) == "black") nt.ok_(get_color(None, TreeType.undefined) == "green") nt.ok_(get_color(None, 'wrong') == "green") nt.ok_(get_color('blue', 'wrong') == "blue") nt.ok_(get_color('yellow', TreeType.axon) == "yellow")
def soma3d(sm, new_fig=True, new_axes=True, subplot=False, **kwargs): '''Generates a 3d figure of the soma. Parameters: soma: Soma neurom.Soma object Options: 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 soma. \ Soma : "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. Returns: A 3D matplotlib figure with a soma view. ''' treecolor = kwargs.get('treecolor', None) # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={'projection': '3d'}) # Definition of the tree color depending on the tree type. treecolor = common.get_color(treecolor, tree_type=TreeType.soma) xs = sm.center[0] ys = sm.center[1] zs = sm.center[2] # Plot the soma as a circle. fig, ax = common.plot_sphere(fig, ax, center=[xs, ys, zs], radius=sm.radius, color=treecolor, alpha=get_default('alpha', **kwargs)) kwargs['title'] = kwargs.get('title', 'Soma view') kwargs['xlabel'] = kwargs.get('xlabel', 'X') kwargs['ylabel'] = kwargs.get('ylabel', 'Y') kwargs['zlabel'] = kwargs.get('zlabel', 'Z') return common.plot_style(fig=fig, ax=ax, **kwargs)
def soma3d(sm, new_fig=True, new_axes=True, subplot=False, **kwargs): """Generates a 3d figure of the soma. Parameters: soma: Soma neurom.Soma object Options: 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 soma. \ Soma : "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. Returns: A 3D matplotlib figure with a soma view. """ treecolor = kwargs.get("treecolor", None) # Initialization of matplotlib figure and axes. fig, ax = common.get_figure(new_fig=new_fig, new_axes=new_axes, subplot=subplot, params={"projection": "3d"}) # Definition of the tree color depending on the tree type. treecolor = common.get_color(treecolor, tree_type=TreeType.soma) xs = sm.center[0] ys = sm.center[1] zs = sm.center[2] # Plot the soma as a circle. fig, ax = common.plot_sphere( fig, ax, center=[xs, ys, zs], radius=sm.radius, color=treecolor, alpha=get_default("alpha", **kwargs) ) kwargs["title"] = kwargs.get("title", "Soma view") kwargs["xlabel"] = kwargs.get("xlabel", "X") kwargs["ylabel"] = kwargs.get("ylabel", "Y") kwargs["zlabel"] = kwargs.get("zlabel", "Z") 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. 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 soma(sm, plane='xy', new_fig=True, subplot=False, **kwargs): '''Generates a 2d figure of the soma. Parameters: soma: Soma neurom.Soma 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 soma. \ Soma: 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. 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 2D matplotlib figure with a soma view, at the selected plane. ''' treecolor = kwargs.get('treecolor', None) outline = kwargs.get('outline', True) 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) # Definition of the tree color depending on the tree type. treecolor = common.get_color(treecolor, tree_type=TreeType.soma) # Plot the outline of the soma as a circle, is outline is selected. if not outline: soma_circle = common.plt.Circle(sm.center, sm.radius, color=treecolor, alpha=get_default('alpha', **kwargs)) ax.add_artist(soma_circle) else: horz = [] vert = [] for s_point in sm.iter(): horz.append(s_point[getattr(COLS, plane[0].capitalize())]) vert.append(s_point[getattr(COLS, plane[1].capitalize())]) horz.append(horz[0]) # To close the loop for a soma viewer. This might be modified! vert.append(vert[0]) # To close the loop for a soma viewer. This might be modified! common.plt.plot(horz, vert, color=treecolor, alpha=get_default('alpha', **kwargs), linewidth=get_default('linewidth', **kwargs)) kwargs['title'] = kwargs.get('title', 'Soma view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) 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 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 soma(sm, plane='xy', new_fig=True, subplot=False, **kwargs): ''' Generates a 2d figure of the soma. Parameters: soma: Soma \ neurom.Soma 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 soma. \ Soma: 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. 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 2D matplotlib figure with a soma view, at the selected plane. ''' treecolor = kwargs.get('treecolor', None) outline = kwargs.get('outline', True) 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) # Definition of the tree color depending on the tree type. treecolor = common.get_color(treecolor, tree_type=TreeType.soma) # Plot the outline of the soma as a circle, is outline is selected. if not outline: soma_circle = common.plt.Circle(sm.center, sm.radius, color=treecolor, alpha=get_default('alpha', **kwargs)) ax.add_artist(soma_circle) else: horz = [] vert = [] for s_point in sm.iter(): horz.append(s_point[getattr(COLS, plane[0].capitalize())]) vert.append(s_point[getattr(COLS, plane[1].capitalize())]) horz.append(horz[0]) # To close the loop for a soma viewer. This might be modified! vert.append(vert[0]) # To close the loop for a soma viewer. This might be modified! common.plt.plot(horz, vert, color=treecolor, alpha=get_default('alpha', **kwargs), linewidth=get_default('linewidth', **kwargs)) kwargs['title'] = kwargs.get('title', 'Soma view') kwargs['xlabel'] = kwargs.get('xlabel', plane[0]) kwargs['ylabel'] = kwargs.get('ylabel', plane[1]) 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)