【问题标题】:How to add padding between Graph and X/Y-Scale in chart.js?如何在 chart.js 中的 Graph 和 X/Y-Scale 之间添加填充?
【发布时间】:2015-08-19 12:42:40
【问题描述】:

我有一个使用chart.js 的简单折线图。

它应该看起来像这样:http://fs1.directupload.net/images/150819/ktkgs9pw.jpg(Photoshop,我用红线标记了填充)

chart.jshttp://fs2.directupload.net/images/150819/ql5l3jez.png 目前的样子

如您所见,Graph-Points 的轮廓与底部的 X-Scale(例如“2:00 PM”)和左侧的 Y-Scale(例如“0”)重叠.

我的折线图代码:

HTML:

<canvas id="server-usage"></canvas>

全球图表设置:

Chart.defaults.global = {
            // Boolean - Whether to animate the chart
            animation: false,

            // Number - Number of animation steps
            animationSteps: 60,

            // String - Animation easing effect
            // Possible effects are:
            // [easeInOutQuart, linear, easeOutBounce, easeInBack, easeInOutQuad,
            //  easeOutQuart, easeOutQuad, easeInOutBounce, easeOutSine, easeInOutCubic,
            //  easeInExpo, easeInOutBack, easeInCirc, easeInOutElastic, easeOutBack,
            //  easeInQuad, easeInOutExpo, easeInQuart, easeOutQuint, easeInOutCirc,
            //  easeInSine, easeOutExpo, easeOutCirc, easeOutCubic, easeInQuint,
            //  easeInElastic, easeInOutSine, easeInOutQuint, easeInBounce,
            //  easeOutElastic, easeInCubic]
            animationEasing: "easeInOutQuart",

            // Boolean - If we should show the scale at all
            showScale: true,

            // Boolean - If we want to override with a hard coded scale
            scaleOverride: true,

            // ** Required if scaleOverride is true **
            // Number - The number of steps in a hard coded scale
            scaleSteps: 7,
            // Number - The value jump in the hard coded scale
            scaleStepWidth: 18,
            // Number - The scale starting value
            scaleStartValue: 0,

            // String - Colour of the scale line
            scaleLineColor: "#565a60",

            // Number - Pixel width of the scale line
            scaleLineWidth: 0.1,

            // Boolean - Whether to show labels on the scale
            scaleShowLabels: true,

            // Interpolated JS string - can access value
            scaleLabel: "<%=value%>",

            // Boolean - Whether the scale should stick to integers, not floats even if drawing space is there
            scaleIntegersOnly: true,

            // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
            scaleBeginAtZero: false,

            // String - Scale label font declaration for the scale label
            scaleFontFamily: "'Open Sans', sans-serif",

            // Number - Scale label font size in pixels
            scaleFontSize: 13,

            // String - Scale label font weight style
            scaleFontStyle: "500",

            // String - Scale label font colour
            scaleFontColor: "#7c8189",

            // Boolean - whether or not the chart should be responsive and resize when the browser does.
            responsive: true,

            // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
            maintainAspectRatio: false,

            // Boolean - Determines whether to draw tooltips on the canvas or not
            showTooltips: true,

            // Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-custom-tooltips))
            customTooltips: false,

            // Array - Array of string names to attach tooltip events
            tooltipEvents: ["mousemove", "touchstart", "touchmove"],

            // String - Tooltip background colour
            tooltipFillColor: "#42454a",

            // String - Tooltip label font declaration for the scale label
            tooltipFontFamily: "'Open Sans', sans-serif",

            // Number - Tooltip label font size in pixels
            tooltipFontSize: 15,

            // String - Tooltip font weight style
            tooltipFontStyle: "normal",

            // String - Tooltip label font colour
            tooltipFontColor: "#e7e7e7",

            // String - Tooltip title font declaration for the scale label
            tooltipTitleFontFamily: "'Open Sans', sans-serif",

            // Number - Tooltip title font size in pixels
            tooltipTitleFontSize: 14,

            // String - Tooltip title font weight style
            tooltipTitleFontStyle: "regular",

            // String - Tooltip title font colour
            tooltipTitleFontColor: "#fff",

            // Number - pixel width of padding around tooltip text
            tooltipYPadding: 6,

            // Number - pixel width of padding around tooltip text
            tooltipXPadding: 6,

            // Number - Size of the caret on the tooltip
            tooltipCaretSize: 8,

            // Number - Pixel radius of the tooltip border
            tooltipCornerRadius: 0,

            // Number - Pixel offset from point x to tooltip edge
            tooltipXOffset: 10,

            // String - Template string for single tooltips
            tooltipTemplate: "On <%if (label){%><%=label%> there were <%}%><%= value %> active users",

            // String - Template string for multiple tooltips
            multiTooltipTemplate: "<%= value %>",

            // Function - Will fire on animation progression.
            onAnimationProgress: function(){},

            // Function - Will fire on animation completion.
            onAnimationComplete: function(){}
}

一些图表数据:

var usageData = {
     labels : ["2:00 PM","4:00 PM","6:00 PM","8:00 PM","10:00 PM","0:00 AM","2:00 AM"],
     datasets : [
         {
               strokeColor : "#61666c",
               pointColor : "#4e82c9",
               pointStrokeColor : "#565a60",
               data : [0,120,120,100,60,40,0]
          }
     ]
}

图表选项:

var options = {

            ///Boolean - Whether grid lines are shown across the chart
            scaleShowGridLines : false,

            //String - Colour of the grid lines
            scaleGridLineColor : "rgba(0,0,0,.05)",

            //Number - Width of the grid lines
            scaleGridLineWidth : 1,

            //Boolean - Whether to show horizontal lines (except X axis)
            scaleShowHorizontalLines: true,

            //Boolean - Whether to show vertical lines (except Y axis)
            scaleShowVerticalLines: true,

            //Boolean - Whether the line is curved between points
            bezierCurve : false,

            //Number - Tension of the bezier curve between points
            bezierCurveTension : 0.4,

            //Boolean - Whether to show a dot for each point
            pointDot : true,

            //Number - Radius of each point dot in pixels
            pointDotRadius : 18,

            //Number - Pixel width of point dot stroke
            pointDotStrokeWidth : 8,

            //Number - amount extra to add to the radius to cater for hit detection outside the drawn point
            pointHitDetectionRadius : 20,

            //Boolean - Whether to show a stroke for datasets
            datasetStroke : true,

            //Number - Pixel width of dataset stroke
            datasetStrokeWidth : 4,

            //Boolean - Whether to fill the dataset with a colour
            datasetFill : false,

            //String - A legend template
            legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"

};

创建图表:

var serverUsage = document.getElementById('server-usage').getContext('2d');
new Chart(serverUsage).Line(usageData, options);

我在搜索 Question-Tag chart.js 后发现了一个非常相似的问题,但效果不太好,因为解决方案在悬停时有问题,而且它不是折线图。 (Chart.JS spacing and padding)

【问题讨论】:

  • 感谢您指出这一点!我已经在链接答案的小提琴中修复了它。
  • @potatopeelings 感谢您更新您的出色解决方案!您能否也为折线图创建解决方案或解释如何自行完成?我的 JavaScript 技能真的像 0 - 所以我只是靠那些库和像你这样的人来帮助调整它们。提前致谢!
  • 我对您当前的代码做了一些假设。如果这些不正确,请告诉我。顺便说一句,您不需要像在您的问题中那样设置您的Chart.defaults.global。你可以覆盖那些你必须喜欢的Chart.defaults.global.scaleSteps = 7; Chart.defaults.global.animation = false; 而对于你的个人图表选项,你只需要在你的选项对象中包含你想要覆盖的选项 - 你可以忽略其余的。

标签: javascript canvas chart.js


【解决方案1】:

实际上,您不需要链接解决方案的所有复杂性,因为

  1. 您打算不显示轴线(我从图像中看到您将图表背景和刻度颜色设置为相同)和
  2. 您已经硬编码了刻度的开始值和结束值(我假设您知道数据的值范围,不需要自动计算) - 如果这种情况不成立,请参阅替代解决方案给你

有了这些注意事项,您只需要进行一些更改(只需在选项名称上按 Ctrl + F 即可找到要替换的行)

scaleSteps: 5,
// Number - The value jump in the hard coded scale
scaleStepWidth: 50,
// Number - The scale starting value
scaleStartValue: -50,

我们基本上是从比我们需要的值低 1 步的值开始的。这会提升图表。现在我们需要做的就是隐藏这个额外的比例标签,我们用它来做

scaleLabel: function (d) {
    if (d.value < 0)
        return '';
    else
        return d.value + '         ';
},

方法的第一行负责隐藏额外的刻度标签。最后一行的+ ' ' 将图表向右移动(我们告诉 Chart.js 标签比实际更长)


小提琴 - http://jsfiddle.net/56578cn4/



如果2.不适用,去掉scaleOverride和配置,覆盖计算y轴刻度范围的常用方法,再初始化图表,上面加一个刻度标签,下面加一个刻度标签

// this applies to all chart instances that use this scale!
var originalCalculateScaleRange = Chart.helpers.calculateScaleRange;
Chart.helpers.calculateScaleRange = function () {
    var scaleRange = originalCalculateScaleRange.apply(this, arguments);
    // add 1 unit at the top and bottom
    scaleRange.min = scaleRange.min - scaleRange.stepValue;
    scaleRange.max = scaleRange.max + scaleRange.stepValue;
    scaleRange.steps = scaleRange.steps + 2;
    return scaleRange;
}

如果值都大于 0 时您不介意额外的标签,这将正常工作(我们的 scaleLabel 选项负责隐藏负标签,并且只隐藏负标签)。

请注意,如果您正在使用不希望应用此功能的其他图表,则需要在完成图表初始化后恢复此功能。


小提琴 - http://jsfiddle.net/mkzdzj3b/

【讨论】:

  • 首先:非常感谢!编辑:当按下回车该死的时候,它总是自动发送答案。所以:我真的不知道我的数据将在值的范围内。为什么我现在对其进行硬编码:否则,scala 将在下一个 100 步上,这是我不希望的。我实际上想在 PHP 中计算一个好的 Start/StepWidth 和 Step-Value 的总数。这意味着您的答案本身有效,但不适用于其他数据集,因为填充最终会有所不同。我希望你明白我的意思。但是感谢您到目前为止的时间!
  • 再次感谢您的编辑!填充似乎工作正常,但没有我的 Scala 值,我得到了一个不必要的大 y-Scala。图片:fs1.directupload.net/images/150819/no5gv92l.png 是否可以让 Graph 中的最高 Value 等于 Y-Scala 上的最高点?或者可能是一个没有现在那么大的差距。无论如何,再次感谢您的时间!
  • 尝试使用 calculateScaleRange 函数来减少 scaleRange.max 值,直到它在数据最大值的 1 stepValue 内(您需要减少 scaleRange.steps 以匹配 btw) - 请参阅此处修改的函数@ 987654325@
  • 我真的不知道如何按照我想要的方式调整它,但那个小提琴似乎已经足够好了。非常感谢您,并祝您度过愉快的一天!
  • 这很简单。我们允许 chart.js 进行比例计算。然后我们将刻度的顶部调整到您的最大数据值的 2 步以内。你想做什么改变?如果它太靠近你圈出的边缘,就会被剪掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多