The Victory lets us add charts and data visualization into our React app.
In this article, we’ll look at how to add charts into our React app with Victory.
Mouse Following Tooltip
We can add a tooltip with a pointer that stretches when we move the mouse.
To add it, we write:
import React from "react";
import {
VictoryAxis,
VictoryChart,
VictoryLine,
VictoryScatter,
VictoryTooltip,
VictoryVoronoiContainer
} from "victory";
export default function App() {
return (
<VictoryChart
domain={{ y: [0, 6] }}
containerComponent={
<VictoryVoronoiContainer
mouseFollowTooltips
voronoiDimension="x"
labels={({ datum }) => `y: ${datum.y}`}
/>
}
>
<VictoryScatter
style={{ data: { fill: "red" }, labels: { fill: "red" } }}
data={[
{ x: 0, y: 2 },
{ x: 2, y: 3 },
{ x: 4, y: 4 },
{ x: 6, y: 5 }
]}
/>
<VictoryScatter
data={[
{ x: 2, y: 2 },
{ x: 4, y: 3 },
{ x: 6, y: 4 },
{ x: 8, y: 5 }
]}
/>
</VictoryChart>
);
}
We add the mouseFollowTooltips
prop to the VictoryVoronoiContainer
component to add this feature.
Also, we can listen to other events with the events
prop.
For instance, we can write:
import React from "react";
import { VictoryBar, VictoryChart, VictoryTooltip } from "victory";
export default function App() {
return (
<VictoryChart domain={{ x: [0, 11], y: [-10, 10] }}>
<VictoryBar
labelComponent={<VictoryTooltip />}
data={[
{ x: 2, y: 5, label: "A" },
{ x: 4, y: -6, label: "B" },
{ x: 6, y: 4, label: "C" },
{ x: 8, y: -5, label: "D" },
{ x: 10, y: 7, label: "E" }
]}
style={{
data: { fill: "tomato", width: 20 }
}}
events={[
{
target: "data",
eventHandlers: {
onMouseOver: () => {
return [
{
target: "data",
mutation: () => ({ style: { fill: "gold", width: 30 } })
},
{
target: "labels",
mutation: () => ({ active: true })
}
];
},
onMouseOut: () => {
return [
{
target: "data",
mutation: () => {}
},
{
target: "labels",
mutation: () => ({ active: false })
}
];
}
}
}
]}
/>
</VictoryChart>
);
}
We have the onMouseOver
and onMouseOut
properties with the target
property to set which item to mutate.
And the mutation
method to change the styles by returning an object with the styles we want.
Custom Tooltip
We can add a custom tooltip by creating our own tooltip component.
For instance, we can write:
import React from "react";
import { VictoryBar, VictoryChart, VictoryTooltip } from "victory";
const CustomTooltip = (props) => {
const { x, y } = props;
const rotation = `rotate(-45 ${x} ${y})`;
return (
<g transform={rotation}>
<VictoryTooltip {...props} renderInPortal={false} />
</g>
);
};
CustomTooltip.defaultEvents = VictoryTooltip.defaultEvents;
export default function App() {
return (
<VictoryChart domain={{ x: [0, 11], y: [-10, 10] }}>
<VictoryBar
labelComponent={<CustomTooltip />}
data={[
{ x: 2, y: 5, label: "A" },
{ x: 4, y: -6, label: "B" },
{ x: 6, y: 4, label: "C" },
{ x: 8, y: -5, label: "D" },
{ x: 10, y: 7, label: "E" }
]}
style={{
data: { fill: "tomato", width: 20 }
}}
/>
</VictoryChart>
);
}
to create the CustomTooltip
component.
We have to set the defaultEvents
property to VictoryTooltip.defaultEvents
for the tooltip to work since it adds the required event handlers for the tooltip.
Conclusion
We can add a mouse following tooltip and custom tooltips into our React charts with Victory.