先上效果图(x轴固定为时间轴):

图中出现的悬浮框是鼠标悬停效果

1、环境说明:

vue版本:"vue": "^2.5.2"
d3版本:"d3": "^5.9.1"

2、Line.vue源码

 <template>
<div class="d3line" :id="id">
</div>
</template> <script>
import * as d3 from 'd3'
export default {
name: 'd3line',
props: {
id: String,
width: Number,
height: Number,
dataset: Array
},
mounted() {
this.init();
},
methods: {
init() {
d3.select("#svg" + this.id).remove();
let width = this.width ? this.width : ;
let height = this.height ? this.height : ;
let padding = {
left: ,
right: ,
top: ,
bottom:
}
let colorZ = d3.scaleOrdinal(d3.schemeDark2)
let parseTime = d3.timeParse("%Y-%m-%d")
let xScale = d3.scaleTime().range([, width - padding.left - padding.right])
let dates = this.dataset.flatMap((d) => d.value.map(v => parseTime(v.key)))
xScale.domain([d3.min(dates), d3.max(dates)])
let yScale = d3.scaleLinear().range([height - padding.top - padding.bottom, ])
yScale.domain([, d3.max(this.dataset.flatMap((d) => d.value.map( v => v.value) )) + ])
let xAxis = d3.axisBottom(xScale).tickFormat(d => d.getFullYear() + '-' + (d.getMonth() + ) + '-' + d.getDate())
let yAxis = d3.axisLeft(yScale)
let svg = d3.select("#" + this.id).append("svg").attr("width", width).attr("height", height).attr("id", "svg" + this.id);
svg.append('g')
.attr('transform', 'translate(' + padding.left + ',' + (height - padding.bottom) + ')')
.call(xAxis)
.selectAll('text')
.attr('dx', -)
.attr('dy', )
.attr('transform', 'rotate(-20)')
.style('font-weight', 'bold')
svg.append('g')
.attr('transform', 'translate(' + padding.left + ',' + padding.top + ')')
.call(yAxis)
.selectAll('text')
.style('font-weight', 'bold')
let line = d3.line().x(d => xScale(parseTime(d.key))).y(d => yScale(d.value))
this.dataset.forEach((v, vi) => {
let tp_x = ,
tp_y =;
svg.append("path")
.attr('d' , line(v.value))
.attr('transform', 'translate(' + padding.left + ',' + padding.top + ')')
.attr('fill', 'none')
.attr('stroke', (d, i) => colorZ(vi))
.attr("stroke-width", )
.style('stroke-dasharray', function(d, i) {
return d3.select(this).node().getTotalLength();
})
.style('stroke-dashoffset', function(d, i) {
return d3.select(this).node().getTotalLength();
})
.transition()
.duration()
.ease(d3.easePolyOut)
.delay((d, i) => i * )
.style('stroke-dashoffset', )
svg.selectAll('circle1')
.data(v.value)
.enter()
.append('circle')
.attr('cx', (d, i) => {
let x = xScale(parseTime(d.key))
if (i === v.value.length - ) tp_x = x -
return x
})
.attr('cy', (d, i) => {
let y = yScale(d.value)
if (i === v.value.length - ) tp_y = y -
return y
})
.attr('r', )
.attr('transform', 'translate(' + padding.left + ',' + padding.top + ')')
.style("fill", (d, i) => colorZ(vi))
.on("mouseover", (d, i) => {
let g = svg.append('g')
.attr('id', `hoverg${vi}${d.key}${d.value}`)
.attr("transform", "translate(" + (xScale(parseTime(d.key)) - ) + "," + (yScale(d.value) + ) + ")" )
g.append("rect")
.attr("x", function(d){ return this.parentNode.getBBox().x - ;})
.attr("y", function(d, i){ return this.parentNode.getBBox().y - })
.attr("width", )
.attr("height", )
.style("fill", "#fffbf0")
g.append('text')
.text(`${d.key}:${d.value}`)
.style("fill", colorZ(vi))
})
.on("mouseout", (d) => d3.select(`#hoverg${vi}${d.key}${d.value}`).remove())
.transition()
.duration()
.ease(d3.easePolyIn)
.delay((d, i) => i * )
.attr('r', )
// svg.selectAll('text1')
// .data([v.name])
// .enter()
// .append('text')
// .attr('dx', (d, i) => tp_x)
// .attr('dy', (d, i) => tp_y)
// .attr('transform', 'translate(' + padding.left + ',' + padding.top + ')')
// .text((d) => d)
// .style("fill", (d, i) => colorZ(vi))
// .style('font-weight', 'bold')
svg.append('text')
.attr('dx', tp_x)
.attr('dy', tp_y)
.attr('transform', 'translate(' + padding.left + ',' + padding.top + ')')
.text(v.name)
.style("fill", colorZ(vi))
.style('font-weight', 'bold')
})
}
},
watch: {
dataset() {
this.init();
}
}
}
</script> <style> </style>

3、使用示例

 <template>
