将eventlistner添加到SVG条形图

哈桑·优素福

我有下面的代码正在使用绘制图表 SVG

var studentexamdata = new Array();
//ID and Grade
studentexamdata[0] = "01,80";
studentexamdata[1] = "02,40";
studentexamdata[2] = "03,70";
studentexamdata[3] = "04,80";
studentexamdata[4] = "05,30";
studentexamdata[5] = "06,90";
studentexamdata[6] = "07,70";
studentexamdata[7] = "08,80";
studentexamdata[8] = "09,100";
studentexamdata[9] = "10,60";

var svg;
var svgWidth, svgHeight, svgMargin, svgSpace;
var MarginSpace, MarginHeight;
var barchartWidth, barchartMargin, totalChartBars, maximumDataValue;
var LabelOnYAxis;

function drawBarChart() {
  svg = document.getElementsByTagName('svg')[0];

  var barchart = document.getElementById('barchart');
  barchart.addEventListener('click', function() {
    clear();
    ChartSettings();
    drawAxis();
    drawChart("Bar");
  }, false);

  var pointchart = document.getElementById('pointchart');
  pointchart.addEventListener('click', function() {
    clear();
    ChartSettings();
    drawAxis();
    drawChart("Point");
  }, false);
}

function clear() {
  while (svg.lastChild) {
    svg.removeChild(svg.lastChild);
  }
}

function ChartSettings() {
  svgMargin = 20;
  svgSpace = 60;

  svgHeight = svg.height.baseVal.value - 2 * svgMargin - svgSpace;
  svgWidth = svg.width.baseVal.value - 2 * svgMargin - svgSpace;

  MarginSpace = svgMargin + svgSpace;
  MarginHeight = svgMargin + svgHeight;

  barchartMargin = 15;
  totalChartBars = studentexamdata.length;
  barchartWidth = (svgWidth / totalChartBars) - barchartMargin;

  maximumDataValue = 0;
  for (var i = 0; i < totalChartBars; i++) {
    var arrVal = studentexamdata[i].split(",");
    var barVal = parseInt(arrVal[1]);
    if (parseInt(barVal) > parseInt(maximumDataValue))
      maximumDataValue = barVal;
  }

  LabelOnYAxis = 10;
}

function drawAxis() {
  //Y-Axis
  drawXYAxis(MarginSpace, MarginHeight, MarginSpace, svgMargin);
  //X-Axis
  drawXYAxis(MarginSpace, MarginHeight, MarginSpace + barchartWidth + 500, MarginHeight);
  drawMarkers();
}

function drawXYAxis(x1, y1, x2, y2) {
  var newdataAxis = document.createElementNS("http://www.w3.org/2000/svg", 'line');
  newdataAxis.setAttribute("x1", x1);
  newdataAxis.setAttribute("y1", y1);
  newdataAxis.setAttribute("x2", x2);
  newdataAxis.setAttribute("y2", y2);
  newdataAxis.style.stroke = "black";
  newdataAxis.style.strokeWidth = "2px";
  svg.appendChild(newdataAxis);
}

function drawMarkers() {
  var numberMarkers = parseInt(maximumDataValue / LabelOnYAxis);
  for (var i = 0; i < LabelOnYAxis + 1; i++) {
    markerVal = i * numberMarkers;
    markerValHt = i * numberMarkers * svgHeight;
    var xaxisMarkers = MarginSpace - 5;
    var yaxisMarkers = MarginHeight - (markerValHt / maximumDataValue);
    textelement = document.createElementNS("http://www.w3.org/2000/svg", 'text');
    textelement.setAttribute('dx', xaxisMarkers - 40);
    textelement.setAttribute('dy', yaxisMarkers);
    txtnode = document.createTextNode(markerVal);
    textelement.appendChild(txtnode);
    svg.appendChild(textelement);
  }
  for (var i = 0; i < totalChartBars; i++) {
    arrVal = studentexamdata[i].split(",");
    name = arrVal[0];
    markerXPosition = MarginSpace + barchartMargin + (i * (barchartWidth + barchartMargin)) + (barchartWidth / 2);
    markerYPosition = MarginHeight + 20;
    textelement = document.createElementNS("http://www.w3.org/2000/svg", 'text');
    textelement.setAttribute('dx', markerXPosition);
    textelement.setAttribute('dy', markerYPosition);
    txtnode = document.createTextNode(name);
    textelement.appendChild(txtnode);
    svg.appendChild(textelement);
  }
}

