Skip to content

📈 Beautiful, high-performance Graphs and Charts for React Native built with Skia

License

Notifications You must be signed in to change notification settings

margelo/react-native-graph

Repository files navigation

📈
react-native-graph

Beautiful, high-performance Graphs/Charts for React Native.

About

react-native-graphis a Line Graph implementation based on the high performance 2D graphics rendering engine "Skia". It's used in thePink Panda Wallet appto power thousands of token graphs every day.

  • 🏎️ Faster and smoother than react-native-svg graphs
  • ⚡️ Native path interpolation in Skia
  • 🐎 Up to 120 FPS animations
  • 📈 Cubic bezier rendering for smoother edges
  • 👍 Smooth pan/scrubbing gesture
  • 💰 Made for crypto apps and Wallets
  • ❌ Does not block navigation, press or scroll animations

Installation

yarn addreact-native-reanimated
yarn addreact-native-gesture-handler
yarn add@shopify/react-native-skia
yarn addreact-native-graph

Usage

functionApp(){
constpriceHistory=usePriceHistory('ethereum')

return<LineGraphpoints={priceHistory}color="#4484B2"/>
}

Configuration

animated

Whether to animate between data changes.

Animations are ran using theSkia animation systemand are fully natively interpolated to ensure best possible performance.

Ifanimatedisfalse,a light-weight implementation of the graph renderer will be used, which is optimal for displaying a lot of graphs in large lists.

Example:

<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
/>

enablePanGesture

Whether to enable the pan gesture.

Requiresanimatedto betrue.

There are three events fired when the user interacts with the graph:

  1. onGestureStart:Fired once the user presses and holds down on the graph. The pan gestureactivates.
  2. onPointSelected:Fired for each point the user pans through. You can use this event to update labels or highlight selection in the graph.
  3. onGestureEnd:Fired once the user releases his finger and the pan gesturedeactivates.

The pan gesture can be configured using these props:

  1. panGestureDelay:Set delay for the pan gesture to activate. Set to0to start immediately after touch. Defaults to300.

Example:

<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
enablePanGesture={true}
onGestureStart={()=>hapticFeedback('impactLight')}
onPointSelected={(p)=>updatePriceTitle(p)}
onGestureEnd={()=>resetPriceTitle()}
/>

TopAxisLabel/BottomAxisLabel

Used to render labels above or below the Graph.

Requiresanimatedto betrue.

Usually this is used to render the maximum and minimum values of the Graph. You can get the maximum and minimum values from your graph points array, and smoothly animate the labels on the X axis accordingly.

Example:

<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
TopAxisLabel={()=><AxisLabelx={max.x}value={max.value}/>}
BottomAxisLabel={()=><AxisLabelx={min.x}value={min.value}/>}
/>

Range

Used to define a range for the graph canvas

This range has to be bigger than the span of the provided data points. This feature can be used, e.g. if the graph should show a fixed timeframe, whether there's data for that period or not.



This example shows data in the timeframe between 01/01/2000 to 01/31/2000 and caps the value between 0 and 200:

<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
enablePanGesture={true}
range={{
x:{
min:newDate(newDate(2000,1,1).getTime()),
max:newDate(
newDate(2000,1,1).getTime()+
31*1000*60*60*24
)
},
y:{
min:0,
max:200
}
}}
/>

SelectionDot

Used to render the selection dot.

RequiresanimatedandenablePanGestureto betrue.

IfSelectionDotis missing orundefined,a default one is provided with an outer ring and light shadow.

Example:

<LineGraph
points={priceHistory}
animated={true}
color="#4484B2"
enablePanGesture={true}
SelectionDot={CustomSelectionDot}
/>

See thisexample<SelectionDot />component.

Sponsor

react-native-graphis sponsored byPink Panda.

Download the Pink Panda mobile app to see react-native-graph in action!

Community Discord

Join the Margelo Community Discordto chat about react-native-graph or other Margelo libraries.

Adopting at scale

react-native-graph was built at Margelo, an elite app development agency. For enterprise support or other business inquiries, contact us at[email protected]!

Thanks

Special thanks toWilliam CandillonandChristian Falchfor their amazing help and support for React Native Skia ❤️