Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从d3图表中删除旧数据矩形

如何从d3图表中删除旧数据矩形
EN

Stack Overflow用户
提问于 2021-04-15 11:55:33
回答 3查看 41关注 0票数 1

##ChartWrapper:

这是我第一次发布问题。如果我错过了什么我向你道歉。提前谢谢。我的问题是,我从基于某些选择的api调用接收更新的数据,并将其传递给CharWrapper组件,该组件反过来调用D3Chart类中的updated()方法,用更新后的数据填充d3图表。但是,在第一次调用时,图表是正确填充的,但在第二次选择时,当我从api响应中获得更新的数据时,图表仍然保持原样,使用旧值。它没有得到更新

//此处的代码导出默认类ChartWrapper扩展了React.Component {

代码语言:javascript
运行
AI代码解释
复制
 componentDidMount() {
    this.tooltipRef = React.createRef();
    this.mySvgRef = React.createRef();
    this.legendRef = React.createRef();
    this.setState({ chart: new D3Chart(this.refs.svgChart, this.refs.tooltip, this.refs.legends) });
 }
      shouldComponentUpdate() {
    console.log("shouldComponentUpdate")
    return false;
}
    static getDerivedStateFromProps(nextProps, prevState) {
        if (prevState) {

          prevState.chart.update(nextProps.chartdata);
          console.log("getDerivedStateFromProps : ", nextProps.chartdata)
          return { chartdata: nextProps.chartdata }
     }

      return null;
  }
   render() {
       return (<div>
        <div className="svg" ref="svgChart"></div>
        <div className="tag" ref="tooltip"></div>
        <div className="legend" ref="legends">
        </div>
    </div>)
}

}enter code here

D3Chart组件代码:

下面是我的D3chart组件。我将其与react一起使用。为什么在对数据选择调用exit().remove()之后,较旧的数据仍然显示在窗口中。在过去的三天里,我一直在挣扎。任何建议都将受到高度赞赏。谢谢

注意: D3Chart类构造函数中的代码将只执行一次,并且只要我从api response中获得更新数据作为属性,就会调用update()函数。在此处输入代码

