DC.js 到 React 的转换

2024-04-24

有 dc.js 反应转换的示例吗?对折线图、表格和时间滑块(带画笔的条形图)感兴趣。

任何帮助,将不胜感激。

Thanks!


这是将 DC.js 转换为 React 的开始。使用的库的版本如下(package.json):

"dependencies": {
  "babel-polyfill": "^6.3.14",
  "bootstrap": "^3.3.6",
  "crossfilter": "^1.3.12",
  "d3": "^4.2.8",
  "d3-request": "^1.0.2",
  "d3-scale": "^1.0.3",
  "d3-time-format": "^2.0.2",
  "dc": "^2.0.0-beta.32",
  "history": "^1.17.0",
  "isomorphic-fetch": "^2.2.0",
  "keymirror": "^0.1.0",
  "react": "^0.14.8",
  "react-addons-perf": "^0.14.0",
  "react-bootstrap": "^0.29.5",
  "react-bootstrap-table": "^2.3.7",
  "react-d3-core": "^1.3.9",
  "react-dom": "^0.14.8",
  "react-redux": "^4.2.1",
  "react-router": "^2.0.0",
  "react-router-bootstrap": "^0.19.3",
  "react-router-redux": "^4.0.0-rc.1",
  "redux": "^3.2.1",
  "redux-form": "^5.3.1",
  "redux-logger": "^2.4.0",
  "redux-thunk": "^1.0.3"
},
"devDependencies": {
  "babel-core": "^6.17.0",
  "babel-loader": "^6.2.5",
  "babel-preset-es2015": "^6.16.0",
  "babel-preset-react": "^6.3.13",
  "babel-preset-react-hmre": "^1.1.1",
  "babel-preset-stage-0": "^6.16.0",
  "css-loader": "^0.12.1",
  "expect": "^1.6.0",
  "express": "^4.13.3",
  "express-history-api-fallback": "^2.0.0",
  "file-loader": "^0.8.1",
  "node-libs-browser": "^0.5.2",
  "style-loader": "^0.13.1",
  "url-loader": "^0.5.7",
  "webpack": "^1.13.2",
  "webpack-dev-middleware": "^1.2.0",
  "webpack-hot-middleware": "^2.9.1"
}

请注意,当前 d3 版本是 4.2.8,这意味着 dc.js 代码发生了变化。 Line.js 是一个组件。在index.html 中,重要的是样式标签。

//////Line.js


import React, { PropTypes } from 'react';
import ReactDOM from "react-dom";
import * as d3 from 'd3';
import dc from "dc";
import * as crossfilter from 'crossfilter';
import {Jumbotron } from 'react-bootstrap'; 
import functionDCHelper from './functionDCHelper';
import {scaleTime, scaleLinear} from 'd3-scale';
import { axisLeft, axisBottom } from 'd3-axis';
import TableChart from "../components/TableChart.js";

class LineChart extends React.Component {

    componentDidMount() {
        var bitrateLineChart = dc.compositeChart(this.refs.lineChart);
        var { min15, minDate, maxDate, bitrateWeekMinIntervalGroupMove, maxbit } = functionDCHelper.generateValues(this.props.data);
        bitrateLineChart 
        .xUnits(min15.range) 
        .x(d3.scaleTime().domain([new Date(minDate), new Date(maxDate)]))
        .yAxisPadding('5%')     
        .elasticY(true)
        .width(990)
        .height(200)
        .transitionDuration(500)
        .margins({ top: 30, right: 50, bottom: 25, left: 50, padding: 1 })
        .mouseZoomable(true)
        .brushOn(false)
        .renderHorizontalGridLines(true)
        .legend(dc.legend().x(800).y(10).itemHeight(13).gap(5))
        //Render max bitrate horizontal line copied from bar-extra-line.html
         .yAxisLabel("Total Bitrate per 15 minutes")
        .on('renderlet', function (chart) {
            chart.svg().selectAll('.chart-body').attr('clip-path', null)
            var left_y = 10, right_y = 70; // use real statistics here!
            var extra_data = [{ x: chart.x().range()[0], y: chart.y()(left_y) }, { x: chart.x().range()[1], y: chart.y()(right_y) }];
            var line = d3.line()
                .x(function (d) { return d.x; })
                .y(function (d) { return maxbit; })
                .curve(d3.curveLinear); //.interpolate('linear');
            var chartBody = chart.select('g.chart-body');
            var path = chartBody.selectAll('path.extra').data([extra_data]);
            path.enter().append('path').attr({
                class: 'extra',
                stroke: 'red',
                id: 'extra-line',
            });
            path.attr('d', line);
            // Label the max line
            var text = chartBody.selectAll('text.extra-label').data([0]);
            text.enter().append('text')
                    .attr('text-anchor', 'middle')
                    .append('textPath').attr({
                     class: 'extra-label',   
                    'xlink:href': '#extra-line',
                     startOffset: '50%'
                })
                .text('Total Bitrate Max Value');      
        })
       // Title can be called by any stack layer.
        .title(function (d) {
            var value = d.value.total ? d.value.total : d.value;
            if (isNaN(value)) {
                value = 0;
            }
            return functionDCHelper.dateFormat(d.key) + ' \n Total Bit:' + functionDCHelper.numberFormat(value)
        })

      //Creating dynamic Y axis with min max ticks' values depending on min max of data - copied from http://jsfiddle.net/gordonwoodhull/7anae5c5/1/
     .compose([
      functionDCHelper.nonzero_min(dc.lineChart(bitrateLineChart)
          .dimension(min15)
          .colors('green')
          .group(bitrateWeekMinIntervalGroupMove, 'Bitrate Total')
           .valueAccessor(function (d) {
               return d.value.total;
           })
         // .dashStyle([2,2])
         .interpolate('d3.curveStepAfter') 
          .renderArea(false)
          .brushOn(false)
          .renderDataPoints(false)         
          .clipPadding(10)),
     ])
        bitrateLineChart.render();
    }

