React D3 Гистограмма с возможностью прокрутки по оси X - PullRequest
0 голосов
/ 31 октября 2018

Я настоящий новичок, когда дело доходит до D3. В настоящее время я стараюсь изо всех сил реализовать гистограмму, которая позволяет пользователю прокручивать по оси X, пока ось Y остается на месте. Я использую React в качестве моей платформы.

export default [
  { activity: 'Main Idea and Detail', value: 90, color: '#2A78E4' },
  { activity: 'Character and Plot', value: 80, color: '#2A78E4' },
  { activity: 'Elements of Poetry', value: 70, color: '#2A78E4' },
  { activity: 'Standard 8.10', value: 60, color: '#2A78E4' },
  { activity: '8.1.3', value: 50, color: '#2A78E4' },
  { activity: 'Skill 6', value: 40, color: '#2A78E4' },
  { activity: 'Skill 7', value: 30, color: '#2A78E4' },
  { activity: 'Skill 8', value: 21, color: '#2A78E4' },
  { activity: 'Skill 9', value: 10, color: '#2A78E4' },
  { activity: 'Skill 10', value: 5, color: '#2A78E4' },
  { activity: '8.1.34', value: 50, color: '#2A78E4' },
  { activity: 'Skill 60', value: 40, color: '#2A78E4' },
  { activity: 'Skill 70', value: 30, color: '#2A78E4' },
  { activity: 'Skill 80', value: 21, color: '#2A78E4' },
  { activity: 'Skill 90', value: 10, color: '#2A78E4' },
  { activity: 'Skill 100', value: 5, color: '#2A78E4' },
  { activity: 'Skill 900', value: 100, color: '#2A78E4' },
  { activity: 'Skill 1000', value: 50, color: '#2A78E4' },
  { activity: 'Skill -1', value: 5, color: '#2A78E4' },
  { activity: '8.1.35', value: 50, color: '#2A78E4' },
  { activity: 'Skill 160', value: 40, color: '#2A78E4' },
  { activity: 'Skill 10', value: 30, color: '#2A78E4' },
  { activity: 'Skill 20', value: 21, color: '#2A78E4' },
  { activity: 'Skill 80', value: 10, color: '#2A78E4' },
  { activity: 'Skill 650', value: 5, color: '#2A78E4' },
  { activity: 'Skill 300', value: 100, color: '#2A78E4' },
  { activity: 'Skill 3000', value: 50, color: '#2A78E4' }
];

Мой код, который я использую для генерации своих весов:

generateScales = () => {
    const { height, margin, width } = this.state;
    const xScales = d3
      .scaleBand()
      .domain(this.props.data.map(d => d.activity))
      .range([margin.left, width - margin.right])
      .padding(0.5);

    const yScales = d3
      .scaleLinear()
      .domain([0, 100])
      .range([height - margin.bottom, 0]);
    this.setState({
      xScales,
      yScales
    });
  };

Для генерации моих весов я использую функцию renderAxis:

renderAxis = () => {
    const xAxisBottom = d3.axisBottom().scale(this.state.xScales);
    const axisLeft = d3.axisLeft().scale(this.state.yScales);
    d3.select(this.refs.xAxis).call(xAxisBottom);
    d3.select(this.refs.yAxis).call(axisLeft);
  };

Я пытался использовать этот пример в качестве подсказки, но я не могу заставить эту строку работать должным образом "d3.behavior.drag (). On (" drag ", display)" http://bl.ocks.org/cdagli/ce3045197f4b89367c80743c04bbb4b6.

Я получаю сообщение об ошибке, что это не часть модуля d3, но пример явно использует его. Я думаю, я не знаю, с чего начать или как решить эту проблему. Я пытался решить эту проблему также с помощью CSS, но безрезультатно

Мне удалось создать «песочницу», и если кто-нибудь подскажет мне, как добиться прокручиваемой оси X, оставив ось Y на месте, это будет очень признательно.

https://codesandbox.io/s/k0pj5m8q93

1 Ответ

0 голосов
/ 31 октября 2018

Я решил свою проблему, предоставив моим весам правильные данные. Моя ошибка заключалась в том, что я могу просто произвольно вставить любое число и получить правильные координаты. Для моей конкретной ситуации я должен кормить весы правильными данными.

Итак, для моей модели данных:

export default [
  { activity: 'Main Idea and Detail', value: 10, color: '#2A78E4' },
  { activity: 'Character and Plot', value: 20, color: '#2A78E4' },
  { activity: 'Elements of Poetry', value: 31, color: '#2A78E4' },
  { activity: 'Skill 4', value: 40, color: '#2A78E4' },
  { activity: 'Skill 5', value: 56, color: '#2A78E4' },
  { activity: 'Skill 6', value: 60, color: '#2A78E4' },
  { activity: 'Skill 7', value: 60, color: '#2A78E4' },
  { activity: 'Skill 8', value: 71, color: '#2A78E4' },
  { activity: 'Skill 9', value: 70, color: '#2A78E4' },
  { activity: 'Skill 10', value: 90, color: '#2A78E4' }
];

Я должен установить свою ось X для своей активности, выполнив это:

 d3.line()
    .x((info, index) => {
      return xScales(info.activity);
    })  

Теперь, когда d3 знает о моей оси x, я могу затем установить для Y любое значение, если оно не превышает 100, которое является вершиной оси Y.

Итак, теперь моя ось Y выглядит следующим образом:

.y(data => {
          return yScales(baseLine - 1.2);
        });

И мой путь выглядит так:

          <path
          d={path(data)}
          x={70}
          className="line"
          style={{ fill: 'green', strokeWidth: 2, stroke: 'red' }}
           />

Надеюсь, это имеет какой-то смысл и помогает тому, кто пытается построить горизонтальную линию для гистограмм.

...