2d 数据展示渲染库,本质通过 js 操作 svg,css,在数据可视化自定义图表领域大放异彩
import {} from 'd3'
以 vue 为例
;<div ref="base">index</div>
import * as d3 from 'd3'
export default {
mounted() {
this.$nextTick(() => {
d3.select(this.$refs.base)
.text('fuck')
.style('font-size', '30px')
.style('color', 'red')
})
}
}
d3:可以将数据绑定到 dom 上,绑定完成后当需要依靠这个数据才能操作 dom 时会很方便
datum()
;<div ref="base">
<p></p>
<p></p>
<p></p>
<p></p>
</div>
this.$nextTick(() => {
d3.select(this.$refs.base)
.selectAll('p')
.datum('绑定的内容')
.text((d, i) => {
console.log(i)
return d
})
})
data()
this.$nextTick(() => {
let arr = ['内容1', '内容2', '内容3', '内容4']
d3.select(this.$refs.base)
.selectAll('p')
.data(arr)
.text((d, i) => {
console.log(i)
return d
})
})
append() 后面追加一个元素
d3.select(this.$refs.base)
.select('.p2')
.append('h1')
.text('插入')
insert() 在某元素之前插入一个元素
d3.select(this.$refs.base)
.insert('h3', '.p2')
.text('干')
remove()
d3.select(this.$refs.base).remove('p')
<svg xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="0" fill="blue" />
svg>
// cx:x轴的位置
// vy: y轴的位置
// r: 圆的半径
// stroke: 边框颜色
// stroke-width: 边框粗细
// fill:填充颜色
// 矩形
<rect/>
// 圆形
<circle/>
// 椭圆
<ellipse/>
// 线
<line/>
// 折线
<polyline/>
// 多边形
<polygon/>
// 路径
<path/>
<rect
width="100"
height="100"
stroke="red"
stroke-width="1"
fill="yellow"
fill-opacity="0.2"
x="30"
y="30"
stroke-opacity="0.3"
/>
基本属性,注意这些属性可以单独写,也可以在 style 中写
// 基本属性
width = '100' // 宽度
height = '100' // 高度
stroke = 'red' // 边框颜色
stroke - width = '1' // 边框宽度
fill = 'yellow' // 填充颜色
fill - opacity = '0.2' // 填充颜色透明度
x = '30' // x轴位移
y = '30' // y轴位移
stroke - opacity = '0.3' // 边框透明度
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="0" fill="blue" />
属性
// r:指的圆的半径
// cx:圆心x轴坐标
// cy: 圆心y轴坐标
<ellipse
width="100"
height="100"
rx="100"
ry="50"
stroke="red"
stroke-width="1"
fill="yellow"
fill-opacity="0.2"
cx="150"
cy="100"
stroke-opacity="0.3"
/>
属性
// X轴
rx = '100'
// y轴
ry = '50'
<line x1="0" x2="100" y1="0" y2="100" stroke="red" stroke-width="5" />
属性
// 起始点x轴位置
x1
// 结束点x轴位置
x2
// 起始点y轴位置
y1
// 结束点y轴位置
y2
<polygon
points="100,100 400,100 400,400 100,400"
fill="green"
stroke="red"
stroke-width="3"
/>
// 点绘制
points = '100,100 400,100 400,400 100,400'
// 每逗号为一组,绘制一个点,绘制顺序为顺时针
<path d="M150 0 L75 200 L225 200 Z" />
M=moveTo //起始点
L=lineTo //线起始点
H=horizontal lineto //水平线位置
V=vertical lineto //垂直线
C=curveto //曲线
S=smooth curveto //平滑曲线
Q=quadratic bezier curve //贝塞尔曲线
T= smooth quadratic bezier curve //贝塞尔平滑曲线
A= elliptical acr //椭圆弧度
Z= closepath //关闭路径
<text x="50" y="50" fill="red">
aaaa
text>
import * as d3 from 'd3'
export default {
mounted() {
this.$nextTick(() => {
// 添加画布
var height = 300
var width = 300
var svg = d3
.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
// 添加内容
var dataSet = [250, 210, 170, 173, 200, 100]
var rectHeight = 30 // 矩形高度
svg
.selectAll('rect')
.data(dataSet)
.enter()
.append('rect')
.attr('x', 50)
.attr('y', function(d, i) {
return i * rectHeight // y轴的位置
})
.attr('width', function(d) {
return d //宽度按照数组大小
})
.attr('height', rectHeight - 2)
.attr('fill', 'blue')
})
}
}
var dataSet = [2.5, 2.1, 2.6, 0.5, 1]
var dataSet = [1000, 2000, 3000, 5000, 5500]
使用了比例尺的 DEMO
import * as d3 from 'd3'
export default {
mounted() {
this.$nextTick(() => {
// 添加画布
var height = 300
var width = 300
var svg = d3
.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
// 添加内容
// var dataSet = [1, 2, 3, 4, 5, 6]
var dataSet = [100, 200, 300, 400, 500, 600]
// 设置比例尺
var min = d3.min(dataSet)
var max = d3.max(dataSet)
var linear = d3
.scaleLinear()
.domain([min, max])
.range([1, 300])
// 结束比例尺
var rectHeight = 30 // 矩形高度
svg
.selectAll('rect')
.data(dataSet)
.enter()
.append('rect')
.attr('x', 50)
.attr('y', function(d, i) {
return i * rectHeight // y轴的位置
})
.attr('width', function(d) {
return linear(d) //使用比例尺
})
.attr('height', rectHeight - 2)
.attr('fill', 'blue')
})
}
}
import * as d3 from 'd3'
export default {
mounted() {
this.$nextTick(() => {
// 添加画布
var height = 300
var width = 300
var svg = d3
.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
// 添加内容
// var dataSet = [1, 2, 3, 4, 5, 6]
var dataSet = [100, 200, 300, 400, 500, 600]
// 比例尺
var min = d3.min(dataSet)
var max = d3.max(dataSet)
var linear = d3
.scaleLinear()
.domain([min, max])
.range([100, 200])
// 序数比例尺
var index = [0, 1, 2, 3, 4, 5, 6, 7]
// 你想要的颜色
var colors = ['red', 'blue', 'green', 'yellow', 'pink', 'green']
var ordinal = d3
.scaleOrdinal()
.domain(index)
.range(colors)
var rectHeight = 30 // 矩形高度
svg
.selectAll('rect')
.data(dataSet)
.enter()
.append('rect')
.attr('x', 50)
.attr('y', function(d, i) {
return i * rectHeight // y轴的位置
})
.attr('width', function(d) {
return linear(d) //使用比例尺
})
.attr('height', rectHeight - 2)
.attr('fill', function(d, i) {
return ordinal(i) // 使用序数比例尺
})
})
}
}
import * as d3 from 'd3'
export default {
mounted() {
this.$nextTick(() => {
// 添加画布
var height = 300
var width = 300
var svg = d3
.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
// 添加内容
var dataSetY = [1, 2, 3, 4, 5, 6]
var dataSet = [100, 200, 300, 400, 500, 600]
// 比例尺
var max = d3.max(dataSet)
var linear = d3
.scaleLinear()
.domain([0, max])
.range([0, 200])
// 序数比例尺
var index = [0, 1, 2, 3, 4, 5, 6, 7]
var colors = ['red', 'blue', 'green', 'yellow', 'pink', 'green']
var ordinal = d3
.scaleOrdinal()
.domain(index)
.range(colors)
// 添加坐标
var axis = d3.axisBottom(linear)
// 处理y轴数据
var maxY = d3.max(dataSetY)
var yData = d3
.scaleLinear()
.domain([0, maxY])
.range([180, 0])
var ayis = d3.axisLeft(yData)
// 追加x轴
svg
.append('g')
.attr('transform', 'translate(50,230)')
.attr('color', 'gray')
.call(axis)
// 追加y轴
svg
.append('g')
.attr('transform', 'translate(48,50)')
.attr('color', 'gray')
.call(ayis)
var rectHeight = 30 // 矩形高度
svg
.selectAll('rect')
.data(dataSet)
.enter()
.append('rect')
.attr('x', 50)
.attr('y', function(d, i) {
return i * rectHeight // y轴的位置
})
.attr('width', function(d) {
return linear(d) //宽度按照数组大小->使用比例尺
})
.attr('height', rectHeight - 2)
.attr('fill', function(d, i) {
return ordinal(i)
})
.attr('transform', 'translate(0,50)') // 调整画图的位置
})
}
}