ReactJS에서 나만의 대화형 선 그래프 만들기

Patricia Arquette
풀어 주다: 2024-10-31 18:14:30
원래의
537명이 탐색했습니다.

Building your own Interactive Line Graph in ReactJS

기본 SVG 구성 요소

먼저 너비와 높이를 소품으로 허용하는 간단한 SVG 구성 요소를 만들어 보겠습니다. 이것이 그래프의 출발점이 될 것입니다.

import React from "react";

const LineGraph = ({ height, width }) => {
  return <svg height={height} width={width}></svg>;
};

export default LineGraph;
로그인 후 복사

X축 추가

이제 그래프를 가로로 가로지르는 X축을 추가해 보겠습니다. 우리는 이를 위한 요소입니다.

const drawXAxis = () => {
  const middleY = height / 2;

  return (
    <line x1={0} y1={middleY} x2={width} y2={middleY} stroke={lineColor} />
  );
};
로그인 후 복사

Y축 추가

다른 을 사용하겠습니다. 그래프 중앙을 수직으로 통과하는 Y축을 그리는 요소입니다.

const drawYAxis = () => {
  const middleX = width / 2;

  return (
    <line x1={middleX} y1={0} x2={middleX} y2={height} stroke={lineColor} />
  );
};
로그인 후 복사

좌표를 선 경로로 그리기

선 그래프의 핵심 부분은 서로 다른 점을 연결하는 선입니다. 몇 가지 샘플 좌표를 플롯하고 SVG를 사용하여 연결해 보겠습니다.

const drawPath = () => {
    const pathData = coordinates
      .map((coordinate, index) =>
        index === 0
          ? `M ${coordinate.x} ${coordinate.y}`
          : `L ${coordinate.x} ${coordinate.y}`
      )
      .join(" ");

    return <path d={pathData} stroke={pathColor} fill="none" />;
  };

로그인 후 복사

선 아래 영역을 채우는 옵션

선 아래 영역을 색상으로 채워 그래프를 향상시킬 수 있습니다. 이는 추가 요소를 사용하여 수행할 수 있습니다. 이 영역을 표시하거나 숨기려면 isFillArea 소품을 고려하세요.

const drawPath = () => {
  const pathData = coordinates
    .map((coordinate, index) =>
      index === 0
        ? `M ${coordinate.x} ${coordinate.y}`
        : `L ${coordinate.x} ${coordinate.y}`
    )
    .join(" ");

  const middleY = height / 2;
  const svgPath = showFillArea
    ? `${pathData} L ${width} ${middleY} L 0 ${middleY} Z`
    : pathData;
  const fillColor = showFillArea ? areaColor : "none";
  return (
    <path d={svgPath} fill={fillColor} stroke={pathColor} opacity="0.5" />
  );
};
로그인 후 복사

커서 추적

그래프 경로에서 커서의 움직임을 따라가는 원을 추가해 보겠습니다.

SVG 요소의 경계 상자에 액세스하려면 SVG 구성 요소에 대한 참조가 필요합니다. 또한 그래프 위에서 커서를 추적하는 데 사용되는 추적 원에 대한 참조입니다.

const svgRef = useRef();
const circleRef = useRef();
// ...
const drawTrackingCircle = () => {
  return (
    <circle
      ref={circleRef}
      r={6}
      fill="red"
      style={{ display: "none" }} // Initially hidden
    />
  );
};
// ...
<svg ref={svgRef} width={width} height={height}>
// ...
</svg>
로그인 후 복사

그런 다음 SVG 요소에 이벤트 리스너를 추가해야 합니다. 그러면 그래프 위의 모든 커서 움직임을 듣게 됩니다.

useEffect(() => {
  const svgElement = svgRef.current;
  svgElement.addEventListener("mousemove", handleMouseMove);

  // clean up
  return () => svgElement.removeEventListener("mousemove", handleMouseMove);
}, []);
로그인 후 복사

다음으로 커서 위치와 경로 사이의 교차 좌표를 찾는 방법이 필요합니다.

const getIntersectionPoint = (cursorX) => {
  // Find the segment (p1, p2) where cursorX lies between two consecutive coordinates.
  const segment = coordinates.find((p1, i) => {
    // Get the next point
    const p2 = coordinates[i + 1]; 
    // Check if cursorX falls between the two coordinates horizontally.
    return (
      p2 &&
      ((p1.x <= cursorX && p2.x >= cursorX) ||
        (p1.x >= cursorX && p2.x <= cursorX))
    );
  });

  // Return null if no valid segment is found.
  if (!segment) return null; 

  // Destructure the two coordinates in the segment.
  const [p1, p2] = [segment, coordinates[coordinates.indexOf(segment) + 1]];

  // Calculate 't' to determine the relative position between p1 and p2.
  const t = (cursorX - p1.x) / (p2.x - p1.x);

  // Interpolate the Y-coordinate using 't'.
  const y = p1.y + t * (p2.y - p1.y);

  return { x: cursorX, y };
};
로그인 후 복사

커서 이동 추적 방법. getIntersectionPoint 메소드를 사용하여 현재 교차점 좌표를 찾습니다.

const handleMouseMove = (event) => {
  // Get SVG position
  const svgRect = svgRef.current.getBoundingClientRect();
  // Calculate cursor's X within the SVG
  const cursorX = event.clientX - svgRect.left;

  // Find the intersection point
  const intersectionPoint = getIntersectionPoint(cursorX);
  if (intersectionPoint) {
    // Move the intersection circle to the calculated point
    circleRef.current.setAttribute("cx", intersectionPoint.x);
    circleRef.current.setAttribute("cy", intersectionPoint.y);
    circleRef.current.style.display = "block";
  }
};
로그인 후 복사

마지막으로 이것이 그래프 구성 요소의 구조입니다

return (
  <svg ref={svgRef} height={height} width={width}>
    {drawPath()}
    {drawXAxis()}
    {drawYAxis()}
    {drawTrackingCircle()}
    {drawDataPointCircles()}
  </svg>
);
로그인 후 복사

그래프 구성요소를 사용하는 방법

<LineGraph
  width={300}
  height={400}
  coordinates={samplePoints}
  lineColor="#000"
  pathColor="#00008B"
  areaColor="#ADD8E6"
  dataPointColor="#008000"
  showFillArea
  showDataPointCircle
/>
로그인 후 복사

LineGraph 데모용 Codesandbox 링크

Unsplash에 있는 Isaac Smith의 블로그 사진

읽어주셔서 감사합니다 ❤

위 내용은 ReactJS에서 나만의 대화형 선 그래프 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!