柱状图、折线图、散点图和气泡图都是较为相似的图。
同折线图的坐标轴的实现是相同的.
先用 d3.scaleLinear()
线性比例尺来创建比例尺
再用 d3.axisBottom().scale()
/ var yAxis = d3.axisLeft().scale()
创建坐标轴并且设置对应的比例尺,
最后 添加SVG元素并“绑定”坐标轴到其上
,就可以看到完成以后的坐标轴。
注意:这里需要对移动SVG元素,使它们在视觉上组装成一个坐标系(但实际上它们在位置上是零散的,并没有很强的关系)。
1⃣️ : 创建x轴 , y轴的比例尺
// 创建x轴的比例尺
var xScale = d3
.scaleLinear()
.domain([140, 190])
.range([0, width - padding.left - padding.right]);
// 创建y轴的比例尺
var yScale = d3
.scaleLinear()
.domain([40, 120])
.range([height - padding.top - padding.bottom, 0]);
2⃣️ :创建x轴, 创建y轴
// 创建x轴
var xAxis = d3.axisBottom()
.scale(xScale)
// 创建y轴
var yAxis = d3.axisLeft()
.scale(yScale)
3⃣️ : 把x轴 , y轴应用到对应的SVG元素上
// 把x轴应用到对应的SVG元素上
chart
.append("g")
.attr("class", "axis")
.attr(
"transform",
"translate(0," + (height - padding.top - padding.bottom) + ")"
)
.call(xAxis);
// 把y轴应用到对应的SVG元素上
chart
.append("g")
.attr("class", "axis")
.call(yAxis);
散点的实现
// 添加散点
chart
.attr("class", "point")
.selectAll(".point")
.data(dataset)
.enter()
.append("circle")
.attr('fill','#2ec7c9')
.attr('opacity','0.7')
.attr("cx", function(d) {
return xScale(d[0]);
})
.attr("cy", function(d) {
return yScale(d[1]);
})
.attr("r", 5);
折线图的绘制
line
.curve(d3.curveBasis)
// d3.curveBasis // 曲线插值方式为三次 basis 曲线
核心代码:
let line = d3
.line() //创建一个新的线条生成器
.x(function(d, i) {
return (
padding.left +
((width - padding.left - padding.right) / _this.lineData.length) *
(i + 0.5)
);
})
.y(function(d, i) {
return yScale(d);
})
.curve(d3.curveBasis);
// d3.curve 设置曲线插值方式
// d3.curveBasis 三次 basis 曲线
svg
.append("path")
.attr("d", line(_this.lineData))
.attr("stroke", "red") //定义一条线、文本或元素轮廓颜色
.attr("stroke-width", "4px") //定义一条线、文本或元素轮廓厚度
.attr("fill", "none")
.attr("class", "line");
}
area - 生成一个线性的区域,用于区域图表.
area.x - 获取或设置x坐标.
area.y - 获取或设置y坐标.
area.y0 - 获取或设置y0坐标(基线).
area.y1 - 获取或设置y1坐标(背线).
通俗来讲:y0 函数可以确定 x 点对应的 y 轴投影下限(base),y1 确定上限(top)
。
核心代码:
let area = d3
.area()
// .x()和.y()是根据输入数据得到的点的位置信息
.x(function(d, i) {
return (
padding.left +
((width - padding.left - padding.right) / _this.lineData.length) *
(i + 0.5)
);
})
.y(function(d, i) {
return height - padding.bottom;
})
// y0 函数可以确定 x 点对应的 y 轴投影下限(base),y1 确定上限(top)
.y1(function(d, i) {
return yScale(d);
})
.curve(d3.curveBasis);
svg
.append("path")
.attr("d", area(_this.areaData))
.style("fill","skyblue")