2017-04-13 3 views
1

Ist es möglich, einem bestimmten Datenpunkt in einem X-Series Highchart-Graphen ein Bild hinzuzufügen?Highcharts-Datenpunkt Bild

Zum Beispiel habe ich die folgende Tabelle:

/** 
* Highcharts X-range series plugin 
*/ 
(function (H) { 
    var defaultPlotOptions = H.getOptions().plotOptions, 
     columnType = H.seriesTypes.column, 
     each = H.each, 
     extendClass = H.extendClass, 
     pick = H.pick, 
     Point = H.Point, 
     Series = H.Series; 

defaultPlotOptions.xrange = H.merge(defaultPlotOptions.column, { 
    tooltip: { 
     pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.yCategory}</b><br/>' 
    } 
}); 
H.seriesTypes.xrange = H.extendClass(columnType, { 
    pointClass: extendClass(Point, { 
     // Add x2 and yCategory to the available properties for tooltip formats 
     getLabelConfig: function() { 
      var cfg = Point.prototype.getLabelConfig.call(this); 

      cfg.x2 = this.x2; 
      cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y]; 
      return cfg; 
     } 
    }), 
    type: 'xrange', 
    forceDL: true, 
    parallelArrays: ['x', 'x2', 'y'], 
    requireSorting: false, 
    animate: H.seriesTypes.line.prototype.animate, 

    /** 
    * Borrow the column series metrics, but with swapped axes. This gives free access 
    * to features like groupPadding, grouping, pointWidth etc. 
    */ 
    getColumnMetrics: function() { 
     var metrics, 
      chart = this.chart; 

     function swapAxes() { 
      each(chart.series, function (s) { 
       var xAxis = s.xAxis; 
       s.xAxis = s.yAxis; 
       s.yAxis = xAxis; 
      }); 
     } 

     swapAxes(); 

     this.yAxis.closestPointRange = 1; 
     metrics = columnType.prototype.getColumnMetrics.call(this); 

     swapAxes(); 

     return metrics; 
    }, 

    /** 
    * Override cropData to show a point where x is outside visible range 
    * but x2 is outside. 
    */ 
    cropData: function (xData, yData, min, max) { 

     // Replace xData with x2Data to find the appropriate cropStart 
     var crop = Series.prototype.cropData.call(this, this.x2Data, yData, min, max); 

     // Re-insert the cropped xData 
     crop.xData = xData.slice(crop.start, crop.end); 

     return crop; 
    }, 

    translate: function() { 
     columnType.prototype.translate.apply(this, arguments); 
     var series = this, 
      xAxis = series.xAxis, 
      metrics = series.columnMetrics, 
      minPointLength = series.options.minPointLength || 0; 

     H.each(series.points, function (point) { 
      var plotX = point.plotX, 
       plotX2 = xAxis.toPixels(H.pick(point.x2, point.x + (point.len || 0)), true), 
       width = plotX2 - plotX, 
       widthDifference; 

      if (minPointLength) { 
       widthDifference = width < minPointLength ? minPointLength - width : 0; 
       plotX -= widthDifference/2; 
       plotX2 += widthDifference/2; 
      } 

      plotX = Math.max(plotX, -10); 
      plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10); 

      point.shapeArgs = { 
       x: plotX, 
       y: point.plotY + metrics.offset, 
       width: plotX2 - plotX, 
       height: metrics.width 
      }; 
      point.tooltipPos[0] += width/2; 
      point.tooltipPos[1] -= metrics.width/2; 
     }); 
    } 
}); 

/** 
* Max x2 should be considered in xAxis extremes 
*/ 
H.wrap(H.Axis.prototype, 'getSeriesExtremes', function (proceed) { 
    var axis = this, 
     dataMax, 
     modMax; 

    proceed.call(this); 
    if (this.isXAxis) { 
     dataMax = pick(axis.dataMax, Number.MIN_VALUE); 
     each(this.series, function (series) { 
      each(series.x2Data || [], function (val) { 
       if (val > dataMax) { 
        dataMax = val; 
        modMax = true; 
       } 
      }); 
     }); 
     if (modMax) { 
      axis.dataMax = dataMax; 
     } 
    } 
}); 
}(Highcharts)); 


// THE CHART 
Highcharts.chart('container', { 
    chart: { 
     type: 'xrange' 
    }, 
    title: { 
     text: 'Item List' 
    }, 
    xAxis: { 
     type: 'datetime', 
     min: Date.UTC(2014, 11, 3) 
    }, 
    yAxis: { 
     title: '', 
     categories: ['Item 1', 'Item 2'], 
     reversed: true 
    }, 
    series: [{ 
     name: 'Project 1', 
     // pointPadding: 0, 
     // groupPadding: 0, 
     borderRadius: 5, 
     pointWidth: 10, 
     data: [{ 
      x: Date.UTC(2014, 11, 3), 
      x2: Date.UTC(2014, 11, 3), 
      y: 0 
     }, { 
      x: Date.UTC(2014, 11, 6), 
      x2: Date.UTC(2014, 11, 7), 
      y: 0 
     }, 
     { 
      x: Date.UTC(2014, 11, 9), 
      x2: Date.UTC(2014, 11, 11), 
      y: 0 
     }], color: '#BF0B23' 
    }] 

}); 

JSFiddle Example

in dem ersten Datenpunkt:

{ x: Date.UTC (2014, 11, 3), x2: Date.UTC (2014, 11, 3), y: 0 },

Ich möchte ein Markerbild hinzufügen, da der Datumsbereich es zu klein macht, um tatsächlich in der Grafik angezeigt zu werden (wie das "Sonnen" -Bild von this example), aber ich kann nicht herausfinden, wo der Marker sein müsste in meinem JSFiddle-Beispiel platziert.

+0

Es ist schwer, ein Bild zu Ihrer Serie hinzuzufügen, weil sie Spaltenreihentyp erweitert. Stattdessen sollten Sie in der Lage sein, verschiedene Diagrammtypen zu verwenden, zB Liniendiagramm http://jsfiddle.net/7gxjecnn/2/ –

Antwort

0

wird die Markierung auf dem Punkt gebracht:

{ 
    x: Date.UTC(2014, 11, 3), 
    x2: Date.UTC(2014, 11, 3), 
    y: 0, 

    // Like this: 
    marker: { 
    symbol: 'url(...)' 
    } 
}, 
+0

Ich nahm an, dass es dort auch gehen würde, aber es scheint nicht zu funktionieren: http: // jsfiddle. net/7gxjecnn/ – ca8msm

+1

@ ca8msm sieht nicht so aus, als ob es auf 'xrange' Charts unterstützt wird. Es funktioniert, wenn der Diagrammtyp stattdessen auf "Spline" eingestellt ist: http://jsfiddle.net/7gxjecnn/1. –

+0

Danke, leider muss ich den XRange verwenden, da es mehrere Bereiche pro x geben wird – ca8msm