先上效果图(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. c#数字图像处理(六)直方图均衡化

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

  2. Python3之MySQL操作

    1.安装pymysql PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,在使用之前需要进行安装,可以使用以下命令安装最新版的 PyMySQL: 1).在cmd命令 ...

  3. LeetCode-指针法

    LeetCode刷题总结-指针法 方法介绍:指针法主要使用在一组按从小到大排好序的数组中,当按照条件查找对应元素时,在数组的前后定义两个指针,当两个指针代表的元素进行运算时:若结果大于目标值,则左移右 ...

  4. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

  5. HDU-2647 Reward(链式前向星+拓扑排序)

    Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. node使用art-template的过滤器

    引言 art-template过滤器在我看来,其实就是定义一个函数,模板字符串通过调用该函数处理相关的数据,得到相应的返回结果,显示在页面上.因此我们可以注册一个过滤器,处理相关的数据.这里使用nod ...

  7. 中国天气网API接口

    http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.h ...

  8. [实用分享]Kindle电子书格式AZW3转换为MOBI

    [实用分享]Kindle电子书格式AZW3转换为MOBI 思路:先拆解成源文件再转换成 MOBI 推荐首选这种方法.此方法的思路是,首先用 KindleUnpack 把 azw3 文件拆解成源文件,然 ...

  9. 小程序图片 mode 设置为 widthFix 图片显示瞬间竖向拉伸变形闪烁

    官方文档中 mode="widthFix"   宽度不变,高度自动变化,保持原图宽高比不变,即设置图片宽度而高度自适应. 但是在实际开发中发现图片在初始加载时瞬间竖向拉伸变形闪烁然 ...

  10. HDU2066dijkstra模板题

    问题描述: 题目描述:Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中    会遇见很多人(白马王 ...