Chart.js 在条形图和折线图上具有双轴

2023-12-14

我正在使用本主题中的 Quince 的 Chart.js 版本Chart.js如何获得组合条形图和折线图?。条形图和折线图看起来非常漂亮。无论如何,轴必须分为 Y1 和 Y2,我找不到 Quince 的版本支持。

我又搜索了一下,发现了这个主题如何在 Chart.js 中为条形图和折线图添加第二个 Y 轴?建议使用 Khertan 的 Chart.js,它可以处理双轴,但我找不到在一个图中组合条形图和线条图的方法。

我尝试将此选项输入到 Quince 的版本中,但没有成功。

scaleUse2Y: true,

我有什么办法可以做到这一点吗?感谢您的热心帮助。

<script>
Chart.defaults.global.templateInterpolators = {
    start: "[[",
    end: "]]"
};
Chart.defaults.global.scaleLabel = "[[= value ]]";
Chart.defaults.global.tooltipTemplate = "[[if (label){]][[= label ]]:     [[}]][[= value ]]";
Chart.defaults.global.multiTooltipTemplate = "[[= value ]]";


var data = {
    labels: ["January", "February", "March", "April", "May", "June", "July"],
    datasets: [{
        label: "My First dataset",
        color:"#F7464A",
        //new option, barline will default to bar as that what is used to create the scale
        type: "line",
        fillColor: "rgba(220,220,220,0.2)",  //White
        strokeColor: "rgba(220,220,220,1)", //gray
        pointColor: "rgba(220,220,220,1)",  //gray
        pointStrokeColor: "#fff",
        pointHighlightFill: "#fff",
        pointHighlightStroke: "rgba(220,220,220,1)",
        data: [65, 20, 43, 81, 56, 55, 40]
    }, {
        label: "My First dataset",
        color:"#F7464A",
        //new option, barline will default to bar as that what is used to create the scale
        type: "bar",
        fillColor: "rgba(255, 187, 0, 1)",
        strokeColor: "rgba(255, 187, 0, 1)",
        pointColor: "rgba(255, 187, 0, 1)",
        pointStrokeColor: "#fff",
        pointHighlightFill: "#fff",
        pointHighlightStroke: "rgba(220,220,220,1)",
        data: [32, 25, 43, 22, 12, 92, 33]
    }]
};

//canvases
var lineBar = document.getElementById("line-bar").getContext("2d");

//charts
var myLineBarChart = new Chart(lineBar).Overlay(data);

在这个 HTML 中

<ul class="tabs"><li><input type="radio" name="tabs" id="tab1"checked />
<label for="tab1" onclick="rePlot(1,3)">2015</label>
<div id="tab-content1" class="tab-content" onclick="rePlot(1,3)">
<canvas group="canvas" id="line-bar" height="450" width="600" style="background-color:#8CDFD3;"></canvas>
</div>
</li>

<li><input type="radio" name="tabs" id="tab2" /><label for="tab2" onclick="rePlot(2,3)">2014</label>
<div id="tab-content2" class="tab-content" onclick="rePlot(2,3)">

<canvas group="canvas" id="line-bar" height="450" width="600" style="background-color:#8CDFD3;"></canvas>
</div>
</li>

<li><input type="radio" name="tabs" id="tab3" /><label for="tab3" onclick="rePlot(3,3)">2013</label>
<div id="tab-content3" class="tab-content" onclick="rePlot(3,3)">

<canvas group="canvas" id="line-bar" height="450" width="600" style="background-color:#8CDFD3;"></canvas>
</div>
</li>
</ul>

我终于将我的多轴功能端口推到了这个前叉上的主机上。作为对正在发生的事情的极其简短的概述,我在比例中添加了一组轴。每个轴都能够计算一个值相对于其自身比例的 y 位置。开发人员现在唯一需要做的就是说明每个数据集需要属于哪个轴组。每个轴还可以被告知它应该是什么颜色以及它应该出现在图表的哪一侧。