    render() {
        return(
            <div  ref="lineChart">
            </div>
        );
    }

}

export default LineChart;

//////functionDCHelper.js

import crossfilter from 'crossfilter';
import * as d3 from 'd3';
import dc from 'dc';

var minDate,min15,bitrateWeekMinIntervalGroupMove,maxDate,minIntervalWeekBitrateGroup,dateDimension,dateFormat,numberFormat,maxbit;

function nonzero_min(chart) {
    dc.override(chart, 'yAxisMin', function () {
        var min = d3.min(chart.data(), function (layer) {            
            return d3.min(layer.values, function (p) {
                return p.y + p.y0;
            });
        });
        return dc.utils.subtract(min, chart.yAxisPadding());
    });
    return chart;
}
// 15 Min Interval - copied from https://github.com/mbostock/d3/blob/master/src/time/interval.js
var d3_date = Date;
function d3_time_interval(local, step, number) {
    function round(date) {
        var d0 = local(date), d1 = offset(d0, 1);
        return date - d0 < d1 - date ? d0 : d1;
    }
    function ceil(date) {
        step(date = local(new d3_date(date - 1)), 1);
        return date;
    }
    function offset(date, k) {
        step(date = new d3_date(+date), k);
        return date;
    }
    function range(t0, t1, dt) {
        var time = ceil(t0), times = [];
        if (dt > 1) {
            while (time < t1) {
                if (!(number(time) % dt)) times.push(new Date(+time));
                step(time, 1);
            }
        } else {
            while (time < t1) times.push(new Date(+time)), step(time, 1);
        }
        return times;
    }
    function range_utc(t0, t1, dt) {
        try {
            d3_date = d3_date_utc;
            var utc = new d3_date_utc();
            utc._ = t0;
            return range(utc, t1, dt);
        } finally {
            d3_date = Date;
        }
    }
    local.floor = local;
    local.round = round;
    local.ceil = ceil;
    local.offset = offset;
    local.range = range;
    var utc = local.utc = d3_time_interval_utc(local);
    utc.floor = utc;
    utc.round = d3_time_interval_utc(round);
    utc.ceil = d3_time_interval_utc(ceil);
    utc.offset = d3_time_interval_utc(offset);
    utc.range = range_utc;
    return local;
}
function d3_time_interval_utc(method) {
    return function (date, k) {
        try {
            d3_date = d3_date_utc;
            var utc = new d3_date_utc();
            utc._ = date;
            return method(utc, k)._;
        } finally {
            d3_date = Date;
        }
    };
}
// generalization of d3.time.minute copied from- https://github.com/mbostock/d3/blob/master/src/time/minute.js
function n_minutes_interval(nmins) {
    var denom = 6e4 * nmins;
    return d3_time_interval(function (date) {
        return new d3_date(Math.floor(date / denom) * denom);
    }, function (date, offset) {
        date.setTime(date.getTime() + Math.floor(offset) * denom); // DST breaks setMinutes
    }, function (date) {
        return date.getMinutes();
    });
}


