Полярная диаграмма Highcharts неправильно соединяет линии

У меня очень странная проблема при использовании полярных опций в highcharts-more. Вот как это выглядит... введите здесь описание изображения

Ниже приведен мой полный код (он завернут в компонент React)

import React from 'react'
import PropTypes from 'prop-types'
import { Card, CardHeader, CardText, CircularProgress } from 'material-ui'
import ReactHighcharts from 'react-highcharts'
import HighchartsMore from 'highcharts-more'
import colors from '../../../colors'

HighchartsMore(ReactHighcharts.Highcharts)

const styles = {
  textAlignLeft: {
    textAlign: 'left'
  },
  loadingCardText: {
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center'
  }
}

const View = ({data1, data2, data3, data4, loading, hasEtfBeenSelected, highchartsAreaThreshold}) => {
  if (!hasEtfBeenSelected) {
    return (<div />)
  }

  let config = {
    credits: false,
    chart: {
      polar: true,
      type: 'area'
    },
    title: {
      text: null
    },
    pane: {
      size: '80%',
      startAngle: 22.5
    },
    colors: [
      colors.color1, colors.color2, colors.color3, colors.color4
    ],
    xAxis: {
      categories: data1.map(x => x[0]),
      tickmarkPlacement: 'on',
      lineWidth: 0
    },
    plotOptions: {
      series: {
        threshold: highchartsAreaThreshold
      }
    },
    yAxis: {
      gridLineInterpolation: 'polygon',
      lineWidth: 0,
      min: highchartsAreaThreshold,
      startOnTick: false,
      tickAmount: 5
    },
    tooltip: {
      shared: true,
      valuePrefix: '$'
    },
    legend: {
      align: 'right',
      verticalAlign: 'top',
      y: 70,
      layout: 'vertical'
    },
    series: [
      {
        name: 'Data1',
        data: data1,
        pointPlacement: 'on',
        marker: {
          enabled: false
        },
        fillOpacity: 0.2,
        lineWidth: 1
      },
      {
        name: 'Data2',
        data: data2,
        pointPlacement: 'on',
        marker: {
          enabled: false
        },
        fillOpacity: 0.2,
        lineWidth: 1
      },
      {
        name: 'Data3',
        data: data3,
        pointPlacement: 'on',
        marker: {
          enabled: false
        },
        fillOpacity: 0.2,
        lineWidth: 1
      },
      {
        name: 'Data4',
        data: data4,
        pointPlacement: 'on',
        marker: {
          enabled: false
        },
        fillOpacity: 0.2,
        lineWidth: 1
      }
    ]
  }

  if (loading) {
    return (<div>
      <Card>
        <CardHeader title='Spreads' style={styles.textAlignLeft} />
        <CardText style={styles.loadingCardText}>
          <CircularProgress size={70} thickness={5} />
        </CardText>
      </Card>
    </div>)
  }

  return (
    <div>
      <Card>
        <CardHeader title='Spreads'
          style={styles.textAlignLeft} />
        <CardText>
          <ReactHighcharts config={config} />
        </CardText>
      </Card>
    </div>
  )
}

View.propTypes = {
  data1: PropTypes.array,
  data2: PropTypes.array,
  data3: PropTypes.array,
  data4: PropTypes.array,
  loading: PropTypes.bool,
  hasEtfBeenSelected: PropTypes.bool,
  highchartsAreaThreshold: PropTypes.number
}

export default View

highchartsAreaThreshold установлен как минимум всех данных (чтобы диаграмма окрашивала отрицательные данные). Это странно, потому что именно этот код работал вчера. Так что это случайно. Я понятия не имею, что я делаю неправильно.

РЕДАКТИРОВАТЬ: Вот некоторые примеры данных (данные1..данные4 выглядят так):

data1:
Array[8]
0: 0.01
1: 0
2: -0.007
3: 0.014
4: -0.001
5: 0.021
6: 0
7: 0.01

data2:
Array[8]
0: 0.04
1: 0.02
2: 0.003
3: 0.031
4: -0.03
5: -0.006
6: -0.03
7: 0.04

Я только что попытался использовать простой массив вместо массива 2d-векторов, как было предложено, но получил тот же результат.