function drawRectangleForChart(x, y, wd, ht, fill) {
  var rect = document.createElementNS("http://www.w3.org/2000/svg", 'rect');
  rect.setAttributeNS(null, 'x', x);
  rect.setAttributeNS(null, 'y', y);
  rect.setAttributeNS(null, 'width', wd);
  rect.setAttributeNS(null, 'height', ht);
  rect.setAttributeNS(null, 'fill', "blue");
  svg.appendChild(rect);
}

function drawEllipse(x, y, rx) {
  var circle = document.createElementNS("http://www.w3.org/2000/svg", 'circle');
  circle.setAttributeNS(null, 'cx', x);
  circle.setAttributeNS(null, 'cy', y);
  circle.setAttributeNS(null, 'r', rx);
  circle.setAttributeNS(null, 'fill', "darkred");
  svg.appendChild(circle);
}

function drawChart(chart) {
  for (var i = 0; i < totalChartBars; i++) {
    var arrchartVal = studentexamdata[i].split(",");
    bcVal = parseInt(arrchartVal[1]);
    bcHt = (bcVal * svgHeight / maximumDataValue);
    bcX = MarginSpace + (i * (barchartWidth + barchartMargin)) + barchartMargin + 10;
    bcY = (MarginHeight - bcHt - 2);
    switch (chart) {
      case "Bar":
        drawRectangleForChart(bcX, bcY, barchartWidth, bcHt, true);
        break;

      case "Point":
        drawEllipse(bcX, bcY, 5, 5);
        break;
    }
  }
}
window.onload = drawBarChart;
#chartcontainer {
  height: 250px;
  width: 400px;
  border: double;
  background-color: aliceblue;
}

#charttype {
  border: double;
  height: 75px;
  width: 100px;
}
<div id="charttype">
  <br />
  <input type="radio" id="barchart" name="Chart" />Bar Chart
  <br />
  <input type="radio" id="pointchart" name="Chart" />Point Chart
</div>
<div id="chartcontainer">
  <svg id="svgcontainer" height="250" width="400">
        </svg>
</div>

输出很好,如下所示:

在此处输入图片说明

我需要的是以下内容:

  1. 将事件列表添加到条形图中,以便将鼠标悬停在每个条上后,我会看到一些详细信息,例如ID和等级
  2. 将eventlistner添加到条形图中,可以在其中通过上下拖动条的顶部来更改值,即通过更改条高来更改等级
vqf

创建每个元素(矩形或椭圆形)时,可以添加eventListeners:

var studentexamdata = new Array();
//ID and Grade
studentexamdata[0] = "01,80";
studentexamdata[1] = "02,40";
studentexamdata[2] = "03,70";
studentexamdata[3] = "04,80";
studentexamdata[4] = "05,30";
studentexamdata[5] = "06,90";
studentexamdata[6] = "07,70";
studentexamdata[7] = "08,80";
studentexamdata[8] = "09,100";
studentexamdata[9] = "10,60";


var svg;
var svgWidth, svgHeight, svgMargin, svgSpace;
var MarginSpace, MarginHeight;
var barchartWidth, barchartMargin, totalChartBars, maximumDataValue;
var LabelOnYAxis;

function drawBarChart() {
  svg = document.getElementsByTagName('svg')[0];

  var barchart = document.getElementById('barchart');
  barchart.addEventListener('click', function() {
    clear();
    ChartSettings();
    drawAxis();
    drawChart("Bar");
  }, false);

  var pointchart = document.getElementById('pointchart');
  pointchart.addEventListener('click', function() {
    clear();
    ChartSettings();
    drawAxis();
    drawChart("Point");
  }, false);
}

function clear() {
  while (svg.lastChild) {
    svg.removeChild(svg.lastChild);
  }
}