代码语言:javascript
运行
AI代码解释
复制
  export default class D3Chart {
     constructor(mySvgRef, tooltipRef, legendRef) {
        const vis = this;

        vis.tooltipRef = tooltipRef;
        vis.ganttSvgRef = d3.select(mySvgRef)
        .append("svg")
        .attr("width", w + margin.left + margin.right)
        .attr("height", h + margin.top + margin.bottom)
        .attr("class", "svg")
        .append('g')
        .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');

      vis.timeScale = d3.scaleTime()
        .range([0, w - 100]);

      vis.yScale = d3.scaleBand().rangeRound([0, h - margin.top - margin.bottom], 0);

      vis.xAxisGroup = vis.ganttSvgRef.append("g")
        .attr("className", "x top axis")
        .attr('transform', 'translate(' + 20 + ', ' + 0 + ')')

      vis.yAxisGroup = vis.ganttSvgRef.append("g")
        .attr("className", "y axis")
        .attr('transform', 'translate(' + margin.left + ', ' + 0 + ')')


      vis.legendRef = d3.select(legendRef)
        .style("width", w + margin.left + margin.right + 'px')

      vis.ganttSvgRef.append("text")
        .attr("transform",
            "translate(" + 0 + " ," +
            (h / 2) + ") rotate(-90)")
        .style("text-anchor", "middle")
        .text("Vessel in Terminal");

  } 

     update = (chartData) => {
       var barHeight = 50;
       var gap = 95;
       var topPadding = 0;
       var sidePadding = 20;
       const vis = this;
       console.log("I am updated with : ", chartData)
       var parseTime = d3.timeParse("%Y-%m-%d %H:%M:%S");

       var slotNumber = [];
       var vesselsNames = [];
       var serviceName = [];
       var serviceColorSelector = {}
    
     for (var i = 0; i < chartData.length; i++) {
           slotNumber.push(chartData[i].slot);
           serviceName.push(chartData[i].serviceName_data);
           vesselsNames.push(chartData[i].vesselName_data);
    }


        var uniqueService = [...new Set(serviceName)];
       for (var i = 0; i < uniqueService.length; i++) {
           serviceColorSelector[uniqueService[i]] = colArray[i];
    }
    slotNumber = this.checkUnique(slotNumber);
    slotNumber.sort(function (a, b) {
        return Number(a) - Number(b);
    });

    vis.timeScale.domain([d3.min(chartData, function (d) { return parseTime(d.arrivalTime_data); }),
    d3.max(chartData, function (d) { return parseTime(d.departureTime_data); })])
    vis.yScale.domain(slotNumber)

    var xAxistop = d3.axisTop(vis.timeScale).ticks().tickSizeInner((-h + margin.top + margin.bottom))
    vis.xAxisGroup
        // .transition()
        .call(xAxistop);

    var yAxis = d3.axisLeft(vis.yScale)
    vis.yAxisGroup
        // .transition()
        .call(yAxis);
    console.log("vis.ganttSvgRef :", vis.ganttSvgRef)


    if (slotNumber.length > 6) {
        barHeight = this.calculateBarHeight(slotNumber.length, barHeight);
    }
    var rectangles = vis.ganttSvgRef
        .selectAll("rect")
        .data(chartData);
    console.log("Reactangles : ", rectangles)
    rectangles.exit().remove();

    var innerRects = rectangles.enter().append("rect")
        .attr("x", function (d) {
            return vis.timeScale(parseTime(d.arrivalTime_data)) + sidePadding;
        })
        .attr("y", function (d, i) {
            for (var j = 0; j < slotNumber.length; j++) {
                if (d.slot == slotNumber[j]) {
                    return vis.yScale(d.slot);
                }
            }
        })
        .attr("width", function (d) {
            return (vis.timeScale(parseTime(d.departureTime_data)) - vis.timeScale(parseTime(d.arrivalTime_data)));
        })
        .attr("height", barHeight)
        .attr("stroke", "none")
        .attr("fill", function (d) {
            for (var i = 0; i < vesselsNames.length; i++) {
                return serviceColorSelector[d.serviceName_data]
            }
        })

    innerRects.on('mouseover', function (e) {
        var tag = "";

        tag = "Imo: " + d3.select(this).data()[0].imo_data + "<br/>" +
            "Vessel: " + d3.select(this).data()[0].vesselName_data + "<br/>" +
            "Service: " + d3.select(this).data()[0].serviceName_data;


        var x = (this.x.animVal.value + this.width.animVal.value / 2) + "px";
        var y = this.y.animVal.value + 25 + "px";

        vis.tooltipRef.innerHTML = tag;
        vis.tooltipRef.style.top = y;
        vis.tooltipRef.style.left = x;
        vis.tooltipRef.style.display = "block";
    }).on('mouseout', function () {
        vis.tooltipRef.style.display = "none";

    });


    var legend5 = vis.legendRef.selectAll(".legend5")

        .data(serviceName)

    legend5.exit().remove();
    var p = legend5.enter().append("div")
        .attr("class", "legends5").append("p")
        .attr("class", "country-name")
    p.append("span")
        .attr("class", "key-dot")
        .style("background", function (d, i) {
            return serviceColorSelector[d]
        })

    p.insert("text")
        .attr("class", "text-style")
        .style("text-anchor", 'start')

        .text(function (d, i) { return d })

}

checkUnique = (arr) => {
    var hash = {}, result = [];
    for (var i = 0, l = arr.length; i < l; ++i) {
        if (!hash.hasOwnProperty(arr[i])) {
            hash[arr[i]] = true;
            result.push(arr[i]);
        }
    }
    return result;
}
calculateBarHeight = (totalSlot, barheight) => {
    let height = barheight;
    let franction_x = totalSlot - 6;
    let franction_y = 6;
    let decrementRatio = franction_x / (franction_x + franction_y);
    let decresedHeight = decrementRatio * barheight;
    let rectHeight = Math.trunc(barheight - decresedHeight);
    return rectHeight;
}

}

EN

回答 3

Stack Overflow用户

发布于 2021-04-15 14:38:29

打电话

代码语言:javascript
运行
AI代码解释
复制
d3.select(mySvgRef).selectAll('svg').remove();

在行之前

代码语言:javascript
运行
AI代码解释
复制
d3.select(mySvgRef).append('svg')...
票数 0
EN

Stack Overflow用户

发布于 2021-04-16 05:16:48

d3 V5:

我使用merge()方法来解决我的问题。希望对其他也有帮助

代码语言:javascript
运行
AI代码解释
复制
    ` var rectangles = vis.ganttSvgRef.selectAll("rect")
                        .data(chartData);
   
                       rectangles.exit().remove();

    var innerRects = rectangles.enter().append("rect").merge(rectangles)
                     .attr("x", function (d) {
                     return vis.timeScale(parseTime(d.arrivalTime_data)) + 
                             sidePadding;
        })`
票数 0
EN

Stack Overflow用户

发布于 2021-04-22 16:34:33

如果您正在开发一个具有多个显示不同d3图表的小部件的仪表板,请使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
d3.selectAll("#d3-donutChart > *").remove();

这将只清除特定的图表,而不是网页中的所有svg。

在为更新的数据重新绘制d3图之前添加此行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67107991

