简介

Ohos-MPChart是OpenAtom OpenHarmony(简称“OpenHarmony”)系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视图,包括折线图、曲线图、柱形图、饼状图、K线图、雷达图、气泡图。适用于各种统计后的数据以视觉直观的方式呈现。

使用场景

Ohos-MPChart为广大OpenHarmony应用开发者在处理数据时,使数据显示更加直观。尤其现在的大数据时代面对愈加庞大的数据只需要导入Ohos-MPChart三方组件,然后调用相关的接口就能实现各种各样的图表以方便数据汇总。

效果展示

组件功能描述

Ohos-MPChart是一个强大的图表视图,主要提供多种多样的图表视图,包括折线图、曲线图、柱形图、饼状图、K线图等等,具体功能模块如下:

开发环境

安装IDE:支持DevEco Studio 3.0 Release(Build Version 3.0.0.993)版本。

安装SDK:支持OpenHarmony API version 8 及以上版本

使用方法

图表一:折线图

1.下载Ohos-MPChart组件并导入LineChart自定义组件:

//下载mpchart组件
npm install @ohos/mpchart --save
import { LineChart } from '@ohos/ohos_mpchart'

  

OpenHarmony npm环境配置等更多内容,请参考安装教程

如何安装OpenHarmony npm包

https://gitee.com/openharmony-tpc/docs/blob/master/OpenHarmony_npm_usage.md

2.初始化数据

aboutToAppear() {
this.lineData = this.initCurveData(45, 100);
this.topAxis.setLabelCount(5, false);
this.topAxis.setPosition(XAxisPosition.TOP);
this.topAxis.setAxisMinimum(0);
this.topAxis.setAxisMaximum(50);
this.bottomAxis.setLabelCount(5, false);
this.bottomAxis.setPosition(XAxisPosition.BOTTOM);
this.bottomAxis.setAxisMinimum(0);
this.bottomAxis.setAxisMaximum(50);
this.bottomAxis.setDrawAxisLine(false);
this.bottomAxis.setDrawLabels(false) this.leftAxis = new YAxis(AxisDependency.LEFT);
this.leftAxis.setLabelCount(7, false);
this.leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
this.leftAxis.setSpaceTop(15);
this.leftAxis.setAxisMinimum(-50);
this.leftAxis.setAxisMaximum(200);
this.leftAxis.enableGridDashedLine(5,5,0) this.rightAxis = new YAxis(AxisDependency.RIGHT);
this.rightAxis.setDrawGridLines(false);
this.rightAxis.setLabelCount(7, false);
this.rightAxis.setSpaceTop(11);
this.rightAxis.setAxisMinimum(-50); // this replaces setStartAtZero(true)
this.rightAxis.setAxisMaximum(200);
this.rightAxis.setDrawAxisLine(false); var upperLimtLine:LimitLine= new LimitLine(150, "Upper Limit");
upperLimtLine.setLineWidth(4);
upperLimtLine.enableDashedLine(10, 10, 0);
upperLimtLine.setLabelPosition(LimitLabelPosition.RIGHT_TOP);
upperLimtLine.setTextSize(10); var lowerLimtLine:LimitLine= new LimitLine(-30, "Lower Limit");
lowerLimtLine.setLineWidth(4);
lowerLimtLine.enableDashedLine(5, 5, 0);
lowerLimtLine.setLabelPosition(LimitLabelPosition.RIGHT_BOTTOM);
lowerLimtLine.setTextSize(10); this.leftAxis.setDrawLimitLinesBehindData(true);
this.leftAxis.addLimitLine(upperLimtLine);
this.leftAxis.addLimitLine(lowerLimtLine);
}
private initCurveData(count: number, range: number): LineData { let values = new JArrayList<EntryOhos>(); for (let i = 0; i < 50; i++) {
let val: number = Math.random() * 180-30;
values.add(newEntryOhos(i, val));
} let gradientFillColor =newArray<ColorStop>();
gradientFillColor.push(['#ffff0000',0.1])
gradientFillColor.push(['#00ff0000',1.0]) let dataSet =newJArrayList<ILineDataSet>(); let set1 =newLineDataSet(values,"DataSet 1");
set1.setDrawFilled(true);
set1.enableDashedLine(10,5,0)
set1.setMode(Mode.LINEAR);
set1.setGradientFillColor(gradientFillColor)
set1.setColorByColor(Color.Black);
set1.setLineWidth(1)
set1.setDrawCircles(true);
set1.setCircleColor(Color.Black);
set1.setCircleRadius(2);
set1.setCircleHoleRadius(1)
set1.setCircleHoleColor(Color.Green)
set1.setDrawCircleHole(false)
dataSet.add(set1); returnnewLineData(dataSet)
}

  