function ChartSettings() {
  svgMargin = 20;
  svgSpace = 60;

  svgHeight = svg.height.baseVal.value - 2 * svgMargin - svgSpace;
  svgWidth = svg.width.baseVal.value - 2 * svgMargin - svgSpace;

  MarginSpace = svgMargin + svgSpace;
  MarginHeight = svgMargin + svgHeight;

  barchartMargin = 15;
  totalChartBars = studentexamdata.length;
  barchartWidth = (svgWidth / totalChartBars) - barchartMargin;

  maximumDataValue = 0;
  for (var i = 0; i < totalChartBars; i++) {
    var arrVal = studentexamdata[i].split(",");
    var barVal = parseInt(arrVal[1]);
    if (parseInt(barVal) > parseInt(maximumDataValue))
      maximumDataValue = barVal;
  }

  LabelOnYAxis = 10;
}

function drawAxis() {
  //Y-Axis
  drawXYAxis(MarginSpace, MarginHeight, MarginSpace, svgMargin);
  //X-Axis
  drawXYAxis(MarginSpace, MarginHeight, MarginSpace + barchartWidth + 500, MarginHeight);
  drawMarkers();
}

function drawXYAxis(x1, y1, x2, y2) {
  var newdataAxis = document.createElementNS("http://www.w3.org/2000/svg", 'line');
  newdataAxis.setAttribute("x1", x1);
  newdataAxis.setAttribute("y1", y1);
  newdataAxis.setAttribute("x2", x2);
  newdataAxis.setAttribute("y2", y2);
  newdataAxis.style.stroke = "black";
  newdataAxis.style.strokeWidth = "2px";
  svg.appendChild(newdataAxis);
}

function drawMarkers() {
  var numberMarkers = parseInt(maximumDataValue / LabelOnYAxis);
  for (var i = 0; i < LabelOnYAxis + 1; i++) {
    markerVal = i * numberMarkers;
    markerValHt = i * numberMarkers * svgHeight;
    var xaxisMarkers = MarginSpace - 5;
    var yaxisMarkers = MarginHeight - (markerValHt / maximumDataValue);
    textelement = document.createElementNS("http://www.w3.org/2000/svg", 'text');
    textelement.setAttribute('dx', xaxisMarkers - 40);
    textelement.setAttribute('dy', yaxisMarkers);
    txtnode = document.createTextNode(markerVal);
    textelement.appendChild(txtnode);
    svg.appendChild(textelement);
  }
  for (var i = 0; i < totalChartBars; i++) {
    arrVal = studentexamdata[i].split(",");
    name = arrVal[0];
    markerXPosition = MarginSpace + barchartMargin + (i * (barchartWidth + barchartMargin)) + (barchartWidth / 2);
    markerYPosition = MarginHeight + 20;
    textelement = document.createElementNS("http://www.w3.org/2000/svg", 'text');
    textelement.setAttribute('dx', markerXPosition);
    textelement.setAttribute('dy', markerYPosition);
    txtnode = document.createTextNode(name);
    textelement.appendChild(txtnode);
    svg.appendChild(textelement);
  }
}

function displayInfo(info){
  let bx = document.getElementById('infoblock');
  bx.innerHTML = info;
}

function showInfo(evt, stId){
  let info = studentexamdata[stId];
  let show = `${stId} - ${info}`;
  displayInfo(show);
}

function modifyInfo(evt, stId){
  displayInfo(evt.clientY);
}

function drawRectangleForChart(stId, x, y, wd, ht, fill) {
  var rect = document.createElementNS("http://www.w3.org/2000/svg", 'rect');
  rect.setAttributeNS(null, 'x', x);
  rect.setAttributeNS(null, 'y', y);
  rect.setAttributeNS(null, 'width', wd);
  rect.setAttributeNS(null, 'height', ht);
  rect.setAttributeNS(null, 'fill', "blue");
  rect.addEventListener('mouseover', function(e){showInfo(e, stId)});
  rect.addEventListener('click', function(e){modifyInfo(e, stId)});
  svg.appendChild(rect);
}

