You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular8中使用D3.js生成面积图沿X轴对称的镜像图

实现D3.js面积图沿X轴对称镜像的方案

你之前的方案不生效有两个核心原因:

  • rotateX(180deg)属于CSS 3D变换属性,不能通过SVG的attr()方法直接设置,即使改为style()设置CSS属性,也会将X轴、刻度文字等所有元素一起翻转,不符合需求
  • 3D变换在不同浏览器对SVG的支持度不一致,还需要额外调整偏移量,维护成本高

推荐两种原生SVG支持的实现方案,代码改动量小,兼容性好:


方案1:新增镜像面积生成器(推荐)

不需要修改原有绘图逻辑,直接新增对称的面积路径即可:

// 原有绘图代码保持不变,新增以下内容
// 定义镜像面积生成器,沿现有X轴(y = this.height位置)对称
const mirrorArea = d3.area()
  .x((d: any) => x(d.x))
  .y0(this.height) // 基准线和原面积一致,保持X轴为对称轴
  .y1((d: any) => this.height + (this.height - y(d.y))); // 计算对称后的y坐标

// 绘制镜像面积,可自定义填充色、透明度实现叠加效果
this.svg.append("path")
  .datum(this.data)
  .style("fill", "rgba(66, 133, 244, 0.7)")
  .attr("d", mirrorArea);

如果需要将镜像和原有面积在同一区域上下叠加,只需要调整y0为0,y1为y(d.y)即可。


方案2:通过SVG变换实现镜像

如果不想修改面积生成逻辑,可以直接复用原有路径数据,通过SVG原生变换实现翻转:

// 原有面积绘制代码添加class标识
this.svg.append("path")
  .attr("class", "original-area")
  .datum(this.data)
  .style("fill", "#D04242")
  .attr("d", area);

// 复制路径做镜像变换
this.svg.append("path")
  .attr("class", "mirror-area")
  .datum(this.data)
  .style("fill", "rgba(208, 66, 66, 0.7)")
  .attr("d", area)
  // 核心变换:沿Y轴翻转后调整位移,保证X轴为对称中心
  .attr("transform", `scaleY(-1) translate(0, -${this.height})`);

如果需要调整镜像的位置,只需要修改translate的第二个参数即可。


内容的提问来源于stack exchange,提问作者Yaditya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:54:00