3.添加数据到自定义曲线图表组件

build() {
Stack({ alignContent: Alignment.TopStart }) {
LineChart({
topAxis: this.topAxis,
bottomAxis: this.bottomAxis,
width: this.width,
height: this.height,
minOffset: this.minOffset,
leftAxis: this.leftAxis,
rightAxis: this.rightAxis,
lineData: this.lineData,
})
}
}

  

图表二:柱状图

1.导入BarChart自定义组件:

import{BarChart,BarChartModel} from '@ohos/ohos_mpchart'

  

2.初始化数据

@State model:BarChartModel = new BarChartModel();
width: number = 350; //表的宽度
height: number = 500; //表的高度
minOffset: number = 15; //X轴线偏移量
leftAxis: YAxis = null;
rightAxis: YAxis = null;
bottomAxis: XAxis = new XAxis(); private aboutToAppear(){
this.leftAxis = new YAxis(AxisDependency.LEFT);
this.leftAxis.setLabelCount(6, false);
this.leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
this.leftAxis.setSpaceTop(15);
this.leftAxis.setAxisMinimum(0);
this.leftAxis.setAxisMaximum(110);
this.leftAxis.enableGridDashedLine(10,10,0) this.rightAxis = new YAxis(AxisDependency.RIGHT);
this.rightAxis.setDrawGridLines(false);
this.rightAxis.setLabelCount(6, false);
this.rightAxis.setSpaceTop(11);
this.rightAxis.setAxisMinimum(0);
this.rightAxis.setAxisMaximum(110); this.bottomAxis.setLabelCount(5, false);
this.bottomAxis.setPosition(XAxisPosition.BOTTOM);
this.bottomAxis.setAxisMinimum(0);
this.bottomAxis.setAxisMaximum(10); this.setData(this.bottomAxis.getAxisMaximum(),this.leftAxis.getAxisMaximum()) this.model.width = this.width;
this.model.height = this.height;
this.model.init();
this.model.setDrawBarShadow(false);
this.model.setDrawValueAboveBar(true);
this.model.getDescription().setEnabled(false);
this.model.setMaxVisibleValueCount(60);
this.model.setLeftYAxis(this.leftAxis);
this.model.setRightYAxis(this.rightAxis);
this.model.setXAxis(this.bottomAxis)
this.model.mRenderer.initBuffers();
this.model.prepareMatrixValuePx();
}
private setData(count: number, range: number) {
let groupSpace: number = 0.08;
let barSpace: number = 0.03; // x4 DataSet
let barWidth: number = 0.2; // x4 DataSet
let groupCount: number = count + 1;
let startYear: number = 1980;
letendYear: number = startYear + groupCount;
letvalues1:JArrayList<BarEntry>=
newJArrayList<BarEntry>();
letvalues2:JArrayList<BarEntry>=
newJArrayList<BarEntry>();
letvalues3:JArrayList<BarEntry>=
newJArrayList<BarEntry>();
letvalues4:JArrayList<BarEntry>=
newJArrayList<BarEntry>();
letrandomMultiplier: number = range;
for(let i = startYear; i < endYear; i++){
values1.add(newBarEntry(i,
(Math.random()* randomMultiplier)))
values2.add(newBarEntry(i,
(Math.random()* randomMultiplier)))
values3.add(newBarEntry(i,
(Math.random()* randomMultiplier)))
values4.add(newBarEntry(i,
(Math.random()* randomMultiplier)))
}
letset1: BarDataSet,set2:
BarDataSet,set3: BarDataSet,set4: BarDataSet;
if(this.model.getBarData()!=null&&
this.model.getBarData().getDataSetCount()>0){
set1 =this.model.getBarData().getDataSetByIndex(0) as BarDataSet;
set2 =this.model.getBarData().getDataSetByIndex(1) as BarDataSet;
set3 =this.model.getBarData().getDataSetByIndex(2) as BarDataSet;
set4 =this.model.getBarData().getDataSetByIndex(3) as BarDataSet;
set1.setValues(values1);
set2.setValues(values2);
set3.setValues(values3);
set4.setValues(values4);
this.model.getBarData().notifyDataChanged();
this.model.notifyDataSetChanged(); }else{
letcolors: number[]=
[Color.rgb(104,241,175),Color.rgb(164,228,251),Color.rgb(242,247,158),Color.rgb(255,102,0)];
set1 =newBarDataSet(values1,"Company A");
set1.setColorsByArr(colors);
set2 =newBarDataSet(values2,"Company B");
set2.setColorsByArr(colors);
set3 =newBarDataSet(values3,"Company C");
set3.setColorsByArr(colors);
set4 =newBarDataSet(values2,"Company D");
set4.setColorsByArr(colors); letdataSets: JArrayList<IBarDataSet>=
newJArrayList<IBarDataSet>();
dataSets.add(set1);
dataSets.add(set2);
dataSets.add(set3);
dataSets.add(set4); letdata: BarData =newBarData(dataSets);
this.model.setData(data);
}
this.model.getBarData().setBarWidth(barWidth);
this.bottomAxis.setAxisMinimum(startYear);
this.bottomAxis.setAxisMaximum(startYear +this.model.getBarData().getGroupWidth(groupSpace, barSpace)* groupCount);
this.model.groupBars(startYear, groupSpace, barSpace);
}

  

