首页 > 解决方案 > 如何使用 d3 和 reactjs 在饼图中显示标签

问题描述

我是 reactjs 和 d3js 的新手,并试图在 reactjs 网站中使用 d3 创建饼图。我想创建一个饼图,将饼图中的标签显示为工具提示,以及一个指向切片的箭头及其对应的标签,就像这个例子一样。

我创建了一个代码框来进一步演示我现在卡在哪里。如您所见,切片中显示了值,但我也想要标签,就像上面的示例一样。如果有人可以帮我解决这个问题,我将不胜感激。

这是我到目前为止创建的代码。

import React, { useEffect, useRef } from "react";
import * as d3 from "d3";

const Pie = props => {
  const ref = useRef(null);
  const createPie = d3
    .pie()
    .value(d => d.value)
    .sort(null);
  const createArc = d3
    .arc()
    .innerRadius(props.innerRadius)
    .outerRadius(props.outerRadius);
  const colors = d3.scaleOrdinal(d3.schemeCategory10);
  const format = d3.format(".2f");

  useEffect(() => {
    const data = createPie(props.data);
    const group = d3.select(ref.current);
    const groupWithData = group.selectAll("g.arc").data(data);

    groupWithData.exit().remove();

    const groupWithUpdate = groupWithData
      .enter()
      .append("g")
      .attr("class", "arc");

    const path = groupWithUpdate
      .append("path")
      .merge(groupWithData.select("path.arc"));

    path
      .attr("class", "arc")
      .attr("d", createArc)
      .attr("fill", (d, i) => colors(i));

    const text = groupWithUpdate
      .append("text")
      .merge(groupWithData.select("text"));

    text
      .attr("text-anchor", "middle")
      .attr("alignment-baseline", "middle")
      .attr("transform", d => `translate(${createArc.centroid(d)})`)
      .style("fill", "white")
      .style("font-size", 10)
      .text(d => format(d.value));
  }, [props.data]);

  return (
    <svg width={props.width} height={props.height}>
      <g
        ref={ref}
        transform={`translate(${props.outerRadius} ${props.outerRadius})`}
      />
    </svg>
  );
};

export default Pie;

标签: reactjsd3.js

解决方案


推荐阅读