Building your own Interactive Line Graph in ReactJS
Basic SVG Component
First, let's create a simple SVG component that accepts width and height as props. This will be the starting point for our graph.
import React from "react"; const LineGraph = ({ height, width }) => { return <svg height={height} width={width}></svg>; }; export default LineGraph;
Adding the X-Axis
Now, let's add the X-axis, which runs horizontally across the graph. We’ll use the
const drawXAxis = () => { const middleY = height / 2; return ( <line x1={0} y1={middleY} x2={width} y2={middleY} stroke={lineColor} /> ); };
Adding the Y-Axis
We’ll use another
const drawYAxis = () => { const middleX = width / 2; return ( <line x1={middleX} y1={0} x2={middleX} y2={height} stroke={lineColor} /> ); };
Plotting coordinates as a line path
The key part of a line graph is the line connecting different points. Let's plot some sample coordinates and connect them using an 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" />; };
Option to fill area beneath the line
We can fill the area beneath the line with a color to enhance the graph. This can be done using an additional element. Consider prop isFillArea to show/hide this area.
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" /> ); };
Tracking the cursor
Let’s add a circle that follows the cursor's movement across the graph path.
We will need a reference of our SVG component to access the bounding box of the SVG element. Also a reference for our tracking-circle that will be used for tracking the cursor over the graph.
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>
Then, we need to add an event listener to our SVG element. This will listen to all our cursor movements over the graph.
useEffect(() => { const svgElement = svgRef.current; svgElement.addEventListener("mousemove", handleMouseMove); // clean up return () => svgElement.removeEventListener("mousemove", handleMouseMove); }, []);
Next, we need a method to find the intersection coordinate between the cursor position and the path.
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 }; };
Cursor movement tracker method. It uses the getIntersectionPoint method to find the current intersection coordinate.
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"; } };
Finally, this would be the structure of our graph component
return ( <svg ref={svgRef} height={height} width={width}> {drawPath()} {drawXAxis()} {drawYAxis()} {drawTrackingCircle()} {drawDataPointCircles()} </svg> );
This is how we can use our Graph component
<LineGraph width={300} height={400} coordinates={samplePoints} lineColor="#000" pathColor="#00008B" areaColor="#ADD8E6" dataPointColor="#008000" showFillArea showDataPointCircle />
Codesandbox link for the LineGraph demo
Blog Photo by Isaac Smith on Unsplash
Thanks for reading ❤
The above is the detailed content of Building your own Interactive Line Graph in ReactJS. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Frequently Asked Questions and Solutions for Front-end Thermal Paper Ticket Printing In Front-end Development, Ticket Printing is a common requirement. However, many developers are implementing...

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

There is no absolute salary for Python and JavaScript developers, depending on skills and industry needs. 1. Python may be paid more in data science and machine learning. 2. JavaScript has great demand in front-end and full-stack development, and its salary is also considerable. 3. Influencing factors include experience, geographical location, company size and specific skills.

How to merge array elements with the same ID into one object in JavaScript? When processing data, we often encounter the need to have the same ID...

Learning JavaScript is not difficult, but it is challenging. 1) Understand basic concepts such as variables, data types, functions, etc. 2) Master asynchronous programming and implement it through event loops. 3) Use DOM operations and Promise to handle asynchronous requests. 4) Avoid common mistakes and use debugging techniques. 5) Optimize performance and follow best practices.

Discussion on the realization of parallax scrolling and element animation effects in this article will explore how to achieve similar to Shiseido official website (https://www.shiseido.co.jp/sb/wonderland/)...

In-depth discussion of the root causes of the difference in console.log output. This article will analyze the differences in the output results of console.log function in a piece of code and explain the reasons behind it. �...

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.
