D3.js 替换xaxis上的默认标签

D3.js 替换xaxis上的默认标签,d3.js,D3.js,我使用d3的创建者提供的演示创建了一个分组条形图(请参阅js fiddle)。沿着X轴,图表显示编号标签(0-19)。这些数字似乎用作默认值,因为数据样本(n)是一个长度为20的数组,并且没有其他显式代码将标签设置为等于该数字 问题:如何将这些标签设置为其他标签 代码 // create a range that is 20 var x0 = d3.scale.ordinal() .domain(d3.range(n)) //n = 20 [0,1,2,...19]

我使用d3的创建者提供的演示创建了一个分组条形图(请参阅js fiddle)。沿着X轴,图表显示编号标签(0-19)。这些数字似乎用作默认值,因为数据样本(n)是一个长度为20的数组,并且没有其他显式代码将标签设置为等于该数字

问题:如何将这些标签设置为其他标签

代码

// create a range that is 20 
    var x0 = d3.scale.ordinal()
        .domain(d3.range(n))  //n = 20 [0,1,2,...19]
        .rangeBands([0, width], .2);

    var x1 = d3.scale.ordinal()
        .domain(d3.range(m))  // m = 4 , not relevant for this question
        .rangeBands([0, x0.rangeBand()]);

    var z = d3.scale.category10();

    var xAxis = d3.svg.axis()
        .scale(x0) // xAxis is scaling the range of 20 along the bottom, there is no code setting the text of the label
        .orient("bottom");

一种方法是创建两个比例,一个用于定位,一个用于标签

 var x0 = d3.scale.ordinal()
        .domain(d3.range(n))  //n = 20 [0,1,2,...19]
        .rangeBands([0, width], .2);

 var alphabet = d3.scale.ordinal()
        .domain(d3.range(n))  //n = 20 ["a","b","c",..."t"]
        .rangeBands([0, width], .2);
然后,使用其中一个来创建xAxis,在本例中,它将放置默认标签“a”、“b”、“c”

附加
rect
时,使用另一个标尺进行定位

 .enter().append("rect")
    .attr("width", x1.rangeBand())
    .attr("height", y)
    .attr("x", function(d, i) { return x0(i); }) //will set position according to x0 scale
    .attr("y", function(d) { return height - y(d); });
必须注意两个刻度在数组中的长度和位置是否正确对齐,即如果
n
是一个20个数字的数组,那么另一个数组必须有一个20个字母的数组(如本例所示)

我认为有一个更好的(不太粗糙的)解决方案,但这个解决方案有效

与建议不同,您不需要两个刻度。您只需使用一个刻度即可完成所有操作:

var alphabet = "ABCDEFGHIJKLMNOPQRST".split("");

var x0 = d3.scale.ordinal()
    .domain(alphabet)
    .rangeBands([0, width], .2);
问题是:在原始代码中,因为域只是一个整数数组,所以Bostock依靠索引(
i
)来设置条的x位置

最好的替代方法是为每个数据点创建一个具有值(y位置)和字母(x位置)的数据数组。但是,一个简单的替代方法(对原始代码进行最小更改)是按索引获取字母,如下所示:

.attr("x", function(d,i) { return x0(alphabet[i]); })
以下是更新的演示:

var n=20;//样本数量
var m=4;
var data=d3.range(m).map(函数(){
返回d3.range(n).map(Math.random);
});
var保证金={
前20名,
右:30,,
底数:30,
左:40
},
宽度=960-margin.left-margin.right,
高度=500-margin.top-margin.bottom;
变量y=d3.scale.linear()
.domain([0,1])
.范围([高度,0]);
var alphabet=“ABCDEFGHIJKLMNOPQRST”。拆分(“”);
var x0=d3.scale.ordinal()
.域名(字母表)
.范围带([0,宽度],.2);
var x1=d3.scale.ordinal()
.域(d3.范围(m))
.rangeBand([0,x0.rangeBand()]);
var z=d3.scale.category10();
var xAxis=d3.svg.axis()
.比例(x0)
.东方(“底部”);
var yAxis=d3.svg.axis()
.比例(y)
.东方(“左”);
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度+边距。左侧+边距。右侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.append(“svg:g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
svg.append(“g”)
.attr(“类”、“y轴”)
.呼叫(yAxis);
svg.append(“g”)
.attr(“类”、“x轴”)
.attr(“变换”、“平移(0)”、“高度+”)
.呼叫(xAxis);
svg.append(“g”).selectAll(“g”)
.数据(数据)
.enter().append(“g”)
.样式(“填充”,功能(d,i){
返回z(i);
})
.attr(“转换”,函数(d,i){
返回“translate(“+x1(i)+”,0)”;
})
.selectAll(“rect”)
.数据(功能(d){
返回d;
})
.enter().append(“rect”)
.attr(“宽度”,x1.rangeBand())
.attr(“高度”,y)
.attr(“x”,函数(d,i){
返回x0(字母表[i]);
})
.attr(“y”,函数(d){
返回高度-y(d);
});
.axis文本{
字体:10px无衬线;
}
.轴线路径,
.轴线{
填充:无;
行程:#000;
形状渲染:边缘清晰;
}
.x轴路径{
显示:无;
}
.attr("x", function(d,i) { return x0(alphabet[i]); })