function drawEllipse(stId, x, y, rx) {
  var circle = document.createElementNS("http://www.w3.org/2000/svg", 'circle');
  circle.setAttributeNS(null, 'cx', x);
  circle.setAttributeNS(null, 'cy', y);
  circle.setAttributeNS(null, 'r', rx);
  circle.setAttributeNS(null, 'fill', "darkred");
  circle.addEventListener('mouseover', function(e){showInfo(e, stId)});
  circle.addEventListener('click', function(e){modifyInfo(e, stId)});
  svg.appendChild(circle);
}

function drawChart(chart) {
  for (var i = 0; i < totalChartBars; i++) {
    var studentId = i;
    var arrchartVal = studentexamdata[i].split(",");
    bcVal = parseInt(arrchartVal[1]);
    bcHt = (bcVal * svgHeight / maximumDataValue);
    bcX = MarginSpace + (i * (barchartWidth + barchartMargin)) + barchartMargin + 10;
    bcY = (MarginHeight - bcHt - 2);
    switch (chart) {
      case "Bar":
        drawRectangleForChart(studentId, bcX, bcY, barchartWidth, bcHt, true);
        break;

      case "Point":
        drawEllipse(studentId, bcX, bcY, 5, 5);
        break;
    }
  }
}
window.onload = drawBarChart;
#chartcontainer {
  height: 250px;
  width: 400px;
  border: double;
  background-color: aliceblue;
}
#infoblock {
  position: fixed;
  right: 0;
  top: 0;
  background-color: aliceblue;
}

#charttype {
  border: double;
  height: 75px;
  width: 100px;
}
<div id="charttype">
  <br />
  <input type="radio" id="barchart" name="Chart" />Bar Chart
  <br />
  <input type="radio" id="pointchart" name="Chart" />Point Chart
</div>
<div id="infoblock">
</div>
<div id="chartcontainer">
  <svg id="svgcontainer" height="250" width="400">
        </svg>
</div>

一些注意事项:

  • 我添加了一个displayInfo在右上角显示数据功能,您可能希望以其他方式显示它。

  • 我没有添加拖动事件侦听器,因为它并不琐碎。您可以查看click事件的工作方式。modifyInfo功能显示clientY事件坐标。从这里开始,您需要在考虑比例和边距的情况下进行协调。再次,这并非不重要,因为它svg本身可能具有转换和/或viewBox。您可能会找到一些示例,该示例显示了使用getScreenCTM来完成此任务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将误差线添加到条形图

来自分类Dev

r将线条或线段添加到条形图

来自分类Dev

将 % 添加到条形图 ggplot2

来自分类Dev

将演化线添加到堆叠条形图

来自分类Dev

Dimple.js-将数据标签添加到条形图的每个条形

来自分类Dev

NVD3.js-如何将条形图文本添加到堆积图中的每个条形图?

来自分类Dev

将段添加到ggplot2中的条形图(离散X轴)

来自分类Dev

将y轴标签添加到NVD3多条形图

来自分类Dev

将条形图添加到ggplot2图例

来自分类Dev

将跨度图标添加到D3条形图

来自分类Dev

使用多面条形图将文本添加到绘图中

来自分类Dev

将值添加到hvplot中的分组条形图

来自分类Dev

如何将条形图添加到基于Django的数据库中?

来自分类Dev

如何将图像添加到轴上的条形图(matplotlib)

来自分类Dev

将geom_line添加到R中的堆叠条形图

来自分类Dev

将条形图添加到geom_density的底部

来自分类Dev

将文本添加到条形图ggplot2(重要性星号)

来自分类Dev

如何使用HightCharts将两个dataLabel添加到条形图

来自分类Dev

将变量geom_hline添加到条形图的所有方面

来自分类Dev

将条形图添加到ggplot2图例

来自分类Dev

如何使用Chart.js将标签方块添加到条形图

来自分类Dev

将y轴值标签添加到gnuplot条形图

来自分类Dev

如何将总计添加到amcharts中的堆叠条形图

来自分类Dev

Highchart:将href添加到堆叠条形图的每个细分中

来自分类Dev

将段添加到ggplot2中的条形图(离散X轴)

来自分类Dev

将线添加到ggplot2中的双条形图

来自分类Dev

使用多面条形图将文本添加到绘图中

来自分类Dev

将垂直线添加到ggplot条形图

来自分类Dev

将阴影目标区域添加到ggplot2条形图

Related 相关文章

热门标签

归档