使用react-chartjs-2显示每个切片的饼图数据值

2023-12-19

我正在制作一个饼图,并且正在努力显示每个切片的饼图数据值。由于我的应用程序是用 React.js 编写的,因此我使用react-chartjs-2。

我找到了这个针对chart.js的解决方案并尝试实现,但它不适用于react-chartjs-2。

如何在chart.js中显示饼图每个切片的数据值 https://stackoverflow.com/questions/33363373/how-to-display-pie-chart-data-values-of-each-slice-in-chart-js

如何为每个切片增加价值?任何帮助表示赞赏。

这是饼图的当前视图。

根据建议,我实施了chart.piecelabel.js。它还不起作用..

My code

import {Pie} from 'react-chartjs-2';
import {pieceLabel} from 'chart.piecelabel.js';

export default class Categories extends React.Component{
constructor(props){
    super(props);
    this.state = {
        slideOpen : false,
        piData : piData
      }

this.handleClick = this.handleClick.bind(this);
this.update = this.update.bind(this);
this.doParentToggle = this.doParentToggle.bind(this);
}

doParentToggle(){


this.setState({
    piData : piData
  })
  console.log('-------')
  console.log('parentToggle' + piData )
  console.log('parentToggle' + piData2 )
  console.log('parentToggle' + piData3 )
  console.log('-------')
  this.update();
 }

handleClick(){
    this.setState({
        slideOpen : !this.state.slideOpen
    })
}

update() {
  var piData;
  this.setState({
    piData : piData
  })
  console.log('-------')
  console.log('parentToggle' + piData )
  console.log('parentToggle' + piData2 )
  console.log('parentToggle' + piData3 )
  console.log('-------')
  }    

render(){
 const CategoriesPanel = this.state.slideOpen? "slideOpen" : "";
 const { length } = this.props


  var totalData = piData + piData2 + piData3 + piData4 + piData5;

   let newpiData =  function() {
   return parseFloat((piData /  totalData ) * 100 ).toFixed(2) };

   let newpiData2 =  function() {
   return parseFloat((piData2 /  totalData ) * 100).toFixed(2) };

   let newpiData3 =  function() {
   return  parseFloat((piData3 /  totalData ) * 100).toFixed(2) };

   let newpiData4 =  function() {
   return parseFloat((piData4 /  totalData ) * 100).toFixed(2) };

   let newpiData5 =  function() {
   return parseFloat((piData5 /  totalData ) * 100).toFixed(2) };

  const data = {
  datasets: [{
    data: [ newpiData() , newpiData2(), newpiData3(), newpiData4(), newpiData5()],
    backgroundColor: [
    'orange',
    'blue',
    'red',
    'purple',
    'green'
    ],
    hoverBackgroundColor: [
    'orange',
    'blue',
    'red',
    'purple',
    'green'
    ],
    borderColor: [ 'orange',
    'blue',
    'red',
    'purple',
    'green'
    ]
  }],
  options : [{
    pieceLabel: { render: 'value' }
  }]};

   var pieOptions = {
   events: false,
   animation: {
   duration: 500,
   easing: "easeOutQuart",
   onComplete: function () {
   var ctx = this.chart.ctx;
   ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
   ctx.textAlign = 'center';
   ctx.textBaseline = 'bottom';

   this.data.datasets.forEach(function (dataset) {

    for (var i = 0; i < dataset.data.length; i++) {
      var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
          total = dataset._meta[Object.keys(dataset._meta)[0]].total,
          mid_radius = model.innerRadius + (model.outerRadius - model.innerRadius)/2,
          start_angle = model.startAngle,
          end_angle = model.endAngle,
          mid_angle = start_angle + (end_angle - start_angle)/2;

      var x = mid_radius * Math.cos(mid_angle);
      var y = mid_radius * Math.sin(mid_angle);

      ctx.fillStyle = '#fff';
      if (i == 3){ // Darker text color for lighter background
        ctx.fillStyle = '#444';
      }
      var percent = String(Math.round(dataset.data[i]/total*100)) + "%";
      ctx.fillText(dataset.data[i], model.x + x, model.y + y);
      // Display percent in another line, line break doesn't work for fillText
      ctx.fillText(percent, model.x + x, model.y + y + 15);
    }
   });               
   }
   }
 };
return(
<div>
<div id="chart" className={CategoriesPanel}>
<Pie style={{"fontSize" : "20px" }}data={data}/>
<div className="categoriesSlide" onClick={this.handleClick}>{this.state.slideOpen? <img src={Arrowup} alt="arrowup" className="arrowup" /> : <img src={Arrowdown} alt="arrowdown" className="arrowdown"/>}</div>
<button onClick={this.update} className="chartButton">Update Information</button></div>

 <div className="clear">
 <List parentToggle={this.doParentToggle} />
 <ListSecond parentToggle={this.doParentToggle} />
 <ListThird parentToggle={this.doParentToggle} />
 <ListFourth parentToggle={this.doParentToggle} />
 <ListFifth parentToggle={this.doParentToggle} />
 </div>
 </div>
    )
}
}

您可以使用这个 ChartJS 插件 -Chart.PieceLabel.js https://github.com/emn178/Chart.PieceLabel.js

first,通过 npm 安装它:

npm install chart.piecelabel.js --save

then,将其导入您的组件中:

import 'chart.piecelabel.js';

and finally,在图表选项中添加以下内容:

pieceLabel: {
   render: 'value'
}

