从 php 循环绘制多个图表(Chart.js)以读取多个文件

2023-12-08

我一直在尝试使用 Chart.js 从 php 循环绘制多个图表。事实证明,Chart.js 只会将数据聚集在一个画布(第一个画布)中,其他画布最终会变成空白。我觉得我已经很接近了,但还没有完全实现......有人可以帮助我吗?提前致谢!这是我的代码:

PS:画布空间出现在其他 div 内部,尽管是空白的......所以它被清除了。

GraphPage.blade.php

@foreach ($items as $item)
<div class="table">
  <div class="table-row">
    {{ $item->id }}
  </div>
  <div class="table-row">
    {{ $item->name }}
  </div>
  <div class="table-row">
    <canvas class="bar-chart"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
    <script type="text/javascript">
    
      <?php
      $i = 0;
      $files = fopen("storage/" . $item->file, "r");
      while(!feof($files)) {
      $content = fgets($files);
      $carray = explode(",", $content);
      list($axisX, $axisY) = $carray;
      $x[] = $axisX;
      $y[] = $axisY;
      $i++;
      }
      fclose($files);

      $x_to_json = json_encode((array)$x);
      $y_to_json = json_encode((array)$y);
      ?>

      var x = <?php echo $x_to_json ?>;
      var y = <?php echo $y_to_json ?>;

      var ctx = document.getElementsByClassName('bar-chart');
      var chartGraph = new Chart(ctx, {
        type: 'bar',
        data: {
          labels: x,
          datasets: [{
            label: "Bar Plot",
            data: y,
          }]
        }
      });
    </script>
  </div>
</div>
@endforeach

这就是现在的结果......

第一个图中所有数据都聚集在一起,而第二个图中则没有任何数据......


好吧,事实证明我想出了解决我的问题的方法,当然得到了 stackoverflow 和 YouTube 代码朋友的很多帮助。其作用是,根据公共存储 URL 中的逗号分隔值文件的数量(两列,无标题 ~ 所有内容都可以调整),它读取每个文件并为每个文件动态构建一个 Chart.js 图表其中。无论如何......如果它对任何人有任何帮助,这是我的代码和我使用的帮助来源:

In the 查看刀片文件(created-project.blade.php),我已将 Chart.js 中的画布和函数插入到foreach循环,以便通过数据运行每个文件:

EDIT 1:就这里而言,数据来自x axis将被视为连续(线性)。但请确保至少将 Chart.js 对应的脚本行添加到3.0.0-beta.7。在早期版本中,这不起作用......

@foreach ($mols as $mol)
    <div class="flex flex-wrap m-1 w-5/6 lg:w-3/6">
        <script>

            var cont;
            for(cont = 0; cont < {!! $spectraCount !!}; cont++) {

                window.addEventListener('load', setup);

                async function setup() {

                    const ctx = document.getElementById('myChart').insertAdjacentHTML("afterend","<canvas id='canvas"+cont+"' height='230'></canvas>");
                    const can_id="canvas"+cont;
                    const ctx2 = document.getElementById(can_id).getContext('2d');
                    const spectra = await getData();

                    window.can_id = new Chart(ctx2, {

                        type: 'bar',
                        data: {
                            datasets: [{
                                label: "{!! $mol->nome_molecula !!}",
                                backgroundColor: "#0070bf",
                                data: spectra.xy,
                                barThickness: 3,
                            }]
                        },
                        options: {
                            scales: {
                                x: {
                                    type: 'linear',
                                    offset: false,
                                    gridLines: {
                                        offsetGridLines: false,
                                    }
                                }
                            }
                        }

                    });

                    window.can_id.update();

                }

                async function getData() {
                    const response = await fetch('spectra/{!! $mol->espectro !!}');
                    const data = await response.text();
                    const xy = [];
                    const table = data.split('\n');

                    table.forEach(row => {
                        const columns = row.split(',');
                        xy.push({'x': parseFloat(columns[0]), 'y': parseFloat(columns[1])});
                    });

                    return { xy };

                }

                var cont = cont + {!! $spectraCount !!};

            }

        </script>

        <canvas id="myChart" class="w-2 h-2"></canvas>

    </div>
@endforeach

PS:原因如下var 续 = 续 + {!! $spectraCount!!}在结束时forJavaScript循环就是匹配统计的文件个数,并完成for循环,每次都会重新启动foreach从刀片代码循环。如果不添加,则会导致页面中的图表数量增加一倍。

数据通过 Livewire 传输成分(CreatedProject.php),包含以下代码:

<?php

    namespace App\Http\Livewire;

    use Livewire\Component;
    use App\Models\Spectra;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\Http;

    class CreatedProject extends Component
    {
        public function render()
        {
            $metadados = DB::table('new_projects')->where('user_id', '=', auth()->user()->id)->orderBy('id_projeto', 'DESC')->first();
            $mols = DB::table('new_molecules')->where('nome_projeto', '=', $metadados->nome_projeto)->get();
            $spectra = DB::table('spectras')->where('nome_projeto', '=', $metadados->nome_projeto)->get();
            $collection = collect($spectra);
            $spectraCount = collect($spectra)->count();

            return view('livewire.created-project', [
                'metadados' => $metadados,
                'mols' => $mols,
                'collection' => $collection,
                'spectraCount' => $spectraCount,
            ]);

        }
    }

进入数据库的文件已经在 livewire 的 save() 函数中进行处理成分(新建Project.php),代码如下:

public function save()
{
    foreach ($this->espectro as $key => $value) {

        $mol_localpath = $this->espectro[$key]->storeAs('spectra', $mol_path);

        $a = 0;
        $files = fopen("spectra/" . $this->espectro[$key]->hashName(), "r");
        while(!feof($files)) {
            $content = fgets($files);
            $carray = explode(",", $content);
            list($mz1, $int1) = $carray;
            $mz[] = $mz1;
            $int[] = $int1;
            $a++;
        }

        fclose($files);

        Spectra::create([
            'user_id' => auth()->user()->id,
            'nome_projeto' => $this->nome_projeto,
            'espectro' => $this->espectro[$key]->hashName(),
            'mz' => $mz,
            'int' => $int,
        ]);

        $mz = [];
        $int = [];

    }

    return redirect()->route('created-project');

}

当然,您不应该忘记在视图文件中 HTML 的 head 标签中添加 Chart.js 主 CDN 脚本,或者按照您认为最好的方式安装它。

两个不同文本文件的结果示例:

Exemple

PS2:我的 CSS 是基于 Tailwind 的。爱它!

我必须解决这个问题的主要帮助来源:

  • YouTube 上 The Coding Train 的这个系列:https://youtu.be/RfMkdvN-23o

  • 这篇文章来自 stackoverflow:使用chart.js 实现多个动态折线图 | js和html

  • 这个人制作的视频(不是英文,但很容易理解):https://youtu.be/sjF7A_uMbgc

  • 在 Chart.js Github 中发布 @etimberg 的答案:https://github.com/chartjs/Chart.js/issues/8233

  • 他用小提琴来解释:https://jsfiddle.net/ob0xc5u7/

一切都切中要害,经过一些调整,我就可以运行了。因此,我在此向开放代码社区表示感谢!

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

