【问题标题】:Chart.js horizontal line chart or modified horizontal bar chartChart.js 水平折线图或修改后的水平条形图
【发布时间】:2016-07-19 15:24:10
【问题描述】:

我正在使用 chart.js 尝试创建相对于当前日期的事件时间线。

水平条形图很接近,但只想显示条形的尖端,例如作为几乎是水平折线图的点。

我已经展示了我的水平条形图以及它看起来像水平折线图的模型。

chart.js 可以做到这一点吗?

【问题讨论】:

标签: javascript chart.js


【解决方案1】:

您首先需要知道,您可以编辑的有关图表的所有信息都存储在包含图表的变量中(通常称为myChart,但在your fiddle 中称为my2Bar)。

如果要全局更改图表,则需要编辑myChart.config.options 中的属性。
如果要更改特定图表,则需要编辑myChart.config.data 中的属性。

在这种情况下,您需要更改特定的图表(这是水平条)。


如果您碰巧检查了图表的日志,并深入了解了config,您最终会看到图表中的条形图是使用存储在myChart.config.data.datasets[0]._meta[0].data[n 中的属性绘制的em>]._modeln 是绘制的第 n 个 矩形,从上到下)。

你可以在那里找到一些属性:

  • base:开始绘制矩形的 X 位置(例如,xAxe 中的 0 )。
  • x :矩形被绘制到这个 X 位置。
  • height:绘制矩形的高度。
  • 等等……

要编辑这些值,您只需在不同的矩形中循环(上述路径中的 n)。

但是您不能在变量的config 上手动执行此操作。如果您这样做,它将不起作用,因为您的图表是响应式的(在调整大小时,它将使用以前的选项重新绘制图表)。


你必须使用的是Chart.js plugins

插件让您可以处理在创建、更新、渲染图表时触发的所有事件。

然后,在您的 beforeRender 事件中(在初始化之后但在绘图之前触发),您需要在不同的矩形中循环以编辑值以影响它们的绘制方式:

beforeRender: function(chart) {
    for (var i = 0; i < chart.config.data.datasets[0]._meta[0].data.length; i++) {
        // Change both `3` values to change the height & width of the point 
        chart.config.data.datasets[0]._meta[0].data[i]._model["base"] = chart.config.data.datasets[0]._meta[0].data[i]._model["x"] + 3;
        chart.config.data.datasets[0]._meta[0].data[i]._model["height"] = 3;
    }
}

这是a jsFiddle 的最终结果。
不幸的是,我无法制作圆点,而不是正方形。


更新:

我还制作了another jsFiddle,所有的点都链接在一起,这使它看起来像是一个水平折线图(当然可以改进,但这是一个好的开始)。

【讨论】:

  • 嘿,这太棒了。我认为改变酒吧基础可能是解决方案,但不知道从哪里开始,所以很高兴了解 Chart.js 插件。我的页面中有多个 Chart.js 图表。该解决方案是否适用于 jsfiddle,因为它是全局参考并且其中只有一个图表? beforeRender: function(chart) 是否必须修改以专门引用我的图表?我刚刚将beforeRender: function(chart) 复制到我的代码中,但它没有显示图表。
  • @curtisp 我给出的解决方案是使用全局编辑。那么你调用后创建的每个图表都会受到影响(如this fiddle所示)。如果我以某种方式找到针对特定图表的方法,我会更新我的答案
  • 文档注释beforeRender: function(chartInstance) { },chartInstance 对我的图表的引用,例如my2Bar。我已经尝试过了,但没有任何乐趣。
  • @curtisp 知道了!即使是全局编辑,也只会编辑一个图表。这是因为 myChart.config.data.datasets[0]._meta[ n ] 中的 n。这是绘制的第 n 个图表。比如this fiddle中,即使一开始就创建了插件,第二个图表也不受影响。
  • 好的,你证明它适用于多个图表,每个图表使用不同的引用 ctxctx2。我的每个图表都使用ctx。我将不得不重构我的图表参考。非常感谢。