note: this is the minimum option needed to be set to display the value and you can find more options here https://github.com/emn178/Chart.PieceLabel.js#usage.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用react-chartjs-2显示每个切片的饼图数据值 的相关文章

随机推荐

  • 在线协作环境(不仅面向开发)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 分析中的安全点和安全点轮询是什么?

    我面临的情况是看不到某些方法调用not被记录在VisualVM应用 想找出原因并遇到这个回答SO https stackoverflow com a 14025723 1527084 第三点提到了一个潜在的问题sampling方法 这是我看
  • MySQL 是否有相当于 PostgreSQL array_to_string 的工具

    我正在尝试找到与 PostgreSQL 函数等效的 MySQLarray and 数组到字符串并遇到了这个帖子 https stackoverflow com questions 4326868 equivalent to postgres
  • sed 中的贪婪

    I want ereg rat dog cat 成为 preg match rat dog cat 为了实现这一目标 我做了 echo ereg rat dog cat sed s ereg preg match 1 2 g 但是 这个正则
  • AWS Lambda S3 GET/POST - SignatureDoesNotMatch 错误

    我的 Lambda node js 函数已经启动并运行了大约 6 个月 没有出现任何问题 该函数只是获取一个对象并将其从一个存储桶复制到另一个存储桶 今天 我开始得到 SignatureDoesNotMatch 我们计算的请求签名不匹配 与
  • sed 仅删除第一个模式匹配

    我想匹配两个模式之间的一组数据并删除该数据和开始 结束模式 但仅限于模式的第一次出现 所以如果这是测试数据 PATTERNSTART LINE1 LINE2 LINE3 PATTERNEND PATTERNSTART LINE1 LINE2
  • Python:如何从加拿大的 shapefile 创建分区统计图?

    我的目标是创建一个等值线地图 https en wikipedia org wiki Choropleth map加拿大的Python 假设我有一本字典 其中的值涉及加拿大每个省 地区 myvalues Alberta 1 0 Britis
  • ios 10+、Swift 3+ - 无法从 Singleton 实例中消除 UIAlertController

    我创建了一个覆盖层 以便在对服务器运行异步数据抓取时运行 以便用户在数据抓取完成之前不会继续按 UI 中的按钮 我已将该函数放入全局单例类中 并在传递布尔值时调用它来表示是否要显示或隐藏 我可以让它显示 但我无法让它隐藏 这是代码 clas
  • Solr 使用 copyField 突出显示

    我有一个 solr 实例 在索引时我在文本正文上使用 copyField 将其通过两个不同的分析器 我想突出显示这两个字段 因此我将这两个字段设置为stored true 这使得索引的文本存储变得臃肿 我认为这些数据是重复的 So 1 有没
  • DatePickerDialog 主题为 Holo Light?

    如何获得具有 Holo Light 主题的 DatePickerDialog 当创建一个DatePickerDialog如下 DatePickerDialog dpd new DatePickerDialog new ContextThem
  • 使用 jQuery 检查特定类的所有输入是否为空

    我正在尝试检查某个类的所有输入字段是否为空 现在我有以下代码 HTML
  • 如何设置 BLE 通告数据包的设备名称字段

    我使用 API 来构建广告数据包 我通过true to setIncludeDeviceName AdvertiseData data new AdvertiseData Builder setIncludeDeviceName true
  • 在php中模糊搜索数组

    在我搜索之后 我发现了如何对a进行模糊搜索string 但我有一个字符串数组 search a gt laptop b gt screen 我从 MySQL 数据库中检索到的 是否有任何 php 类或函数可以对单词数组进行模糊搜索 或者至少
  • Json 日期到 Java 日期并返回 Json 日期

    我在这里查看了所有可能的答案 但我很难弄清楚这件事 我在字符串中有 Json 日期 我想在不损失时间的情况下转换为 Java 日期 我还想从 Java Date 转换为 Json Date 字符串 这是我所拥有的 String jsonDa
  • 如何从图中获取顶点 ID

    请考虑以下事项 library igraph id lt c 1 2 A B name lt c 02 653245 03 4542342 Peter Mary category lt c digit digit char char fro
  • Scala 中有双向映射之类的东西吗?

    我想链接 2 列唯一标识符 并且能够通过第二列值获取第一列值以及通过第一列值获取第二列值 就像是 Map 1 lt gt one 2 lt gt two 3 lt gt three Scala中有这样的设施吗 实际上我需要更多 3 列 用于
  • 添加滚动视图会使应用程序崩溃

    我的任务是为情人节创建一个应用程序 我正在制作一个情书生成器 我只能使用一项活动 因此我创建了一个文本视图 将可见性设置为消失 这封情书有点长 所以我想要滚动视图 添加该内容会使应用程序崩溃 请帮忙
  • javascript中对象串联的问题

    我在连接java脚本中的对象时遇到问题 例如 var firstObj firstObj info sam kam var secObj secObj info ram dam 我需要的输出 firstObj info sam kam ra
  • ValueError:Python 中 float() 的文字无效

    To all 我很好奇是否有人可以帮助我理解错误 ValueError float 的无效文字 当我将文本文件传递到列表然后尝试将此列表转换为浮点值时 我得到了这个信息 a open input txt r lines a readline
  • 使用react-chartjs-2显示每个切片的饼图数据值

    我正在制作一个饼图 并且正在努力显示每个切片的饼图数据值 由于我的应用程序是用 React js 编写的 因此我使用react chartjs 2 我找到了这个针对chart js的解决方案并尝试实现 但它不适用于react chartjs