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相关类。

