HarmonyOS鸿蒙Next MPChart原生图表组件如何使用?折线图柱状图开发指南

HarmonyOS鸿蒙Next MPChart原生图表组件如何使用?折线图柱状图开发指南 HarmonyOS 5.0,DevEco Studio 5.0

  • 需要使用原生图表组件,不想通过Web加载ECharts
  • 找到了MPChart三方库,但不清楚如何配置和使用
  • 希望了解折线图、柱状图的完整实现

希望了解HarmonyOS MPChart原生图表库的安装配置和使用方法

3 回复

解决方案

1. 安装MPChart

ohpm install @aspect/mpchart

2. 折线图实现

import {
  LineChart,
  LineChartModel,
  LineData,
  LineDataSet,
  EntryOhos,
  JArrayList,
  XAxis,
  YAxis,
  XAxisPosition,
  AxisDependency,
  ColorTemplate
} from '@aspect/mpchart'

@Entry
@Component
struct LineChartPage {
  private model: LineChartModel = new LineChartModel()

  aboutToAppear(): void {
    this.initChart()
  }

  initChart(): void {
    // 准备数据
    const values = new JArrayList<EntryOhos>()
    const dataPoints = [25.5, 26.0, 25.8, 26.2, 25.9, 26.1, 25.7]
    
    dataPoints.forEach((value, index) => {
      values.add(new EntryOhos(index, value))
    })
    
    // 创建数据集
    const dataSet = new LineDataSet(values, '水温')
    dataSet.setColor(0xFF36e27b)           // 线条颜色
    dataSet.setCircleColor(0xFF36e27b)     // 圆点颜色
    dataSet.setLineWidth(2)                // 线条宽度
    dataSet.setCircleRadius(4)             // 圆点半径
    dataSet.setDrawCircleHole(false)       // 不绘制空心圆
    dataSet.setDrawValues(false)           // 不显示数值
    dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER) // 平滑曲线
    dataSet.setDrawFilled(true)            // 绘制填充
    dataSet.setFillColor(0x3336e27b)       // 填充颜色(带透明度)
    
    // 创建数据对象
    const dataSets = new JArrayList<LineDataSet>()
    dataSets.add(dataSet)
    const lineData = new LineData(dataSets)
    
    // 配置X轴
    const xAxis = this.model.getXAxis()
    xAxis.setPosition(XAxisPosition.BOTTOM)
    xAxis.setDrawGridLines(false)
    xAxis.setTextColor(0xFF9eb7a8)
    xAxis.setTextSize(10)
    xAxis.setLabelCount(7)
    xAxis.setValueFormatter({
      getFormattedValue: (value: number) => {
        const days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        return days[Math.floor(value)] || ''
      }
    })
    
    // 配置Y轴
    const leftAxis = this.model.getAxisLeft()
    leftAxis.setTextColor(0xFF9eb7a8)
    leftAxis.setTextSize(10)
    leftAxis.setDrawGridLines(true)
    leftAxis.setGridColor(0xFF1a3d2a)
    leftAxis.setAxisMinimum(24)
    leftAxis.setAxisMaximum(28)
    
    // 隐藏右侧Y轴
    this.model.getAxisRight().setEnabled(false)
    
    // 其他配置
    this.model.getLegend().setEnabled(false) // 隐藏图例
    this.model.getDescription().setEnabled(false) // 隐藏描述
    this.model.setTouchEnabled(true) // 启用触摸
    this.model.setDragEnabled(true)  // 启用拖拽
    this.model.setScaleEnabled(false) // 禁用缩放
    
    // 设置数据
    this.model.setData(lineData)
  }

  build() {
    Column() {
      Text('水温趋势')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
        .fontColor($r('app.color.text_primary'))
        .width('100%')
        .margin({ bottom: 12 })
      
      LineChart({ model: this.model })
        .width('100%')
        .height(200)
        .backgroundColor(Color.Transparent)
    }
    .padding(16)
    .backgroundColor($r('app.color.surface'))
    .borderRadius(16)
  }
}

3. 柱状图实现

import {
  BarChart,
  BarChartModel,
  BarData,
  BarDataSet,
  BarEntry,
  JArrayList,
  XAxisPosition
} from '@aspect/mpchart'

@Entry
@Component
struct BarChartPage {
  private model: BarChartModel = new BarChartModel()

  aboutToAppear(): void {
    this.initChart()
  }