从 php 循环绘制多个图表(Chart.js)以读取多个文件 的相关文章

  • Jquery 关注下一个带有类的元素

    我正在尝试创建一个函数 当按下 Enter 键时 会选择带有类的下一个输入 我已经设法 focus 同一行中的下一个元素 但是 如果我需要选择下一行的下一个输入 它将无法继续 下一行中的第一个 quantity 文本框需要获得焦点 控制台没
  • 如何覆盖 phpunit 中导出的变量?

    我知道我可以设置环境变量 https phpunit de manual current en appendixes configuration html在我的 phpunit xml 里面
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 有什么简单的方法可以清理 Google Maps v3 API 上的所有标记、折线和其他叠加层吗?

    我想获得一张新地图 而不是使用刷新网页 thanks 并有简单的方法来获取地图上的所有叠加层 在 v2 API 中 有clearOverlays http code google com apis maps documentation ja
  • Discord.js v12:如何等待 DM 通道中的消息?

    这是我尝试过的代码 message author dmChannel awaitMessages msg gt console log msg content 但它返回此错误消息 TypeError Cannot read property
  • 如何使用 JavaScript 禁用滚动条?

    当我仅在 Internet Explorer 7 中显示代表模式窗口的 div 时 我需要锁定浏览器滚动条 谷歌搜索我发现我可以使用document body style overflow hidden 但这不适用于 IE7 我也尝试过do
  • 在 WordPress 和 woocommerce 中禁用 zxcvbn.min.js

    如您所知 zxcvbn min js 约为 400kb 并且默认在 WordPress 网站中加载 我想知道如何阻止加载此 JavaScript 库 因为我不想在我的网站中检查密码长度 将以下内容添加到主题的 function php 或自
  • 创建响应式眼睛焦点图标

    我一直在尝试制作响应式彩色眼睛焦点图标 但到目前为止我所尝试的一切均不成功 我试图在某种程度上复制真眼的颜色 我使用边框 框阴影来获取颜色 但该部分没有缩放 也尝试过轮廓 但也失败了 那个甚至不是圆的 div 的高度当前是静态的 但我希望它
  • 使 div 的大小与其内部图像的大小相同

    我有一个带有以下代码的div HTML div img src img logo png div CSS div imgContainer width 250px height 250px padding 13px 问题是用户可以编辑图像大
  • 转换MAC地址格式

    我刚刚编写了一个小脚本 从交换机中提取数百个 MAC 地址进行比较 但它们的格式为 0025 9073 3014 而不是标准的 00 25 90 73 30 14 我对如何转换它感到困惑 我能想到的最好的办法就是在 处将它们分解成碎片 然后
  • 在窗口调整大小和窗口加载时动态调整 pixi 舞台及其内容的大小

    我正在尝试在窗口调整大小时动态调整 pixi 舞台 画布和内容 的大小 并且最初以浏览器窗口的大小加载 而不改变比例 我使用以下内容将初始大小基本上设置为window innerWidth window innerHeight 但它做了一些
  • 验证单个单选按钮在可用的 javascript 验证脚本中不起作用

    我随机生成了单选按钮系列 例如
  • PHP - 查找和比较日期

    你好 我有 foreach 我可以在其中获取数据库中的事件数据 我使用数据库中的日期名称 例如 event date 我需要在一个 div 中比较具有相同日期和输出的操作 例如我有这个事件 活动一 9 月 13 日 活动二 9 月 1 日
  • IE7 问题 - 当禁用文件下载自动提示时无法下载流式文件

    我的应用程序是基于 J2EE JSP Servlet 的 当我尝试从 JSP 打开新窗口 弹出窗口 并调用 Servlet 操作 例如 Streamer do 以在该弹出窗口内传输 PDF 文件时 我遇到了问题 问题 当 IE 7 gt 工
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • Laravel 5 注销特定用户

    在我的 laravel 5 应用程序中 有一个功能允许具有管理员角色的用户重置非管理员的任何人的密码 但这不会强制该人注销并再次登录 更改密码后如何强制用户注销 我没有对用于验证用户身份或任何内容的中间件进行任何更改 我不知道它是否有效 但
  • jQuery可排序发布数据,但没有数据

    谁能告诉我我在这里缺少什么 我的数据似乎总是空的 我做错了什么 document ready function nav sortable connectWith nav axis y update function event ui var
  • (A == B == C) 比较在 JavaScript 中如何工作?

    我预计以下比较会给出错误 var A B 0 if A B 0 console log true else console log false 但奇怪的是它又回来了false 更奇怪的是 console log A B 1 returns
  • 如何防止IE11弹出(您确定要离开此页面)

    我正在处理一个页面 除了一个下拉菜单可供选择外 我无需输入任何内容 但在 IE11 中 当我尝试转到下一页时 它会弹出该消息 我想阻止这种弹出的发生 所以我只是想知道 IE11 中弹出窗口的默认行为是什么 因为它不会出现在 Chrome 或
  • 如何在jsp页面中包含javascript

    我是 J2EE 和 Web 开发的新手 这是我的问题 我想在网页中包含 angular js 这是有效的版本 但我也想要一些本地的 javascript 文件 并且希望我想在本地目录中导入 angularjs