复制
相关文章
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
利用数据集:MNIST http://yann.lecun.com/exdb/mnist/ 完成手写体数字识别 紫色yyds
司六米希
2022/11/15
5.5K0
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
Keras中创建LSTM模型的步骤[通俗易懂]
本文是对The 5 Step Life-Cycle for Long Short-Term Memory Models in Keras的复现与解读,新手博主,边学边记,以便后续温习,或者对他人有所帮助
全栈程序员站长
2022/10/03
3.8K0
Keras中创建LSTM模型的步骤[通俗易懂]
[Deep-Learning-with-Python]神经网络入手学习[上]
网络层堆叠形成网络模型,网络模型由输入数据得到预测值。损失函数比较预测值与实际值,得到损失函数值:用来评估预测结果的好坏;优化方法用损失值来更新网络模型的权重系数。
用户1631856
2018/08/01
1.1K0
[Deep-Learning-with-Python]神经网络入手学习[上]
【推荐系统】基于文本挖掘的推荐模型【含基于CNN的文本挖掘、python代码】
二维卷积网络是通过将卷积核在二维矩阵中,分别从width和height两个方向进行滑动窗口操作,且对应位置进行相乘求和。而图像则正是拥有二维特征像素图,所以图像应用卷积网络是二维卷积网络。
司六米希
2022/11/15
1.4K0
【推荐系统】基于文本挖掘的推荐模型【含基于CNN的文本挖掘、python代码】
MLK | Keras 基础模型调参指南
上一篇文章讲解了如何简易入门Keras,大致给出了一个深度学习模型,但对于模型如何调参就没有太过于深入讲解,今天继续写一篇文章来整理下 Keras 深度学习模型的调参教程,希望可以对大家有所帮助。
Sam Gor
2019/08/09
1.2K0
MLK | Keras 基础模型调参指南
Python安装TensorFlow 2、tf.keras和深度学习模型的定义
使用tf.keras,您可以设计,拟合,评估和使用深度学习模型,从而仅用几行代码即可做出预测。它使普通的深度学习任务(如分类和回归预测建模)可供希望完成任务的普通开发人员使用。
拓端
2020/11/03
1.7K0
第10章 使用Keras搭建人工神经网络·精华代码
电脑上看效果好,不用左右滑屏。都调好了,复制粘贴就可以在PyCharm里直接跑起来。 # -*- coding: utf-8 -*- # 需要安装和引入的包有tensorflow\pandas\numpy\matplotlib\scikit-learn # 使用pip安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tensorflow pandas matplotlib scikit-learn import numpy as
SeanCheney
2019/10/21
1.3K0
TensorFlow 基础学习 - 1
了解机器学习的一些基础功能,一些基础用法,然后在我们的实际工作中创造出更多的火花。
叉叉敌
2021/12/06
4010
TensorFlow 基础学习 - 1
用Python实现神经网络(附完整代码)!
在学习神经网络之前,我们需要对神经网络底层先做一个基本的了解。我们将在本节介绍感知机、反向传播算法以及多种梯度下降法以给大家一个全面的认识。
Datawhale
2020/12/07
5.7K0
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第10章 使用Keras搭建人工神经网络
下载本书代码和电子书:https://www.jianshu.com/p/4a94798f7dcc
SeanCheney
2019/10/16
3.4K0
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第10章 使用Keras搭建人工神经网络
keras中的损失函数
损失函数是模型优化的目标,所以又叫目标函数、优化评分函数,在keras中,模型编译的参数loss指定了损失函数的类别,有两种指定方法:
用户3578099
2020/03/31
2.2K0
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
IT派
2018/07/30
4860
TensorFlow快餐教程:程序员快速入门深度学习五步法
Keras 中神经网络模型的 5 步生命周期
https://machinelearningmastery.com/5-step-life-cycle-neural-network-models-keras/
PM小王
2019/07/01
2K0
Keras 中神经网络模型的 5 步生命周期
TensorFlow与PyTorch — 线性回归
如果是深度学习和神经网络的新手,那么一定遇到过“ TensorFlow ”和“ PyTorch ” 这两个术语。这是在数据科学领域中使用的两个流行的深度学习框架。
代码医生工作室
2020/06/01
1.1K0
(数据科学学习手札44)在Keras中训练多层感知机
  Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度学习框架中的sklearn,本文就将基于Keras,以手写数字数据集MNIST为演示数据,对多层感知机(MLP)的训练方法进行一个基本的介绍,而关于多层感知机的相关原理,请移步数据科学学习手札34:https://www.cnblogs.com/feffery/p/8996623.html,本文不再赘述。
Feffery
2018/07/29
1.5K0
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
AI科技大本营
2018/07/23
4250
TensorFlow快餐教程:程序员快速入门深度学习五步法
点击加载更多

相似问题

Keras -训练损失与验证损失

10

为什么Keras训练得很好,但返回错误的预测呢?

10

验证损失低于训练损失,并在Keras中减少损失

121

Keras model.fit() -使用了哪种训练算法?

14

Keras模型训练得很好,但预测值相同。

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档