使用带刻度的相同可重复字符串值

时间:2019-03-29 08:55:23

标签: javascript d3.js

我是D3的新手,想绘制带有6条水平线的图表。我的xAxis是scaleLinear及其值。所以我希望yAxis只是每个条形名称的列表。因此对于yScale,我有6个名称-['Games','Apps','Games','Apps','Games','Apps']

所以当我使用这个yScale时:

var params = ['Games', 'Apps', 'Games', 'Apps', 'Games', 'Apps'];
var yScale = d3.scaleBand()
 .domain(params)
 .range([0, 300])

我在yAxis上仅看到一个“游戏”和一个“应用” enter image description here 如何列出yAxis上的所有参数而不跳过可重复的内容?

1 个答案:

答案 0 :(得分:2)

您在这里看到的是任何序数刻度的默认(和预期)行为:值必须是唯一

如果您查看API,将会看到:

  

域值内部存储在从字符串化值到索引的映射中;然后,将所得的索引用于确定频段。因此,频段标度的值必须可对字符串强制,并且域值的字符串化版本唯一标识相应的频段。 (强调我的)

因此,任何解决方案在这里都是不可靠的。话虽如此,一个简单的解决方案是在数组的每个元素中添加无意义的 unique 值...

const params = ['Games', 'Apps', 'Games', 'Apps', 'Games', 'Apps'].map(function(d, i) {
  return d + "-" + i;
});

...并使用tickFormat在轴上将其删除:

const yAxis = d3.axisLeft(yScale)
    .tickFormat(function(d) {
        return d.split("-")[0];
    });

这是一个演示:

const svg = d3.select("svg");
const params = ['Games', 'Apps', 'Games', 'Apps', 'Games', 'Apps'].map(function(d,i) {
  return d + "-" + i;
});
const yScale = d3.scaleBand()
  .domain(params)
  .range([2, 148]);
const yAxis = d3.axisLeft(yScale)
  .tickFormat(function(d) {
    return d.split("-")[0];
  });
yAxis(svg.append("g").attr("transform", "translate(100,0)"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg></svg>