Highcharts - цвет диаграммы P ie для каждого среза - PullRequest
0 голосов
/ 05 марта 2020

У меня есть приложение angular с высокими диаграммами, в случае диаграммы p ie у меня есть список цветов для использования на каждом срезе. Я ограничил р ie только 10 ломтиками. Мне нужно нанести несколько цветов на кусочки в порядке от самого большого до самого маленького.

Вот конфигурация диаграммы p ie:

pieChartOptions = {
  chart: {
    type: "pie"
 },
 title: {
  enabled: true,
  text: this.xAxis.name + " by Daypart",
  verticalAlign: "top",
  align: "left"
},
credits: {
  enabled: false
},
    xAxis: {
      title: {
        text: this.xAxis.name
      }
    },
    yAxis: {
      title: {
          text: "Reach"
      }
    },
    series: [{
      data: null,
      colors: ["#205493", "#BE5873", "#81CACF", "#E98841", "#E3D830", "#A6C46F",
       "#894C7B", "#BA9765", "#7F7F7F", "#C3C3C3"],
      dataLabels: {
        enabled: false
     },
    }]
 };

Массив colors должен быть в порядке от самого большого среза к наименьшему. Проблема в том, что у меня также есть линейный график, который при наведении курсора обновляет график p ie, поэтому размеры меняются динамически.

Вот настройки данных для диаграммы p ie:

loadCharts() {
    let presentationResults: OptimizationAllocationGroupByTrps[] | OptimizationAllocationGroupByCost[] = [];

    this.xAxis.name = this.selectedOption == null ? "TRP" : this.selectedOption;

    if (this.selectedOption === "Budget") {
      presentationResults = [...this.projectResults.OptimizationAllocationGroupByCost];
    } else {
      presentationResults = [...this.projectResults.OptimizationAllocationGroupByTRPs];
    }

    this.chartOptions.series[0].name = this.xAxis.name;
    this.chartOptions.series[0].data = [];
    this.chartOptions.series[0].data = [... this.projectResults.Curves.filter(x => x.Type === this.xAxis.name)[0].Points];

    presentationResults.forEach((oa: OptimizationAllocationGroupByTrps | OptimizationAllocationGroupByCost) => {
      if (oa.name.indexOf("%") === -1) {
        oa.y = (Math.round(oa.y * 100) / 100);
        oa.name = oa.name + ": " + oa.y + "%";
      }
    });

    if (presentationResults.length > 10) {
      let accumPercentage: number = 100;


      presentationResults.sort((v1: any, v2: any) => v1.y > v2.y ? -1 : 1).length = 9;

      presentationResults.forEach(updateResult => {
        accumPercentage -= updateResult.y;
      });

      presentationResults.push({name: "Others: " + Math.round(((accumPercentage))) + "%", y: accumPercentage});
    }


    this.pieChartOptions.series[0].data = presentationResults;
    this.pieChartOptionsBig.series[0].data = presentationResults;
    console.log(this.pieChartOptions.series[0].data);

    this.chartOptions.xAxis.title.text = this.xAxis.name;
    this.chartOptions.title.text = "Reach +1/" + this.xAxis.name;
    this.pieChartOptions.title.text = this.xAxis.name + " by Daypart";
    this.pieChartOptionsBig.title.text = this.xAxis.name + " by Daypart";

    this.chartOptions = {... this.chartOptions };
    this.pieChartOptions = {... this.pieChartOptions };
    this.pieChartOptionsBig = {... this.pieChartOptionsBig };
  }

А вот пример диаграмм:

enter image description here

В этом примере срез апельсина должен быть "#205493" Как и первый элемент в массиве цветов.

Есть идеи, как этого добиться?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете установить цвет непосредственно в точке и динамически обновлять его.

series: [{
  type: 'pie',
  data: [
    { y: 20, color: 'red'},
    { y: 20, color: 'blue'},
    { y: 20, color: 'orange'}
  ]
}]

Пример в реальном времени: http://jsfiddle.net/BlackLabel/6m4e8x0y/4899/

Справочник по API:

https://api.highcharts.com/highcharts/series.pie.data.color

https://api.highcharts.com/class-reference/Highcharts.Point#update

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...