Flutter图表绘制插件mp_chart的使用

Flutter图表绘制插件mp_chart的使用

flutter charts 类似于强大的 Android 图表库 <a href="https://github.com/PhilJay/MPAndroidChart" rel="ugc"><strong>MPAndroidChart</strong></a>

当前支持的最低版本为 1.22.0。如果你使用的 Flutter 版本较低,请切换到 'localPosition-support' 分支,该分支支持对 flutter version 中不支持 wiget local postionXXXDetailsPointerXXXEvent

感谢 <a href="https://github.com/PhilJay/MPAndroidChart" rel="ugc"><strong>MPAndroidChart</strong></a>,在将此库移植到 Flutter 的过程中,我学到了很多关于矩阵在动画中的应用知识。

待办事项 (todos)

  1. 潜在问题修复

更多例子

线形图 (LineCharts)

基础线形图

多条线形图

双轴线形图

倒置轴线形图

曲线线形图

彩色线形图

性能优化线形图

填充区域线形图


柱状图 (BarCharts)

基础柱状图

多数据集柱状图

水平柱状图

堆叠柱状图

含负值柱状图

带负值堆叠柱状图

正弦函数柱状图


饼图 (PieCharts)

基础饼图

带值线饼图

半圆饼图


其他图表 (OtherCharts)

组合图表

散点图

气泡图

蜡烛图

雷达图


滚动图表 (ScrollingCharts)

多种图表滚动

视图页滚动

高度超过屏幕的柱状图

许多柱状图滚动


更多功能图表 (EvenMoreCharts)

动态图表

实时更新图表

每小时更新图表


许可证 (License)

版权所有 © 2019 SunPointed
根据 Apache License, Version 2.0 许可证授权;你可以根据许可证的规定使用此文件,除非遵守许可证的规定,否则不能使用此文件。你可以在以下地址获取许可证的副本:

除非适用法律或书面协议要求,否则以“原样”为基础分发的软件,不包含任何明示或暗示的担保或条件。有关具体许可条款,请参阅许可证。


完整示例代码