3.添加数据到自定义曲线图表组件

build() {
Stack(){
BarChart({model:this.model})
}
}

  

图表三:饼状图

1.导入PieChart自定义组件:

import { PieChart } from '@ohos/ohos_mpchart'

  

2.初始化数据

pieData: PieData = null;
@State pieModel: PieChart.Model = new PieChart.Model()
@State @Watch("seekBarXValueWatch")
seekBarX: SeekBar.Model = new SeekBar.Model()
@State @Watch("seekBarYValueWatch")
seekBarY: SeekBar.Model = new SeekBar.Model()
parties: string[] = [
"Party A", "Party B", "Party C", "Party D", "Party E", "Party F", "Party G", "Party H",
"Party I", "Party J", "Party K", "Party L", "Party M", "Party N", "Party O", "Party P",
"Party Q", "Party R", "Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
"Party Y", "Party Z"] private aboutToAppear(): void {
this.pieData = this.initPieData(4, 10);
this.pieModel
.setPieData(this.pieData)
.setRadius(150)
.setHoleRadius(0.5)
.setOffset(new MPPointF(160,200)) // vp
}
private initPieData(count: number,
range: number): PieData{
let entries = new JArrayList<PieEntry>();
for (var i = 0; i < count; i++) {
entries.add(new PieEntry(((Math.random() * range) + range / 5), this.parties[i % this.parties.length]))
}
// entries.add(new PieEntry(4,'Party A'))
// entries.add(new PieEntry(2,'Party B'))
// entries.add(new PieEntry(5,'Party C'))
// entries.add(new PieEntry(3,'Party D')) let dataSet: PieDataSet = new PieDataSet(entries,
"Election Results");
dataSet.setDrawIcons(false);
dataSet.setSliceSpace(3);
dataSet.setIconsOffset(new MPPointF(0, 40));
dataSet.setSelectionShift(5); // add a lot of colors
let colors: JArrayList<number> = new JArrayList();
for (let index = 0;
index < ColorTemplate.VORDIPLOM_COLORS.length; index++) {
colors.add(ColorTemplate.VORDIPLOM_COLORS[index]);
} for(let index =0;
index < ColorTemplate.JOYFUL_COLORS.length; index++){
colors.add(ColorTemplate.JOYFUL_COLORS[index]);
} for(let index =0;
index < ColorTemplate.COLORFUL_COLORS.length; index++){
colors.add(ColorTemplate.COLORFUL_COLORS[index]);
}
for(let index =0;
index < ColorTemplate.LIBERTY_COLORS.length; index++){
colors.add(ColorTemplate.LIBERTY_COLORS[index]);
}
for(let index =0;
index < ColorTemplate.PASTEL_COLORS.length; index++){
colors.add(ColorTemplate.PASTEL_COLORS[index]);
}
colors.add(ColorTemplate.getHoloBlue());
dataSet.setColorsByList(colors);
returnnewPieData(dataSet)
}

  

3.添加数据到自定义曲线图表组件

