我是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])
答案 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>