共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。
declare const d3;
export class BarChart {
svg: any;
svgWidth=400;
svgHeight=400;
padding={top:30,bottom:30,left:30,right:30}
rectWidth=30
axisWidth=300
axisHeight=300
constructor(target: HTMLElement) {this.svg=d3.select(target)
.attr('width',this.svgWidth)
.attr('height',this.svgHeight)
}
drawBar(data) {let names=['小明','小红','小圆','小贾','小猪']
// 坐标轴
let xscale=d3.scalePoint()
.domain(names)
.rangeRound([0,this.axisWidth])
.padding(0.8)
let xaxis=d3.axisBottom(xscale)
this.svg.append('g').attr('transform',`translate(${this.padding.left},${this.svgHeight-this.padding.bottom})`).call(xaxis)
let yscale=d3.scaleLinear([100,0],[0,this.axisHeight])
let yaxis=d3.axisLeft(yscale)
this.svg.append('g')
.call(yaxis)
.attr('transform',`translate(${this.padding.left},${this.svgHeight-this.axisHeight-this.padding.bottom})`)
// 数据缩放
data=data.map(d=>yscale(d))
//console.log(data);
// y 轴原点的纵坐标
let y0=this.svgHeight-this.padding.bottom-this.axisHeight
let rect=this.svg.selectAll('rect').data(data)
.join(enter=>{enter.append('rect').attr('fill','red')
.attr('x',(d,i)=>xscale(names[i])+this.padding.left-0.5*this.rectWidth)
.attr('y',d=>y0+d)
.attr('width',this.rectWidth)
.attr('height',d=>this.axisHeight-d)
},update=>{update.attr('fill','red')
.attr('x',(d,i)=>xscale(names[i])+this.padding.left-0.5*this.rectWidth)
.attr('y',d=>y0+d)
.attr('width',this.rectWidth)
.attr('height',d=>this.axisHeight-d)
},exit=>{exit.remove()
})
//console.log(rect);
let text=this.svg.selectAll('.text').data(data)
.join(enter=>{enter.append('text')
.text(d=>yscale.invert(d))
.attr('x',(d,i)=>xscale(names[i])+this.padding.left)
.attr('y',d=>y0+d)
.attr('text-anchor','middle')
},update=>{
update
.text(d=>yscale.invert(d))
.attr('x',(d,i)=>xscale(names[i])+this.padding.left)
.attr('y',d=>y0+d)
.attr('text-anchor','middle')
},exit=>{exit.remove()
})
//console.log(text);
}
}
正文完