Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

253 lines
9.0 KiB

/**
* @class Ext.chart.series.Line
* @extends Ext.chart.series.Cartesian
*
* Creates a Line Chart. A Line Chart is a useful visualization technique to display quantitative information for different
* categories or other real values (as opposed to the bar chart), that can show some progression (or regression) in the dataset.
* As with all other series, the Line Series must be appended in the *series* Chart array configuration. See the Chart
* documentation for more information. A typical configuration object for the line series could be:
*
* @example
* Ext.create({
* xtype: 'cartesian',
* renderTo: document.body,
* width: 600,
* height: 400,
* insetPadding: 40,
* store: {
* fields: ['name', 'data1', 'data2'],
* data: [{
* 'name': 'metric one',
* 'data1': 10,
* 'data2': 14
* }, {
* 'name': 'metric two',
* 'data1': 7,
* 'data2': 16
* }, {
* 'name': 'metric three',
* 'data1': 5,
* 'data2': 14
* }, {
* 'name': 'metric four',
* 'data1': 2,
* 'data2': 6
* }, {
* 'name': 'metric five',
* 'data1': 27,
* 'data2': 36
* }]
* },
* axes: [{
* type: 'numeric',
* position: 'left',
* fields: ['data1'],
* title: {
* text: 'Sample Values',
* fontSize: 15
* },
* grid: true,
* minimum: 0
* }, {
* type: 'category',
* position: 'bottom',
* fields: ['name'],
* title: {
* text: 'Sample Values',
* fontSize: 15
* }
* }],
* series: [{
* type: 'line',
* style: {
* stroke: '#30BDA7',
* lineWidth: 2
* },
* xField: 'name',
* yField: 'data1',
* marker: {
* type: 'path',
* path: ['M', - 4, 0, 0, 4, 4, 0, 0, - 4, 'Z'],
* stroke: '#30BDA7',
* lineWidth: 2,
* fill: 'white'
* }
* }, {
* type: 'line',
* fill: true,
* style: {
* fill: '#96D4C6',
* fillOpacity: .6,
* stroke: '#0A3F50',
* strokeOpacity: .6,
* },
* xField: 'name',
* yField: 'data2',
* marker: {
* type: 'circle',
* radius: 4,
* lineWidth: 2,
* fill: 'white'
* }
* }]
* });
*
* In this configuration we're adding two series (or lines), one bound to the `data1`
* property of the store and the other to `data3`. The type for both configurations is
* `line`. The `xField` for both series is the same, the `name` property of the store.
* Both line series share the same axis, the left axis. You can set particular marker
* configuration by adding properties onto the marker object. Both series have
* an object as highlight so that markers animate smoothly to the properties in highlight
* when hovered. The second series has `fill = true` which means that the line will also
* have an area below it of the same color.
*
* **Note:** In the series definition remember to explicitly set the axis to bind the
* values of the line series to. This can be done by using the `axis` configuration property.
*/
Ext.define('Ext.chart.series.Line', {
extend: 'Ext.chart.series.Cartesian',
alias: 'series.line',
type: 'line',
seriesType: 'lineSeries',
requires: [
'Ext.chart.series.sprite.Line'
],
config: {
/**
* @cfg {Number} selectionTolerance
* The offset distance from the cursor position to the line series to trigger events (then used for highlighting series, etc).
*/
selectionTolerance: 20,
/**
* @cfg {Object} style
* An object containing styles for the visualization lines. These styles will override the theme styles.
* Some options contained within the style object will are described next.
*/
/**
* @cfg {Boolean/Number} smooth
* If set to `true` or a non-zero number, the line will be smoothed/rounded around its points; otherwise
* straight line segments will be drawn.
*
* A numeric value is interpreted as a divisor of the horizontal distance between consecutive points in
* the line; larger numbers result in sharper curves while smaller numbers result in smoother curves.
*
* If set to `true` then a default numeric value of 3 will be used.
*/
smooth: false,
/**
* @cfg {Boolean} step
* If set to `true`, the line uses steps instead of straight lines to connect the dots.
* It is ignored if `smooth` is true.
*/
step: false,
/**
* @cfg {Boolean} fill
* If set to `true`, the area underneath the line is filled with the color defined as follows, listed by priority:
* - The color that is configured for this series ({@link Ext.chart.series.Series#colors}).
* - The color that is configured for this chart ({@link Ext.chart.AbstractChart#colors}).
* - The fill color that is set in the {@link #style} config.
* - The stroke color that is set in the {@link #style} config, or the same color as the line.
*
* Note: Do not confuse `series.config.fill` (which is a boolean) with `series.style.fill' (which is an alias
* for the `fillStyle` property and contains a color). For compatibility with previous versions of the API,
* if `config.fill` is undefined but a `style.fill' color is provided, `config.fill` is considered true.
* So the default value below must be undefined, not false.
*/
fill: undefined,
aggregator: { strategy: 'double' }
},
/**
* @private Default numeric smoothing value to be used when `{@link #smooth} = true`.
*/
defaultSmoothness: 3,
/**
* @private Size of the buffer area on either side of the viewport to provide seamless zoom/pan
* transforms. Expressed as a multiple of the viewport length, e.g. 1 will make the buffer on
* each side equal to the length of the visible axis viewport.
*/
overflowBuffer: 1,
themeMarkerCount: function() {
return 1;
},
/**
* @private Override {@link Ext.chart.series.Series#getDefaultSpriteConfig}
*/
getDefaultSpriteConfig: function () {
var me = this,
parentConfig = me.callParent(arguments),
style = Ext.apply({}, me.getStyle()),
styleWithTheme,
fillArea = false;
if (typeof me.config.fill != 'undefined') {
// If config.fill is present but there is no fillStyle, then use the
// strokeStyle to fill (and paint the area the same color as the line).
if (me.config.fill) {
fillArea = true;
if (typeof style.fillStyle == 'undefined') {
if (typeof style.strokeStyle == 'undefined') {
styleWithTheme = me.getStyleWithTheme();
style.fillStyle = styleWithTheme.fillStyle;
style.strokeStyle = styleWithTheme.strokeStyle;
} else {
style.fillStyle = style.strokeStyle;
}
}
}
} else {
// For compatibility with previous versions of the API, if config.fill
// is undefined but style.fillStyle is provided, we fill the area.
if (style.fillStyle) {
fillArea = true;
}
}
// If we don't fill, then delete the fillStyle because that's what is used by
// the Line sprite to fill below the line.
if (!fillArea) {
delete style.fillStyle;
}
style = Ext.apply(parentConfig || {}, style);
return Ext.apply(style, {
fillArea: fillArea,
step: me.config.step,
smooth: me.config.smooth,
selectionTolerance: me.config.selectionTolerance
});
},
updateStep: function (step) {
var sprite = this.getSprites()[0];
if (sprite && sprite.attr.step !== step) {
sprite.setAttributes({step: step});
}
},
updateFill: function (fill) {
var sprite = this.getSprites()[0];
if (sprite && sprite.attr.fillArea !== fill) {
sprite.setAttributes({fillArea: fill});
}
},
updateSmooth: function (smooth) {
var sprite = this.getSprites()[0];
if (sprite && sprite.attr.smooth !== smooth) {
sprite.setAttributes({smooth: smooth});
}
}
});