-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Add 'cumulative' histogram 'mode' for CDF #1189
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
62aeefb
9c0dea0
fd7526b
17c04c5
4bc28dd
c12b7cf
4d02af7
53b61aa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -247,63 +247,97 @@ describe('Test histogram', function() { | |
}); | ||
|
||
describe('cumulative distribution functions', function() { | ||
var base = {x: [1, 2, 3, 4, 2, 3, 4, 3, 4, 4]}; | ||
var base = { | ||
x: [0, 5, 10, 15, 5, 10, 15, 10, 15, 15], | ||
y: [2, 2, 2, 14, 6, 6, 6, 10, 10, 2] | ||
}; | ||
|
||
it('makes the right base histogram', function() { | ||
var baseOut = _calc(base); | ||
expect(baseOut).toEqual([ | ||
{b: 0, p: 1, s: 1}, | ||
{b: 0, p: 2, s: 2}, | ||
{b: 0, p: 3, s: 3}, | ||
{b: 0, p: 4, s: 4}, | ||
{b: 0, p: 2, s: 1}, | ||
{b: 0, p: 7, s: 2}, | ||
{b: 0, p: 12, s: 3}, | ||
{b: 0, p: 17, s: 4}, | ||
]); | ||
}); | ||
|
||
var CDFs = [ | ||
{p: [1, 2, 3, 4], s: [1, 3, 6, 10]}, | ||
{p: [2, 7, 12, 17], s: [1, 3, 6, 10]}, | ||
{ | ||
direction: 'decreasing', | ||
p: [1, 2, 3, 4], s: [10, 9, 7, 4] | ||
p: [2, 7, 12, 17], s: [10, 9, 7, 4] | ||
}, | ||
{ | ||
currentbin: 'exclude', | ||
p: [2, 3, 4, 5], s: [1, 3, 6, 10] | ||
p: [7, 12, 17, 22], s: [1, 3, 6, 10] | ||
}, | ||
{ | ||
direction: 'decreasing', currentbin: 'exclude', | ||
p: [0, 1, 2, 3], s: [10, 9, 7, 4] | ||
p: [-3, 2, 7, 12], s: [10, 9, 7, 4] | ||
}, | ||
{ | ||
currentbin: 'half', | ||
p: [1, 2, 3, 4, 5], s: [0.5, 2, 4.5, 8, 10] | ||
p: [2, 7, 12, 17, 22], s: [0.5, 2, 4.5, 8, 10] | ||
}, | ||
{ | ||
direction: 'decreasing', currentbin: 'half', | ||
p: [0, 1, 2, 3, 4], s: [10, 9.5, 8, 5.5, 2] | ||
p: [-3, 2, 7, 12, 17], s: [10, 9.5, 8, 5.5, 2] | ||
}, | ||
{ | ||
direction: 'decreasing', currentbin: 'half', histnorm: 'percent', | ||
p: [0, 1, 2, 3, 4], s: [100, 95, 80, 55, 20] | ||
p: [-3, 2, 7, 12, 17], s: [100, 95, 80, 55, 20] | ||
}, | ||
{ | ||
currentbin: 'exclude', histnorm: 'probability', | ||
p: [2, 3, 4, 5], s: [0.1, 0.3, 0.6, 1] | ||
p: [7, 12, 17, 22], s: [0.1, 0.3, 0.6, 1] | ||
}, | ||
{ | ||
// behaves the same as without *density* | ||
direction: 'decreasing', currentbin: 'half', histnorm: 'density', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looking good! |
||
p: [-3, 2, 7, 12, 17], s: [10, 9.5, 8, 5.5, 2] | ||
}, | ||
{ | ||
// behaves the same as without *density*, only *probability* | ||
direction: 'decreasing', currentbin: 'half', histnorm: 'probability density', | ||
p: [-3, 2, 7, 12, 17], s: [1, 0.95, 0.8, 0.55, 0.2] | ||
}, | ||
{ | ||
currentbin: 'half', histfunc: 'sum', | ||
p: [2, 7, 12, 17, 22], s: [1, 6, 19, 44, 60] | ||
}, | ||
{ | ||
currentbin: 'half', histfunc: 'sum', histnorm: 'probability', | ||
p: [2, 7, 12, 17, 22], s: [0.5 / 30, 0.1, 9.5 / 30, 22 / 30, 1] | ||
}, | ||
{ | ||
direction: 'decreasing', currentbin: 'half', histfunc: 'max', histnorm: 'percent', | ||
p: [-3, 2, 7, 12, 17], s: [100, 3100 / 32, 2700 / 32, 1900 / 32, 700 / 32] | ||
}, | ||
{ | ||
direction: 'decreasing', currentbin: 'half', histfunc: 'min', histnorm: 'density', | ||
p: [-3, 2, 7, 12, 17], s: [8, 7, 5, 3, 1] | ||
}, | ||
{ | ||
currentbin: 'exclude', histfunc: 'avg', histnorm: 'probability density', | ||
p: [7, 12, 17, 22], s: [0.1, 0.3, 0.6, 1] | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be nice to test There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Another good call by @etpinard 🌮 (and see also #1189 (comment)) What should we do with cumulative enabled and I don't think there's anything special to do based on Thoughts on any of this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I can see this being used in time series CDFs. Think payments over time: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I agree 100% here. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Absolutely - and that will work just fine without modification (tests to come). I was just saying I don't think there's anything that needs altering based on There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
]; | ||
|
||
CDFs.forEach(function(CDF) { | ||
var direction = CDF.direction, | ||
currentbin = CDF.currentbin, | ||
histnorm = CDF.histnorm, | ||
p = CDF.p, | ||
var p = CDF.p, | ||
s = CDF.s; | ||
|
||
it('handles direction=' + direction + ', currentbin=' + currentbin + ', histnorm=' + histnorm, function() { | ||
it('handles direction=' + CDF.direction + ', currentbin=' + CDF.currentbin + | ||
', histnorm=' + CDF.histnorm + ', histfunc=' + CDF.histfunc, function() { | ||
var traceIn = Lib.extendFlat({}, base, { | ||
cumulative: true, | ||
direction: direction, | ||
currentbin: currentbin, | ||
histnorm: histnorm | ||
cumulative: { | ||
enabled: true, | ||
direction: CDF.direction, | ||
currentbin: CDF.currentbin | ||
}, | ||
histnorm: CDF.histnorm, | ||
histfunc: CDF.histfunc | ||
}); | ||
var out = _calc(traceIn); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be nice to add one image mock. Maybe one that combines a
currentbin: 'include'
andcurrentbin: 'exclude'
traces like in:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test image in 53b61aa
One thing this showed is that we need a way to harmonize autobins across traces, and that it needs to know about
cumulative
. To make this example work I needed to manually extend the bin range for the smaller trace, otherwise its CDF ended too soon. Actually, CDFs never end, really... so perhaps the even better thing to do would be to look at the axis range and draw bins out to the edge. Anyway, fixing this will be a bigger project so I'll make an issue for it rather than try to address it here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's fine. Thanks for the info!