Flutter热力图绘制插件fl_heatmap的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter热力图绘制插件fl_heatmap的使用

插件简介

fl_heatmap 是一个用于Flutter应用的热力图组件。它允许开发者以直观的方式展示数据分布,通过颜色深浅来表示数值大小。

heatmap electricity consumption heatmap water consumption

使用步骤

1. 添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  fl_heatmap: ^0.1.0

2. 安装依赖

通过命令行安装依赖包:

flutter packages get

3. 使用示例

下面是一个完整的示例代码,展示了如何创建一个热力图,并处理用户点击事件:

import 'dart:math';
import 'package:fl_heatmap/fl_heatmap.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  HeatmapItem? selectedItem;

  late HeatmapData heatmapDataPower;

  @override
  void initState() {
    _initExampleData();
    super.initState();
  }

  void _initExampleData() {
    const rows = [
      '2022',
      '2021',
      '2020',
      '2019',
      '2018',
      '2017',
      '2016',
      '2015',
    ];
    const columns = [
      'Jan',
      'Feb',
      'Mär',
      'Apr',
      'Mai',
      'Jun',
      'Jul',
      'Aug',
      'Sep',
      'Okt',
      'Nov',
      'Dez',
    ];
    final r = Random();
    const String unit = 'kWh';
    final items = [
      for (int row = 0; row < rows.length; row++)
        for (int col = 0; col < columns.length; col++)
          if (!(row == 3 && col < 2)) // 不添加特定位置的数据(模拟不完整数据的情况)
            HeatmapItem(
                value: r.nextDouble() * 6,
                style: row == 0 && col > 1 ? HeatmapItemStyle.hatched : HeatmapItemStyle.filled,
                unit: unit,
                xAxisLabel: columns[col],
                yAxisLabel: rows[row]),
    ];
    heatmapDataPower = HeatmapData(
      rows: rows,
      columns: columns,
      radius: 6.0,
      items: items,
    );
  }

  @override
  Widget build(BuildContext context) {
    final title = selectedItem != null
        ? '${selectedItem!.value.toStringAsFixed(2)} ${selectedItem!.unit}'
        : '--- ${heatmapDataPower.items.first.unit}';
    final subtitle = selectedItem != null
        ? '${selectedItem!.xAxisLabel} ${selectedItem!.yAxisLabel}'
        : '---';
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Heatmap plugin example app'),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              const SizedBox(height: 16),
              Text(title, textScaleFactor: 1.4),
              Text(subtitle),
              const SizedBox(height: 8),
              Heatmap(
                  onItemSelectedListener: (HeatmapItem? selectedItem) {
                    debugPrint(
                        'Item ${selectedItem?.yAxisLabel}/${selectedItem?.xAxisLabel} with value ${selectedItem?.value} selected');
                    setState(() {
                      this.selectedItem = selectedItem;
                    });
                  },
                  rowsVisible: 5,
                  heatmapData: heatmapDataPower)
            ],
          ),
        ),
      ),
    );
  }
}

特性

  • 自定义颜色方案:支持动态调整大小的颜色方案或使用预定义的颜色调色板,如 colorPaletteTemperaturecolorPaletteRedcolorPaletteBlue
  • 动态轴标签:x轴和y轴标签完全动态生成。
  • 隐藏轴标签:根据需要选择是否显示x轴/y轴标签。
  • 交互功能:检测单元格点击事件,并返回选中的数据项,以便显示详细信息。
  • 样式定制:为不同的单元格设置不同样式。
  • 分页显示:可以只显示前几行,用户可以选择展开显示所有行。

应用实例

该插件已经被一些实际项目采用,例如 EHW+,以下是其界面截图: EHW+

希望以上内容能帮助你更好地理解和使用 fl_heatmap 插件!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用fl_heatmap插件来绘制热力图的代码示例。fl_heatmap是一个用于在Flutter应用中绘制热力图的流行插件。

首先,确保在你的pubspec.yaml文件中添加fl_heatmap依赖:

dependencies:
  flutter:
    sdk: flutter
  fl_heatmap: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,下面是一个完整的示例代码,展示如何使用fl_heatmap来绘制一个简单的热力图:

import 'package:flutter/material.dart';
import 'package:fl_heatmap/fl_heatmap.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Heatmap Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HeatmapPage(),
    );
  }
}

class HeatmapPage extends StatefulWidget {
  @override
  _HeatmapPageState createState() => _HeatmapPageState();
}

class _HeatmapPageState extends State<HeatmapPage> {
  final List<HeatmapData> heatmapData = [
    HeatmapData(x: 1, y: 1, value: 10),
    HeatmapData(x: 2, y: 1, value: 20),
    HeatmapData(x: 1, y: 2, value: 30),
    HeatmapData(x: 2, y: 2, value: 40),
    // 添加更多数据点...
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Heatmap Example'),
      ),
      body: Center(
        child: Container(
          width: double.infinity,
          height: double.infinity,
          child: HeatmapWidget(
            data: heatmapData,
            maxValue: 50,  // 热力图的最大值,用于归一化颜色
            xRange: 0..2,  // X轴的范围
            yRange: 0..2,  // Y轴的范围
            cellSize: Size(50, 50),  // 每个单元格的大小
            builder: (context, value) {
              // 根据值返回颜色,这里是一个简单的线性渐变示例
              final color = Color.lerp(Colors.blue, Colors.red, value / 1.0)!;
              return Container(
                decoration: BoxDecoration(color: color),
              );
            },
          ),
        ),
      ),
    );
  }
}

解释:

  1. 依赖添加:在pubspec.yaml文件中添加fl_heatmap依赖。

  2. 数据准备:在_HeatmapPageState类中,我们准备了一些HeatmapData对象,这些对象包含了热力图的坐标(x, y)和对应的值(value)。

  3. 构建热力图:使用HeatmapWidget来构建热力图。我们传递了数据列表、最大值、X轴和Y轴的范围、单元格大小以及一个自定义的builder函数。builder函数根据归一化后的值返回颜色。

  4. 颜色映射:在builder函数中,我们使用Color.lerp方法根据值生成颜色。这是一个简单的线性渐变示例,从蓝色到红色。

你可以根据需要调整数据、范围、单元格大小和颜色映射逻辑,以适应你的具体需求。这个示例提供了一个基本的框架,你可以在其基础上进行扩展和自定义。

回到顶部