@Override
 public void draw(AdvancedContext2d ctx, DiagramObject item, Double factor, Coordinate offset) {
   ctx.save();
   DiagramProfile profile = DiagramColours.get().PROFILE;
   ctx.setStrokeStyle(profile.getChemical().getStroke());
   ctx.setFillStyle(profile.getChemical().getFill());
   drawNode(ctx, (Node) item, factor, offset);
   ctx.restore();
 }
  @Override
  public void drawExpression(
      AdvancedContext2d ctx,
      OverlayContext overlay,
      DiagramObject item,
      int t,
      double min,
      double max,
      Double factor,
      Coordinate offset) {
    GraphComplex complex = item.getGraphObject();
    double percentage =
        complex.getHitParticipants().size() / (double) complex.getParticipants().size();

    Node node = (Node) item;
    NodeProperties prop = NodePropertiesFactory.transform(node.getProp(), factor, offset);

    ctx.save();
    setColourProperties(ctx, ColourProfileType.ANALYSIS);
    if (item.getIsDisease() != null)
      ctx.setStrokeStyle(DiagramColours.get().PROFILE.getProperties().getDisease());
    shape(ctx, prop, node.getNeedDashedBorder());
    ctx.fill();
    ctx.stroke();
    ctx.restore();

    List<Double> expression = new LinkedList<>(complex.getParticipantsExpression(t).values());
    Collections.sort(expression); // Collections.sort(expression, Collections.reverseOrder());
    Double value = ExpressionUtil.median(expression);

    AdvancedContext2d buffer = overlay.getBuffer();

    buffer.save();
    buffer.setFillStyle(AnalysisColours.get().expressionGradient.getColor(value, min, max));
    buffer.octagon(
        prop.getX(),
        prop.getY(),
        prop.getWidth(),
        prop.getHeight(),
        RendererProperties.COMPLEX_RECT_ARC_WIDTH);
    buffer.fill();
    buffer.setGlobalCompositeOperation(Context2d.Composite.SOURCE_IN);
    buffer.fillRect(prop.getX(), prop.getY(), prop.getWidth() * percentage, prop.getHeight());

    overlay
        .getOverlay()
        .drawImage(buffer.getCanvas(), 0, 0); // TODO: Improve this to copy only the region
    buffer.restore();
  }