vue + d3.js(v6) 绘制【柱状图/条形图】(含动画和交互)

简介: vue + d3.js(v6) 绘制【柱状图/条形图】(含动画和交互)

安装d3

npm install d3

.vue文件中

<template>
    <div class="d3Chart"></div>
</template>
<script>
    import * as d3 from 'd3';
    export default {
        mounted() {
            // 数据——x轴的标签——城市
            let labelList = ["成都", "武汉", "上海", "北京", "深圳"]
            // 数据——对应y轴的值——城市人口(万)
            let dataList = [100, 105, 200, 250, 230]
            // 画布的参数
            let mapWidth = 300;
            let mapHeight = 300;
            let mapPadding = 30
            // 定义画布—— 宽 300 高 300 外边距 10px
            let map = d3.select(".d3Chart").append("svg").attr("width", mapWidth).attr("height", mapHeight).style("margin", "10px")
            // d3.select("div").remove()
            //定义x轴比例尺(序数段比例尺)
            let scaleX = d3.scaleBand().domain(labelList).range([0, mapWidth - mapPadding * 2])
            // .paddingInner(0.2) // 段间距
            // .paddingOuter(0.5) //外边距
            // .align(0.5) //段对齐
            // .round(true);  //取整
            //定义Y轴比例尺(线性比例尺)——最大值为画布高度-2*画布内边距,最小值为0(0放在第二位,因为y轴正方向是反的)
            let scaleY = d3.scaleLinear().domain([0, d3.max(dataList)]).range([mapHeight - 2 * mapPadding, 0]);
            //定义x y 轴
            let axisX = d3.axisBottom(scaleX)
            let axisY = d3.axisLeft(scaleY)
            // 绘制x y 轴
            map.append('g').attr("transform", `translate(${mapPadding},${mapHeight - mapPadding})`).call(axisX);
            map.append('g').attr("transform", "translate(" + mapPadding + "," + mapPadding + ")").call(axisY);
            //矩形间的空白
            let rectMargin = scaleX.bandwidth() / 3;
            //添加矩形元素
            map.selectAll(".MyRect")
                .data(dataList)
                .enter()
                .append("rect")
                .on("mouseover", function (d, i) {
                    d3.select(this).attr("fill", "yellow");
                })
                .on("mouseout", function (d, i) {
                    d3.select(this)
                        .transition()
                        .duration(500)
                        .attr("fill", "steelblue");
                })
                .attr("class", "MyRect")
                .attr("transform", "translate(" + mapPadding + "," + mapPadding + ")")
                .attr("x", function (d, i) {
                    return i * scaleX.bandwidth() + rectMargin / 2
                })
                // 起始状态是在 y 轴等于 0 的位置(但要注意,不能在起始状态直接返回 0,要应用比例尺计算画布中的位置)
                .attr("y", function (d) {
                    var min = scaleY.domain()[0];
                    // 值域的最小值
                    return scaleY(min);
                })
                .transition()
                .delay(function (d, i) {
                    return i * 200;
                })
                .duration(2000)
                // 终止状态是目标值
                .attr("y", function (data) {
                    return scaleY(data);
                })
                .attr("width", scaleX.bandwidth() - rectMargin)
                .attr("height", function (data) {
                    return mapHeight - mapPadding * 2 - scaleY(data);
                })
                // 矩形填充颜色_填充颜色不要写在CSS里
                .attr('fill', 'blue')
            //添加文字元素
            map.selectAll(".MyText")
                .data(dataList)
                .enter()
                .append("text")
                .attr("class", "MyText")
                .attr("transform", "translate(" + mapPadding + "," + mapPadding + ")")
                .attr("x", function (d, i) {
                    return i * scaleX.bandwidth() + scaleX.bandwidth() / 2
                })
                .attr("y", function (d) {
                    var min = scaleY.domain()[0];
                    // 值域的最小值
                    return scaleY(min);
                })
                .transition()
                .delay(function (d, i) {
                    return i * 200;
                })
                .duration(2000)
                .attr("y", function (data) {
                    return scaleY(data);
                })
                // 沿x轴方向偏移量
                // .attr("dx",function(){
                //     return 0
                // })
                // 沿y轴方向偏移量
                .attr("dy", function (d) {
                    return -6;
                })
                // 文本对齐方式(相对于文本原点)  start、middle、end或inherit
                .attr("text-anchor", "middle")
                // 文本字体大小
                .attr("font-size", "12px")
                // 文本颜色
                .attr("fill", "red")
                .text(function (d) {
                    return d;
                });
 
        },
    }
</script>
<style scoped>
</style>
目录
相关文章
|
JavaScript 前端开发
如何使用时间切片来优化JavaScript动画的性能?
如何使用时间切片来优化JavaScript动画的性能?
479 158
|
JavaScript 前端开发
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
548 156
|
JavaScript 前端开发
CSS3 动画和 JavaScript 动画的性能比较
具体的性能表现还会受到许多因素的影响,如动画的复杂程度、浏览器的性能、设备的硬件条件等。在实际应用中,需要根据具体情况选择合适的动画技术。
433 154
|
11月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
512 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
3271 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
前端开发 API 开发者
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
364 0
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
479 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
369 4
ractive.js联系表单动画效果源码
一款ractive.js联系表单动画效果,很有创意的发送邮件、联系内容等表单,基于ractive.js实现的动画效果,以发送信件的方式。
131 1
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
336 4