docs: def calculateDatasets(self, scene, axes, datasets):
          """
          Builds the datasets for this renderer.  Each renderer will need to
          subclass and implemenent this method, otherwise, no data will be
          shown in the chart.
          
          :param      scene | <XChartScene>
                      axes | [<
                      datasets | [<XChartDataset>, ..]
          """
          items = self.calculateDatasetItems(scene, datasets)
          if not items:
              scene.clear()
              return
          
          rect = self.buildData('axis_rect')
          half_size = self.maximumBarSize() / 2.0
          
          for dataset, item in items.items():
              path = QPainterPath()
              subpaths = []
              
              for value in dataset.values():
                  pos = self.pointAt(axes, value)
                  
                  radius = min(rect.bottom() - pos.y(), 8)
                  
                  subpath = QPainterPath()
                  
                  # create a vertical bar graph
                  if self.orientation() == Qt.Vertical:
                      subpath.moveTo(pos.x() - half_size, rect.bottom())
                      subpath.lineTo(pos.x() - half_size, pos.y() + radius)
                      subpath.quadTo(pos.x() - half_size, pos.y(),
                                     pos.x() - half_size + radius, pos.y())
                      subpath.lineTo(pos.x() + half_size - radius, pos.y())
                      subpath.quadTo(pos.x() + half_size, pos.y(),
                                     pos.x() + half_size, pos.y() + radius)
                      subpath.lineTo(pos.x() + half_size, rect.bottom())
                      subpath.lineTo(pos.x() - half_size, rect.bottom())
                  
                  # create a horizontal bar graph
                  else:
                      subpath.moveTo(rect.left(), pos.y() - half_size)
                      subpath.lineTo(pos.x(),     pos.y() - half_size)
                      subpath.lineTo(pos.x(),     pos.y() + half_size)
                      subpath.lineTo(rect.left(), pos.y() + half_size)
                      subpath.lineTo(rect.left(), pos.y() - half_size)
                  
                  path.addPath(subpath)
                  subpaths.append(subpath)
              
              item.setPath(path)
              item.setBuildData('subpaths', subpaths)