class_docstr: Radar chart created from a pandas Dataframe. Each column of the df will be
  represented as a loop in the radar chart. Each row of the df will be
  represented as a spoke of the radar chart
  
  Attributes
  ----------
  data: DataFrame
      data for the radar
  band_type: {"circle", "polygon"} (default: "circle")
      type of bands to display in the radar
  num_bands: Int (default: 5)
      number of bands on the radar. As of now, this attribute is not
      dynamic and it has to set in the constructor
  data_range: List (default: [0, 1])
      range of data
  fill: Bool(default: True)
      flag which lets us fill the radar loops or not
code: def update_data(self, *args):
      self.update_bands(None)
      rows = list(self.data.index)
      n = len(rows)
  
      # spokes representing each data set
      self.spoke_data_t = np.linspace(0, 2 * np.pi, n + 1)[:-1]
      spoke_data_x, spoke_data_y = (
          np.sin(self.spoke_data_t),
          np.cos(self.spoke_data_t),
      )
  
      # Update mark data based on data changes
      with self.spokes.hold_sync():
          self.spokes.x = np.column_stack(
              [self.scaled_band_data[1] * spoke_data_x, spoke_data_x]
          )
          self.spokes.y = np.column_stack(
              [self.scaled_band_data[1] * spoke_data_y, spoke_data_y]
          )
  
      scaled_data = (self.data.values - self.data_range[0]) / (
          self.data_range[1] - self.data_range[0]
      )
      data_x = scaled_data * np.sin(self.spoke_data_t)[:, np.newaxis]
      data_y = scaled_data * np.cos(self.spoke_data_t)[:, np.newaxis]
  
      # update data lines
      with self.loops.hold_sync():
          self.loops.x = np.column_stack([data_x.T, data_x.T[:, 0]])
          self.loops.y = np.column_stack([data_y.T, data_y.T[:, 0]])
          if self.fill:
              self.loops.fill = "inside"
              self.loops.fill_opacities = [0.2] * len(self.loops.y)
          else:
              self.loops.fill = "none"
              self.loops.fill_opacities = [0.0] * len(self.loops.y)
          self.loops.labels = [str(c) for c in self.data.columns]
  
      # update spoke labels
      t = np.linspace(0, 2 * np.pi, n + 1)
      with self.spoke_labels.hold_sync():
          self.spoke_labels.text = [str(row) for row in rows]
          self.spoke_labels.x = np.sin(t)
          self.spoke_labels.y = np.cos(t)
  
file_path: bqplot/bqplot/plotting_widgets.py
imports: from ipywidgets import Layout
  from traitlets import List, Enum, Int, Bool
  from traittypes import DataFrame
  from bqplot import Figure, LinearScale, Lines, Label
  from bqplot.marks import CATEGORY10
  import numpy
label_desc: Use image node_id 3 for calling the Radar obj's underlying member method code with example usage: obj.update_data() without return types