build() {
Column() {
PieChart({
model: this.pieModel
})
}

  

图表四:雷达图

1.导入RadarChart自定义组件:

import { RadarChart } from '@ohos/ohos_mpchart';

  

2.初始化数据

width: number = 300; //表的宽度
height: number = 300 //表的高度
minOffset: number = 5; //X轴线偏移量
xAxis: XAxis = new XAxis(); //顶部X轴
yAxis: YAxis = new YAxis();
data:RadarData= new RadarData();
@State
radarChartMode:RadarChartMode=new RadarChartMode();
public aboutToAppear() {
this.model.menuItemArr = this.menuItemArr
this.model.title = this.title this.data=this.initRadarData( 5,50)
this.xAxis.setTextSize(9);
this.xAxis.setYOffset(0);
this.xAxis.setXOffset(0);
this.xAxis.setTextColor(Color.White);
const mActivities:string[] = ["Burger", "Steak", "Salad", "Pasta", "Pizza"];
this.xAxis.setValueFormatter(new
class RadarAxisValueFormatter
implements IAxisValueFormatter{
public getFormattedValue( value:number,
axis:AxisBase):string {
return mActivities[value % mActivities.length];
}
});
this.xAxis.longest=mActivities[0];
this.yAxis.setLabelCount(5, false);
this.yAxis.setTextSize(9);
this.yAxis.setAxisMinimum(0);
this.yAxis.setAxisMaximum(80);
this.yAxis.setDrawLabels(false); this.radarChartMode.mRotateEnabled=false
this.radarChartMode.setYExtraOffset(this.model.height)
this.radarChartMode.setXAxis(this.xAxis)
this.radarChartMode.setYAxis(this.yAxis)
this.radarChartMode.setWidth(this.width)
this.radarChartMode.setHeight(this.height)
this.radarChartMode.setMinOffset(this.minOffset)
this.radarChartMode.setData(this.data)
this.radarChartMode.setPaddingLeft(30)
this.radarChartMode.setPaddingTop(100)
this.radarChartMode.init();
//this.animate('Animate XY')
} private initRadarData(count: number,
range: number): RadarData {
let mul:number = 80;
let min:number = 20;
let cnt:number =5;
let entries1 =newJArrayList<RadarEntry>();
let entries2 =newJArrayList<RadarEntry>(); //NOTE: The order of the entries when being added to the entries array determines their position around the center of
// the chart.
for(let i =0; i < cnt; i++){
letval1:number = Math.random()* mul + min;
entries1.add(newRadarEntry(val1)); letval2:number = Math.random()* mul + min;
entries2.add(newRadarEntry(val2));
}
letset1:RadarDataSet =newRadarDataSet(entries1,
"Last Week");
set1.setColorByColor(0xb4676e81);
set1.setFillColor(0xb4676e81);
set1.setDrawFilled(true);
set1.setFillAlpha(180);
set1.setLineWidth(2);
set1.setDrawHighlightCircleEnabled(true);
set1.setDrawHighlightIndicators(false);
set1.setHighlightCircleStrokeColor(0xffffffff);
set1.setHighlightCircleFillColor(0xb4676e81)
set1.setDrawValues(true)
set1.setIconsOffset(newMPPointF(0,px2vp(0))); letset2:RadarDataSet =newRadarDataSet(entries2,"This Week");
set2.setColorByColor(0xb479a2af);
set2.setFillColor(0xb479a2af);
set2.setDrawFilled(true);
set2.setFillAlpha(180);
set2.setLineWidth(2);
set2.setDrawHighlightCircleEnabled(true);
set2.setDrawHighlightIndicators(false);
set2.setHighlightCircleStrokeColor(0xffffffff);
set2.setHighlightCircleFillColor(0xb479a2af)
set2.setDrawValues(true)
set2.setIconsOffset(newMPPointF(0,px2vp(0))); let sets =newJArrayList<IRadarDataSet>();
sets.add(set1);
sets.add(set2);
//
letdata:RadarData =newRadarData(sets);
data.setValueTextSize(8);
data.setDrawValues(this.isDrawValuesEnable);
data.setValueTextColor(Color.White);
return data
}
public getFormattedValue(value: number): string {
var str =String(value.toFixed(1)).split(".");
if(str[1]=="0"){
return str[0];
}else{
returnString(value.toFixed(1))
}
}

  

3.添加数据到自定义曲线图表组件

build() {
Column() {
Stack({ alignContent: Alignment.TopStart }) {
RadarChart({
radarChartMode:this.radarChartMode,
})
}
}
}

  

其他图表使用方式与以上图表使用方法基本一致

Ohos-MPChart——支持多种图表绘制的组件的更多相关文章

  1. Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型 OxyPlot组件中支持7种类型的条型图表,分别为普通条形图.线型条形图.矩形条形图.差值图.龙卷风图.普通柱形图和柱形误差图, ...

  2. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表.条型图表.金融图表和其它图表. 线型图表 ...

  3. 让IE8支持HTML5及canvas功能!chart.js图表绘制工具库IE8上兼容方案

    第一步,我们加上对html5的支持. <!--[if IE]> <script src="/public/html5.js" type="text/ja ...

  4. 创建支持多种屏幕尺寸的Android应用

    Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的用户界面到它显示的屏上.与此同时,系统提供 ...

  5. 创办支持多种屏幕尺寸的Android应用

    创建支持多种屏幕尺寸的Android应用 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的 ...

  6. StreamSets学习系列之StreamSets支持多种安装方式【Core Tarball、Cloudera Parcel 、Full Tarball 、Full RPM 、Docker Image和Source Code 】(图文详解)

    不多说,直接上干货! Streamsets的官网 https://streamsets.com/ 得到 https://streamsets.com/opensource/ StreamSets支持多 ...

  7. ym——Android怎样支持多种屏幕

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/pra ...

  8. Quick BI 支持多种数据源进行多维分析

    一.摘要 随着互联网的高速发展,数据量爆发式增长的同时,数据的存储形式也开始呈现出多样性,有结构化存储,如 Mysql, Oracle, SQLServer 等,半结构化甚至非结构化存储,如HBase ...

  9. Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70)

    Neutron 的架构是非常开放的,可以支持多种 network provider,只要遵循一定的设计原则和规范.本节我们将开始讨论这个主题. 先讨论一个简单的场景:在 Neutorn 中使用 lin ...

  10. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

