Flutter图表绘制插件relu_plot_lib的使用

Flutter图表绘制插件relu_plot_lib的使用

relu_plot_lib 是一个用于Flutter桌面应用程序的简单图表工具。

您可以添加多个图表,并使用您选择的小部件对其进行注释。通过鼠标操作,您可以导航和缩放图表,并使用十字线读取和比较图表值。

使用

要使用 relu_plot_lib,只需在您的 pubspec.yaml 文件中添加 relu_plot_lib 作为依赖项。

dependencies:
  relu_plot_lib: ^1.0.6

下面是一个简单的 relu_plot_lib 图表实现示例,该示例与上文中的视频演示一致。此代码也可以在 examples 文件夹中找到。

Plot(
  xTicks: Ticks(
    pretty: true, 
    logarithmic: true,
    unit: 'Hz',
    fractionDigits: 1,
  ),
  yTicks: Ticks(
    pretty: true, 
    unit: 'dB'
  ),
  graphs: [
    Graph(
      x: List<double>.generate(10000, (i) => i + 1.0), 
      y: List<double>.generate(10000, (i) => i + 1.0),
      color: Colors.blue,
      crosshairs: [
        Crosshair(
          width: 120,
          label: 'Crosshair', 
          yPadding: 20, 
          color: Colors.red,
        )
      ],
      annotations: [
        Annotation(
          width: 100,
          height: 100,
          child: const Card.filled(
            color: Colors.red,
            child: SizedBox(
              width: 100,
              height: 70,
              child: Center(
                child: Text(
                  'This is an annotation!', 
                  textAlign: TextAlign.center,
                )
              ),
            ),
          ),
        ),
      ]
    ),
  ],
)

示例代码

以下是完整的示例代码,展示了如何在Flutter应用中使用 relu_plot_lib

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

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

/// 这是一个示例应用,展示如何使用relu_plot_lib。
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'relu_plot_lib demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'relu_plot_lib demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
          child: Padding(
              padding: const EdgeInsets.all(10),
              child: Plot(
                xTicks: Ticks(
                  pretty: true,
                  logarithmic: true,
                  unit: 'Hz',
                  fractionDigits: 1,
                ),
                yTicks: Ticks(pretty: true, logarithmic: false, unit: 'dB'),
                graphs: [
                  Graph(
                    x: List<double>.generate(10000, (i) => i + 1.0),
                    y: List<double>.generate(10000, (i) => i + 1.0),
                    color: Colors.blue,
                    crosshairs: [
                      Crosshair(
                        width: 120,
                        label: 'Crosshair',
                        yPadding: 20,
                        color: Colors.red,
                      )
                    ],
                    annotations: [
                      Annotation(
                        width: 100,
                        height: 100,
                        child: const Card.filled(
                          color: Colors.red,
                          child: SizedBox(
                            width: 100,
                            height: 70,
                            child: Center(
                                child: Text(
                              'This is an annotation!',
                              textAlign: TextAlign.center,
                            )),
                          ),
                        ),
                      ),
                    ]),
                ],
              ))),
    );
  }
}

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

1 回复

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


当然,我可以为你提供一个关于如何使用 relu_plot_lib 插件在 Flutter 中绘制图表的示例代码。请注意,relu_plot_lib 并不是 Flutter 官方或者广泛知名的图表库(例如 charts_flutterflutter_line_chart),因此假设 relu_plot_lib 是一个自定义的或者小众的图表库,并且其 API 类似于常见的图表库。

以下是一个假设性的示例代码,用于展示如何使用 relu_plot_lib 绘制一个简单的折线图:

  1. 添加依赖: 首先,确保你已经在 pubspec.yaml 文件中添加了 relu_plot_lib 的依赖(注意:这只是一个假设性的依赖名称)。

    dependencies:
      flutter:
        sdk: flutter
      relu_plot_lib: ^x.y.z  # 替换为实际版本号
    
  2. 导入库: 在你的 Dart 文件中导入 relu_plot_lib

    import 'package:relu_plot_lib/relu_plot_lib.dart';
    
  3. 创建图表数据: 定义你的图表数据,这里我们假设你有一个简单的数据集。

    final List<double> xData = [1, 2, 3, 4, 5];
    final List<double> yData = [2, 3, 5, 7, 11];
    
  4. 构建图表: 使用 relu_plot_lib 提供的组件构建你的图表。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Demo'),
            ),
            body: Center(
              child: PlotWidget(
                data: LinePlotData(
                  xData: xData,
                  yData: yData,
                  label: 'Prime Numbers Line Plot',
                  color: Colors.blue,
                ),
              ),
            ),
          ),
        );
      }
    }
    
    class PlotWidget extends StatelessWidget {
      final LinePlotData data;
    
      PlotWidget({required this.data});
    
      @override
      Widget build(BuildContext context) {
        return CustomPaint(
          size: Size(double.infinity, double.infinity),
          painter: LinePlotPainter(data),
        );
      }
    }
    
    class LinePlotData {
      final List<double> xData;
      final List<double> yData;
      final String label;
      final Color color;
    
      LinePlotData({
        required this.xData,
        required this.yData,
        required this.label,
        required this.color,
      });
    }
    
    class LinePlotPainter extends CustomPainter {
      final LinePlotData data;
    
      LinePlotPainter(this.data);
    
      @override
      void paint(Canvas canvas, Size size) {
        final Paint paint = Paint()
          ..color = data.color
          ..strokeWidth = 2.0
          ..style = PaintingStyle.stroke;
    
        final double padding = 20.0;
        final double plotWidth = size.width - 2 * padding;
        final double plotHeight = size.height - 2 * padding;
    
        final double scaleX = plotWidth / (data.xData.last - data.xData.first);
        final double scaleY = plotHeight / (data.yData.maxOrNull()!?.toDouble() ?? 1.0 - data.yData.minOrNull()!?.toDouble() ?? 1.0);
    
        Path path = Path();
        path.moveTo(
          padding + data.xData.first * scaleX,
          plotHeight + padding - data.yData[0] * scaleY,
        );
    
        for (int i = 1; i < data.xData.length; i++) {
          path.lineTo(
            padding + data.xData[i] * scaleX,
            plotHeight + padding - data.yData[i] * scaleY,
          );
        }
    
        canvas.drawPath(path, paint);
      }
    
      @override
      bool shouldRepaint(covariant CustomPainter oldDelegate) {
        return oldDelegate != this;
      }
    }
    

注意

  • 上面的代码假设 relu_plot_lib 提供了类似于 LinePlotDataLinePlotPainter 的抽象。如果 relu_plot_lib 的实际 API 不同,你需要根据实际的文档和 API 进行调整。
  • CustomPaintCustomPainter 是 Flutter 中用于自定义绘图的组件。
  • 实际的 relu_plot_lib 可能会有更高级的 API,可以直接使用而不需要手动绘制路径。

如果你使用的是实际的 relu_plot_lib,请参考该库的官方文档和示例代码来获取准确的用法。

回到顶部