随机推荐

  • 如何在R中叠加条形图?

    我正在尝试创建一个类似于下面的图 摘自 Ro Russell 和 Lavie 2001 年 在他们的图表中 他们绘制了反应时间条内的误差 即准确性 条 基本上 我正在寻找一种在条形图内绘制条形图的方法 我知道创建这样的图表存在几个挑战 首先
  • iPhone 应用程序升级和移动 xibs/nibs 导致资源过时

    我有一个未本地化的运输应用程序 其主项目目录中有 foo xib 为了准备本地化 我将其移至 en lproj foo xib 现在 当我构建我的应用程序并安装在我的测试设备上时 它最终会使用陈旧的 foo nib 它必须是之前存在的 安装
  • 从宽到长返回空输出 - Python 数据框

    我有一个数据框 可以从下面给出的代码生成 df pd DataFrame person id 1 2 3 date1 12 31 2007 11 25 2009 10 06 2005 val1 2 4 6 date2 12 31 2017
  • NativeApplicationClient 不受任何支持

    当在我的 Visual Studio Winform 项目中使用此代码时 var provider new NativeApplicationClient GoogleAuthenticationServer Description Cli
  • Python,安装 matplotlib 时出错

    操作系统 Windows 10 Python版本 3 9 0 错误代码 ERROR Command errored out with exit status 1 python setup py egg info Check the logs
  • 使用flock和lockfile在bash中锁定文件

    我花了一天的大部分时间寻找这个问题的解决方案 我想我已经接近边缘了 我需要在 bash 中做的是 编写 1 个脚本 该脚本将定期读取您的输入并将它们写入文件中第二个脚本将定期打印出完整的文件 但仅当写入新内容时 这意味着它永远不会一个接一个
  • Android RadioGroup 检查多个 RadioButton?

    我在用RadioGroup added RadioButton rdbut to RadioGroup rdgrp like rdgrp addView rdbut for int j 0 j lt 3 j RadioGroup rdgrp
  • 使用关联标签/单元提取数据

    我一直在尝试分离出隐藏在文本句子中的关键数据 例如 我已经使用以下代码取得了一些进展 但它也提取了不需要的值 let Source Excel CurrentWorkbook Name Table3 Content Changed Type
  • 写行方法

    我有一个日志文件 txt 其中包含以下信息 Filename1 A3332NCDER Filename2 B3332NCDER Filename3 B1222NCDERE Filename4 C1222NCDER Filename4 C12
  • 在 pip jnius 安装中找不到 JRE_HOME

    正在尝试安装jnius来自 pip 这是一个要求pip install sikuli 这是我尝试安装时遇到的错误 变量定义是否正确 有谁明白为什么它一直说找不到JRE HOME Edit 我的路径变量是 setup py 包含 jdk ho
  • 这个 PHP 随机数库如何工作?

    From http fullthrottledevelopment com php nonce library download 有一个PHP nonce库 但是有一些东西我不知道理解 第一个是它提醒我们为FT NONCE UNIQUE K
  • 如何终止与 grep 匹配时间超过 30 分钟的进程?

    我有一组并行运行的进程 有时 有些内容的停留时间会超过脚本允许的时间 time start microtime true max run time 30 60 30 minutes measured in seconds while mic
  • 如何使用 Exchange Web 服务托管 API 设置联系人头衔

    我正在尝试使用 EWS API 创建新联系人 我可以设置除联系人标题属性之外的所有所需值 我尝试了代码 oContact new Contact oService oContact GivenName John oContact Surna
  • 使用 NLB 和 IAM 身份验证公开 AWS MSK - 主机名验证失败

    我们正在努力让 Amazon MSK Kafka 与 IAM 身份验证配合使用 然后使用 aws kafka 广告侦听器中的更改通过 DNS 公开访问它 为了实现这一点 我们遵循如下相同的基础设施计划 但我们不使用接口端点 而是使用网络负载
  • 如何以编程方式创建和管理 macOS Safari 书签?

    我正在制作一个脚本 它会更新我的 macOS Safari 上的书签 以便始终将我订阅的所有 Reddit 子版块作为特定文件夹中的单独书签 我已经将所有 subreddits 作为 Python 中元组的排序列表 将所需的书签名称作为第一
  • SML 中绑定的价值?

    有人可以解释一下为什么评估后 and 的值一定是 16 这是正确的答案吗 我认为答案 3 是因为我们调用函数 f 并将值 1 和 2 作为函数 f 发送 但看不到值 5 和 10 但我想我错了 val x 1 val y 2 val f f
  • 在 SwiftUI 中将 NavigationButton 与服务器请求结合使用

    我怎样才能做一个NavigationButton在进入下一个视图之前等待服务器响应 我尝试过这样的事情 NavigationButton destination LogonView onTrigger gt Bool in return s
  • 如何从远程服务器加载图像到iPhone中的UIImageView上?

    我正在尝试从应用程序中的 UIImageView 上的远程服务器加载图像 是否可以从远程服务器加载图像 我正在使用以下代码 id path http upload wikimedia org wikipedia commons c c7 S
  • 在 Swift 中,无主引用与弱引用[重复]

    这个问题在这里已经有答案了 如果你有一个Dog弱引用Bone 这意味着在这种情况下 Dog 是引用的 所有者 并且它使用骨骼 但是骨骼可以不存在 而 Dog 仍然可以运行 因为对骨骼的引用是可选的 然而 对于 无主 关键字 无主 似乎不是在
  • 从 php 循环绘制多个图表(Chart.js)以读取多个文件

    我一直在尝试使用 Chart js 从 php 循环绘制多个图表 事实证明 Chart js 只会将数据聚集在一个画布 第一个画布 中 其他画布最终会变成空白 我觉得我已经很接近了 但还没有完全实现 有人可以帮助我吗 提前致谢 这是我的代码