min15 = n_minutes_interval(15);
dateFormat = d3.timeFormat('%Y/%m/%d/%H:%M');
numberFormat = d3.format('d');

//### Crossfilter Dimensions 
function generateValues(data) {

    data.forEach(function (d) {
        d.bitdate = new Date(d.DATETIME);    //d.DATETIME = dateFormat.parse(d.DATETIME);
       // d.month = d3.time.month(d.bitdate);
      //  d.week = d3.time.week(d.bitdate);
        d.BITRATE = +d.BITRATE.match(/\d+/); //d.BITRATE = +d.BITRATE; 
    });

    var crossFilteredData = crossfilter(data);
    var all = crossFilteredData.groupAll();
    // Dimension by full date
     dateDimension = crossFilteredData.dimension(function (d) {
        return d.bitdate;
     });


     maxbit = d3.max(data, function (d) { return +d["BITRATE"]; }); //alert(maxbit);  

    //Group bitrate per week, 15 minInterval - maintain running tallies 
     bitrateWeekMinIntervalGroupMove = dateDimension.group(min15).reduce(
       /* callback for when data is added to the current filter results */
       function (p, v) {
           ++p.count;
           p.BITRATE = +v.BITRATE;
           p.total += +v.BITRATE;
           p.avg = p.count ? Math.round(p.total / p.count) : 0;
           return p;
       },
       /* callback for when data is removed from the current filter results */
       function (p, v) {
           --p.count;
           p.BITRATE = +v.BITRATE;
           p.total -= +v.BITRATE;
           p.avg = p.count ? Math.round(p.total / p.count) : 0;
           return p;
       },
       /* initialize p */
       function () {
           return {
               count: 0,
               bitrate: 0,
               total: 0,
               avg: 0
           };
       }
    );


    try {
        minDate = dateDimension.bottom(1)[0].DATETIME;
    } catch(err) {
        minDate = new Date("2016-06-14 0:00"); 
    }

   
    try {
        maxDate = dateDimension.top(1)[0].DATETIME;
    } catch(err) {
         maxDate = new Date("2016-06-18 23:55");
    }

    return {
        min15, minDate, maxDate, bitrateWeekMinIntervalGroupMove,minIntervalWeekBitrateGroup,dateDimension,maxbit
    };
}

export default {
    generateValues,
    nonzero_min,
    dateFormat,
    numberFormat
};
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
     <style>
          path.line {
          fill: none;
          stroke: green;
          stroke-width: 1.5px;
          }
          .y.axis line,
          .y.axis path {
          fill: none;
          stroke: black;
        }
          .x.axis line,
          .x.axis path {
          fill: none;
          stroke: black;
        }

    </style>
    <title>Line Chart DC.js,React</title>
  </head>
  <body>
    <div id="App"></div>
    <script src="/bundle.js"></script>
  </body>

</html>

结果:

React 中的折线图 dc.js https://i.stack.imgur.com/IXJjK.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DC.js 到 React 的转换 的相关文章

