class_docstr: !
  @brief Common cluster visualizer for 1-, 2- and 3-dimensional data.
  @details `cluster_visualizer_multidim` visualizer can be used to display clusters in N-dimensional data.
  
  The general difference between `cluster_visualizer` and `cluster_visualizer_multidim` is a way of representation
  of 3-dimensional data. In case of `cluster_visualizer` 3-dimensional data is displayed in 3-dimensional plot with
  `x0`, `x1` and `x2` axis. In case of `cluster_visualizer_multidim` it displayed on three 2-dimensional plots:
  `(x0, x1)`, `(x0, x2)` and `(x1, x2)`.
  
  There is an example where sample `Atom` is used for clustering and displayed by `cluster_visualizer`:
  @code
      from pyclustering.utils import read_sample
      from pyclustering.samples.definitions import FCPS_SAMPLES
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.cluster.dbscan import dbscan
  
      sample = read_sample(FCPS_SAMPLES.SAMPLE_ATOM)
      clusters = dbscan(sample, 15, 3).process().get_clusters()
  
      visualizer = cluster_visualizer()
      visualizer.append_clusters(clusters, sample)
      visualizer.show()
  @endcode
  
  Visualized clustering results of `Atom` data:
  @image html dbscan_atom_visualizer.png "Fig. 1. DBSCAN clustering results (3-dimensional data 'Atom')."
  
  @see cluster_visualizer_multidim
docstr: !
  @brief Append cluster attribure for cluster on specific canvas.
  @details Attribute it is data that is visualized for specific cluster using its color, marker and markersize if last two is not specified.
  
  @param[in] index_canvas (uint): Index canvas where cluster is located.
  @param[in] index_cluster (uint): Index cluster whose attribute should be added.
  @param[in] data (array_like): List of points (data) that represents attribute.
  @param[in] marker (string): Marker that is used for displaying objects from cluster on the canvas.
  @param[in] markersize (uint): Size of marker.
docstr_tok: ["!","@","brief","Append","cluster","attribure","for","cluster","on","specific","canvas",".","@","details","Attribute","it","is","data","that","is","visualized","for","specific","cluster","using","its","color",",","marker","and","markersize","if","last","two","is","not","specified",".","@","param","[","in","]","index_canvas","(","uint",")",":","Index","canvas","where","cluster","is","located",".","@","param","[","in","]","index_cluster","(","uint",")",":","Index","cluster","whose","attribute","should","be","added",".","@","param","[","in","]","data","(","array_like",")",":","List","of","points","(","data",")","that","represents","attribute",".","@","param","[","in","]","marker","(","string",")",":","Marker","that","is","used","for","displaying","objects","from","cluster","on","the","canvas",".","@","param","[","in","]","markersize","(","uint",")",":","Size","of","marker","."]
code: def append_cluster_attribute(
      self,
      index_canvas,
      index_cluster,
      data,
      marker=None,
      markersize=None,
  ):
      """!
      @brief Append cluster attribure for cluster on specific canvas.
      @details Attribute it is data that is visualized for specific cluster using its color, marker and markersize if last two is not specified.
  
      @param[in] index_canvas (uint): Index canvas where cluster is located.
      @param[in] index_cluster (uint): Index cluster whose attribute should be added.
      @param[in] data (array_like): List of points (data) that represents attribute.
      @param[in] marker (string): Marker that is used for displaying objects from cluster on the canvas.
      @param[in] markersize (uint): Size of marker.
  
      """
  
      cluster_descr = self.__canvas_clusters[index_canvas][
          index_cluster
      ]
      attribute_marker = marker
      if attribute_marker is None:
          attribute_marker = cluster_descr.marker
  
      attribure_markersize = markersize
      if attribure_markersize is None:
          attribure_markersize = cluster_descr.markersize
  
      attribute_color = cluster_descr.color
  
      added_attribute_cluster_descriptor = canvas_cluster_descr(
          data,
          None,
          attribute_marker,
          attribure_markersize,
          attribute_color,
      )
      self.__canvas_clusters[index_canvas][
          index_cluster
      ].attributes.append(added_attribute_cluster_descriptor)
  
imports: import itertools
  import math
  import matplotlib.pyplot
  import matplotlib.gridspec
  from mpl_toolkits.mplot3d import Axes3D
  from pyclustering.utils.color import color
label_desc: Use image node_id 3 for calling the cluster_visualizer obj's underlying member method code with example usage: obj.append_cluster_attribute(index_canvas, index_cluster, data, marker, markersize) without return types