javascript - 一页上多个简单图表 d3.js

标签 javascript csv d3.js

我正在使用d3.js并且我试图在同一页面中显示多个图表。虽然d3.js代码是相同的。一个图表来自Measurements.csv,另一个来自m1.csv

<!DOCTYPE html>

<svg width="1000" height="500"></svg>

<style> /* set the CSS */


.grid line {
  stroke: aquamarine;
  stroke-opacity: 0.7;
  shape-rendering: crispEdges;
}

.grid path {
  stroke-width: 1;
}

</style>
<style>
body {
    background-color: SlateGrey;
}
</style>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script>

// set the dimensions and margins of the graph
var svg2 = d3.select("svg"),
    margin = {top: 0, right: 0, bottom: 90, left: 50},
    width = 950 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom,
    g = svg2.append("g").attr("transform", "translate(" + margin.left +  "," + margin.top + ")");


var x = d3.scaleLinear()
    .rangeRound([0, width]);

var y = d3.scaleLinear()
    .rangeRound([height, 0]);

    // gridlines in x axis function
    function make_x_gridlines() {
        return d3.axisBottom(x)
            .ticks(5)
    }

    // gridlines in y axis function
function make_y_gridlines() {
    return d3.axisLeft(y)
        .ticks(5)
}

var line = d3.line()
    .x(function(d) { return x(d.frequency); })
    .y(function(d) { return y(d.output); });




d3.csv("Measurements.csv", function(d) {
  d.frequency = +d.frequency;
  d.output = +d.output;
  return d;
}, function(error, data) {
  if (error) throw error;

  x.domain(d3.extent(data, function(d) { return d.frequency; }));
  y.domain(d3.extent(data, function(d) { return d.output; }));

  g.append("g")
      .attr("transform", "translate(0," + height + ")")
      .call(d3.axisBottom(x))
      .append("text")
        .attr("fill", "#000")
        .attr("y", 10)
        .attr("dx", "0.71em")
        .attr("text-anchor", "end")
        .text("Frequency");


  g.append("g")
      .call(d3.axisLeft(y))
    .append("text")
      .attr("fill", "#000")
      .attr("transform", "rotate(-90)")
      .attr("y", 9)
      .attr("dy", "0.71em")
      .attr("text-anchor", "end")
      .text("Mixer");

  g.append("path")
      .datum(data)
      .attr("fill", "none")
      .attr("stroke", "aquamarine")
      .attr("stroke-linejoin", "round")
      .attr("stroke-linecap", "round")
      .attr("stroke-width", 4)
      .attr("d", line);

      // add the X gridlines
  svg2.append("g")
      .attr("class", "grid")
      .attr("transform", "translate(0," + height + ")")
      .call(make_x_gridlines()
          .tickSize(-height)
          .tickFormat("")
      )  

      // add the Y gridlines
 svg2.append("g")
     .attr("class", "grid")
     .call(make_y_gridlines()
         .tickSize(-width)
         .tickFormat("")
     )


});

// set the dimensions and margins of the graph
var svg3 = d3.select("svg"),
    margin = {top: 0, right: 0, bottom: 90, left: 50},
    width = 950 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom,
    g = svg2.append("g").attr("transform", "translate(" + margin.left +  "," + margin.top + ")");


var x = d3.scaleLinear()
    .rangeRound([0, width]);

var y = d3.scaleLinear()
    .rangeRound([height, 0]);

    // gridlines in x axis function
    function make_x_gridlines() {
        return d3.axisBottom(x)
            .ticks(5)
    }

    // gridlines in y axis function
function make_y_gridlines() {
    return d3.axisLeft(y)
        .ticks(5)
}

var line = d3.line()
    .x(function(d) { return x(d.frequency); })
    .y(function(d) { return y(d.output); });




d3.csv("m1.csv", function(d) {
  d.frequency = +d.frequency;
 d.output = +d.output;
  return d;
}, function(error, data) {
  if (error) throw error;

  x.domain(d3.extent(data, function(d) { return d.frequency; }));
  y.domain(d3.extent(data, function(d) { return d.output; }));

  g.append("g")
      .attr("transform", "translate(0," + height + ")")
      .call(d3.axisBottom(x))
      .append("text")
        .attr("fill", "#000")
        .attr("y", 10)
        .attr("dx", "0.71em")
        .attr("text-anchor", "end")
        .text("Frequency");


  g.append("g")
      .call(d3.axisLeft(y))
    .append("text")
      .attr("fill", "#000")
      .attr("transform", "rotate(-90)")
      .attr("y", 9)
      .attr("dy", "0.71em")
      .attr("text-anchor", "end")
      .text("Mixer");

  g.append("path")
      .datum(data)
      .attr("fill", "none")
      .attr("stroke", "aquamarine")
      .attr("stroke-linejoin", "round")
      .attr("stroke-linecap", "round")
      .attr("stroke-width", 4)
      .attr("d", line);

      // add the X gridlines
  svg3.append("g")
      .attr("class", "grid")
      .attr("transform", "translate(0," + height + ")")
      .call(make_x_gridlines()
          .tickSize(-height)
          .tickFormat("")
      )

      // add the Y gridlines
 svg3.append("g")
     .attr("class", "grid")
     .call(make_y_gridlines()
         .tickSize(-width)
         .tickFormat("")
     )


});

</script>

我发现必须使用不同的变量名称来保存svgs,例如svg1、svg2..等..但是一个图表放在另一个图表上。如何解决这个问题? here is the chart on the other!

最佳答案

只是改变这个...

var svg = d3.select("svg")

...为此...

var svg2 = d3.select("svg")

...不会有任何区别:变量名称不同,但选择是相同的:它们都选择相同 SVG。

由于您不是附加 SVG,而是选择现有的 SVG,因此设置两个 SVG,每个 SVG 都有一个唯一的 ID...

<svg id="svg1" width="1000" height="500"></svg>
<svg id="svg2" width="1000" height="500"></svg>

...并相应地选择它们:

var svg1 = d3.select("#svg1")
var svg2 = d3.select("#svg2")

PS:我只是解决选择问题。为了避免重复代码(因为你说代码是相同的),请将整个代码包装在一个带有两个参数的函数中:所选 SVG 的 ID 和 CSV 文件的路径。然后,您只需使用不同的参数调用该函数两次。

关于javascript - 一页上多个简单图表 d3.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45351412/

相关文章:

java - JSP 的 Catch block 中的警报消息

JavaScript 名称与 ID

javascript - 使用 "Tab"单击执行 "Enter"键的操作,在 Bootstrap 行内

java - BufferedWriter 性能缓慢

javascript - d3 - 嵌套选择/子项更新问题

javascript - 如何使用javascript获取单选按钮的值

mysql - Ruby 创建临时文件来保存 CSV 行并将其分配给数据库

csv - Spark 2.0 Scala - 读取带有转义分隔符的 csv 文件

javascript - D3JS 测试 - enter() 未被触发

javascript - Microsoft Edge 不会在对 gzipped SVG 文件的 ajax 调用中呈现 SVG 样式元素