在数据可视化中,文本方向直接影响信息传达效果,D3.js 作为专业的 JavaScript 数据可视化库,通过灵活操作 SVG 元素可实现中文竖排文字的精准控制,以下为两种主流实现方案及深度解析:
通过 SVG 的旋转变换实现文本竖直排列,适合快速实现基础需求。
d3.select("svg") .append("text") .attr("x", 100) .attr("y", 50) .attr("transform", "rotate(-90,100,50)") // 以(x,y)为中心旋转-90度 .style("text-anchor", "start") // 对齐方式控制 .text("数据可视化分析");
技术细节:
text-anchor
需设置为start
以保持字符顺序一致性通过拆解字符逐行排列,实现真正从右至左的传统竖排效果。
const verticalText = d3.select("svg") .append("text") .attr("x", 200) .attr("y", 30) .style("writing-mode", "tb-rl") // 备选方案(部分浏览器支持) .style("glyph-orientation-vertical", "0deg"); "深度学习模型".split("").forEach((char, i) => { verticalText.append("tspan") .attr("x", 200) .attr("dy", i === 0 ? "0" : "1.2em") // 纵向间距控制 .text(char); });
核心参数解析:
dy
属性控制纵向位移量(推荐使用em单位保持比例)tspan
元素级联排列保持文字连贯性writing-mode
CSS属性可作为辅助方案(需考虑兼容性)function calcVerticalPos(baseX, baseY, lineHeight, index) { return [baseX, baseY + index * lineHeight]; }
window.addEventListener('resize', () => { d3.selectAll(".vertical-text") .attr("x", window.innerWidth * 0.8); });
.vertical-text { font-family: "SimSun", serif; /* 优先选用衬线字体 */ font-size: 1.1em; letter-spacing: 0.1em; /* 增加字间距提升可读性 */ }
根据2024年中国可视化协会报告显示:
问题现象 | 解决方案 | 实现原理 |
---|---|---|
文字镜像翻转 | 检查transform-origin 设置 | 确保旋转中心点与定位坐标一致 |
字符间距异常 | 调整dy 值为负值 | 通过dy="-1.2em" 实现反向排列 |
边缘裁切 | 添加viewBox 自适应 | 设置svg 的viewBox="0 0 width height" |