D3 直方图

双曲线

我正在尝试通过函数使用 D3 创建一个简单的直方图。图表的 y 值作为数组传递给函数,然后函数创建 svg 和条形图。我的轴正确,但是横杆被切断。

似乎我的矩形 x 值太大而无法放入 svg。我想不出任何解决方案,希望能提供任何帮助。

杰拉尔多·费塔朵

您图表中的问题是您对 x 轴使用线性刻度,域从 0 到 1,然后将其用于 x 位置:

.attr("x", function(d, i) { return x(i) - 0.5; })

线性刻度用于直方图,但不用于条形图,我不清楚您实际上是在绘制直方图。话虽如此,无需对您的代码进行重大更改(这不是我的职责,我只是在回答一个特定问题),您可以将x属性更改为:

.attr("x", function(d, i) {
    return x(i/dataset.length);
})

这是演示:

<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
  .title {
    padding-top: 10px;
    font-family: "Oswald", sans-serif;
  }
  
  .subtitle {
    font-family: "Open Sans", sans-serif;
    margin-top: 10px;
  }
  
  .bar:hover {
    fill: blue;
  }

</style>

<body>
  <div class="container">
    <h1 class="display-4 text-center title">HW #4</h1>
    <hr>
    <div class="row justify-content-md-center">
      <div class="col-12 col-md-auto">
        <button type="button" class="btn btn-primary">Bar chart</button>
        <br>
        <br>
        <br>
        <div id="normal"></div>
      </div>
    </div>
  </div>
  <script>
    function plotHistogram(element, dataset) {

      var margin = {
          top: 20,
          right: 20,
          bottom: 100,
          left: 40
        },
        width = 900 - margin.left - margin.right,
        height = 600 - margin.top - margin.bottom;

      // set the ranges
      var x = d3.scaleLinear()
        .domain([0, 1])
        .range([0, width]);

      var y = d3.scaleLinear()
        .domain([0, d3.max(dataset, function(d) {
          return d;
        })])
        .range([height, 0]);

      var svg = d3.select(element).append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform",
          "translate(" + margin.left + "," + margin.top + ")");

      // append the rectangles for the bar chart
      svg.selectAll(".bar")
        .data(dataset)
        .enter().append("rect")
        .attr("class", "bar")
        .attr("x", function(d, i) {
          return x(i/dataset.length);
        })
        .attr("width", x(1/dataset.length)-2)
        .attr("y", function(d) {
          return y(d);
        })
        .attr("height", function(d) {
          return height - y(d);
        })
        .attr("fill", "teal").attr("opacity", 0.5);

      // add the x Axis
      svg.append("g")
        .attr("transform", "translate(0," + height + ")")
        .call(d3.axisBottom(x))
        .selectAll("text")
        .style("text-anchor", "end")
        .attr("dx", "-.8em")
        .attr("dy", "-.55em")
        .attr("transform", "rotate(-90)");

      // add the y Axis
      svg.append("g")
        .call(d3.axisLeft(y));


    }

    // Change the array here
    plotHistogram("#normal", [10, 20, 50, 30, 15]);

  </script>
</body>

但是,我必须说,对于任何 D3 程序员来说,这都是一段奇怪的代码。我建议你首先决定你是要绘制条形图还是直方图(它们有根本的不同)。然后,在做出这个决定之后,使用适当的方法和尺度。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

D3动画直方图

来自分类Dev

D3直方图,从时间戳记起出现的日期数

来自分类Dev

屏幕尺寸上的响应D3直方图

来自分类Dev

网格线未在D3直方图中显示

来自分类Dev

Javascript D3 直方图:产生错误数量的 bin 的阈值

来自分类Dev

d3JS直方图直方图

来自分类Dev

gnuplot直方图3d

来自分类Dev

gnuplot直方图3d

来自分类Dev

缩放d3的直方图x域会导致“ <rect>属性的无效负值”错误

来自分类Dev

D3:在bin中合并两个数据集-直方图布局

来自分类Dev

即使使用了preserveAspectRatio,D3直方图也没有响应

来自分类Dev

d3正负条形图(直方图有所不同)

来自分类Dev

缩放d3的直方图x域会导致“ <rect>属性的负值无效”错误

来自分类Dev

d3 v4:将堆栈与直方图数据一起使用?

来自分类Dev

3D直方图和条件着色

来自分类Dev

3d 网格的遮罩和直方图

来自分类Dev

我可以在3d中绘制几个直方图吗?

来自分类Dev

动态更改d3.js直方图的bin和高度

来自分类Dev

如何在R中制作3D直方图

来自分类Dev

3D直方图和轮廓图Python

来自分类Dev

d3.js画笔填充颜色直方图

来自分类Dev

D3.js直方图bin大小增量

来自分类Dev

在一个3D中绘制多个直方图

来自分类Dev

MatLab:从采样数据创建3D直方图

来自分类Dev

D3.js直方图bin大小增量

来自分类Dev

D3.js尝试使用直方图布局绘制矩形

来自分类Dev

使用包 plot3D 时直方图被剪切

来自分类Dev

3个通道-联合颜色直方图

来自分类Dev

在python3中绘制(直方图)