Mermaid 雷达图 #

雷达图(Radar Chart)也称为蜘蛛图,用于展示多维度数据的比较,适用于性能评估、能力分析、产品对比等场景。

基本概念 #

雷达图由以下几个部分组成:

  • 中心:图表的中心点
  • :从中心向外辐射的轴,每条轴代表一个维度
  • 数据系列:不同颜色的多边形,代表不同的数据系列
  • 网格线:同心圆,用于表示数值刻度

实现方式 #

Mermaid目前没有专门的雷达图语法,但可以使用流程图(Flowchart)来模拟实现简单的雷达图效果:

1. 简单雷达图 #

mermaid
graph LR
  subgraph 雷达图
    direction TB
    
    %% 中心点
    center((中心))
    
    %% 轴
    axis1((维度1)) -.- center
    axis2((维度2)) -.- center
    axis3((维度3)) -.- center
    axis4((维度4)) -.- center
    axis5((维度5)) -.- center
    
    %% 数据点
    p1((•)) -.- center
    p2((•)) -.- center
    p3((•)) -.- center
    p4((•)) -.- center
    p5((•)) -.- center
    
    %% 连接线
    p1 <--> p2 <--> p3 <--> p4 <--> p5 <--> p1
  end

2. 多系列雷达图 #

mermaid
graph LR
  subgraph 多系列雷达图
    direction TB
    
    %% 中心点
    center((中心))
    
    %% 轴
    axis1((维度1)) -.- center
    axis2((维度2)) -.- center
    axis3((维度3)) -.- center
    axis4((维度4)) -.- center
    
    %% 数据系列1
    p11((•)) -.- center
    p12((•)) -.- center
    p13((•)) -.- center
    p14((•)) -.- center
    p11 <--> p12 <--> p13 <--> p14 <--> p11
    
    %% 数据系列2
    p21((•)) -.- center
    p22((•)) -.- center
    p23((•)) -.- center
    p24((•)) -.- center
    p21 <--> p22 <--> p23 <--> p24 <--> p21
  end

数据可视化示例 #

1. 产品性能比较 #

mermaid
graph LR
  subgraph 产品性能比较
    direction TB
    
    %% 中心点
    center((中心))
    
    %% 性能维度
    performance((性能)) -.- center
    usability((易用性)) -.- center
    features((功能)) -.- center
    price((价格)) -.- center
    reliability((可靠性)) -.- center
    
    %% 产品A数据
    a1((•)) -.- center
    a2((•)) -.- center
    a3((•)) -.- center
    a4((•)) -.- center
    a5((•)) -.- center
    a1 <--> a2 <--> a3 <--> a4 <--> a5 <--> a1
    
    %% 产品B数据
    b1((•)) -.- center
    b2((•)) -.- center
    b3((•)) -.- center
    b4((•)) -.- center
    b5((•)) -.- center
    b1 <--> b2 <--> b3 <--> b4 <--> b5 <--> b1
  end

2. 团队能力评估 #

mermaid
graph LR
  subgraph 团队能力评估
    direction TB
    
    %% 中心点
    center((中心))
    
    %% 能力维度
    technical((技术能力)) -.- center
    communication((沟通能力)) -.- center
    teamwork((团队协作)) -.- center
    problem_solving((解决问题)) -.- center
    creativity((创造力)) -.- center
    
    %% 团队1数据
    t11((•)) -.- center
    t12((•)) -.- center
    t13((•)) -.- center
    t14((•)) -.- center
    t15((•)) -.- center
    t11 <--> t12 <--> t13 <--> t14 <--> t15 <--> t11
    
    %% 团队2数据
    t21((•)) -.- center
    t22((•)) -.- center
    t23((•)) -.- center
    t24((•)) -.- center
    t25((•)) -.- center
    t21 <--> t22 <--> t23 <--> t24 <--> t25 <--> t21
  end

替代方案 #

由于Mermaid目前不支持原生雷达图,以下是一些替代方案:

1. 使用其他图表库 #

Chart.js #

html
<!DOCTYPE html>
<html>
<head>
    <title>Radar Chart with Chart.js</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <canvas id="myRadarChart" width="400" height="400"></canvas>
    <script>
        const ctx = document.getElementById('myRadarChart').getContext('2d');
        const myRadarChart = new Chart(ctx, {
            type: 'radar',
            data: {
                labels: ['性能', '易用性', '功能', '价格', '可靠性'],
                datasets: [{
                    label: '产品A',
                    data: [85, 90, 75, 65, 95],
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    borderColor: 'rgba(75, 192, 192, 1)',
                    pointBackgroundColor: 'rgba(75, 192, 192, 1)'
                }, {
                    label: '产品B',
                    data: [70, 75, 90, 85, 70],
                    backgroundColor: 'rgba(255, 99, 132, 0.2)',
                    borderColor: 'rgba(255, 99, 132, 1)',
                    pointBackgroundColor: 'rgba(255, 99, 132, 1)'
                }]
            },
            options: {
                scales: {
                    r: {
                        beginAtZero: true,
                        max: 100
                    }
                }
            }
        });
    </script>
