代码之家  ›  专栏  ›  技术社区  ›  NelbeDG

在React-Chartjs-2框的甜甜圈图表中添加文本以进行反应

  •  1
  • NelbeDG  · 技术社区  · 6 年前

    我应该在哪里指示要显示的文本和坐标?在图表的选项中?

    class DoughnutChart extends React.Component {
    
      render() {
        const data = {
          datasets: [{
          data: [],
          backgroundColor: [
            '#999',
            '#eee'
          ]
        }],
         text: '45'
      };
        return (
           <Doughnut data={data} />
        );
      }
    };
    
    export default DoughnutChart;
    

    编辑

    我找到了这个插件,但是我找不到它是如何应用于react组件的

    //Plugin for center text
    Chart.pluginService.register({
      beforeDraw: function(chart) {
        var width = chart.chart.width,
        height = chart.chart.height,
        ctx = chart.chart.ctx;
        ctx.restore();
        var fontSize = (height / 160).toFixed(2);
        ctx.font = fontSize + "em sans-serif";
        ctx.textBaseline = "top";
        var text = "Foo-bar",
        textX = Math.round((width - ctx.measureText(text).width) / 2),
        textY = height / 2;
        ctx.fillText(text, textX, textY);
        ctx.save();
      }
    });
    

    2 回复  |  直到 6 年前
        1
  •  3
  •   jay    3 年前

    我试过这个,效果很好

    import { Doughnut } from "react-chartjs-2";
    
    function DoughnutChart() {
    
     const data = {...}
    
     const options = {...}
    
     const plugins = [{
         beforeDraw: function(chart) {
          var width = chart.width,
              height = chart.height,
              ctx = chart.ctx;
              ctx.restore();
              var fontSize = (height / 160).toFixed(2);
              ctx.font = fontSize + "em sans-serif";
              ctx.textBaseline = "top";
              var text = "Foo-bar",
              textX = Math.round((width - ctx.measureText(text).width) / 2),
              textY = height / 2;
              ctx.fillText(text, textX, textY);
              ctx.save();
         } 
       }]
    
    
    
      return (
       
            <Doughnut 
              type="doughnut" 
              data={data} 
              options{options} 
              plugins={plugins} 
             />
      );
    }
    
    export default DoughnutChart;
    
        2
  •  2
  •   Curious13    6 年前

    我不相信React Chart JS有这个选项。但是,有一些自定义插件允许您在甜甜圈图表中插入自定义数据标签。请参阅本文档,了解如何实现这一点。

    ChartJS Plugin Datalabels

        3
  •  2
  •   Dragomir Kolev    6 年前

    从我所看到的 react-chartjs-2 它仅具有以下属性:

    data: (PropTypes.object | PropTypes.func).isRequired,
    width: PropTypes.number,
    height: PropTypes.number,
    id: PropTypes.string,
    legend: PropTypes.object,
    options: PropTypes.object,
    redraw: PropTypes.bool,
    getDatasetAtEvent: PropTypes.func,
    getElementAtEvent: PropTypes.func,
    getElementsAtEvent: PropTypes.func
    onElementsClick: PropTypes.func, // alias for getElementsAtEvent (backward compatibility)
    

    另一种方法是将甜甜圈组件包装到一个div中,在该div中包含文本的另一个子级,如下所示:

        return( 
        <div className='wrapper'> 
            <div className='chart-number'>{this.state.text}</div>
            <Doughnut data={data} />
        </div>)
    

    如果您刚刚开始使用这个库,也许可以寻找一个适合您需要的不同的库,这样您就不必围绕它编写代码了!

    希望这有帮助:)

    编辑1:

    Chart.pluginService.register 以某种方式向图形对象编码,这是 <Doughnut />

        4
  •  1
  •   ramamoorthy_villi    5 年前

    以下是一个简单的解决方案:

    options: {
            centerText: {
                display: true,
                text: `90%`
            }
          .....
          .....
    

    步骤02: 创建一个新方法drawInnerText

    drawInnerText = (chart) => {
    
        var width = chart.chart.width,
            height = chart.chart.height,
            ctx = chart.chart.ctx;
    
        ctx.restore();
        var fontSize = (height / 114).toFixed(2);
        ctx.font = fontSize + "em sans-serif";
        ctx.textBaseline = "middle";
    
        var text = chart.config.options.centerText.text,
            textX = Math.round((width - ctx.measureText(text).width) / 2),
            textY = height / 2;
    
        ctx.fillText(text, textX, textY);
        ctx.save();
    }
    

    componentWillMount() {
            Chart.Chart.pluginService.register({
                beforeDraw: function (chart) {                    
                    if (chart.config.options.centerText.display !== null &&
                        typeof chart.config.options.centerText.display !== 'undefined' &&
                        chart.config.options.centerText.display) {
                        this.drawInnerText(chart);
                    }
                },
            });
        }
    
        5
  •  0
  •   vaibhav singh    3 年前
    function DoughnutChart({ data = {} }) {
     return (
       <Doughnut
         data={format(dataObj)}
         plugins={[
          {
            beforeDraw(chart) {
             const { width } = chart;
             const { height } = chart;
             const { ctx } = chart;
             ctx.restore();
             const fontSize = (height / 160).toFixed(2);
             ctx.font = `${fontSize}em sans-serif`;
             ctx.textBaseline = 'top';
             const { text } = "23";
             const textX = Math.round((width - ctx.measureText(text).width) / 2);
             const textY = height / 2;
             ctx.fillText(text, textX, textY);
             ctx.save();
           },
         },
       ]}
     />);
    

    }