如何使用它 - 在每个数据集中声明一个名为的新属性yAxesGroup

 datasets: [{
         label: "My First dataset",
         type: "bar",
         yAxesGroup: "1", //any with same group will appear in the same axis, also this can be anything as long as you always refer to it with the same name
         fillColor: "rgba(151,137,200,0.5)",
         strokeColor: "rgba(151,137,200,0.8)",
         highlightFill: "rgba(151,137,200,0.75)",
         highlightStroke: "rgba(151,137,200,1)",
         data: [28, 48, 40, 19, 86, 27, 90]
     },

然后为该轴提供更多选项,向名为的数据添加一个额外的属性yAxis这是轴选项的数组。默认情况下,每个轴都会在左侧显示一个比例,并以默认颜色或您设置为整体字体颜色的颜色显示,但您可以在此处覆盖它们

 var overlayData = {
     labels: ["January", "Februarya", "March", "April", "May", "Jun", "July"],
     datasets: [{
         label: "My First dataset",
         type: "bar",
         yAxesGroup: "1",
         fillColor: "rgba(151,137,200,0.5)",
         strokeColor: "rgba(151,137,200,0.8)",
         highlightFill: "rgba(151,137,200,0.75)",
         highlightStroke: "rgba(151,137,200,1)",
         data: [28, 48, 40, 19, 86, 27, 90]
     }, {
         label: "My Second dataset",
         type: "line",
         yAxesGroup: "2",
         fillColor: "rgba(151,187,205,0.5)",
         strokeColor: "rgba(151,187,205,0.8)",
         highlightFill: "rgba(151,187,205,0.75)",
         highlightStroke: "rgba(151,187,205,1)",
         data: [8, 38, 30, 29, 46, 67, 80]
     }],
     yAxes: [{
         name: "1",
         scalePositionLeft: false,
         scaleFontColor: "rgba(151,137,200,0.8)"
     }, {
         name: "2",
         scalePositionLeft: true,
         scaleFontColor: "rgba(151,187,205,0.8)"
     }]
 };

现在该图表将有 2 个轴,一个在左侧,一个在右侧。

有几点需要注意,如果任何值低于 0,则需要设置scaleBeginAtZero to false否则会有点混乱。此外,每个轴都有自己的 0 基线,因此 2 条边不会对齐。这正如我所预期的那样,因为我认为你有两个轴的原因是因为它们显示不同的比例,所以为了让所有东西都很好地坐在 0 上,每个轴需要处于不同的位置。

我已经对它进行了测试,以针对我添加的其他功能进行回归,这一切似乎都运行良好,但如果您确实使用它并注意到任何奇怪的事情,请告诉我。

另外,我无法将其编写为 ChartJS 的插件,因为核心中涉及的内容太多,因此它没有意义,因为您可以从 fork 构建版本,而不仅仅是覆盖 ChartJS 的原始版本。

总的来说,这就是它会产生的效果

 var overlayData = {
     labels: ["January", "Februarya", "March", "April", "May", "Jun", "July"],
     datasets: [{
         label: "My First dataset",
         type: "bar",
         yAxesGroup: "1",
         fillColor: "rgba(151,137,200,0.5)",
         strokeColor: "rgba(151,137,200,0.8)",
         highlightFill: "rgba(151,137,200,0.75)",
         highlightStroke: "rgba(151,137,200,1)",
         data: [28, 48, 40, 19, 86, 27, 90]
     }, {
         label: "My Second dataset",
         type: "line",
         yAxesGroup: "2",
         fillColor: "rgba(151,187,205,0.5)",
         strokeColor: "rgba(151,187,205,0.8)",
         highlightFill: "rgba(151,187,205,0.75)",
         highlightStroke: "rgba(151,187,205,1)",
         data: [8, 38, 30, 29, 46, 67, 80]
     }],
     yAxes: [{
         name: "1",
         scalePositionLeft: false,
         scaleFontColor: "rgba(151,137,200,0.8)"
     }, {
         name: "2",
         scalePositionLeft: true,
         scaleFontColor: "rgba(151,187,205,0.8)"
     }]
 };

 window.onload = function () {
     window.myOverlayChart = new Chart(document.getElementById("canvas").getContext("2d")).Overlay(overlayData, {
         populateSparseData: true,
         overlayBars: false,
         datasetFill: true,
     });
 }
<script src="https://raw.githack.com/leighquince/Chart.js/master/Chart.js"></script>

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

Chart.js 在条形图和折线图上具有双轴 的相关文章

随机推荐

  • Android:在gridlayout或gridview中创建具有动态大小的网格

    我计划制作网格基础应用程序 其中网格数量将根据用户的点击而变化 网格图案 2 2 4 4 例如 用户将单击正确的网格 然后网格数将会增加 我可以制作网格 但它不适合布局 那么 如何更改用户单击时的网格数量以及如何动态设置网格大小 在这里我附
  • 如何将 -std=c++11 添加到 NetBeans IDE 中的编译器选项?

    Netbeans 给我以下错误 错误此文件需要 ISO C 2011 标准的编译器和库支持 此支持目前处于实验阶段 必须 使用 std c 11 或 std gnu 11 编译器选项启用 我不知道如何解决这个问题 有什么帮助吗 首先 打开项
  • 适用于运行时 4.0 的 WebApi cors

    我需要 WebApi Cors dll 用于 Web api 项目 我安装了 net 4框架的Web Api版本 因为我使用VS 2010 我尝试通过nuget安装web api cors lib Install Package Micro
  • 无法通过套接字'/tmp/mysql.sock'连接到本地MySQL服务器

    我是 Web 开发和 RoR 的新手 超级菜鸟 我正在通过 lynda com 参加在线 RoR 课程 很高兴加入 StackOverflow 社区 并且非常感谢一些解决障碍的帮助 当我设置基本应用程序并成功运行一些迁移时 MySQL 和
  • 使用实体框架时如何排除相关表

    db UploadFileSet Where f gt f Article ID id ToList ef 会自动加载文章 但我不需要它 我怎样才能阻止它 我知道我可以这样写 Select new XXX Id xxx Name xxx 但
  • 设置 CodePipeline - 部署步骤的状态为失败

    设置 CodeDeploy 时如下本教程 在Setup CodePipeline的最后一步下 如果我单击 失败 下的 详细信息 如果我单击链接到执行详细信息 部署失败 因为没有找到您的实例 部署组 检查您的部署组设置以确保 您的 Amazo
  • 如何使用“new”而不是“malloc”动态分配二维数组?

    我想使用二维指针制作矩阵 当我使用 malloc 和 free 函数来使用内存时没有问题 请参阅我的代码 但是 我无法使用 new 和 delete 编写相同的代码 如您所知 一维指针可以通过 new 声明 例如 double exampl
  • 如何通过 OWA REST API 获取附件内容 > ~35MB?

    我正在使用 OWA REST API 开发 OWA 插件 我收到了不好的请求400尝试通过 OWA REST API 获取大于 35MB 的附件时的状态代码 在 Outlook 中 用户能够上传高达约 35MB 的附件 通过 OWA RES
  • 使用 - 我的流会发生什么?

    也许这是一个琐碎的问题 但它困扰着我 如果它是重复的 请不要大喊大叫 我尝试搜索 但有很多关于使用的问题 我很难找到答案 我有这样的代码 using IsolatedStorageFile ISF IsolatedStorageFile G
  • Java堆内存错误

    我收到此错误 Exception in thread main java lang OutOfMemoryError Java heap space at com mysql jdbc MysqlIO nextRowFast MysqlIO
  • 如何使用 C++ API 将元数据附加到 LLVM IR?

    谁能给我指出使用 c api 将元数据附加到 llvm ir 的具体示例 我已阅读此页http llvm org docs SourceLevelDebugging html Thanks 上面的答案并不完全正确 或完整 您还可以仅使用 M
  • 不推荐从字符串文字到 char* 的转换[重复]

    这个问题在这里已经有答案了 我在代码中不断收到错误 从字符串文字到 char 的转换已被弃用 代码的目的是使用指针到指针为string1和string2分配一个单词 然后打印出来 我怎样才能解决这个问题 这是我的代码 include
  • 代码在迭代 86 时崩溃

    static void Job47 Args args str path stx TreeNodeIterator iter TreeNode treeNode treeNodeToRelease Map dictMenuDisplay F
  • 循环用户输入,直到用户输入有效的输入

    我学到了一点生锈的知识 通常在我的代码中我喜欢实现一个循环用户输入直到正确的函数 但在这种情况下它不起作用 我不知道为什么 我尝试过一种名为is ok 但这总是返回 false 代码如下 use std io macro rules inp
  • 没有开发者帐户 oAuth 的发布者 API

    我有些疑惑 我就这样坚持了一个星期 我正在开发一个应用程序来获取游戏商店的所有评论 它适用于在 Play 商店拥有帐户的所有最终用户 https developers google com android publisher getting
  • Visual Studio 2019 C++ - 概念标识符未定义

    我尝试在我的 cpp 项目中使用概念 该项目是使用 Visual Studio 2019 版本 16 4 1 编写的 但我收到错误消息 标识符 conecpt 未定义 据我所知 自版本 16 3 以来 Visual Studio 2019
  • Doctrine Regular 与 Fetch 连接

    从理论上讲 常规连接和获取连接有什么区别 我不明白仅仅通过阅读docs regular query em gt createQuery SELECT u FROM User u JOIN u address a WHERE a city B
  • 如何在 Angular 4 中使用多个 Http 请求

    我正在使用 Angular 4 和一个 API 制作一个简单的应用程序 该应用程序有几个页面可以满足他们的请求 例如 我使用此 url 获取前 10 个字符 http swapi co api people 为了获得接下来的 10 个人 我
  • 在使用独立应用程序之前,是否必须在系统上安装 .net core?

    我正在使用 Visual Studio 2019 发布一个独立的 net core 2 1 应用程序 发布期间会发出许多文件 应用程序文件以及核心库 但发布的文件中不包含 dotnet exe 如果没有 dotnet exe 我无法启动已发
  • Chart.js 在条形图和折线图上具有双轴

    我正在使用本主题中的 Quince 的 Chart js 版本Chart js如何获得组合条形图和折线图 条形图和折线图看起来非常漂亮 无论如何 轴必须分为 Y1 和 Y2 我找不到 Quince 的版本支持 我又搜索了一下 发现了这个主题