随机推荐

  • Android 应用程序首选项会自动清除

    突然之间 每次我启动应用程序时 我的用户首选项都会被清除 我没有直接在 Activity 中使用首选项 而是在我的 Application 对象中有一个辅助类 它可以像这样访问首选项 SharedPreferences prefs Pref
  • Meteor:多个不需要的 mongodb 连接使数据库部署饱和

    我维护了一些部署在 AWS elastic beanstalk 64 位 Amazon Linux 4 5 2 上的meteor 1 7 0 3 应用程序 所有连接到托管 mongodb 部署 在 Compose 上 mongodb 版本
  • Compass (sass) 和 Web 开发人员扩展

    我经常使用 Web 开发人员扩展中的 编辑 css 功能来编辑样式表 这是一个很棒的功能 但编辑 css 并将其复制回编辑器进行保存需要时间 我计划在下一个项目中使用 Compass 我想知道如何使用 SASS Compass 的 编辑 c
  • Java - 调整 WAV 文件的播放速度

    我可能很笨 但我似乎找不到解决我的问题的方法 NOTE 我发现很多人报告了这个问题 似乎它是由于较新的 Java 可能是 1 5 而发生的 也许不再支持 SAMPLE RATE 我无法找到任何解决方案 我正在尝试调整 SAMPLE RATE
  • SQL Server 存储过程中的循环

    我需要帮助编写调用另一个存储过程并向其传递值的存储过程 到目前为止 这是用 C 完成的 现在我想将其移动到存储过程并创建一个在特定时间调用它的 SQL 代理作业 有任何想法吗 情况就是这样 Table A PK TableA ID Tabl
  • d3.js:如何在圆环图中的标签下方添加值

    我是 d3 js 的新手 到目前为止我所取得的成就是 this https jsfiddle net saras arya ypdw96v9 使用教程和视频 Now I am trying to add the dataset value
  • python,将字典转换为按值而不是键排序的列表

    我正在构建一个 collections defaultdict int 来记录某个键在一组数据中出现的次数 后来我希望能够以降序方式对其进行排序 显然是先将其转换为列表 首先按最高值排序 我创建了如下字典 adict defaultdict
  • 是否可以使用 Google Glass 拍照而无需“点击接受”?

    我按照此处的代码使用 Google Glass 相机捕获图像 https developers google com glass develop gdk media camera camera capturing images or vid
  • C/C++ - 运行系统(“process &”),然后写入其标准输入

    我正在研究 Linux 和 C C 我编写了一个带有一些线程的程序 include pthread h 并使用 sudo 运行它 一个线程运行一个进程 mplayer 并通过添加 使其保持运行 以便system 可以快速返回 system
  • Android studio 搁置的更改消失了,甚至在 .idea/shelf 目录中也没有

    我在 Android studio 中搁置了一些更改 然而 由于某种原因 搁置的更改不再存在 我已经检查了 project directory idea shelf 但它们也不在那里 Android studio 是否会在 idea she
  • Twilio:自动驾驶仪发起对话

    我们是一家送货服务公司 下订单后 我们希望向我们的司机发出送货工作邀请 这些职位是先到先得 订单在我们的 NodeJS 服务器上处理 在使用 Twilio Autopilot 处理对话 询问工作详细信息 的同时 向每位司机发送短信 SMS
  • 将函数与 Angular 7 中注入的 html 绑定

    我想使用innerHTML 在运行时将函数绑定到注入的html 中 我的组件 Component selector my app template div div styleUrls my app css encapsulation Vie
  • ffprobe/ffmpg 静音检测命令

    我正在研究流静音检测 它正在 ffmpeg 中执行以下命令 ffmpeg i http mystream com stream af silencedetect n 50dB d 0 5 f null 2 gt log txt 我想获得日志
  • Elasticsearch 对字符串排序未返回预期结果

    当对包含多个单词的字符串字段进行排序时 Elasticsearch 会拆分字符串值并使用最小值或最大值作为排序值 即 当对值为 老虎之眼 的字段进行升序排序时 排序值为 Eye 当按降序排序时 排序值为 Tiger 假设我的索引中有 老虎之
  • C# 可以在列表框中显示图像吗?

    C 简而言之 我可以在列表框中显示图像吗 我有一个用户列表 我想在某些名称旁边显示一个绿色勾号 这可能吗 Thanks 以下代码显示如何在列表框中进行自定义绘图 using System Windows Forms using System
  • 如何找出文件的编码? C#

    好吧 我需要找出我在某个目录中找到的哪些文件是 UTF8 编码的 或者是 ANSI 编码的 以更改我稍后决定的其他编码 我的问题是 我如何确定文件是 UTF8 还是 ANSI 编码 这两种编码实际上都可以在我的文件中使用 没有可靠的方法来做
  • 将 Objective-C 代码转换为 C++ 以检测 OS X 上的用户空闲时间

    我正在开发 Qt C 应用程序 我需要简单的函数来在 Mac OS X 上以秒为单位检索用户空闲时间 我发现这个代码用于检测用户空闲时间 include
  • 如何确定主线程上运行的内容 + 减慢 UI 速度?

    我在我的应用程序中添加了新的数据加载功能 它的目的是将大型数据库的内容从移动设备传输到后端并进行处理 在我在此管道中运行的每个函数中 该函数的全部内容都在一个 dispatch async 这会分派到非主线程 我还通过日志验证了这些功能是否
  • 自动增量不适用于具有复合键的实体类

    我希望我的复合键元素之一自动递增 并且我正在为实体类使用嵌入键 因此我无法使用生成值注释来解决问题 因为 GeneratedValue使用时注释被忽略 Embeddable or EmbeddedId 你不能使用 GeneratedValu
  • DC.js 到 React 的转换

    有 dc js 反应转换的示例吗 对折线图 表格和时间滑块 带画笔的条形图 感兴趣 任何帮助 将不胜感激 Thanks 这是将 DC js 转换为 React 的开始 使用的库的版本如下 package json dependencies