</body>
</html>

D3.js #

html
<!DOCTYPE html>
<html>
<head>
    <title>Radar Chart with D3.js</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
    <style>
        .axis line, .axis path {
            fill: none;
            stroke: #000;
        }
        .axis text {
            font-size: 12px;
        }
        .radar-line {
            fill: none;
            stroke: #69b3a2;
            stroke-width: 2px;
        }
        .radar-area {
            fill: #69b3a2;
            fill-opacity: 0.3;
        }
    </style>
</head>
<body>
    <svg width="400" height="400"></svg>
    <script>
        const svg = d3.select("svg"),
              width = +svg.attr("width"),
              height = +svg.attr("height"),
              radius = Math.min(width, height) / 2 - 40,
              g = svg.append("g").attr("transform", `translate(${width / 2},${height / 2})`);

        // 数据
        const data = [
            {axis: "性能", value: 85},
            {axis: "易用性", value: 90},
            {axis: "功能", value: 75},
            {axis: "价格", value: 65},
            {axis: "可靠性", value: 95}
        ];

        // 角度比例尺
        const angle = d3.scalePoint()
            .domain(data.map(d => d.axis))
            .range([0, 2 * Math.PI]);

        // 半径比例尺
        const radiusScale = d3.scaleLinear()
            .domain([0, 100])
            .range([0, radius]);

        // 绘制网格线
        for (let i = 20; i <= 100; i += 20) {
            g.append("circle")
                .attr("r", radiusScale(i))
                .attr("fill", "none")
                .attr("stroke", "#ccc")
                .attr("stroke-width", 0.5);
        }

        // 绘制轴
        const axis = g.append("g")
            .selectAll("g")
            .data(data)
            .join("g")
            .attr("transform", d => `rotate(${(angle(d.axis) * 180 / Math.PI - 90)}) translate(${radius})`);

        axis.append("line")
            .attr("x1", -radius)
            .attr("x2", 0)
            .attr("fill", "none")
            .attr("stroke", "#000")
            .attr("stroke-width", 0.5);

        axis.append("text")
            .attr("transform", d => angle(d.axis) > Math.PI ? `translate(-10,0) rotate(180)` : `translate(10,0)`)
            .style("text-anchor", d => angle(d.axis) > Math.PI ? "end" : "start")
            .text(d => d.axis);

        // 绘制数据系列
        const line = d3.lineRadial()
            .curve(d3.curveLinearClosed)
            .angle(d => angle(d.axis))
            .radius(d => radiusScale(d.value));

        g.append("path")
            .datum(data)
            .attr("fill", "#69b3a2")
            .attr("fill-opacity", 0.3)
            .attr("d", line);

        g.append("path")
            .datum(data)
            .attr("fill", "none")
            .attr("stroke", "#69b3a2")
            .attr("stroke-width", 2)
            .attr("d", line);

        // 绘制数据点
        g.selectAll(".point")
            .data(data)
            .join("circle")
            .attr("class", "point")
            .attr("transform", d => `rotate(${(angle(d.axis) * 180 / Math.PI - 90)}) translate(${radiusScale(d.value)})`)
            .attr("r", 4)
            .attr("fill", "#69b3a2")
            .attr("stroke", "#000")
            .attr("stroke-width", 1);
    </script>
</body>
</html>

2. 使用Markdown扩展 #

一些Markdown编辑器支持通过扩展语法创建雷达图:

Mermaid未来计划 #

Mermaid团队正在考虑添加对雷达图的支持,未来可能会有类似以下的语法:

mermaid
radar
  title: 产品性能比较
  labels: [性能, 易用性, 功能, 价格, 可靠性]
  datasets:
    - name: 产品A
      data: [85, 90, 75, 65, 95]
    - name: 产品B
      data: [70, 75, 90, 85, 70]

最佳实践 #

  1. 维度数量适中:维度数量最好在3-8个之间,过多会导致图表难以阅读
  2. 统一的刻度:所有维度使用相同的数值范围
  3. 清晰的标签:为每个维度添加清晰的标签
  4. 适当的颜色区分:使用不同颜色区分不同的数据系列
  5. 避免重叠:如果数据系列过多,考虑使用多个雷达图

应用场景 #

  1. 性能评估:评估产品、团队或个人的多维度性能
  2. 能力分析:分析个人或团队的技能和能力
  3. 产品对比:比较不同产品的多维度特性
  4. 市场调研:分析不同品牌的市场表现
  5. 风险评估:评估项目或投资的多维度风险

总结 #

虽然Mermaid目前不支持原生的雷达图,但可以使用流程图模拟简单的效果,或者使用其他专门的数据可视化库(如Chart.js、D3.js)创建更专业的雷达图。随着Mermaid的不断发展,未来可能会添加对雷达图的原生支持。

最后更新:2026-02-08