import 'package:example/demo/bar_chart/basic.dart';
import 'package:example/demo/bar_chart/basic2.dart';
import 'package:example/demo/bar_chart/horizontal.dart';
import 'package:example/demo/bar_chart/multiple.dart';
import 'package:example/demo/bar_chart/negative.dart';
import 'package:example/demo/bar_chart/sine.dart';
import 'package:example/demo/bar_chart/stacked.dart';
import 'package:example/demo/bar_chart/stacked2.dart';
import 'package:example/demo/even_more/dynamic.dart';
import 'package:example/demo/even_more/hourly.dart';
import 'package:example/demo/line_chart/basic.dart';
import 'package:example/demo/line_chart/colorful.dart';
import 'package:example/demo/line_chart/cubic.dart';
import 'package:example/demo/line_chart/dual_axis.dart';
import 'package:example/demo/line_chart/filled.dart';
import 'package:example/demo/line_chart/invert_axis.dart';
import 'package:example/demo/line_chart/multiple.dart';
import 'package:example/demo/line_chart/performance.dart';
import 'package:example/demo/other_chart/bubble.dart';
import 'package:example/demo/other_chart/candlestick.dart';
import 'package:example/demo/other_chart/combined.dart';
import 'package:example/demo/other_chart/radar.dart';
import 'package:example/demo/other_chart/scatter_plot.dart';
import 'package:example/demo/pie_chart/basic.dart';
import 'package:example/demo/pie_chart/half_pie.dart';
import 'package:example/demo/pie_chart/value_lines.dart';
import 'package:example/demo/res/styles.dart';
import 'package:example/demo/scrolling_chart/multiple.dart';
import 'package:example/demo/scrolling_chart/tall_bar.dart';
import 'package:example/demo/scrolling_chart/view_pager.dart';
import 'package:flutter/material.dart';
import 'package:mp_chart/mp/core/utils/color_utils.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'example Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(title: 'example example'),
      routes: {
        '/line_chart/basic': (_) => LineChartBasic(),
        '/line_chart/multiple': (_) => LineChartMultiple(),
        '/line_chart/dual_axis': (_) => LineChartDualAxis(),
        '/line_chart/invert_axis': (_) => LineChartInvertAxis(),
        '/line_chart/cubic': (_) => LineChartCubic(),
        '/line_chart/colorful': (_) => LineChartColorful(),
        '/line_chart/performance': (_) => LineChartPerformance(),
        '/line_chart/filled': (_) => LineChartFilled(),
        '/bar_chart/basic': (_) => BarChartBasic(),
        '/bar_chart/basic2': (_) => BarChartBasic2(),
        '/bar_chart/multiple': (_) => BarChartMultiple(),
        '/bar_chart/horizontal': (_) => BarChartHorizontal(),
        '/bar_chart/stacked': (_) => BarChartStacked(),
        '/bar_chart/negative': (_) => BarChartNegative(),
        '/bar_chart/stacked2': (_) => BarChartStacked2(),
        '/bar_chart/sine': (_) => BarChartSine(),
        '/pie_chart/basic': (_) => PieChartBasic(),
        '/pie_chart/value_lines': (_) => PieChartValueLines(),
        '/pie_chart/half_pie': (_) => PieChartHalfPie(),
        '/other_chart/combined_chart': (_) => OtherChartCombined(),
        '/other_chart/scatter_plot': (_) => OtherChartScatterPlot(),
        '/other_chart/bubble_chart': (_) => OtherChartBubble(),
        '/other_chart/candlestick': (_) => OtherChartCandlestick(),
        '/other_chart/redar_chart': (_) => OtherChartRadar(),
        '/scrolling_chart/multiple': (_) => ScrollingChartMultiple(),
        '/scrolling_chart/view_pager': (_) => ScrollingChartViewPager(),
        '/scrolling_chart/tall_bar_chart': (_) => ScrollingChartTallBar(),
        '/scrolling_chart/many_bar_charts': (_) => ScrollingChartManyBar(),
        '/even_more_line_chart/dynamic': (_) => EvenMoreDynamic(),
        '/even_more_line_chart/realtime': (_) => EvenMoreRealtime(),
        '/even_more_line_chart/hourly': (_) => EvenMoreHourly(),
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  PopupMenuItem _item(String text, String id) {
    return PopupMenuItem<String>(
      value: id,
      child: Container(
        padding: EdgeInsets.only(top: 15.0),
        child: Center(
          child: Text(
            text,
            textDirection: TextDirection.ltr,
            textAlign: TextAlign.center,
            style: TextStyle(color: ColorUtils.BLACK, fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
      ),
    );
  }

  void _itemClick(String action) {
    switch (action) {
      case 'A':
        break;
      case 'B':
        break;
      case 'C':
        break;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          PopupMenuButton<String>(
            itemBuilder: (BuildContext context) => [
              _item('View on GitHub', 'A'),
              _item('Problem Report', 'B'),
              _item('Developer Website', 'C'),
            ],
            onSelected: (String action) {
              _itemClick(action);
            },
          ),
        ],
      ),
      body: CustomScrollView(
        shrinkWrap: false,
        slivers: [
          SliverPadding(
            padding: const EdgeInsets.fromLTRB(0, 0, 0, 5),
            sliver: SliverList(
              delegate: SliverChildListDelegate(
                [
                  Container(
                    padding: EdgeInsets.symmetric(horizontal: 15.0),
                    child: Column(
                      mainAxisSize: MainAxisSize.max,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Container(
                          padding: EdgeInsets.all(15.0),
                          child: Center(
                            child: Text(
                              "Line Charts",
                              textDirection: TextDirection.ltr,
                              textAlign: TextAlign.center,
                              style: TextStyle(color: ColorUtils.BLACK, fontSize: 18, fontWeight: FontWeight.bold),
                            ),
                          ),
                        ),
                        Gaps.line,
                      ],
                    ),
                  ),
                  InkWell(
                    onTap: () => Navigator.of(context).pushNamed('/line_chart/basic'),
                    child: Container(
                      padding: EdgeInsets.symmetric(horizontal: 15.0),
                      child: Container(
                        padding: EdgeInsets.only(top: 15),
                        child: Column(
                          mainAxisSize: MainAxisSize.max,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(
                              "Basic",
                              textDirection: TextDirection.ltr,
                              textAlign: TextAlign.center,
                              style: TextStyle(color: ColorUtils.BLACK, fontSize: 14, fontWeight: FontWeight.bold),
                            ),
                            Container(
                              padding: EdgeInsets.only(top: 10, bottom: 15),
                              child: Text(
                                "Simple line chart.",
                                textDirection: TextDirection.ltr,
                                textAlign: TextAlign.center,
                                style: TextStyle(color: ColorUtils.BLACK, fontSize: 12),
                              ),
                            ),
                            Gaps.line,
                          ],
                        ),
                      ),
                    ),
                  ),
                  InkWell(
                    onTap: () => Navigator.of(context).pushNamed('/line_chart/multiple'),
                    child: Container(
                      padding: EdgeInsets.symmetric(horizontal: 15.0),
                      child: Container(
                        padding: EdgeInsets.only(top: 15),
                        child: Column(
                          mainAxisSize: MainAxisSize.max,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(
                              "Multiple",
                              textDirection: TextDirection.ltr,
                              textAlign: TextAlign.center,
                              style: TextStyle(color: ColorUtils.BLACK, fontSize: 14, fontWeight: FontWeight.bold),
                            ),
                            Container(
                              padding: EdgeInsets.only(top: 10, bottom: 15),
                              child: Text(
                                "Show mutiple data sets.",
                                textDirection: TextDirection.ltr,
                                textAlign: TextAlign.center,
                                style: TextStyle(color: ColorUtils.BLACK, fontSize: 12),
                              ),
                            ),
                            Gaps.line,
                          ],
                        ),
                      ),
                    ),
                  ),
                  // 其他图表项...
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter图表绘制插件mp_chart的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图表绘制插件mp_chart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mp_chart 是一个基于 Flutter 的图表绘制插件,它提供了丰富的图表类型和自定义选项,帮助开发者轻松地在应用中集成各种图表。mp_chart 是基于 Android 的 MPAndroidChart 库的 Flutter 版本,因此它继承了 MPAndroidChart 的强大功能和灵活性。

1. 安装 mp_chart 插件

首先,你需要在 pubspec.yaml 文件中添加 mp_chart 依赖:

dependencies:
  flutter:
    sdk: flutter
  mp_chart: ^0.4.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 基本使用

mp_chart 支持多种图表类型,包括折线图、柱状图、饼图、雷达图等。下面以折线图为例,介绍如何使用 mp_chart

2.1 折线图 (LineChart)

首先,导入 mp_chart 包:

import 'package:mp_chart/mp/chart/line_chart.dart';
import 'package:mp_chart/mp/controller/line_chart_controller.dart';
import 'package:mp_chart/mp/core/data/line_data.dart';
import 'package:mp_chart/mp/core/data_interfaces/i_line_data_set.dart';
import 'package:mp_chart/mp/core/data_set/line_data_set.dart';
import 'package:mp_chart/mp/core/description.dart';
import 'package:mp_chart/mp/core/entry/entry.dart';
import 'package:mp_chart/mp/core/enums/legend_form.dart';
import 'package:mp_chart/mp/core/enums/mode.dart';
import 'package:mp_chart/mp/core/value_formatter/value_formatter.dart';

然后,创建一个 LineChartController 并配置图表:

class LineChartExample extends StatelessWidget {
  final LineChartController controller = LineChartController();

  LineChartExample() {
    _setupChart();
  }

  void _setupChart() {
    // 创建数据点
    List<Entry> entries = [
      Entry(x: 0, y: 4),
      Entry(x: 1, y: 8),
      Entry(x: 2, y: 6),
      Entry(x: 3, y: 2),
      Entry(x: 4, y: 7),
    ];

    // 创建数据集
    LineDataSet dataSet = LineDataSet(entries, "Label");
    dataSet.setColor1(Colors.blue);
    dataSet.setCircleColor(Colors.red);
    dataSet.setLineWidth(2);
    dataSet.setCircleRadius(4);
    dataSet.setDrawValues(true);

    // 创建图表数据
    LineData lineData = LineData([dataSet]);

    // 配置图表
    controller.data = lineData;
    controller.description = Description()..text = "Line Chart Example";
    controller.legend
      ..form = LegendForm.LINE
      ..textColor = Colors.black;
    controller.xAxis
      ..position = XAxisPosition.BOTTOM
      ..textColor = Colors.black;
    controller.axisLeft
      ..textColor = Colors.black;
    controller.axisRight.setEnabled(false);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Line Chart Example"),
      ),
      body: Center(
        child: LineChart(controller),
      ),
    );
  }
}

3. 其他图表类型

mp_chart 还支持其他图表类型,如柱状图 (BarChart)、饼图 (PieChart)、雷达图 (RadarChart) 等。使用方法与折线图类似,只需替换相应的图表类型和控制器即可。

3.1 柱状图 (BarChart)

import 'package:mp_chart/mp/chart/bar_chart.dart';
import 'package:mp_chart/mp/controller/bar_chart_controller.dart';
import 'package:mp_chart/mp/core/data/bar_data.dart';
import 'package:mp_chart/mp/core/data_set/bar_data_set.dart';

class BarChartExample extends StatelessWidget {
  final BarChartController controller = BarChartController();

  BarChartExample() {
    _setupChart();
  }

  void _setupChart() {
    List<BarEntry> entries = [
      BarEntry(x: 0, y: 4),
      BarEntry(x: 1, y: 8),
      BarEntry(x: 2, y: 6),
      BarEntry(x: 3, y: 2),
      BarEntry(x: 4, y: 7),
    ];

    BarDataSet dataSet = BarDataSet(entries, "Label");
    dataSet.setColor1(Colors.blue);

    BarData barData = BarData([dataSet]);

    controller.data = barData;
    controller.description = Description()..text = "Bar Chart Example";
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Bar Chart Example"),
      ),
      body: Center(
        child: BarChart(controller),
      ),
    );
  }
}
回到顶部