Flutter 颤振中的非连续时间序列

Flutter 颤振中的非连续时间序列,flutter,charts,timeserieschart,Flutter,Charts,Timeserieschart,我正在尝试为web创建一个颤振时间体验。我的数据涵盖多天,但在24小时内仅从07:00到16:00。是否有一种方法可以从时间轴中排除非采样时间 我已经附上代码来显示一个代表性的数据集,它生成下面的图表。我想去掉没有样品的扁平部分 导入“包装:颤振/材料.省道”; 以图表形式导入“包:图表\颤振/颤振.省道”; void main(){ runApp(MyApp()); } 类MyApp扩展了无状态小部件{ //此小部件是应用程序的根。 @凌驾 小部件构建(构建上下文){ 返回材料PP( 标题:

我正在尝试为web创建一个颤振时间体验。我的数据涵盖多天,但在24小时内仅从07:00到16:00。是否有一种方法可以从时间轴中排除非采样时间

我已经附上代码来显示一个代表性的数据集,它生成下面的图表。我想去掉没有样品的扁平部分

导入“包装:颤振/材料.省道”;
以图表形式导入“包:图表\颤振/颤振.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
//这是应用程序的主题。
//
//尝试使用“flutter run”运行应用程序。您将看到
//应用程序有一个蓝色工具栏。然后,在不退出应用程序的情况下,重试
//将下面的primarySwatch更改为Colors.green,然后调用
//“热重新加载”(在运行“颤振运行”的控制台中按“r”,
//或者只需将更改保存到颤振IDE中的“热重新加载”。
//请注意,计数器没有重置回零;应用程序
//未重新启动。
主样本:颜色。蓝色,
//这使视觉密度适应您运行的平台
//上的应用程序。对于桌面平台,控件将更小且更简单
//比移动平台更紧密(密度更高)。
视觉密度:视觉密度。自适应平台密度,
),
主页:主页(),
);
}
}
类MainPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
//在这里,我们从MyHomePage对象中获取由创建的值
//使用App.build方法,并使用它设置appbar标题。
标题:文本(“标题”),
),
正文:SimpleTimeSeresChart.withSampleData(),
);
}
}
类SimpleTimesRiesChart扩展了无状态小部件{
最终清单系列清单;
最后的布尔动画;
SimpleTimeSeriesChart(this.seriesList,{this.animate});
///创建带有样本数据且无转换的[TimeSeriesChart]。
工厂SimpleTimeriesChart.with采样数据(){
返回新的SimpleTimeriesChart(
_createSampleData(),
//禁用图像测试的动画。
动画:假,
);
}
@凌驾
小部件构建(构建上下文){
返回新图表。TimeSeriesChart(
系列列表,
动画制作:动画制作,
//可选地传入图表使用的[DateTimeFactory]。工厂
//应创建与提供的数据相同类型的[DateTime]。如果没有
//指定时,默认值将创建本地日期时间。
dateTimeFactory:const charts.LocalDateTimeFactory(),
主要测量轴:图表。数值轴规格(
tickProviderSpec:
charts.BasicNumericTickProviderSpec(zeroBound:false)),
行为:[
charts.LinePoint荧光灯(
DrawFollowlinesCrossChart:正确,
showHorizontalFollowLine:
charts.LinePointHighlighterFollowLineType.nearest,
showVerticalFollowLine:
charts.LinePointHighlighterFollowLineType.nearest,
)
],
);
}
///使用示例硬编码数据创建一个系列。
静态列表_createSampleData(){
最终数据=[
时间体验(
DateTime.parse('2020-09-08 07:00:00-05'),28133.310000000000),
时间体验(
DateTime.parse('2020-09-08 08:00:00-05'),27896.299667),
时间体验(
DateTime.parse('2020-09-08 09:00:00-05'),27650.79050000000),
时间体验(
DateTime.parse('2020-09-08 10:00:00-05'),27663.60583333333),
时间体验(
DateTime.parse('2020-09-08 11:00:00-05'),27700.321667),
时间体验(
DateTime.parse('2020-09-08 12:00:00-05'),27787.622500000000),
时间体验(
DateTime.parse('2020-09-08 13:00:00-05'),27671.972500000000),
时间体验(
DateTime.parse('2020-09-08 14:00:00-05'),27576.78166667),
时间体验(
DateTime.parse('2020-09-08 15:00:00-05'),27501.2855000000),
时间体验(
DateTime.parse('2020-09-08 16:00:00-05'),27500.890000000000),
时间体验(
DateTime.parse('2020-09-09 07:00:00-05'),27500.890000000000),
时间体验(
DateTime.parse('2020-09-09 08:00:00-05'),27626.43766667),
时间体验(
DateTime.parse('2020-09-09 09:00:00-05'),27934.25516667),
时间体验(
DateTime.parse('2020-09-09 10:00:00-05'),28004.045000000000),
时间体验(
DateTime.parse('2020-09-09 11:00:00-05'),28043.67650000000),
时间体验(
DateTime.parse('2020-09-09 12:00:00-05'),28136.98766667),
时间体验(
DateTime.parse('2020-09-09 13:00:00-05'),28144.2343333),
时间体验(
DateTime.parse('2020-09-09 14:00:00-05'),28134.081166667),
时间体验(
DateTime.parse('2020-09-09 15:00:00-05'),27940.84150000000),
时间体验(
DateTime.parse('2020-09-09 16:00:00-05'),27940.470000000000),
时间体验(
DateTime.parse('2020-09-10 07:00:00-05'),27940.470000000000),
时间体验(
DateTime.parse('2020-09-10 08:00:00-05'),28027.06133333),
时间体验(
DateTime.parse('2020-09-10 09:00:00-05'),28059.610667),
时间体验(
DateTime.parse('2020-09-10 10:00:00-05'),27931.955500000000),
时间体验(
DateTime.parse('2020-09-10 11:00:00-05'),27828.52766667),
时间体验(
DateTime.parse('2020-09-10 12:00:00-05'),27829.48366667),
import 'package:flutter/material.dart';
import 'package:charts_flutter/flutter.dart' as charts;

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
        // This makes the visual density adapt to the platform that you run
        // the app on. For desktop platforms, the controls will be smaller and
        // closer together (more dense) than on mobile platforms.
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MainPage(),
    );
  }
}

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text('Title'),
      ),
      body: SimpleTimeSeriesChart.withSampleData(),
    );
  }
}

