首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从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

复制
相关文章
Android自定义按钮状态背景
如果你觉得Android自带的按钮默认、按下时样式太low,可以尝试自定义按钮状态背景:
张拭心 shixinzhang
2022/11/30
8210
为wordpress添加google+按钮
作者:matrix 被围观: 1,093 次 发布时间:2013-09-10 分类:Wordpress 兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
5450
为wordpress添加google+按钮
unity 背景根据按钮数量变化
立羽
2023/08/24
1570
unity 背景根据按钮数量变化
【CSS】CSS 背景设置 ⑧ ( 背景设置案例 | 导航栏按钮 )
在 div 盒子中的 a 标签是 行内元素 , 为其设置宽高是无效的 , 首先要将其转为 行内块样式 ;
韩曙亮
2023/03/30
4.6K0
【CSS】CSS 背景设置 ⑧ ( 背景设置案例 | 导航栏按钮 )
【HTML】HTML 表单 ② ( 按钮表单 | 普通按钮 | 提交按钮 | 重置按钮 | 图片按钮 | 文件域 )
将 <input /> 标签 的 type 属性设置为 button , 就可以将该 表单组件 设置为 普通按钮 类型表单 ;
韩曙亮
2023/03/30
8.5K0
【HTML】HTML 表单 ② ( 按钮表单 | 普通按钮 | 提交按钮 | 重置按钮 | 图片按钮 | 文件域 )
给 WordPress 博客添加 Google Buzz 按钮
Google Buzz 是 Google 推出的整合在 Gmail 中分享个人状态信息和其他动态的工具,只要是 Gmail 用户,就可以在 Buzz 中通过空开或者私密的方式来分享文字,图片,视频等信息,在移动设备中,还可以通过 Buzz 向好友分享地理位置,并且 Google Buzz 还可以直接导入个人的 Twitter,Picasa,Google Reader,博客等各种内容。 由于 Google Buzz 整合到 Gmail 中,所以这个服务一开始,就有非常多的用户,那么如何让博客读者把你的博客中的日志分享到 Google Buzz 中,让你的博客日志在更多的用户分享和传播呢?今天我就讲解下如何添加 Google Buzz 按钮到 WordPress 博客当中。
Denis
2023/04/14
9220
给 WordPress 博客添加 Google Buzz 按钮
一个类似抖音 APP 拍摄按钮效果的控件
效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+id/touch_btn" android:layo
阳仔
2019/07/31
8480
一个类似抖音 APP 拍摄按钮效果的控件
跟我学Rx编程——调皮的背景音乐按钮
有些H5的页面会有一个按钮控制背景音乐播放,如果只是单一页面的话,没有什么逻辑可言。但如果涉及到转场,那么逻辑就复杂起来。
我不是码神
2022/07/28
5360
Android开发 点击按钮切换背景的两种方法
第一种方式 第二种方式 获取ListView某个Item中的控件
用户2192970
2019/02/21
2.7K0
Android开发 点击按钮切换背景的两种方法
CSS好看的按钮
好看的按钮 <style> .btn { BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7b9ebd 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#cecfde); BO
欢醉
2018/01/22
2.3K0
利用GDI+制作背景颜色淡入淡出效果的按钮
用过QQ2009的网友都知道QQ主面板的界面非常炫丽,特别好看,鼠标移上去还有淡入淡出的效果。那这样效果是怎么做出来的呢?其实不难,只要自定义一个用户控件的外怪就可以了,用到GDI+技术和时钟控件来操作…
SAP梦心
2022/05/09
1.1K0
巧用layer-list实现按钮背景阴影、投影
我们在实现UI标注画图的时候难免会遇到要求按钮带阴影的效果。很多人会想,现在安卓5.0以上原生控件已经支持android:elevation=""属性设置投影了,再者也可以使用CardView给需要投影的布局控件来包一层,因为CardView也是带app:cardElevation=""属性的,设置投影还不是分分钟的事。 当我在实际开发中时,项目需求几乎所有的控件按钮都是带阴影的,列表项、详情项等等,如果使用切图肯定是不大现实的,占用空间太大。当我使用上面提到的android:elevation=""与ap
木溪bo
2019/07/28
2.5K0
自定义UITabBar--实现类似新浪微博中间的发送按钮
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52710240
用户1451823
2018/09/13
6510
Xamarin.Forms 按钮样式 圆角按钮
在 Xamarin 中可以方便进行样式定义或不进行定义样式只修改属性而改变外观,如按钮的圆角可以通过 CornerRadius 属性设置
林德熙
2020/12/07
3.3K0
freemarker文件下,bootstrap 点击按钮,切换按钮上的图标
fa标签在bootstrap封装的原形是:使用一个单<i>并增加对应的CSS类名,例: <i class="fa fa-search"></i>
全栈程序员站长
2022/06/30
3.7K0
点击按钮背景变灰色,松开恢复原来色
最初的时候我是想用js逻辑去修改样式,如果点击了,那么就改为灰色,松开后,再改为白色。结果demo有100多个列表项,我也不可能加上100多个监听,我突然想起以前学的事件代理,然后就实践了一把。出现了如下代码
砖业洋__
2023/05/06
5220
点击加载更多

相似问题

舵图在不同的命名空间中创建秘密

120

如何为子舵图设置不同的命名空间?

17

舵图覆盖值

19

舵图未取正确值

11

修改气流舵图值

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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