Vue整合d3.v5.js制作--柱状图(rect)
先上效果图:

图中柱状图变成纯蓝色是鼠标滑动过的颜色(颜色可改,本人配色能力十分的强,建议直接用默认设置即可 ( ᖛ ̫ ᖛ )ʃ))
1、环境说明
Vue版本:"vue": "^2.5.2"
d3版本:"d3": "^5.9.1"
2、Histogram.vue源码
<!--
d3组件:柱状图
属性说明:
id:必填,如果同一页面引用多个柱状图,请设置不同的id
width:选填,默认600
height:选填,默认600
begincolor:选填,柱状图渐变色的起始颜色,默认绿色
endcolor:选填,柱状图渐变色的结束颜色,默认蓝色
selectcolor:选填,鼠标滑过柱状图时显示的颜色,默认蓝色
dataset:必填,数据
数据格式:
[
{'name': '北京', value: },
{'name': '厦门', value: },
{'name': '大兴安岭', value: },
{'name': '苏州', value: }
]
rotate:选填,当x轴文字过长,可设置此值为true让文字旋转,默认不旋转
onRectClick: 选填,点击柱状图的自定义事件
--> <template>
<div class="histogram" :id="id">
</div>
</template> <script>
import * as d3 from 'd3'
function noop(d, i) {
// console.log(d)
// console.log(i)
}
export default {
name: 'histogram',
props: {
id: String,
width: Number,
height: Number,
begincolor: String,
endcolor: String,
selectcolor: String,
dataset: Array,
rotate: Boolean,
onRectClick: {
type: Function,
default: noop
}
},
mounted () {
this.init();
},
methods: {
init() {
d3.select("#svg" + this.id).remove();
let width = this.width ? this.width : ;
let height = this.height ? this.height : ;
let svg = d3.select("#" + this.id).append("svg").attr("width", width).attr("height", height).attr("id", "svg" + this.id);
let begincolor = this.begincolor ? this.begincolor : 'steelblue';
let endcolor = this.endcolor ? this.endcolor : 'green';
let selectcolor = this.selectcolor ? this.selectcolor : 'steelblue';
let linecolorid = 'linecolor' + this.id;
let linearGradient = svg.append('defs').append('linearGradient').attr('id', linecolorid)
.attr('x1', '0%').attr('y1', '0%').attr('x2', '0%').attr('y2', '100%')
linearGradient.append('stop').attr('offset', '0%').attr('style', 'stop-color:' + begincolor + '; stop-opacity:1')
linearGradient.append('stop').attr('offset', '100%').attr('style', 'stop-color:' + endcolor + '; stop-opacity:1')
let gwidth = width - ;
let gheight = height - ;
let values = this.dataset.map(d => d.value)
let xScale1 = d3.scaleBand().range([, gwidth]).domain(this.dataset.map(d => d.name))
let yScale1 = d3.scaleLinear().domain([, d3.max(values)]).range([gheight, ]);
let xAxis = d3.axisBottom().scale(xScale1);
let yAxis = d3.axisLeft().scale(yScale1);
let xScale = d3.scaleBand()
.domain(d3.range(this.dataset.length))
.rangeRound([, gwidth])
.round(0.05);
let yScale = d3.scaleLinear()
.domain([, d3.max(values)])
.range([, gheight]);
svg.selectAll("rect")
.data(values)
.enter()
.append("rect")
.attr("x", (d, i) => + xScale(i))
.attr("width", xScale.bandwidth() - )
.attr("y", + gheight)
.attr("height", )
.attr("fill", "red")
.on("click", this.onRectClick)
// .on("click", function(d, i) {
// d3.select(this)
// .transition()
// .duration(1000)
// .ease(d3.easeBounce)
// .attr("fill", "green");
// })
.on("mouseover", function(d, i) {
d3.select(this)
// .transition(d)
// .duration(200)
// .ease(d3.easeBounce)
.attr("fill", selectcolor);
})
.on("mouseout", function(d, i) {
d3.select(this)
// .transition(d)
// .duration(200)
// .ease(d3.easeBounce)
.attr("fill", "url(#" + linecolorid + ")");
})
.transition()
.duration()
.ease(d3.easeBounce)
.delay((d, i) => i * )
.attr("y", (d) => + gheight - yScale(d))
.attr("height", yScale)
.attr("fill", "url(#" + linecolorid + ")"); svg.selectAll("text")
.data(values)
.enter()
.append("text")
.attr("x", (d, i) => + xScale(i))
.attr("y", d => + gheight - yScale(d))
.attr("dx", xScale.bandwidth() / )
.attr("dy", )
.attr("text-anchor", "begin")
.attr("font-size", () => {
if (width > ) return ;
else return ;
})
.attr("fill", "white")
.transition()
.delay()
.text(d => d); let xvalues = svg.append("g")
.attr("transform", "translate(60, " + (gheight + ) + ")")
.call(xAxis) if (this.rotate) {
xvalues.selectAll('text')
.attr("dx", -)
.attr("dy", )
.attr("transform", "rotate(-30)")
} svg.append("g")
.attr("transform", "translate(60, 50)")
.call(yAxis); // if (this.width && this.height) {
// svg.attr("width", this.width)
// .attr("height", this.height)
// .attr("viewBox", "0 0 600 600");
// }
}
},
watch: {
dataset() {
this.init();
}
}
}
</script> <style> </style>
3、api说明
d3组件:柱状图
属性说明:
id:必填,如果同一页面引用多个柱状图,请设置不同的id
width:选填,默认600
height:选填,默认600
begincolor:选填,柱状图渐变色的起始颜色,默认绿色
endcolor:选填,柱状图渐变色的结束颜色,默认蓝色
selectcolor:选填,鼠标滑过柱状图时显示的颜色,默认蓝色
dataset:必填,数据
数据格式:
[
{'name': '北京', value: },
{'name': '厦门', value: },
{'name': '大兴安岭', value: },
{'name': '苏州', value: }
]
rotate:选填,当x轴文字过长,可设置此值为true让文字旋转,默认不旋转
onRectClick: 选填,点击柱状图的自定义事件
4、使用示例
<template>
<div id="test">
<histogram id="histogram" :dataset="data" :onRectClick="test"></histogram>
</div>
</template> <script>
import histogram from '@/components/d3/Histogram'
export default {
name: 'test',
data() {
return {
data: [
{'name': '北京', value: },
{'name': '厦门', value: },
{'name': '大兴安岭', value: },
{'name': '苏州', value: }
]
}
},
components: {
histogram
},
methods: {
test(d, i) {
this.$alert(d, i, {
confirmButtonText: '确定',
callback: action => {
this.$message({
type: 'info',
message: `action: ${ action }`
});
}
});
}
}
}
</script> <style scoped>
</style>
Vue整合d3.v5.js制作--柱状图(rect)的更多相关文章
- Vue整合d3.v5.js制作--折线图(line)
先上效果图(x轴固定为时间轴): 图中出现的悬浮框是鼠标悬停效果 1.环境说明: vue版本:"vue": "^2.5.2" d3版本:"d3&quo ...
- D3.js 制作中国地图 .net 公共基础类
D3.js 制作中国地图 from: http://d3.decembercafe.org/pages/map/index.html GeoJSON is a format for encoding ...
- d3.js 制作简单的俄罗斯方块
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块.话不多说先上图片. 1. js tetris类 由于方法拆分 ...
- d3.js 制作简单的贪吃蛇
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...
- 使用Vue.js制作仿Metronic高级表格(一)静态设计
Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables.本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库.jQuery做部分用户交互(弹窗). 使 ...
- 使用d3.v5实现条形图
效果图: 条形图: 目录结构: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 使用d3.v5实现饼状图
效果图: 饼状图: 目录结构: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 使用d3.v5实现折线图与面积图
d3最新是V5版的,比起V2的API变动了不少,写下我实现过程 效果图: 面积图: 折线图: 目录结构: <!DOCTYPE html> <html lang="en&qu ...
- vue整合adminLTE
前端框架AdminLTE 中文教程 如何用vue整合adminlte模板 1.adminlte 下载地址 : https://github.com/almasaeed2010/AdminLTE/rel ...
随机推荐
- c/python 的区别
c python ...
- Linux 查看磁盘IO并找出占用IO读写很高的进程
背景-线上告警 线上一台服务器告警,磁盘利用率 disk.util > 90,并持续告警. 登录该服务器后通过 iostat -x 1 10 查看了相关磁盘使用信息.相关截图如下: # 如果没有 ...
- SUSE Linux Enterprise 11 离线安装 DLIB 人脸识别 python机器学习模块
python机器学习模块安装 我的博客:http://www.cnblogs.com/wglIT/p/7525046.html 环境:SUSE Linux Enterprise 11 sp4 离线安 ...
- docker挂载war包到tomcat容器中的注意点和坑
刚开始用docker,难免会遇到很多坑,这里分享一下: 一 挂载最好挂载目录 我刚开始挂载war包,结果发现容器里把挂载的war包当成目录了 二 本地路径必须是绝对路径,否则不管用 三 容器中使用vi ...
- 时序数据库 Apache-IoTDB 源码解析之前言(一)
IoTDB 是一款时序数据库,相关竞品有 Kairosdb,InfluxDB,TimescaleDB等,主要使用场景是在物联网相关行业,如:车联网.风力发电.地铁.飞机监控等等,具体应用案例及公司详情 ...
- ImageButton去边框&Button或者ImageButton的背景透明
在ImageButton中载入图片后,很多人会觉得有图片周围的白边会影响到美观,其实解决这个问题有两种方法 一种方法是将ImageButton的背景改为所需要的图片.如:android:backgro ...
- webdriver高级应用(2) - 滚动条操作
webdriver高级应用(2) - 滚动条操作 #-*- coding:utf-8 -*- from selenium import webdriver import unittest import ...
- one-hot编码(pytorch实现)
n = 5 #类别数 indices = torch.randint(0, n, size=(15,15)) #生成数组元素0~5的二维数组(15*15) one_hot = torch.nn.fun ...
- Spring学习笔记:自动创建Proxy
为什么需要自动创建Proxy 手动为所有需要代理的类用ProxyFactoryBean创建代理Proxy需要大量的配置. 这样如果需要代理的类很多,配置就很繁琐,而且也不便于xml配置的维护. 因此S ...
- 编写 Django 应用单元测试
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已有功能的代码了 ...