随机推荐

  1. jq中的正则

    正则匹配表达式 \w \s \d \b . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 等价于 '[A-Za-z0-9_]'. \s 匹配任意的空白符 \d 匹配数字 \b 匹配单 ...

  2. CGI, FastCGI, WSGI, uWSGI, uwsgi一文搞懂

    中间件 1.服务器中间件:nginx,apache 2.数据库中间件:介于应用程序和数据库之前的,MyCat 3.消息队列中间件:kafka,rabbitmq,Rocketmq CGI 1.CGI是一 ...

  3. chrome浏览器配置自定义搜索引擎

    chrome谷歌浏览器配置自定义搜索引擎 放弃百度搜索已经酝酿许久,现在搜索结果简直不忍直视.如果你想放弃使用百度搜索,并转向其他搜索引擎,头条搜索可能是一个不错的选择. 使用以下方式可以丝滑的使用其 ...

  4. 逆向实战32——某东最新h5st4.4算法分析

    前言 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...

  5. 【Azure Function】示例运行 python durable function(model V2)

    问题描述 参考官方文档(使用 Python 创建你的第一个持久函数:https://learn.microsoft.com/zh-cn/azure/azure-functions/durable/qu ...

  6. 【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?

    问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话"Account failover is not supported for sto ...

  7. Frechet Inception Distance

    (以下内容重新更新,主要讲解FID的意义,为何FID能够表示生成图像的多样性和质量,为什么FID越小,则图像多样性越好,质量也越好) 在计算FID中我们也同样使用inception network网络 ...

  8. C++//queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为

    1 //queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为 2 3 4 #include<iostream> 5 #include<queue> ...

  9. 深入解析:AntSK 0.1.7版本的技术革新与多模型管理策略

    在信息技术快速迭代的当下,.Net生态中的AntSK项目凭借其前沿的AI知识库和智能体技术,已经吸引了广大开发者的关注和参与.今天,我要给大家介绍的主角,AntSK 0.1.7版本,无疑将是这个开源项 ...

  10. vscode 注释后 光标下移(注释后光标快速定位下一行) 仿照idea

    VSCode 注释后光标快速定位下一行 1. 安装插件 Multi-command Multi-command 2.打开 Keybinding.json Keybinding.json 左下角齿轮图标 ...