javascript - D3 条形图镜像

标签 javascript html css d3.js

<分区>

https://jsfiddle.net/cg3xL4da/49/

我将如何旋转/平移 D3 图形条使其看起来像下图,除了数字仍然一直正确对齐。我试过切换范围数组参数,但它只是翻转了条形图的位置。

enter image description here

<svg class="chart"></svg>
<script src="//d3js.org/d3.v3.min.js"></script>

<script>
var data = [4, 8, 15, 16, 23, 42];

var width = 420,
barHeight = 20;

var x = d3.scale.linear()
.domain([0, d3.max(data)])
.range([0, width]);

var chart = d3.select(".chart")
.attr("width", width)
.attr("height", barHeight * data.length);

var bar = chart.selectAll("g")
.data(data)
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });

bar.append("rect")
.attr("width", x)
.attr("height", barHeight - 1);

bar.append("text")
.attr("x", function(d) { return x(d) - 3; })
.attr("y", barHeight / 2)
.attr("dy", ".35em")
.text(function(d) { return d; });
</script>

<style>
.chart rect {
  fill: green;
}

.chart text {
  fill: white;
  font: 10px sans-serif;
  text-anchor: end;
}
</style>

最佳答案

D3 秤

您的问题的答案只是正确理解什么是 D3 音阶以及如何使用它们。当您说 “我已经尝试切换范围数组参数” 时,您走在了正确的道路上。

D3 尺度基本上是一种将域(输入)映射到图像或范围(输出)的数学方法,正如我解释的那样 in this answer .此图片来自 Jerome Cukier blog甚至更具说教性:

enter image description here

如您所见,比例尺将域中的 20 映射到范围中的 0,将域中的 80 映射到 120 在范围内。

反向范围

考虑到这一点,您的问题的答案就很简单了。如果您现在查看您的体重秤...

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);

您会看到数据中的零(即定义域)映射到 SVG 空间中的零,数据中的最大值映射到 SVG 中的 width。所以,你只需要反转范围:

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([width, 0]);

现在,数据中的零映射到 SVG 中的最右侧,数据中的最大值映射到零,即 SVG 中的最左侧。之后,您必须调整矩形的 xwidth 属性。

下面是修改后的代码:

<svg class="chart"></svg>
<script src="//d3js.org/d3.v3.min.js"></script>

<script>
  var data = [4, 8, 15, 16, 23, 42];

  var width = 420,
    barHeight = 20;

  var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([width, 0]);

  var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);

  var bar = chart.selectAll("g")
    .data(data)
    .enter().append("g")
    .attr("transform", function(d, i) {
      return "translate(0," + i * barHeight + ")";
    });

  bar.append("rect")
    .attr("x", x)
    .attr("width", function(d) {
      return width - x(d)
    })
    .attr("height", barHeight - 1);

  bar.append("text")
    .attr("x", width - 2)
    .attr("y", barHeight / 2)
    .attr("dy", ".35em")
    .text(function(d) {
      return d;
    });

</script>

<style>
  .chart rect {
    fill: green;
  }

  .chart text {
    fill: white;
    font: 10px sans-serif;
    text-anchor: end;
  }

</style>

关于javascript - D3 条形图镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51109948/

上一篇:html - 为什么表格的内部元素的宽度不固定,即使它给定了一个固定的数字?

下一篇:html - Flexbox - 显示 : flex - My contents appear in one line

相关文章:

javascript - setInterval() 的工作速度比预期慢

css - IE9 奇怪地呈现 Bootstrap 布局,我不知道为什么

html - Div 表响应 - 标题重复

css - flexbox 中元素之间的行分隔符

jquery - 如何为创建的div动态生成rgb颜色

php - 动态创建div时如何显示/隐藏div

JavaScript 无法在 IE8 中运行,不知道为什么

php - 防止在拖动时显示图像

javascript - 选择框全屏 jquery bootstrap

javascript - 禁用 "remove on backspace"(或完全删除 ibeam)