Skip to content

Commit 2a4f20e

Browse files
authored
Merge pull request #4814 from plotly/rangebreaks-ohlc
Handle rangebreak gaps in `candlestick` & `ohlc`
2 parents af8f15f + 2f3b098 commit 2a4f20e

File tree

6 files changed

+126
-10
lines changed

6 files changed

+126
-10
lines changed

src/lib/search.js

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
var isNumeric = require('fast-isnumeric');
1313
var loggers = require('./loggers');
1414
var identity = require('./identity');
15+
var BADNUM = require('../constants/numerical').BADNUM;
1516

1617
// don't trust floating point equality - fraction of bin size to call
1718
// "on the line" and ensure that they go the right way specified by
@@ -72,22 +73,35 @@ exports.sorterDes = function(a, b) { return b - a; };
7273
*/
7374
exports.distinctVals = function(valsIn) {
7475
var vals = valsIn.slice(); // otherwise we sort the original array...
75-
vals.sort(exports.sorterAsc);
76+
vals.sort(exports.sorterAsc); // undefined listed in the end - also works on IE11
7677

77-
var l = vals.length - 1;
78-
var minDiff = (vals[l] - vals[0]) || 1;
79-
var errDiff = minDiff / (l || 1) / 10000;
80-
var v2 = [vals[0]];
78+
var last;
79+
for(last = vals.length - 1; last > -1; last--) {
80+
if(vals[last] !== BADNUM) break;
81+
}
82+
83+
var minDiff = (vals[last] - vals[0]) || 1;
84+
var errDiff = minDiff / (last || 1) / 10000;
85+
var newVals = [];
86+
var preV;
87+
for(var i = 0; i <= last; i++) {
88+
var v = vals[i];
8189

82-
for(var i = 0; i < l; i++) {
8390
// make sure values aren't just off by a rounding error
84-
if(vals[i + 1] > vals[i] + errDiff) {
85-
minDiff = Math.min(minDiff, vals[i + 1] - vals[i]);
86-
v2.push(vals[i + 1]);
91+
var diff = v - preV;
92+
93+
if(preV === undefined) {
94+
newVals.push(v);
95+
preV = v;
96+
} else if(diff > errDiff) {
97+
minDiff = Math.min(minDiff, diff);
98+
99+
newVals.push(v);
100+
preV = v;
87101
}
88102
}
89103

90-
return {vals: v2, minDiff: minDiff};
104+
return {vals: newVals, minDiff: minDiff};
91105
};
92106

93107
/**
Loading
Loading
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"data": [
3+
{
4+
"type": "candlestick",
5+
"x": [
6+
"2020-01-02 17:00",
7+
"2020-01-02 17:10",
8+
"2020-01-02 17:20",
9+
"2020-01-02 17:30",
10+
"2020-01-02 17:40",
11+
"2020-01-02 17:50",
12+
"2020-01-02 18:00",
13+
"2020-01-02 18:10"
14+
],
15+
"open": [
16+
10,
17+
10,
18+
10,
19+
10,
20+
10,
21+
10,
22+
10,
23+
10
24+
],
25+
"high": [
26+
12,
27+
12,
28+
12,
29+
12,
30+
12,
31+
12,
32+
12,
33+
14
34+
],
35+
"low": [
36+
8,
37+
8,
38+
8,
39+
8,
40+
8,
41+
8,
42+
3,
43+
8
44+
],
45+
"close": [
46+
12,
47+
7,
48+
11,
49+
10.5,
50+
9,
51+
8.5,
52+
3,
53+
14
54+
]
55+
}
56+
],
57+
"layout": {
58+
"width": 600,
59+
"height": 400,
60+
"title": {
61+
"text": "Candlestick with rangebreaks"
62+
},
63+
"xaxis": {
64+
"rangebreaks": [
65+
{
66+
"pattern": "hour",
67+
"bounds": [
68+
18,
69+
9
70+
]
71+
}
72+
]
73+
}
74+
}
75+
}

test/image/mocks/axes_breaks-candlestick2.json

Lines changed: 23 additions & 0 deletions
Large diffs are not rendered by default.

test/jasmine/tests/mock_test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ var list = [
5050
'autorange-tozero-rangemode',
5151
'axes_booleans',
5252
'axes_breaks',
53+
'axes_breaks-candlestick',
54+
'axes_breaks-candlestick2',
5355
'axes_breaks-finance',
5456
'axes_breaks-gridlines',
5557
'axes_breaks-night_autorange-reversed',
@@ -1078,6 +1080,8 @@ figs['automargin-title-standoff'] = require('@mocks/automargin-title-standoff');
10781080
figs['autorange-tozero-rangemode'] = require('@mocks/autorange-tozero-rangemode');
10791081
// figs['axes_booleans'] = require('@mocks/axes_booleans');
10801082
figs['axes_breaks'] = require('@mocks/axes_breaks');
1083+
figs['axes_breaks-candlestick'] = require('@mocks/axes_breaks-candlestick');
1084+
figs['axes_breaks-candlestick2'] = require('@mocks/axes_breaks-candlestick2');
10811085
figs['axes_breaks-finance'] = require('@mocks/axes_breaks-finance');
10821086
figs['axes_breaks-gridlines'] = require('@mocks/axes_breaks-gridlines');
10831087
figs['axes_breaks-night_autorange-reversed'] = require('@mocks/axes_breaks-night_autorange-reversed');

0 commit comments

Comments
 (0)