<div id="test">
<!-- 一定要传进去一个id,随便传一个 -->
<d3line id="line" :dataset="data1"></d3line>
</div>
</template> <script>
import d3line from '@/components/d3/Line'
export default {
name: 'test',
data() {
return {
data1: [
{
'name': '哈尔滨',
'value': [{key: '2015-1-1', value: }, {key: '2015-1-2', value: }, {key: '2015-1-3', value: }, {key: '2015-1-17', value: }]
},
{
'name': '海南',
'value': [{key: '2015-1-1', value: }, {key: '2015-1-2', value: }, {key: '2015-1-3', value: }, {key: '2015-1-17', value: }]
},
{
'name': '天津',
'value': [{key: '2015-1-2', value: }, {key: '2015-1-3', value: }, {key: '2015-1-4', value: }, {key: '2015-1-5', value: }]
}
]
}
},
components: {
d3line
},
methods: { }
}
</script> <style scoped>
</style>

4、参考资料

https://github.com/d3/d3-scale-chromatic/blob/master/README.md#schemeCategory10

https://github.com/d3/d3-time-format#format

https://jakearchibald.com/2013/animated-line-drawing-svg/

Vue整合d3.v5.js制作--折线图(line)的更多相关文章

  1. Vue整合d3.v5.js制作--柱状图(rect)

    先上效果图: 图中柱状图变成纯蓝色是鼠标滑动过的颜色(颜色可改,本人配色能力十分的强,建议直接用默认设置即可 ( ᖛ ̫ ᖛ )ʃ)) 1.环境说明 Vue版本:"vue": &q ...

  2. chart.js制作折线图

    <!DOCTYPE html> <html> <head> <title></title> </head> <script ...

  3. JFreeChart在制作折线图

    JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line; import java.awt.Color; import java.awt.Font; import org ...

  4. Microsoft Excel Sheet/表格 制作折线图

    Microsoft Excel Sheet/表格 制作折线图 虽然比较简单,但是仍然需要稍微花一点功夫. 1.制作好表格数据 2.先将数据选定(不包括 横座标的 年月日或其他的刻度 的那一列) 3.插 ...

  5. 使用d3.v5实现饼状图

    效果图: 饼状图: 目录结构: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  6. excel制作折线图太麻烦?试试这些折线图在线生成工具

    折线图是以折线的上升或下降来表示统计数量的增减变化的统计图,叫作折线统计图.用折线的起伏表示数据的增减变化情况,不仅可以表示数量的多少,而且可以反映数据的增减变化情况.并且折线图也是目前最方便的一种统 ...

  7. Python制作折线图

    利用python的第三方包Pygal制作简单的折线图. 申明:本文仅供学习交流使用.源码大部分来自<python编程从入门到实践>:如有侵权,请联系我删除. 1 #!usr/bin/env ...

  8. d3.js制作蜂巢图表带动画效果

    以上是效果图,本图表使用d3.js v4制作.图表主要功能是在六边形格子中显示数据,点击底部图标可以切换指定格子高亮显示,图表可以随浏览器任意缩放. 1.图表的主体结构是由正六边形组成,使用d3生成六 ...

  9. d3.js画折线图

    下载d3.zip,并解压到网页文件所在的文件夹 windows下,在命令行进入网页文件夹,输入 python -m http.server 在浏览器中输入127.0.0.1:8000/xxx.html ...

随机推荐

  1. git使用的常见命令汇总

    git的简单介绍 git是分布式版本控制工具 git 的基本操作指令 git init 初始化git仓库 git add 文件名 git add . 把文件 添加到 git 暂存区中 git stat ...

  2. c#数字图像处理(六)直方图均衡化

    直方图均衡化又称直方图修平,是一种很重要的非线性点运算.使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好的在直方图上分布. 直方图均衡化的基 ...

  3. Spring注解开发系列VII --- Servlet3.0

    Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...

  4. 在Centos7上安装Oracle

    环境: 硬盘30G:2G RAM:Centos7:Oracle 11G: 1.创建组和用户 [zzd@localhost ~]$ su root #切换到root Password: [root@lo ...

  5. Leetcode 题目整理-5 Valid Parentheses & Merge Two Sorted Lists

    20. Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...

  6. 85道Java微服务面试题整理(助力2020面试)

    微服务 面试题 1.您对微服务有何了解? 2.微服务架构有哪些优势? 3.微服务有哪些特点? 4.设计微服务的最佳实践是什么? 5.微服务架构如何运作? 6.微服务架构的优缺点是什么? 7.单片,SO ...

  7. Struts(四)

    1.Struts 2提供了非常强大的类型转换功能,提供了多种内置类型转换器,也支持开发自定义类型转换器2.Struts 2框架使用OGNL作为默认的表达式语言 ==================== ...

  8. FFMPEG学习----解码视频

    基础概念 我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他 ...

  9. 关于centos7下networkManager关闭操作

    由于network和NetworkManager服务会出现冲突,而且NetworkManager通常会比较先启动,所以为了防止NetworkManager的启动导致我们直接配置的网络环境失效,我们需要 ...

  10. 《Python学习手册 第五版》 -第4章 介绍Python对象类型

    本章的内容主要是介绍了Python的核心对象类型,后续的5.6.7.8.9章针对这些核心类型分别展开详细的说明 本章我认为重要的有几点 1.作者有谈到Python的知识结构,这个我感觉是一个大框架,可 ...