class SimpleTimeSeriesChart extends StatelessWidget {
  final List<charts.Series> seriesList;
  final bool animate;

  SimpleTimeSeriesChart(this.seriesList, {this.animate});

  /// Creates a [TimeSeriesChart] with sample data and no transition.
  factory SimpleTimeSeriesChart.withSampleData() {
    return new SimpleTimeSeriesChart(
      _createSampleData(),
      // Disable animations for image tests.
      animate: false,
    );
  }

  @override
  Widget build(BuildContext context) {
    return new charts.TimeSeriesChart(
      seriesList,
      animate: animate,
      // Optionally pass in a [DateTimeFactory] used by the chart. The factory
      // should create the same type of [DateTime] as the data provided. If none
      // specified, the default creates local date time.
      dateTimeFactory: const charts.LocalDateTimeFactory(),
      primaryMeasureAxis: charts.NumericAxisSpec(
          tickProviderSpec:
              charts.BasicNumericTickProviderSpec(zeroBound: false)),
      behaviors: [
        charts.LinePointHighlighter(
          drawFollowLinesAcrossChart: true,
          showHorizontalFollowLine:
              charts.LinePointHighlighterFollowLineType.nearest,
          showVerticalFollowLine:
              charts.LinePointHighlighterFollowLineType.nearest,
        )
      ],
    );
  }

  /// Create one series with sample hard coded data.
  static List<charts.Series<TimeSeriesSales, DateTime>> _createSampleData() {
    final data = [
      TimeSeriesSales(
          DateTime.parse('2020-09-08 07:00:00-05'), 28133.310000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 08:00:00-05'), 27896.299666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 09:00:00-05'), 27650.790500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 10:00:00-05'), 27663.605833333333),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 11:00:00-05'), 27700.321666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 12:00:00-05'), 27787.622500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 13:00:00-05'), 27671.972500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 14:00:00-05'), 27576.781666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 15:00:00-05'), 27501.285500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-08 16:00:00-05'), 27500.890000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 07:00:00-05'), 27500.890000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 08:00:00-05'), 27626.437666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 09:00:00-05'), 27934.255166666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 10:00:00-05'), 28004.045000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 11:00:00-05'), 28043.676500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 12:00:00-05'), 28136.987666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 13:00:00-05'), 28144.234333333333),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 14:00:00-05'), 28134.081166666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 15:00:00-05'), 27940.841500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 16:00:00-05'), 27940.470000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 07:00:00-05'), 27940.470000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 08:00:00-05'), 28027.061333333333),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 09:00:00-05'), 28059.610666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 10:00:00-05'), 27931.955500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 11:00:00-05'), 27828.527666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 12:00:00-05'), 27829.483666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 13:00:00-05'), 27692.033666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 14:00:00-05'), 27571.017666666667),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 15:00:00-05'), 27534.852833333333),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 16:00:00-05'), 27534.580000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-11 07:00:00-05'), 27534.580000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-11 08:00:00-05'), 27587.593333333333),
      TimeSeriesSales(
          DateTime.parse('2020-09-11 09:00:00-05'), 27688.825500000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-11 10:00:00-05'), 27789.232000000000),
    ];

    return [
      new charts.Series<TimeSeriesSales, DateTime>(
        id: 'Sales',
        colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault,
        domainFn: (TimeSeriesSales sales, _) => sales.time,
        measureFn: (TimeSeriesSales sales, _) => sales.sales,
        data: data,
      )
    ];
  }
}

/// Sample time series data type.
class TimeSeriesSales {
  final DateTime time;
  final double sales;

  TimeSeriesSales(this.time, this.sales);
}
...
      TimeSeriesSales(
          DateTime.parse('2020-09-09 16:00:00-05'), 27940.470000000000),
      TimeSeriesSales(
          DateTime.parse('2020-09-09 16:00:00-05'), null),
      TimeSeriesSales(
          DateTime.parse('2020-09-10 07:00:00-05'), 27940.470000000000),
...