D3.js图表开发求助:Y轴网格线、刻度对齐等4项需求
解决D3图表的四个布局问题
嘿,别为零基础和冗长的提问抱歉!咱们逐个搞定你的四个需求:
1. 绘制Y轴竖线(兼容Growth Target文本不被覆盖)
你提到的方案2其实可以调整网格线范围,既能保留Y轴基线,又不会覆盖右侧的文本。修改draw_yAxis_gridlines函数的tickSize参数,把网格线长度限制在图表主体区域:
// gridlines in y axis function function draw_yAxis_gridlines() { return d3.axisLeft(y) .tickValues(yTicks) .tickSize(-(width - growth_target_width_adjusted)) // 网格线只延伸到图表主体,不碰文本区 .tickFormat(""); // 隐藏默认刻度文本,因为你已经自定义了hgrid-label } // 去掉注释启用这段代码 svg.append("g") .attr("class", "grid axis yAxis") .call(draw_yAxis_gridlines());
如果坚持用方案1,直接在自定义网格线代码后添加一条Y轴竖线即可:
// ******************* Custom Y axis grid lines Ends >> // 添加Y轴竖线 svg.append("line") .attr("class", "y-axis-line") .attr("x1", 0) .attr("x2", 0) .attr("y1", 0) .attr("y2", height) .style("stroke", "#e0e0e0") // 和Y轴网格线同色 .style("stroke-width", 1);
2. Y轴刻度居中对齐
修改自定义Y轴刻度文本的text-anchor属性为middle,并调整X坐标到合适位置,让文本在Y轴左侧居中:
yGrid.append("text") .text(function(d){return d; }) .attr("class", "hgrid-label") .attr("x", -25) // 调整到Y轴左侧的居中位置 .attr("y", "0.3em") .style("text-anchor", "middle"); // 关键:设置居中对齐
3. X轴基线颜色匹配Y轴网格线
找到X轴的.axis元素,修改其路径和线条的颜色为浅灰色(和Y轴网格线一致):
// add the x Axis var xAxis = svg.append("g") .attr("class", "axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); // 修改X轴基线颜色 xAxis.selectAll("path, line") .style("stroke", "#e0e0e0"); // 和Y轴网格线同色
4. "Growth Target (7)"标签居中对齐
给两个文本元素添加text-anchor: middle,并调整X坐标到文本区域的中心位置:
// Text element 1 target.append("text") .text(function(d){return "Growth " }) .attr("class", "tglebal") .attr("x", (width - growth_target_width_adjusted) + 30) // 文本区域的中心位置 .attr("y", "-0.3em") .style("text-anchor", "middle"); // 居中对齐 // Text element 2 target.append("text") .text(function(d){return "Target (" + d + ")" }) .attr("class", "tglebal") .attr("x", (width - growth_target_width_adjusted) + 30) .attr("y", "1em") .style("text-anchor", "middle"); // 居中对齐
如果想要更精准的居中,可以通过获取文本实际宽度动态计算X坐标,但上面的固定值已经能满足基本需求。
内容的提问来源于stack exchange,提问作者Subrata Sarkar
相关产品推荐
相关产品推荐

