You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为react-native-chart-kit折线图添加渐变色

在react-native-chart-kit中实现折线的渐变色效果

要给折线添加沿线条平滑过渡的渐变色,你需要借助react-native-svg的渐变能力——因为react-native-chart-kit底层依赖它渲染图表。以下是具体实现步骤和修改后的代码:

步骤说明

  1. 导入react-native-svg的渐变相关组件
  2. 定义线性渐变规则
  3. 修改折线的颜色配置,引用定义好的渐变

修改后的完整代码

import { useCallback, useEffect, useState } from 'react'
import { ActivityIndicator, Dimensions, ScrollView, StyleSheet, View } from 'react-native'
import { LineChart } from 'react-native-chart-kit'
import { ChartData } from 'react-native-chart-kit/dist/HelperTypes'
import { Line, Svg, Defs, LinearGradient, Stop } from 'react-native-svg' // 新增SVG组件导入
import { RegularText } from 'shared/ui/texts'
import { TChartData, TDotProps } from '../types'
import { PromotionStats } from 'shared/generated/types/graphql'
import { isIos } from 'shared/lib'

const chartHeight = 250

export const StatsChart = ({ data }: { data: TChartData }) => {
  const [chartData, setChartData] = useState<ChartData | undefined>()
  const parseData = useCallback(() => {
    if (data) {
      let chartLabels: string[] = []
      let chartValues: number[] = []
      let copy: PromotionStats = JSON.parse(JSON.stringify(data))
      copy?.views?.viewsPerDate.reverse().forEach(day => {
        if (day?.date) {
          chartLabels.push(day.date.split('.')[0])
          chartValues.push(day.count + 1)
        }
        setChartData({
          labels: chartLabels,
          datasets: [
            {
              data: chartValues,
              strokeWidth: 5,
              color: (opacity = 1) => 'url(#lineGradient)', // 修改为引用渐变ID
            },
          ],
        })
      })
    }
  }, [data])

  useEffect(() => {
    if (data) parseData()
  }, [data])

  const [clickedDot, setClickedDot] = useState<TDotProps | undefined>()

  return (
    <View style={styles.container}>
      {chartData === undefined ? (
        <ActivityIndicator />
      ) : (
        <ScrollView
          showsHorizontalScrollIndicator={false}
          style={{ flex: 1, width: '100%' }}
          horizontal={true}>
          {/* 用Svg包裹图表,添加渐变定义 */}
          <Svg width={5 * Dimensions.get('screen').width} height={chartHeight}>
            <Defs>
              {/* 定义线性渐变,ID与折线color中的引用对应 */}
              <LinearGradient id="lineGradient" x1="0%" y1="0%" x2="100%" y2="0%">
                <Stop offset="0%" stopColor="#F10086" stopOpacity={1} />
                <Stop offset="100%" stopColor="#3F00F1" stopOpacity={1} />
                {/* 可添加更多Stop节点实现多色渐变 */}
              </LinearGradient>
            </Defs>
            <LineChart
              onDataPointClick={dot => {
                setClickedDot(dot)
              }}
              renderDotContent={dot => {
                return (
                  <View>
                    {dot.index === clickedDot?.index && (
                      <View
                        style={{
                          minWidth: 50,
                          position: 'absolute',
                          top: dot.y - 35,
                          left: dot.x - 25,
                          alignItems: 'center',
                        }}>
                        <RegularText>{dot.indexData}</RegularText>
                      </View>
                    )}
                    {dot.index === clickedDot?.index ? (
                      <View
                        style={[styles.clickedDot, { top: dot.y - 10, left: dot.x - 10 }]}>
                        <View style={styles.clickedInnerDot} />
                      </View>
                    ) : (
                      <View style={[styles.dot, { top: dot.y - 7, left: dot.x - 7 }]}>
                        <View style={styles.innerDot} />
                      </View>
                    )}
                    <Line
                      strokeDasharray={'3'}
                      opacity={0.4}
                      fill={'black'}
                      stroke={'black'}
                      strokeWidth={1}
                      x1={dot.x}
                      x2={dot.x}
                      y1={dot.y}
                      y2={chartHeight - 50}
                    />
                  </View>
                )
              }}
              hidePointsAtIndex={[0]}
              fromZero={true}
              transparent
              withHorizontalLines={false}
              withHorizontalLabels={false}
              withInnerLines={false}
              chartConfig={{
                color: (opacity = 1) => 'url(#lineGradient)', // 同步修改chartConfig的color
                labelColor: (opacity = 1) => `rgba(0, 0, 0, ${opacity})`,
                fillShadowGradientFrom: '#F10086',
                fillShadowGradientTo: 'white',
                fillShadowGradientFromOffset: 0,
                fillShadowGradientToOpacity: 0,
                fillShadowGradientOpacity: isIos ?  0.5 : 0.3,
                barPercentage: 1,
                paddingRight: 0,
              }}
              style={{ paddingRight: 0, paddingTop: 20 }}
              height={chartHeight}
              width={5 * Dimensions.get('screen').width}
              data={chartData}
              bezier
            />
          </Svg>
        </ScrollView>
      )}
    </View>
  )
}

关键修改点说明

  • 导入SVG组件:新增Defs、LinearGradient、Stop组件,用于定义渐变规则
  • 定义渐变:在Svg内部通过Defs添加线性渐变,x1/x2设为0%/100%实现水平方向渐变,你可以调整这些值改变渐变方向(比如垂直渐变设y1="0%" y2="100%")
  • 引用渐变:将dataset和chartConfig中的color属性改为url(#lineGradient),对应渐变定义的ID
  • 多色渐变:可以添加更多<Stop>节点,设置不同的offset和stopColor来实现更丰富的渐变效果

内容的提问来源于stack exchange,提问作者Asusoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:35:07