下面我来详细讲解一下如何使用JavaScript制作简单的框选图表。
1. 确定布局
首先,我们需要在HTML中确定图表的布局。可以使用<canvas>
元素来绘制我们的图表,可以设置其宽度和高度,例如:
<canvas id="myChart" width="600" height="400"></canvas>
2. 获取数据
接下来,我们需要获取数据。可以使用XMLHttpRequest对象或fetch API从后台请求数据,或者直接将数据写死在JavaScript中,例如:
var data = [
{ label: "A", value: 10 },
{ label: "B", value: 20 },
{ label: "C", value: 30 },
{ label: "D", value: 40 },
{ label: "E", value: 50 },
];
3. 绘制图表
使用Canvas API来绘制图表,例如:
var ctx = document.getElementById("myChart").getContext("2d");
var x = 0;
var y = 0;
var width = 200;
var height = 200;
ctx.fillStyle = "lightgray";
ctx.fillRect(x, y, width, height);
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
ctx.fillStyle = "blue";
ctx.fillRect(
x,
y + i * height / data.length,
value * width / 100,
height / data.length - 1
);
ctx.fillStyle = "black";
ctx.fillText(label, x + 5, y + i * height / data.length + 15);
}
这段代码会绘制一个简单的柱状图,允许用户通过鼠标拖拽来框选某些柱子。
4. 实现框选功能
相信你已经注意到代码中的x
、y
、width
和height
变量,是用来绘制柱状图的矩形范围。我们可以借助鼠标事件来获取用户所框选的区域:
var x1, y1, x2, y2;
document.getElementById("myChart").addEventListener("mousedown", function (e) {
x1 = e.offsetX;
y1 = e.offsetY;
});
document.getElementById("myChart").addEventListener("mouseup", function (e) {
x2 = e.offsetX;
y2 = e.offsetY;
var rect = getSelectionRect(x1, y1, x2, y2);
var selectedBars = getSelectedBars(rect, data);
console.log(selectedBars);
});
function getSelectionRect(x1, y1, x2, y2) {
var rect = {};
rect.left = Math.min(x1, x2);
rect.top = Math.min(y1, y2);
rect.width = Math.abs(x2 - x1);
rect.height = Math.abs(y2 - y1);
return rect;
}
function getSelectedBars(rect, data) {
var bars = [];
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
var bar = {
x: x,
y: y + i * height / data.length,
width: value * width / 100,
height: height / data.length - 1,
label: label,
};
if (bar.x + bar.width > rect.left && bar.x < rect.left + rect.width &&
bar.y + bar.height > rect.top && bar.y < rect.top + rect.height) {
bars.push(bar);
}
}
return bars;
}
这段代码中,我们使用mousedown
和mouseup
事件来获取用户的框选区域。然后,使用getSelectionRect
函数来计算出矩形的左上角坐标、宽度和高度。接着,使用getSelectedBars
函数来获取用户框选的柱子,如果柱子的矩形与用户框选的矩形有交集,则将其放入一个数组中,并返回该数组。
示例说明
下面是两个示例,展示如何使用框选图表实现不同的功能。
示例1:选择某个柱子
var data = [
{ label: "A", value: 10 },
{ label: "B", value: 20 },
{ label: "C", value: 30 },
{ label: "D", value: 40 },
{ label: "E", value: 50 },
];
var ctx = document.getElementById("myChart").getContext("2d");
var x = 0;
var y = 0;
var width = 200;
var height = 200;
ctx.fillStyle = "lightgray";
ctx.fillRect(x, y, width, height);
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
ctx.fillStyle = "blue";
ctx.fillRect(
x,
y + i * height / data.length,
value * width / 100,
height / data.length - 1
);
ctx.fillStyle = "black";
ctx.fillText(label, x + 5, y + i * height / data.length + 15);
}
document.getElementById("myChart").addEventListener("mouseup", function (e) {
var x = e.offsetX;
var y = e.offsetY;
var bar = findBar(x, y, data);
if (bar) {
alert(bar.label + " is selected.");
}
});
function findBar(x, y, data) {
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
var bar = {
x: x,
y: y + i * height / data.length,
width: value * width / 100,
height: height / data.length - 1,
label: label,
};
if (x > bar.x && x < bar.x + bar.width &&
y > bar.y && y < bar.y + bar.height) {
return bar;
}
}
return null;
}
此示例中,我们在mouseup
事件中查找鼠标所在的柱子,如果找到了某个柱子,则弹出提示框。这样就可以通过选择某个柱子来实现一些功能。
示例2:选择任意数量的柱子
var data = [
{ label: "A", value: 10 },
{ label: "B", value: 20 },
{ label: "C", value: 30 },
{ label: "D", value: 40 },
{ label: "E", value: 50 },
];
var ctx = document.getElementById("myChart").getContext("2d");
var x = 0;
var y = 0;
var width = 200;
var height = 200;
ctx.fillStyle = "lightgray";
ctx.fillRect(x, y, width, height);
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
ctx.fillStyle = "blue";
ctx.fillRect(
x,
y + i * height / data.length,
value * width / 100,
height / data.length - 1
);
ctx.fillStyle = "black";
ctx.fillText(label, x + 5, y + i * height / data.length + 15);
}
var selectedBars = [];
document.getElementById("myChart").addEventListener("mouseup", function (e) {
var x = e.offsetX;
var y = e.offsetY;
var bar = findBar(x, y, data);
if (bar) {
var index = selectedBars.indexOf(bar);
if (index >= 0) {
selectedBars.splice(index, 1);
} else {
selectedBars.push(bar);
}
redrawChart(data, selectedBars);
}
});
function findBar(x, y, data) {
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
var bar = {
x: x,
y: y + i * height / data.length,
width: value * width / 100,
height: height / data.length - 1,
label: label,
};
if (x > bar.x && x < bar.x + bar.width &&
y > bar.y && y < bar.y + bar.height) {
return bar;
}
}
return null;
}
function redrawChart(data, selectedBars) {
var ctx = document.getElementById("myChart").getContext("2d");
var x = 0;
var y = 0;
var width = 200;
var height = 200;
ctx.fillStyle = "lightgray";
ctx.fillRect(x, y, width, height);
for (var i = 0; i < data.length; i++) {
var value = data[i].value;
var label = data[i].label;
ctx.fillStyle = selectedBars.indexOf(label) >= 0 ? "green" : "blue";
ctx.fillRect(
x,
y + i * height / data.length,
value * width / 100,
height / data.length - 1
);
ctx.fillStyle = "black";
ctx.fillText(label, x + 5, y + i * height / data.length + 15);
}
}
此示例中,我们使用selectedBars
数组来保存用户选择的柱子。在mouseup
事件中,如果点击到了某个柱子,则将其从selectedBars
中移除,如果没有点击到某个柱子,则将其添加到selectedBars
中。然后,调用redrawChart
函数来重绘图表,并在柱子被选择时将其颜色设置为绿色。
这样就可以选择任意数量的柱子,并根据其被选择状态来调整柱子的颜色。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript制作简单的框选图表 - Python技术站