  initChart(): void {
    // 准备数据
    const values = new JArrayList<BarEntry>()
    const dataPoints = [12, 15, 18, 14, 20, 16]
    
    dataPoints.forEach((value, index) => {
      values.add(new BarEntry(index, value))
    })
    
    // 创建数据集
    const dataSet = new BarDataSet(values, '喂食次数')
    dataSet.setColor(0xFF36e27b)
    dataSet.setDrawValues(true)
    dataSet.setValueTextColor(0xFF9eb7a8)
    dataSet.setValueTextSize(10)
    
    // 创建数据对象
    const dataSets = new JArrayList<BarDataSet>()
    dataSets.add(dataSet)
    const barData = new BarData(dataSets)
    barData.setBarWidth(0.6)
    
    // 配置X轴
    const xAxis = this.model.getXAxis()
    xAxis.setPosition(XAxisPosition.BOTTOM)
    xAxis.setDrawGridLines(false)
    xAxis.setTextColor(0xFF9eb7a8)
    xAxis.setTextSize(10)
    xAxis.setValueFormatter({
      getFormattedValue: (value: number) => {
        const months = ['1月', '2月', '3月', '4月', '5月', '6月']
        return months[Math.floor(value)] || ''
      }
    })
    
    // 配置Y轴
    const leftAxis = this.model.getAxisLeft()
    leftAxis.setTextColor(0xFF9eb7a8)
    leftAxis.setDrawGridLines(true)
    leftAxis.setGridColor(0xFF1a3d2a)
    leftAxis.setAxisMinimum(0)
    
    this.model.getAxisRight().setEnabled(false)
    this.model.getLegend().setEnabled(false)
    this.model.getDescription().setEnabled(false)
    
    this.model.setData(barData)
  }

  build() {
    Column() {
      Text('月度喂食统计')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
        .fontColor($r('app.color.text_primary'))
        .width('100%')
        .margin({ bottom: 12 })
      
      BarChart({ model: this.model })
        .width('100%')
        .height(200)
        .backgroundColor(Color.Transparent)
    }
    .padding(16)
    .backgroundColor($r('app.color.surface'))
    .borderRadius(16)
  }
}

4. 动态更新数据

// 更新折线图数据
updateLineData(newValues: number[]): void {
  const values = new JArrayList<EntryOhos>()
  newValues.forEach((value, index) => {
    values.add(new EntryOhos(index, value))
  })

  const dataSet = new LineDataSet(values, '水温')
  // ... 配置样式

  const dataSets = new JArrayList<LineDataSet>()
  dataSets.add(dataSet)

  this.model.setData(new LineData(dataSets))
  this.model.notifyDataSetChanged() // 通知数据变化
  this.model.invalidate()           // 刷新图表
}

更多关于HarmonyOS鸿蒙Next MPChart原生图表组件如何使用?折线图柱状图开发指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS Next中MPChart组件通过@ohos/mpchart包提供。使用前需在module.json5中声明ohos.permission.INTERNET权限。折线图通过LineChart组件实现,需配置LineDataSet数据集合和LineData数据对象。柱状图使用BarChart组件,配置BarDataSet和BarData。两者均需设置X轴、Y轴样式及数据适配器。图表交互支持缩放、滑动和高亮显示。数据更新可通过updateData方法动态刷新。

在HarmonyOS Next中使用MPChart进行原生图表开发,主要步骤如下:

1. 安装配置 在工程的oh-package.json5文件中添加依赖:

"dependencies": {
  "@ohos/mpchart": "^1.0.0"
}

执行ohpm install安装。

2. 折线图实现

import { LineChart, LineDataSet, LineData } from '@ohos/mpchart'

// 创建数据集
let entries = [
  { x: 0, y: 10 },
  { x: 1, y: 20 },
  { x: 2, y: 15 }
]
let dataSet = new LineDataSet(entries, "数据标签")

// 配置线条样式
dataSet.setColor(Color.Blue)
dataSet.setLineWidth(2)

// 创建数据对象
let lineData = new LineData([dataSet])

// 创建图表
let lineChart = new LineChart(this.context)
lineChart.setData(lineData)

// 坐标轴配置
lineChart.getXAxis().setPosition(XAxisPosition.BOTTOM)
lineChart.getAxisLeft().setEnabled(true)

3. 柱状图实现

import { BarChart, BarDataSet, BarData } from '@ohos/mpchart'

// 创建柱状图数据集
let barEntries = [
  { x: 0, y: 30 },
  { x: 1, y: 45 },
  { x: 2, y: 25 }
]
let barDataSet = new BarDataSet(barEntries, "柱状图")

// 设置柱状颜色
barDataSet.setColor(Color.Green)

// 创建柱状图数据
let barData = new BarData([barDataSet])

// 创建柱状图
let barChart = new BarChart(this.context)
barChart.setData(barData)

// 配置分组(多组数据时)
barChart.groupBars(0, 0.3, 0.05) // 起始位置、组间距、柱间距

4. 通用配置

// 图表描述
chart.setDescription("图表说明")

// 图例
chart.getLegend().setEnabled(true)

// 触摸交互
chart.setTouchEnabled(true)
chart.setDragEnabled(true)
chart.setScaleEnabled(true)

// 动画
chart.animateY(1000) // Y轴动画

5. 数据更新

// 动态添加数据
dataSet.addEntry({ x: 3, y: 40 })
chart.notifyDataChanged() // 通知更新
chart.invalidate() // 重绘

关键点:

  • 数据格式必须符合ChartEntry接口规范
  • 坐标轴标签需通过ValueFormatter自定义
  • 多数据集时注意颜色区分
  • 性能优化:大数据集启用setDrawValues(false)隐藏数值标签

MPChart提供了完整的图表交互功能,包括手势缩放、高亮显示、值提示等。具体样式配置可参考库中的ChartStyle相关类。

回到顶部