person coolboyjules    schedule 29.09.2017    source источник
comment
Как выглядят ваши данные? Это отсортировано?   -  person Barbara Laird    schedule 30.09.2017
comment
Неа. Это должно быть?   -  person coolboyjules    schedule 30.09.2017
comment
Я заметил подобное поведение, если данные не были отсортированы на линейной диаграмме.   -  person coolboyjules    schedule 30.09.2017
comment
Да, данные должны быть отсортированы.   -  person Barbara Laird    schedule 02.10.2017
comment
@BarbaraLaird данные в этом примере не отсортированы. highcharts.com/demo/polar-spider   -  person coolboyjules    schedule 02.10.2017
comment
Можете ли вы включить данные и все необходимые переменные? Ваша проблема не воспроизводится прямо сейчас.   -  person morganfree    schedule 02.10.2017
comment
Вы передаете декартовы данные (например, 2d векторов)? если да, документ говорит, что 2D-координаты будут преобразованы в полярные, правильно ли вы устанавливаете угол? (пример полярного паука передает простой массив 1d в качестве данных, поэтому сортировка не требуется)...   -  person Massimiliano Janes    schedule 02.10.2017
comment
Добавил некоторые данные @morganfree. Я действительно передавал 2D-данные, но я только что попробовал 1D и ничего хорошего. Может быть, это связано с моей ротацией?   -  person coolboyjules    schedule 03.10.2017


Ответы (3)


Пожалуйста, проверьте свой highchartsAreaThreshold, я думаю проблема в этом, сравните примеры:

Скорее всего, эта часть кода точно такая же, но что-то изменило способ вычисления highchartsAreaThreshold и имеет неправильное значение.

person Paweł Fus    schedule 04.10.2017
comment
У меня была такая же проблема, и это помогло - хороший улов и спасибо. - person Zee Fer; 08.10.2017
comment
Спасибо за помощь. Сейчас у меня нет среды для тестирования, но я хочу наградить вас за помощь. Я уверен, что-то вроде этого исправит это. Я приму ваш ответ во вторник, когда попробую снова. - person coolboyjules; 09.10.2017

Итак, после расследования я понял, что это не имеет ничего общего с официальной библиотекой highcharts... на самом деле это связано с библиотекой react-highcharts. Оскорбительная строка следующая:

HighchartsMore(ReactHighcharts.Highcharts)

Очевидно, вы должны сделать это только один раз в глобальном масштабе, но я делал это дважды, по одному для каждой паутинной диаграммы. Это вызывало такое странное поведение, потому что я предполагаю, что это удаляло функциональность highcharts-more, применяя HighchartsMore() дважды. Решение состоит в том, чтобы запустить эту строку только один раз в компоненте реакции верхнего уровня, таком как App.js или что-то более высокое. Тогда вопросов не будет.

Спасибо всем за вашу помощь. Мой исходный код на самом деле правильный.

person coolboyjules    schedule 11.10.2017

вы не показали данные, поэтому я предполагаю, что виновником являются плохие 2D-данные.

Согласно документу highcharts, полярная диаграмма работает как с одномерными, так и с двумерными данными:

Если вы передаете 1d-вектор, углы будут вычисляться автоматически и постепенно (например, [1,2,3] -> [[0,1],[a,2],[2a,3]] ), где a — это pointInterval, поэтому в этом случае пересечение линий невозможно. (*)

Но если вы передадите 2d-вектор, первая координата будет использоваться для интерполяции угла (например, что-то вроде [[a,1],[b,2],[c,3]] -> [[0,1],[2pi*a/(a+b+c),2],...]); поэтому, если углы не отсортированы должным образом, вы можете получить пересекающиеся линии (например, [[0,2],[2,2],[4,2],[1,3]] ).

РЕДАКТИРОВАТЬ: данные 1d также могут пересекаться с отрицательными значениями; по-видимому, установка yAxis min/max и порога, похоже, не решает проблему, как должно быть... решением может быть установка yAxis:min и thresold на 0 и изменение масштаба данных вручную в этом случае

person Massimiliano Janes    schedule 02.10.2017
comment
Спасибо за вашу помощь. Но это не сработало. Раньше я передавал 2D-данные и просто перешел на 1d, как было добавлено в вопросе. - person coolboyjules; 03.10.2017
comment
@coolboyjules что произойдет, если вы удалите (или перевернете) отрицательные значения? - person Massimiliano Janes; 03.10.2017