apache / superset

Apache Superset is a Data Visualization and Data Exploration Platform
https://superset.apache.org/
Apache License 2.0
61.45k stars 13.4k forks source link

Annotation Layers at Horizontal Barchart #29555

Open Yobi-Aditias opened 1 month ago

Yobi-Aditias commented 1 month ago

Hi everyone,

I Would ask about annotation layers on horizontal barchart.

Screenshot

annotation

Description

First, we aim to add annotation layers to a horizontal bar chart. When I do this on a regular vertical bar chart, it works fine, but it doesn't seem to work when I try it on a horizontal bar chart. And, is it possible to have different annotation layers for each bar in the bar chart?

And then, can I add a color alert to the horizontal bar chart that changes as it approaches the annotation layer? For example, the bar chart is green, but if the value decreases and gets close to the annotation layer, it turns yellow, and when it drops below the annotation layer, it turns red. Is this possible?

Thanks

dosubot[bot] commented 1 month ago

To add annotation layers to a horizontal bar chart, have different annotation layers for each bar, and implement a color alert that changes as the value approaches the annotation layer, you can follow these steps:

  1. Add Annotation Layers: Use the annotationLayers property to manage annotation layers. This property allows you to add, edit, and remove annotation layers.

  2. Different Annotation Layers for Each Bar: Ensure that each bar in your chart has a unique annotation layer. This can be managed by mapping each annotation to a specific bar.

  3. Color Alert Implementation: Implement a color alert that changes as the value approaches the annotation layer. This can be done by dynamically adjusting the color based on the value's proximity to the annotation.

Here is a simplified example of how you might implement this in your React component using Apache Superset's NVD3Vis:

import React from 'react';
import { Bar } from 'react-chartjs-2';
import { nvd3Vis } from 'superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis';

class HorizontalBarChartWithAnnotations extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      annotations: [],
      data: {
        labels: ['Bar 1', 'Bar 2', 'Bar 3'],
        datasets: [
          {
            label: 'Dataset',
            data: [10, 20, 30],
            backgroundColor: ['#FF6384', '#36A2EB', '#FFCE56'],
          },
        ],
      },
    };
    this.handleAnnotationChange = this.handleAnnotationChange.bind(this);
  }

  handleAnnotationChange(annotations) {
    this.setState({ annotations });
  }

  getBarColor(value, annotation) {
    if (value >= annotation) {
      return 'red';
    }
    return 'green';
  }

  render() {
    const { data, annotations } = this.state;

    const updatedData = {
      ...data,
      datasets: data.datasets.map((dataset, index) => ({
        ...dataset,
        backgroundColor: dataset.data.map((value, i) =>
          this.getBarColor(value, annotations[i]?.value || 0)
        ),
      })),
    };

    return (
      <div>
        <Bar data={updatedData} options={{ indexAxis: 'y' }} />
        <AnnotationLayer
          value={annotations}
          onChange={this.handleAnnotationChange}
        />
      </div>
    );
  }
}

export default HorizontalBarChartWithAnnotations;

In this example:

This approach ensures that each bar can have a different annotation layer and the color changes dynamically based on the value. Additionally, the nvd3Vis function from Apache Superset can be used to handle more complex visualization requirements, including annotations and tooltips [1][2][3].

To continue talking to Dosu, mention @dosu.

rusackas commented 1 month ago

Hmm... this sounds valid, but it might be tricky to fix, as the horizontal chart option basically transposes axes. I'm not sure how difficult it'd be to do the same (or not!) for the annotation layer display.

rusackas commented 1 month ago

I doubt he has time to chip in here, but @villebro might be able to point you in the direction of a good code entry point if you're willing to dig deeper and open a PR.