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>
目录
相关文章
|
5天前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
10天前
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数
|
11天前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
24 0
JS配合CSS3实现动画和拖动小星星小Demo
|
22天前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
36 3
|
1月前
|
JavaScript 前端开发
JavaScript 与 DOM 交互
【9月更文挑战第01天】
22 2
|
2月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
18 3
|
2月前
|
JavaScript 前端开发 UED
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
【8月更文挑战第30天】在Vue.js中,动画与过渡效果不仅是视觉点缀,更是提升用户体验的关键。通过流畅的动态效果,应用的互动性和吸引力得以增强,从而提高用户满意度和参与度。`&lt;transition&gt;`和`&lt;transition-group&gt;`组件结合CSS过渡,可轻松实现元素的进入、离开及列表变化动画。合理的性能优化,如使用硬件加速,能避免页面卡顿,确保动画既美观又高效。下面是一个简单的淡入淡出效果示例,展示了如何利用Vue.js实现平滑的动画过渡。总之,恰当的动画设计能显著提升应用的用户体验。
41 0
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
|
2月前
|
JavaScript
Vue项目打包后都产生了哪些JS请求?
【8月更文挑战第19天】Vue项目打包后都产生了哪些JS请求?
74 0
Vue项目打包后都产生了哪些JS请求?
|
2月前
|
Devops 持续交付 测试技术
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
31 0
|
2月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
45 0