2016-09-15 88 views

回答

1

使用Chart.js plugins可以幫助你做到這一點。他們讓你處理那些圖表創建像beforeInitafterUpdateafterDraw過程中引發的,也是容易實現的特定事件:

var myPlugin = { 
    afterDraw: function(chart) { 
     // This will be triggered after the chart is drawn 
    } 
}; 

Chart.pluginService.register(myPlugin); 


一個插件做你正在尋找的東西將在下面聯繫,但第一讓我解釋它是如何工作的。

在你的圖表選項,你將需要添加一個新的屬性,稱爲phases,這是一個數組:

// The following is an example that won't work with every chart 

options: { 
    scales: { 
     xAxes: [{ 

      // `from` & `to` must exist in your xAxe ticks 
      phases: [{ 
       from: "January", 
       to: "March", 
       // You can also define the color here 
       color: "blue" 
      }, 
      { 
       from: "May", 
       to: "June", 
       color: "red" 
      }] 
     }] 
    } 
} 

然後,這裏是使用該信息插件:

var phasePlugin = { 
    // You need to handle the `afterDraw` event since you draw phases edges 
    // after everything is drawn 
    afterDraw: function(chart) 
    { 
     // All the variables the plugin needs follow ... 
     var ctx = chart.chart.ctx; 
     var xAxeId = chart.config.options.scales.xAxes[0].id; 
     var xAxe = chart.scales[xAxeId]; 
     var yAxeId = chart.config.options.scales.yAxes[0].id; 
     var yAxe = chart.scales[yAxeId]; 
     var ticks = xAxe.ticks; 
     var phases = chart.config.options.scales.xAxes[0].phases; 

     // For every phase ... 
     for (var i = 0; i < phases.length; i++) { 

      // We check if the tick actually exists 
      if (ticks.indexOf(phases[i].from) == -1 || (ticks.indexOf(phases[i].to) == -1)) { 
       // Else, we skip to the next phase 
       continue; 
      } 

      // We get the x position of the first limit tick 
      var xPos = ((xAxe.width - xAxe.paddingRight)/xAxe.maxIndex) * ticks.indexOf(phases[i].from) + xAxe.left + 1; 

      // And draw the dashed line 
      ctx.setLineDash([8, 8]); 
      ctx.strokeStyle = phases[i].color; 
      ctx.strokeRect(xPos, yAxe.top, 0, yAxe.height); 

      // Same for the other limit 
      xPos = ((xAxe.width - xAxe.paddingRight)/xAxe.maxIndex) * ticks.indexOf(phases[i].to) + xAxe.left + 1; 
      ctx.strokeStyle = phases[i].color; 
      ctx.strokeRect(xPos, yAxe.top, 0, yAxe.height); 
      ctx.setLineDash([1,0]); 
     } 
    } 
}; 

你可以看到一個完全工作的例子in this jsFiddle這裏是它的結果:

enter image description here

相關問題