Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将d3图表的y轴设置为适合最宽的标签?_Javascript_D3.js_Label_Linechart - Fatal编程技术网

Javascript 将d3图表的y轴设置为适合最宽的标签?

Javascript 将d3图表的y轴设置为适合最宽的标签?,javascript,d3.js,label,linechart,Javascript,D3.js,Label,Linechart,我正在用d3绘制折线图,一切正常。但是,我必须在图表区域的左侧留出足够的边距,以适合我认为最宽的y轴文本标签。我想根据最宽的标签调整每个图表的空间 起初,我认为我可以找到最大y值,创建一个隐藏文本对象,计算出它的宽度,并在创建图表时将该值用于左边距。有点恶心,但这让我觉得很有价值 但是,如果最大y值为“1598.538”,则最顶部的y轴标签可能为“1500”。。。也就是说,要窄得多 所以我想我想找到最上面标签的宽度。但是如果不画图表和轴,测量宽度,然后再画一次,我想不出怎么做。听起来很恶心!有没

我正在用d3绘制折线图,一切正常。但是,我必须在图表区域的左侧留出足够的边距,以适合我认为最宽的y轴文本标签。我想根据最宽的标签调整每个图表的空间

起初,我认为我可以找到最大y值,创建一个隐藏文本对象,计算出它的宽度,并在创建图表时将该值用于左边距。有点恶心,但这让我觉得很有价值

但是,如果最大y值为“1598.538”,则最顶部的y轴标签可能为“1500”。。。也就是说,要窄得多

所以我想我想找到最上面标签的宽度。但是如果不画图表和轴,测量宽度,然后再画一次,我想不出怎么做。听起来很恶心!有没有一种不让人讨厌的方法

更新

下面是我的代码的一部分,使用Lars的建议,只是为了说明它的适用性:

//我确实有
//`.attr(“transform”、“translate”(+margin.left+)、“+margin.top”))`
//在这一行的末尾,但我现在把它移到了底部。
var g=svg。选择(“g”);
//添加行路径。
g、 选择全部(“.line”)。数据(数据)
.输入()
.append(“路径”)
.attr(“d”,行);
//更新以前创建的轴。
g、 选择(“x轴”)
.attr(“转换”、“平移(0,+yScale.range()[0]+”))
.呼叫(xAxis);
g、 选择(“y轴”)
.呼叫(yAxis);
//Lars关于确定y轴标签最大宽度的建议:
var-maxw=0;
d3.选择(此)。选择('.y轴')。选择全部('text')。每个(函数(){
如果(this.getBBox().width>maxw)maxw=this.getBBox().width;
});
//现在更新图表的内部尺寸。
g、 attr(“transform”、“translate”(+(maxw+margin.left)+)、“+margin.top+”);

您可以将所有内容放入
g
元素中,并根据最大宽度设置
变换。类似于

var maxw = 0;
yAxisContainer.selectAll("text").each(function() {
    if(this.getBBox().width > maxw) maxw = this.getBBox().width;
});
graphContainer.attr("transform", "translate(" + maxw + ",0)");

太好了,再次谢谢你,拉尔斯!我将用更多的代码示例来更新我的问题,以显示我将您的建议与图表绘制代码的其他部分相关联的位置。。。虽然它为左轴留下了完美的空间,但它是通过将图表区域向右移动来实现的,这会剪裁图表和x轴的右边缘。我不知道如何解决这个问题-它不是来自x轴的刻度范围吗?应该提前设置?您也可以先绘制y轴,然后测量,然后相应地设置x轴范围,然后绘制图形的其余部分。y轴的元素已经存在可能会干扰用于绘制图形其余部分的选择器(
.selectAll('path')
.selectAll('text')
),但请小心。谢谢。我还想画一个x轴的宽度,允许第一个和最后一个标签贴在它的左边和右边。但是我需要先画x轴,然后才能得到标签的宽度,我需要设置x轴的范围。。。这一切都有点鸡毛蒜皮的:)听起来你想要做什么,你真的必须先画,测量和重画。