精华内容
下载资源
问答
  • 通用折线图

    2018-07-07 14:32:03
    通用型web折线图,可用于任何语言,非常简单,有完整的代码。
  • idea Maven项目 jFreeChart生成折线图前端展示,并且有导出功能跟
  • 在公司搭建数据统计时用到的Echarts图表统计插件,源码已经下载了下来,有相关的js和css源文件,感兴趣的朋友可以下载使用!
  • 在VS2015环境下64位、32位编译通过。High-speed Charting Control--MFC绘制图表(折线图、柱形图)控件。中文翻译文档可参照https://blog.csdn.net/xuanyuanlei1020/article/details/53487107
  • echarts HTML折线图设置

    2020-03-31 19:51:45
    1.添加 div echarts 2.添加JS代码 $(function () { var rwmc = $("#rwmc").val(); var scenario = $("#scenario").val(); $.ajax({ url: prefix + "/getarray",//通过ajax从数据库查询数据,返回值为xdata[]...效果

    1.添加 div echarts

    <div class="col-sm-12">
      <div class="ibox-content">
        <div class="echarts" id="echarts-line-chart"></div>
       </div>
    </div>

    2.添加JS代码

    $(function () {
                var rwmc = $("#rwmc").val();
                var scenario = $("#scenario").val();
                $.ajax({
                    url: prefix + "/getarray",//通过ajax从数据库查询数据,返回值为xdata[][]
                    async: false,
                    type: 'POST',
                    dataType: 'json',
                    data : {
                        "rwmc": rwmc,
                        "scenario": scenario,
                    },
                    success: function (data) {
                        xdata = eval(data)
                    },
                })
                var lineChart = echarts.init(document.getElementById("echarts-line-chart"));
                var lineoption = {
                    title: {
                        text: '车速监控',
                        subtext: 'y: km/h   x: ms'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['主车车速', '远车车速']
                    },
                    grid: {
                        x: 40,
                        x2: 40,
                        y2: 24
                    },
                    calculable: true,
                    xAxis: [
                        {
                            type: 'category',
                            boundaryGap: false,
                            data: xdata[0]
                        }
                    ],
                    yAxis: [
                        {
                            type: 'value',
                            axisLabel: {
                                formatter: '{value}'
                            }
                        }
                    ],
                    series: [
                        {
                            name: '主车车速',
                            type: 'line',
                            data: xdata[1],
                            markPoint: {
                                data: [
                                    {type: 'max', name: '最大值'},
                                    {type: 'min', name: '最小值'}
                                ]
                            },
                            markLine: {
                                data: [
                                    {type: 'average', name: '平均值'}
                                ]
                            }
                        },
                        {
                            name: '远车车速',
                            type: 'line',
                            data: xdata[2],
                            markPoint: {
                                data: [
                                    {type: 'max', name: '最大值'},
                                    {type: 'min', name: '最小值'}
                                ]
                            },
                            markLine: {
                                data: [
                                    {type: 'average', name: '平均值'}
                                ]
                            }
                        }
                    ]
                };
                lineChart.setOption(lineoption);
                $(window).resize(lineChart.resize);
            });

    3.controller层 处理数据

     @PostMapping("/getarray")
        @ResponseBody
        public String[][] getarray(String rwmc,String scenario)
        {
            List<TestMessage> list = testMessageService.selectxdata(rwmc,scenario);
            String [][] xdata = new String[3][list.size()];
            for(int i=0;i<list.size();i++){
                xdata[0][i]=list.get(i).getXtime();//存储x坐标 时间戳
                xdata[1][i]=list.get(i).getHvs().toString();//存储y1坐标 主车车速
                xdata[2][i]=list.get(i).getRvs().toString();//存储y2坐标 远车车速
            }
            return xdata;//返回xdata[][]
        }
          

    4.效果图

           

    展开全文
  • 数据可视化----ECharts---折线图(四)

    多人点赞 热门讨论 2021-07-30 19:10:05
    有帮助的话给个赞,款哥还是会很开心的 标题 地址 ECharts初体验 传送门 ECharts通用配置 传送门 柱状图 传送门 ECharts官网 传送门 折线图 我们都知道,要想使用echarts来进行数据展示,需要以下五步 步骤1:引入...

    引言:

    ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。

    每篇博客都会强调的事情,学习ECharts最直接、最有效的方式就是去看官网,官网上有你想要的一切,官网地址:https://echarts.apache.org/en/index.html

    当然了,在下不才,写了几篇拙文,若大家有兴趣的可以瞅一瞅,有帮助的话给个赞,款哥还是会很开心的

    标题地址
    ECharts初体验传送门
    ECharts通用配置传送门
    柱状图传送门
    ECharts官网传送门

    折线图

    我们都知道,要想使用echarts来进行数据展示,需要以下五步

    步骤1:引入echarts.js文件
    步骤2:准备一个呈现图表的盒子(这个盒子要给予宽高)
    步骤3:初始化echarts实例对象(这个script标签要记得放在呈现图表的盒子之后,或者window.onload)
    步骤4:准备配置项(使用ECharts创建不同的表格,只有配置项会变化,其他代码都是固定)
    步骤5:将配置项配置给echarts实例对象
    ————————————————

    基本实现

    由于折线图的基础结构搭建方面与柱状图并无太大差别,所以下面我就把一个完整的案例代码贴上

    差别在于series中的类型也就是type,柱状图是bar,折线图是line

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>折线图</title>
        <script src="./lib/echarts.min.js"></script>
    </head>
    <body>
        <div style="width: 600px;height: 400px;"></div>
        <script>
            var oDiv = document.querySelector('div');
            var xDataArr = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
            yDataArr = [2000,1000,2500,1550,1800,1300,1400,2800,1200,950,1100,2000];
            var mCharts = echarts.init(oDiv);
            var option = {
                type: 'line',
                name: '销量',
                xAxis:{
                   type: 'category',
                   data: xDataArr
                },
                yAxis:{
                   type: 'value'
                },
                series: {
                name: '白象方便面销量',
                type: 'line',
                data: yDataArr
    
                }
            }
            mCharts.setOption(option)
        </script>
    </body>
    </html>
    

    对以上代码有疑惑的,可以在文章开始的传送门里去看看之前的几篇文章。

    上面的代码在浏览器上运行出来,效果是这样的

    在这里插入图片描述

    风格样式

    同样的,折线图也有对应的最大值、最小值,平均值等样式,并且方法也与柱状图一致,这里就不再过多的叙述。
    柱状图可以去看数据可视化—ECharts—柱状图

    这里主要说一下折线图,不同于柱状图的地方

    标记区域(markArea)

    在series里面写下这段代码,注意:

    1. markArea的值必须是一个对象
    2. markArea里面有一个属性data,它的值是一个数组
    3. 数组里的两个数组,实际上就是标记区间
    4. 两个对象相当于是X轴坐标
    markArea: {
       data: [
          [
             {xAxis:'1月'},
             {xAxis:'2月'}
          ],
          [
             {xAxis:'7月'},
             {xAxis:'10月'}
          ]
      	]
     }
    

    平滑曲线(smooth)

    在series里面写下这段代码,这行代码是与markArea,markPoint等平级的

    // 是否为平滑的曲线,默认为false
    smooth: true,
    

    线的样式(lineStyle)

    这里可一去对折线的样式去进行设置,包括虚实线、颜色、粗细等;

    lineStyle: {
           color: 'green',
           // dashed 虚线   dotted  点线  solid  实线
            type: 'solid'
     }
    

    填充样式(areaStyle)

    在series里写下这行代码

    areaStyle: {
         color: 'yellow'
    }
    

    这时候在浏览器中是这样的
    在这里插入图片描述

    忘了下面这哥俩了:

    缩放,脱离0值比例 scale: true------这个要写在数值轴的配置上
    坐标轴两边留白策略,false 不留白
    boundaryGap: false---------这个写在类目轴即可

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>折线图</title>
        <script src="./lib/echarts.min.js"></script>
    </head>
    <body>
        <div style="width: 600px;height: 400px;"></div>
        <script>
            var oDiv = document.querySelector('div');
            var xDataArr = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
            // yDataArr = [2000,1000,2500,1550,1800,1300,1400,2800,1200,950,1100,2000];
            yDataArr = [2480,2496,2500,2488,2487,2480,2490,2486,2485,2482,2490,2481];
            var mCharts = echarts.init(oDiv);
            var option = {
                xAxis:{
                    type: 'category',
                    data: xDataArr,
                    //坐标轴两边留白策略,false  不留白
                    boundaryGap: false
                },
                yAxis:{
                   type: 'value',
                    //    boundaryGap: true
                    // 缩放,脱离0值比例
                    scale: true
                },
                series: {
                    name: '白象方便面销量',
                    type: 'line',
                    data: yDataArr,
                    // 最大值,最小值
                    markPoint: {
                        data: [
                            {
                                type: 'max',name: '最大值'
                            },
                            {
                                type: 'min',name: '最小值'
                            }
                        ]
                    },
                    // 平均值
                    markLine: {
                        data: [
                            {type: 'average',name: '平均值'}
                        ]
                    },
                    // 标记区域
                    markArea: {
                        data: [
                            [
                                {xAxis:'1月'},
                                {xAxis:'2月'}
                            ],
                            [
                                {xAxis:'7月'},
                                {xAxis:'10月'}
                            ]
                        ]
                    },
                    // 是否为平滑的曲线
                    smooth: true,
                    // 线的样式
                    lineStyle: {
                        color: 'green',
                        // dashed 虚线   dotted  点线  solid  实线
                        type: 'solid'
                    },
                    // 填充风格
                    areaStyle: {
                        color: 'yellow'
                    }
                }
            }
            mCharts.setOption(option)
        </script>
    </body>
    </html>
    

    堆叠图

    其实我们在工作中常用的是一种叫做堆叠图的图表,它其实就是一种变了样的折线图

    这里的关键就是在同个类目轴上系列配置相同的stack值

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>堆叠图</title>
        <script src="./lib/echarts.min.js"></script>
    </head>
    <body>
        <!-- 
            数据堆叠,同个类目轴上系列配置相同的stack值后,后一个系列的值会在前一个系列的值上相加。
         -->
        <div style="width: 600px;height: 400px;"></div>
        <script>
            var oDiv = document.querySelector('div');
            var xDataArr = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
            yDataArr = [2000,1000,2500,1550,1800,1300,1400,2800,1200,950,1800,2000],
            yDataArr2 = [2480,1496,1500,2400,2480,2680,2490,2000,1500,1600,2000,1200];
    
            var mCharts = echarts.init(oDiv);
            var option = {
                xAxis:{
                   type: 'category',
                   data: xDataArr
                },
                yAxis:{
                   type: 'value'
                },
                series: [
                    {
                        name: '白象方便面销量',
                        type: 'line',
                        data: yDataArr,
                        // 堆叠图主要是靠stack属性,series中每个对象的stack值要保持一直
                        stack: 'all',
                        areaStyle: {}
                    },
                    {
                        name: '统一方便面销量',
                        type: 'line',
                        data: yDataArr2,
                        stack: 'all',
                        areaStyle: {}
                    }
                ]
            }
            mCharts.setOption(option)
        </script>
    </body>
    </html>
    

    效果就是下面这样
    在这里插入图片描述

    展开全文
  • Web统计图表插件示例,包含饼状图、柱状图、折线图等;多种表现形式,分类、合并、对比等图表均有
  • Struts2 HighChart Jquery远程加载 折线图 jquery两种ajax方案 无需任何特殊jar包 struts配置无type="json
  • Flutter 实现平滑曲线折线图

    千次阅读 2018-12-15 08:31:22
    但是 charts 只实现了直线折线图,所以只能 fork charts 项目自己实现平滑曲线效果。 基础使用 Goole/charts 这个图表库很强大,但是文档不太友好,只有 online gallery 上有纯示例代码,几乎没有 Api 说明。 ...

    背景

    公司最近引入了 Flutter 技术栈,Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。然而由于 Flutter 还在早期发展阶段没有,生态建设还不够完善。比如项目中需要用到图表 UI 组件,经过一番调研,Google/charts 功能最强大,样式最丰富(详见 online gallery),于是引入到项目中。但是 charts 只实现了直线折线图,所以只能 fork charts 项目自己实现平滑曲线效果。

    基础使用

    • Goole/charts 这个图表库很强大,但是文档不太友好,只有 online gallery 上有纯示例代码,几乎没有 Api 说明。

    • 可行性分析的 Demo 效果

    • 仔细研究优化后的效果

    • 具体使用代码及注释
    return Container(
      height: 150.0,
      child: charts.LineChart(
        _createChartData(), // 折线图的点的数据列表
        animate: true, // 动画
        defaultRenderer: charts.LineRendererConfig( // 折线图绘制的配置
          includeArea: true,
          includePoints: true,
          includeLine: true,
          stacked: false,
        ),
        domainAxis: charts.NumericAxisSpec( // 主轴的配置
          tickFormatterSpec: DomainFormatterSpec(widget.dateRange), // tick 值的格式化,这里把 num 转换成 String
          renderSpec: charts.SmallTickRendererSpec( // 主轴绘制的配置
            tickLengthPx: 0, // 刻度标识突出的长度
            labelOffsetFromAxisPx: 12, // 刻度文字距离轴线的位移
            labelStyle: charts.TextStyleSpec( // 刻度文字的样式
              color: ChartUtil.getChartColor(HColors.lightGrey),
              fontSize: HFontSizes.smaller.toInt(),
            ),
            axisLineStyle: charts.LineStyleSpec( // 轴线的样式
              color: ChartUtil.getChartColor(ChartUtil.lightBlue),
            ),
          ),
          tickProviderSpec: charts.BasicNumericTickProviderSpec( // 轴线刻度配置
            dataIsInWholeNumbers: false,
            desiredTickCount: widget.data.length, // 期望显示几个刻度
          ),
        ),
        primaryMeasureAxis: charts.NumericAxisSpec( // 交叉轴的配置,参数参考主轴配置
          showAxisLine: false, // 显示轴线
          tickFormatterSpec: MeasureFormatterSpec(),
          tickProviderSpec: charts.BasicNumericTickProviderSpec(
            dataIsInWholeNumbers: false,
            desiredTickCount: 4,
          ),
          renderSpec: charts.GridlineRendererSpec( // 交叉轴刻度水平线
            tickLengthPx: 0,
            labelOffsetFromAxisPx: 12,
            labelStyle: charts.TextStyleSpec(
              color: ChartUtil.getChartColor(HColors.lightGrey),
              fontSize: HFontSizes.smaller.toInt(),
            ),
            lineStyle: charts.LineStyleSpec(
              color: ChartUtil.getChartColor(ChartUtil.lightBlue),
            ),
            axisLineStyle: charts.LineStyleSpec(
              color: ChartUtil.getChartColor(ChartUtil.lightBlue),
            ),
          ),
        ),
        selectionModels: [ // 设置点击选中事件
          charts.SelectionModelConfig(
            type: charts.SelectionModelType.info,
            listener: _onSelectionChanged,
          )
        ],
        behaviors: [
          charts.InitialSelection(selectedDataConfig: [ // 设置默认选中
            charts.SeriesDatumConfig<num>('LineChart', _index)
          ]),
        ],
      ),
    );
    复制代码

    平滑曲线效果实现

    虽然基础使用实现的折线图效果已经很不错了,但 UI 设计是平滑曲线效果,工程师也赞同曲线效果更优雅的观点,所以决定挑战自我,自己实现平滑曲线效果。 通过一层层源码分析,最终发现绘制折线图折线的实现位置,改写该实现即可实现平滑曲线效果

    line_chart.dart

    defaultRenderer: charts.LineRendererConfig( // 折线图绘制的配置
      includeArea: true,
      includePoints: true,
      includeLine: true,
      stacked: false,
    ),
    复制代码

    line_renderer.dart

    if (config.includeLine) {
       ...
            canvas.drawLine(
                clipBounds: _getClipBoundsForExtent(line.positionExtent),
                dashPattern: line.dashPattern,
                points: line.points,
                stroke: line.color,
                strokeWidthPx: line.strokeWidthPx,
                roundEndCaps: line.roundEndCaps);
          }
        });
      }
    });
    复制代码

    chart_canvas.dart

    @override
    void drawLine(
       ...
      _linePainter.draw(
          canvas: canvas,
          paint: _paint,
          points: points,
          clipBounds: clipBounds,
          fill: fill,
          stroke: stroke,
          roundEndCaps: roundEndCaps,
          strokeWidthPx: strokeWidthPx,
          dashPattern: dashPattern);
    }
    复制代码

    既然找到了具体绘制折线的入口,剩下的就是如何根据给出的数据集合,绘制出平滑的曲线,而且曲线的范围不能超出数据集合的范围。前前后后尝试了三种绘制曲线的算法,前两种都由于超出数据集合范围而弃用了,最后的曲线效果采用的第三种算法绘制的。

    样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。算法参考 Java 三次样条插值,代码实现如下: interpolation.dart

    class Interpolation {
      int n;
      List<num> xs;
      List<num> ys;
    
      bool spInitialized;
      List<num> spY2s;
    
      Interpolation(List<num> _xs, List<num> _ys) {
        this.n = _xs.length;
        this.xs = _xs;
        this.ys = _ys;
        this.spInitialized = false;
      }
    
      num spline(num x) {
        if (!this.spInitialized) {
          // Assume Natural Spline Interpolation
          num p, qn, sig, un;
          List<num> us;
    
          us = new List<num>(n - 1);
          spY2s = new List<num>(n);
          us[0] = spY2s[0] = 0.0;
    
          for (int i = 1; i <= n - 2; i++) {
            sig = (xs[i] - xs[i - 1]) / (xs[i + 1] - xs[i - 1]);
            p = sig * spY2s[i - 1] + 2.0;
            spY2s[i] = (sig - 1.0) / p;
            us[i] = (ys[i + 1] - ys[i]) / (xs[i + 1] - xs[i]) -
                (ys[i] - ys[i - 1]) / (xs[i] - xs[i - 1]);
            us[i] = (6.0 * us[i] / (xs[i + 1] - xs[i - 1]) - sig * us[i - 1]) / p;
          }
          qn = un = 0.0;
    
          spY2s[n - 1] = (un - qn * us[n - 2]) / (qn * spY2s[n - 2] + 1.0);
          for (int k = n - 2; k >= 0; k--) {
            spY2s[k] = spY2s[k] * spY2s[k + 1] + us[k];
          }
    
          this.spInitialized = true;
        }
    
        int klo, khi, k;
        num h, b, a;
    
        klo = 0;
        khi = n - 1;
        while (khi - klo > 1) {
          k = (khi + klo) >> 1;
          if (xs[k] > x)
            khi = k;
          else
            klo = k;
        }
        h = xs[khi] - xs[klo];
        if (h == 0.0) {
          throw new Exception('h==0.0');
        }
        a = (xs[khi] - x) / h;
        b = (x - xs[klo]) / h;
        return a * ys[klo] +
            b * ys[khi] +
            ((a * a * a - a) * spY2s[klo] + (b * b * b - b) * spY2s[khi]) *
                (h * h) /
                6.0;
      }
    }
    复制代码

    line_painter.dart

    /// Draws smooth lines between each point.
    void _drawSmoothLine(Canvas canvas, Paint paint, List<Point> points) {
      var interval = 0.1;
      var interpolationPoints = List<Point>();
      for (int k = 0; k < points.length; k++) {
        if ((k + 1) < points.length) {
          num temp = 0;
          while (temp < points[k + 1].x) {
            temp = temp + interval;
            interpolationPoints.add(Point(temp, 0.0));
          }
        }
      }
      var tempX = points.map((item) => item.x).toList();
      var tempY = points.map((item) => item.y).toList();
      var ip = Interpolation(tempX, tempY);
      for (int j = 0; j < interpolationPoints.length; j++) {
        interpolationPoints[j] =
            Point(interpolationPoints[j].x, ip.spline(interpolationPoints[j].x));
      }
      interpolationPoints.addAll(points);
      interpolationPoints.sort((a, b) {
        if (a.x == b.x)
          return 0;
        else if (a.x < b.x)
          return -1;
        else
          return 1;
      });
      final path = new Path();
      path.moveTo(interpolationPoints[0].x.toDouble(), interpolationPoints[0].y.toDouble());
      for (int i = 1; i < interpolationPoints.length; i++) {
        path.lineTo(interpolationPoints[i].x.toDouble(), interpolationPoints[i].y.toDouble());
      }
      canvas.drawPath(path, paint);
    }
    复制代码

    最终效果图

    看起来效果还是挺完美的,但是其实有个致命问题,曲线的顶点可能会超出折线图数据的范围

    三次贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑曲线,其难点是两个控制点的计算,算法参考 贝塞尔曲线平滑拟合折线段,代码实现如下: line_painter.dart

    /// Draws smooth lines between each point.
    void _drawSmoothLine(Canvas canvas, Paint paint, List<Point> points) {
      var targetPoints = List<Point>();
      targetPoints.add(points[0]);
      targetPoints.addAll(points);
      targetPoints.add(points[points.length - 1]);
      final path = new Path();
      for (int i = 1; i < targetPoints.length - 2; i++) {
        path.moveTo(
            targetPoints[i].x.toDouble(), targetPoints[i].y.toDouble());
        var controllerPoint1 = Point(
          targetPoints[i].x + (targetPoints[i + 1].x - targetPoints[i - 1].x) / 4,
          targetPoints[i].y + (targetPoints[i + 1].y - targetPoints[i - 1].y) / 4,
        );
        var controllerPoint2 = Point(
          targetPoints[i + 1].x - (targetPoints[i + 2].x - targetPoints[i].x) / 4,
          targetPoints[i + 1].y - (targetPoints[i + 2].y - targetPoints[i].y) / 4,
        );
        path.cubicTo(
            controllerPoint1.x, controllerPoint1.y, controllerPoint2.x,
            controllerPoint2.y, targetPoints[i + 1].x, targetPoints[i + 1].y);
      }
      canvas.drawPath(path, paint);
    }
    复制代码

    平滑曲线效果也是可以实现的,但是依然存在顶点越界的问题

    • 贝塞尔曲线(MonotoneX)

    因为之前 RN 项目用到了 victory-native / victory-chart,通过源码和文档发现它的曲线效果实现是依赖了 d3-shap 的 d3.curveMonotoneX,算法参考 monotone.js,实现代码如下:

    注:由于算法需要当前点和前两个点才能画出一段曲线,所以在折线点数据集合最后人为添加了一个点,否则画出来的曲线会缺少最后一段

    line_painter.dart

    /// Draws smooth lines between each point.
    void _drawSmoothLine(Canvas canvas, Paint paint, List<Point> points) {
      var targetPoints = List<Point>();
      targetPoints.addAll(points);
      targetPoints.add(Point(
          points[points.length - 1].x * 2, points[points.length - 1].y * 2));
      var x0,
          y0,
          x1,
          y1,
          t0,
          path = Path();
      for (int i = 0; i < targetPoints.length; i++) {
        var t1;
        var x = targetPoints[i].x;
        var y = targetPoints[i].y;
        if (x == x1 && y == y1) return;
        switch (i) {
          case 0:
            path.moveTo(x, y);
            break;
          case 1:
            break;
          case 2:
            t1 = MonotoneX.slope3(x0, y0, x1, y1, x, y);
            MonotoneX.point(
                path,
                x0,
                y0,
                x1,
                y1,
                MonotoneX.slope2(x0, y0, x1, y1, t1),
                t1);
            break;
          default:
            t1 = MonotoneX.slope3(x0, y0, x1, y1, x, y);
            MonotoneX.point(
                path,
                x0,
                y0,
                x1,
                y1,
                t0,
                t1);
        }
        x0 = x1;
        y0 = y1;
        x1 = x;
        y1 = y;
        t0 = t1;
      }
      canvas.drawPath(path, paint);
    }
    复制代码

    最终效果图,顶点都是折线图数据集合里的点,完美!

    • 源码

    详见 GitHub dev 分支 github.com/123lxw123/c…

    本文版权属于再惠研发团队,欢迎转载,转载请保留出处。@123lxw123

    展开全文
  • 动态折线图

    2018-08-28 16:47:05
    动态折线图
  • 现在使用Layer和Echarts构建弹出层折线图。 下载好所需要用到的工具包,Echarts下载为echarts.min.js,Layer在layer官网下载之后将layer文件夹放到项目之中。 在HTML文件中引入 [removed]</script
  • 最近针对web端实现单页面展示多个echarts图表,更直观的展示数据的变化,响应式
  • 众所周知图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等。可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web 应用和项目的可靠性。现在就让我们大家一起来...
  • 曲线图折线图面积图

    2019-03-25 16:31:50
    曲线图,面积图,折线图模板,提供用法以及数据展示等信息。
  • 3. 需要将后台数据生成柱状图、折线图 在前台显示 问题: 如果将后台数据生成柱状图、折线图在前台显示 遇坑: 1. 使用Echart进行图片显示,后台传递数据,前台使用jquery显示 使用这种方法发现,网上...

    技术背景:

    1. SpringBoot + JPA

    2. 前端使用Bootstrap

    3. 需要将后台数据生成柱状图、折线图 在前台显示

     

    问题:

    如果将后台数据生成柱状图、折线图在前台显示

     

    遇坑:

    1. 使用Echart进行图片显示,后台传递数据,前台使用jquery显示

    使用这种方法发现,网上大多数教程为静态Echart的显示,不符合需求,动态显示没有研究出来,且这种方法比较具有局限性,由于我做的项目以数据可视化为主,Echart可以表现的图形有限,且作为一个后端开发..前端不擅长

     

    解决方法:

    1. Java调用Python,传递数据,使用Python绘制图片并进行图片保存,保存至指定路径

    2. Java前端每次点击按钮,jquery获取图片路径,在前台进行显示

     

    Java调用Python数据并传值:

    public void startCharaChange(HttpServletRequest request , Long fileId) throws Exception {
            String[] arg2 = new String[] { "python", "D:\\\\Software\\\\python3.7\\\\pie3.py", String.valueOf(fileId)};
            Process pr2=Runtime.getRuntime().exec(arg2);
        }

    此处值的传递,我使用了数据库保存数据,并向Python程序传递Id, Python再查询数据库中的相关数据,读取后绘制图片(范例为饼图)

    Python绘制饼图:

    # encoding: utf-8
    import pymysql
    import matplotlib.pyplot as plt
    import matplotlib
    import sys
    
    def paint(var1):
        matplotlib.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体#连接数据库
        db = pymysql.connect("localhost","root","123456","test")
        db2 = pymysql.connect("localhost","root","123456","test")
        #使用cursor()方法创建一个游标对象
        cursor = db.cursor()
        sql2="select word,chara from keyword where file_id=%s"
        c2=[]
        word=[]
    
        cursor.execute(sql2,int(var1))
        # 获取所有记录列表
        course = cursor.fetchall()
        for row in course:
            a=row[0]
            b=row[1]
            word.append(a)
            d=0.0362
            if(b[0:1] == 'a'):
                d = 0.0432
            if(b[0:1] == 'n'):
                d = 0.2666
            if(b[0:1] == 'v'):
                d = 0.0850
            if(b[0:1] == 'g'):
                d = 0.5691
            c2.append(d)
        plt.axes(aspect = 1)
        plt.pie(x=c2,labels=word,autopct='%.0f%%')
        plt.savefig('E:\\testDataStore\\pics\\piechara.jpg')
        #plt.show()
        
        #关闭游标和数据库的连接
        cursor.close()
        db.close()
        print(var1)
    
    if __name__ == '__main__':
        #for i in range(1, len(sys.argv)):
        paint(sys.argv[1])
        #paint(114)
    

    此时已经在Java调用该Python程序后,已经在指定路径输出了图片,所以,在后台点击按钮时也要同时获取该图片:

    设置获取方法:

        @RequestMapping(value = "/seekPieChara")
        @ResponseBody
        public String seekPieChara(HttpServletRequest request,
                                  HttpServletResponse response, Model model) {
            // response.setContentType("image/*");
            FileInputStream fis = null;
            OutputStream os = null;
            try {
                fis = new FileInputStream(new File("E:\\testDataStore\\pics\\piechara.jpg"));
                os = response.getOutputStream();
                int count = 0;
                byte[] buffer = new byte[1024 * 8];
                while ((count = fis.read(buffer)) != -1) {
                    os.write(buffer, 0, count);
                    os.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                fis.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "ok";
        }

    同时,在jquery中设置点击事件,保证点击后该前端数据源调用上述的图片获取方法,以在前端页面进行显示:

    //all
        $("#allChange").on("click",function () {
            var data = getData();
            console.log(data);
            $("#loading").showLoading();
            $.ajax({
                type : 'POST',
                url : '/formatChange/startAll',
                data : JSON.stringify({'data' : data}),
                dataType : "text",
                contentType : "application/json",
                success : function (response) {
                    $("#loading").hideLoading();
                    response = JSON.parse(response);
                    if (response.errorCode !== 0) {
                        toastr.error('转化失败 [' + response.errorInfo + ']');
                    }else{
                        $('#piechara').attr('src','../seekPieChara.do')
                        toastr.success('转化成功');
    
                    }
                },
                error : function () {
                    $("#loading").hideLoading();
                    toastr.error('请求发送失败');
                }
            });
        });

    由此,可以在前端获取后台生成的图像,并进行显示,同时也具有较好的延展性,因为Python的图像绘制更加专业,可以调用wordcloud、matlabplotlib包等。

     

    注:

    由于生成图片和读图片存在时间差,这里我一般用

    Thread.sleep(5000);

    来缓和时间差,保证一定可以取到最新图片。

    可以根据实际情况设置等待时间,或者有更好地方法也欢迎大家告诉我Thanks♪(・ω・)ノ

    展开全文
  • 折线图形的数据库设计: idint namevarchar(50) dataTimedatetime 饼形和柱状使用同一个表的数据: id int name varchar(50) shuliang int 下面的ChartControl1、ChartControl2、ChartControl3都是...
  • 介绍chart.js中折线图的常用属性及效果
  • 绘制折线图上用逗号分隔的数字列表,可以在Web浏览器中查看该数字。 安装 全局安装chart-csv : npm install chart-csv -g 用法 将CSV数据管道传输到chart-csv应用程序。 chart-csv应用程序会将HTML输出到STDOUT...
  • Web在jsp页面中生成柱状图,折线图,饼状图

    万次阅读 热门讨论 2017-09-08 17:52:23
    一、前言 在实际开发过程中,柱状图,折线图,饼状图在一些OA,ERP中是非常常见的功能,特别是需求需求方是业务型,数据分析型公司,下面的例子简单实现了饼状图,柱状图,折线图在jsp中生成。(ps:新手上路,不喜勿...
  • 用于显示折线图Web组件。 例子 要运行示例代码,请导航至父目录并启动一个, $ cd .. $ python -m SimpleHTTPServer 9090 服务器运行后,在浏览器中打开以下URL ...
  • 本文是有关在Office Web Components中使用折线图的文章,其中X轴中使用了日期。
  • canvas实现折线图插件

    千次阅读 2018-06-06 17:41:41
    适用于手机端的折线图插件,通过canvas实现。 思路就是得到数据值,时间值,先画出x,y坐标轴,然后均分x轴,将时间点绘制上去,然后根据数据值,再求出x,y坐标点,使用lineTo绘制出连续折线图。注释在代码中。 /...
  • js jquery 实现实现柱状图,饼状图,折线图,平面图,立体三维图,自己实现的例子,还有很多官方例子,随便选用,只需要填写相关字段,和对应数值就可实现图表
  • 亲测可用,包括二维码,条形码在web端的生成以及展示,本地的保存,以及折线图生成以及保存,利用QRCODE,zxing,jsbarcode,jfreechart,里面的好多文件可能都不止这个积分数
  • 该文件涵盖了各式各样的图文报表,里面的各种图表通过下拉框选择切换,非常强大,用于各行业,cms、数学统计、数据处理...界面简洁清晰,代码通俗易用。。。
  • echarts折线图.zip

    2019-11-18 11:28:09
    经典的web端echarts折线图示例,调用方便,代码简洁,亲测可用。折线图的样式种类也有很多,图例什么的都有
  • Aspx折线图、柱状图示例(Web Chart) 吴剑 2007-01-22 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 这是一篇2007年的学习记录,最近在整理博客,之前在CSDN上有一个,之后在博客园上有...
  • JFreeChart双Y轴折线图实例,可以直接运行,实例类为LineChartDemo1.JAVA,有注释。 若想在web工程使用只需如下。 String filename = ServletUtilities.saveChartAsPNG(jfreechart, 600, 400, null, session); ...
  • Matplotlib之折线图与子图的绘制

    千次阅读 2019-06-04 19:54:21
    一、Matplotlib简介 Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台的交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和...只需几行代码即可生成绘图,直方,功率谱,条形...
  • asp中使用webchart画多折线图,x的坐标起始点为什么是一样的,![图片说明](https://img-ask.csdn.net/upload/201705/12/1494554775_993771.png)有没有方法可以一张图画几条折线,x的值不同的吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,634
精华内容 4,653
关键字:

web折线图