Skip to content
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

iss3917 #3958

Closed
wants to merge 43 commits into from
Closed

iss3917 #3958

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ddfee60
iss3917
roicos Feb 25, 2017
2d63d8a
Merge branch 'master' of https://github.com/chartjs/Chart.js into pr2…
roicos Apr 8, 2017
7d38cbf
change 0.04 to fontSize for log scale
roicos Aug 18, 2017
dd52e16
getValueForPixel - 0 in range case added
roicos Aug 18, 2017
95724e4
tests for log scale with 0 values
roicos Aug 20, 2017
33298c2
-
roicos Aug 21, 2017
fb04dd3
-
roicos Aug 21, 2017
0185146
Fix use of reserved keyword as a parameter name
etimberg Feb 22, 2017
b65c5c7
Layout service supports a new order setting to configure how boxes ar…
etimberg Jan 20, 2017
95576d7
Add test for layout service weight ordering
etimberg Feb 25, 2017
65a513f
Fixed built-in auto skip caused by previous commit (#3904)
Jareechang Feb 19, 2017
95e8898
Handle incoming model values on element transition
simonbrunel Feb 25, 2017
12065d8
Flatten animation object and fix callbacks
simonbrunel Feb 25, 2017
9a83752
Split radial scale lineArc setting into a combination of existing and…
etimberg Jan 11, 2017
4ca0d73
Added a `maxBarThickness` setting for bar charts xAxis (#3963)
seven7seven Mar 4, 2017
6486f5c
Fix shorthand `legend: false` and `title: false`
simonbrunel Mar 4, 2017
77d74b2
Cleanup and upgrade unit tests environment
simonbrunel Mar 4, 2017
3f948ad
Introduce unit test based on image comparison (#3988)
simonbrunel Mar 5, 2017
068ccc6
Add support to fill between datasets (#4008)
simonbrunel Mar 18, 2017
109968d
Correctly handle decimal display size (#4009)
simonbrunel Mar 18, 2017
a452fee
Update the docs structure/content to use GitBook (#3751)
etimberg Mar 21, 2017
41fa8f5
Avoid errors when rendering serverside (#3909)
khorolets Mar 21, 2017
9031c00
Fix for stacked bar charts with log axes (#4010)
etimberg Mar 21, 2017
5f06e6b
Fix radar chart horizontal position (#4032)
shirosaki Mar 21, 2017
85e3645
Do not draw tooltips that have no items (#4034)
samueljo Mar 21, 2017
a031160
Reorganize samples and list them in index.html (#4043)
simonbrunel Mar 21, 2017
2b3a4fd
Zero line dash options (#4019)
lndobryden Mar 21, 2017
56801fc
Update line-customTooltips.html (Re issue #4038 )
el-ee Mar 22, 2017
826ce3b
Add link to plugin that creates a stacked percentage chart
y-takey Mar 24, 2017
4ac523c
Add `gulp unittest --coverage` argument (#4075)
simonbrunel Mar 25, 2017
e5b7405
Move legend and title in the plugins folder (#4076)
simonbrunel Mar 25, 2017
e74b496
Fixed misplaced data points on category scale
martinzuern Mar 27, 2017
80d7412
Update the tooltip with a new `caretPadding` setting. Previously this…
etimberg Mar 28, 2017
a641be2
Time scale improvements to improve performance and reliability
tredston Apr 2, 2017
157c67a
Add live samples back to docs for each chart type
etimberg Apr 2, 2017
11cca74
Adds a better error message when the chart type is incorrect. Previou…
etimberg Mar 25, 2017
6f3f2a5
scale service - respect new weight scale option for axes ordering (#4…
cizmiak Apr 4, 2017
d0078c0
change 0.04 to fontSize for log scale
roicos Aug 18, 2017
a7411bd
getValueForPixel - 0 in range case added
roicos Aug 18, 2017
bbce9bd
tests for log scale with 0 values
roicos Aug 20, 2017
ce22327
-
roicos Aug 21, 2017
4ce2163
-
roicos Aug 21, 2017
18f1758
Merge branch 'pr20022017' of https://github.com/roicos/Chart.js into …
roicos Aug 21, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/core.ticks.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ module.exports = function(Chart) {

if (tickVal === 0) {
exp = Math.floor(helpers.log10(dataRange.minNotZero));
significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));
significand = 1;

ticks.push(tickVal);
tickVal = significand * Math.pow(10, exp);
Expand Down
96 changes: 55 additions & 41 deletions src/scales/scale.logarithmic.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,63 +178,77 @@ module.exports = function(Chart) {
},
getPixelForValue: function(value) {
var me = this;
var innerDimension;
var pixel;

var innerDimension = me.isHorizontal() ? me.width : me.height;
var start = me.start;
var end = me.end;
var newVal = +me.getRightValue(value);
var range;
var opts = me.options;
var tickOpts = opts.ticks;
var zero = me.isHorizontal() ? (tickOpts.reverse ? me.right : me.left) : (tickOpts.reverse ? me.top : me.bottom);

if (me.isHorizontal()) {
range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0
if (newVal === 0) {
pixel = me.left;
} else {
innerDimension = me.width;
pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));
}
} else {
// Bottom - top since pixels increase downward on a screen
innerDimension = me.height;
if (start === 0 && !tickOpts.reverse) {
range = helpers.log10(me.end) - helpers.log10(me.minNotZero);
if (newVal === start) {
pixel = me.bottom;
} else if (newVal === me.minNotZero) {
pixel = me.bottom - innerDimension * 0.02;
} else {
pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));
}
} else if (me.end === 0 && tickOpts.reverse) {
range = helpers.log10(me.start) - helpers.log10(me.minNotZero);
if (newVal === me.end) {
pixel = me.top;
} else if (newVal === me.minNotZero) {
pixel = me.top + innerDimension * 0.02;
} else {
pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));
}
} else if (newVal === 0) {
pixel = tickOpts.reverse ? me.top : me.bottom;
} else {
range = helpers.log10(me.end) - helpers.log10(start);
innerDimension = me.height;
pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));
var pixel, range, valueOffset;

if (start === 0 || end === 0) { // 0 is in range
var min = Math.pow(10, Math.floor(helpers.log10(me.minNotZero)));
var max = tickOpts.reverse ? start : end;
range = helpers.log10(max) - Math.floor(helpers.log10(me.minNotZero));
var fontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);
var diff = fontSize;
innerDimension -= diff;

if (newVal === 0) { // 0
pixel = zero;
} else if (newVal === min) { // 0 in range, minNotZero
pixel = me.isHorizontal() ? (tickOpts.reverse ? zero - diff : zero + diff) : (tickOpts.reverse ? zero + diff : zero - diff);
} else { // 0 in range, common case
valueOffset = innerDimension / range * (helpers.log10(newVal) - Math.floor(helpers.log10(me.minNotZero)));
pixel = me.isHorizontal()
? (tickOpts.reverse ? zero - diff - valueOffset : zero + diff + valueOffset)
: (tickOpts.reverse ? zero + diff + valueOffset : zero - diff - valueOffset);
}
} else { // 0 is not in range
range = helpers.log10(end) - helpers.log10(start);
valueOffset = innerDimension / range * (helpers.log10(newVal) - helpers.log10(start));
pixel = me.isHorizontal() ? me.left + valueOffset : me.bottom - valueOffset;
}
return pixel;
},
getValueForPixel: function(pixel) {
var me = this;
var range = helpers.log10(me.end) - helpers.log10(me.start);
var value, innerDimension;
var tickOpts = me.options.ticks;
var reverse = tickOpts.reverse;

if (me.start === 0 || me.end === 0) {
var zeroPixel = me.isHorizontal() ? (reverse ? me.right : me.left) : (reverse ? me.top : me.bottom);
range = helpers.log10(reverse ? me.start : me.end) - Math.floor(helpers.log10(me.minNotZero));
var fontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);
var diff = fontSize;
innerDimension -= diff;

//
var pixelMinNotZero;
if (me.isHorizontal()) {
pixelMinNotZero = reverse ? zeroPixel - diff : zeroPixel + diff;
} else {
pixelMinNotZero = reverse ? zeroPixel + diff : zeroPixel - diff;
}

if (me.isHorizontal()) {
if (pixel === zeroPixel) {
value = 0;
} else if (pixel === pixelMinNotZero) {
value = me.minNotZero;
} else {
var p = me.isHorizontal()
? (reverse ? zeroPixel - diff - pixel : zeroPixel + diff + pixel)
: (reverse ? zeroPixel + diff + pixel : zeroPixel - diff - pixel);
value = me.minNotZero * Math.pow(10, p * range / innerDimension);
}
} else if (me.isHorizontal()) {
innerDimension = me.width;
value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);
} else { // todo: if start === 0
} else {
innerDimension = me.height;
value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;
}
Expand Down
81 changes: 68 additions & 13 deletions test/specs/scale.logarithmic.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ describe('Logarithmic Scale tests', function() {
type: 'bar',
data: {
datasets: [{
data: [11, 0.8, 0, 28, 7]
data: [11, 76, 0, 28, 7]
}],
labels: []
},
Expand All @@ -535,9 +535,9 @@ describe('Logarithmic Scale tests', function() {

// Counts down because the lines are drawn top to bottom
expect(chart.scales.yScale).toEqual(jasmine.objectContaining({
ticks: [30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0.9, 0.8, 0],
ticks: [80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
start: 0,
end: 30
end: 80
}));
});

Expand Down Expand Up @@ -602,7 +602,7 @@ describe('Logarithmic Scale tests', function() {

// Counts down because the lines are drawn top to bottom
expect(chart.scales.yScale).toEqual(jasmine.objectContaining({
ticks: [0, 9, 10, 20, 30],
ticks: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30],
start: 30,
end: 0
}));
Expand Down Expand Up @@ -735,7 +735,7 @@ describe('Logarithmic Scale tests', function() {
expect(yScale.getValueForPixel(246)).toBeCloseTo(10, 1e-4);
});

it('should get the correct pixel value for a point when 0 values are present', function() {
it('should get the correct pixel value for a point when 0 values are present (vertical)', function() {
var chart = window.acquireChart({
type: 'bar',
data: {
Expand All @@ -761,21 +761,76 @@ describe('Logarithmic Scale tests', function() {
var yScale = chart.scales.yScale;
expect(yScale.getPixelForValue(70, 0, 0)).toBeCloseToPixel(32); // top + paddingTop
expect(yScale.getPixelForValue(0, 0, 0)).toBeCloseToPixel(484); // bottom - paddingBottom
expect(yScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(475); // minNotZero 2% from range
expect(yScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(344);
expect(yScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(213);
expect(yScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(155);
expect(yScale.getPixelForValue(0.01, 0, 0)).toBeCloseToPixel(472); // first possible tick
expect(yScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(381); // minNotZero
expect(yScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(278);
expect(yScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(174);
expect(yScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(127);
expect(yScale.getPixelForValue(63, 0, 0)).toBeCloseToPixel(38.5);

chart.options.scales.yAxes[0].ticks.reverse = true; // Reverse mode
chart.update();

expect(yScale.getPixelForValue(70, 0, 0)).toBeCloseToPixel(484); // bottom - paddingBottom
expect(yScale.getPixelForValue(0, 0, 0)).toBeCloseToPixel(32); // top + paddingTop
expect(yScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(41); // minNotZero 2% from range
expect(yScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(172);
expect(yScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(303);
expect(yScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(361);
expect(yScale.getPixelForValue(0.01, 0, 0)).toBeCloseToPixel(44); // first possible tick
expect(yScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(135); // minNotZero
expect(yScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(238);
expect(yScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(342);
expect(yScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(389);
expect(yScale.getPixelForValue(63, 0, 0)).toBeCloseToPixel(477);
});

it('should get the correct pixel value for a point when 0 values are present (horizontal)', function() {
var chart = window.acquireChart({
type: 'horizontalBar',
data: {
labels: ['data 1', 'data 2', 'data 3', 'data 4', 'data 5', 'data 6'],
datasets: [{
xAxisID: 'xScale',
yAxisID: 'yScale',
data: [0.063, 4, 0, 63, 10, 0.5],
}],
},
options: {
scales: {
xAxes: [{
id: 'xScale',
type: 'logarithmic',
display: true,
ticks: {
reverse: false,
},
}],
yAxes: [{
id: 'yScale',
type: 'category',
display: true,
}]
}
}
});

var xScale = chart.scales.xScale;
expect(xScale.getPixelForValue(70, 0, 0)).toBeCloseToPixel(505);
expect(xScale.getPixelForValue(0, 0, 0)).toBeCloseToPixel(44);
expect(xScale.getPixelForValue(0.01, 0, 0)).toBeCloseToPixel(56);
expect(xScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(149);
expect(xScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(254);
expect(xScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(360);
expect(xScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(406);
expect(xScale.getPixelForValue(63, 0, 0)).toBeCloseToPixel(500);

chart.options.scales.xAxes[0].ticks.reverse = true; // Reverse mode
chart.update();

expect(xScale.getPixelForValue(70, 0, 0)).toBeCloseToPixel(44);
expect(xScale.getPixelForValue(0, 0, 0)).toBeCloseToPixel(505);
expect(xScale.getPixelForValue(0.01, 0, 0)).toBeCloseToPixel(493);
expect(xScale.getPixelForValue(0.063, 0, 0)).toBeCloseToPixel(400);
expect(xScale.getPixelForValue(0.5, 0, 0)).toBeCloseToPixel(295);
expect(xScale.getPixelForValue(4, 0, 0)).toBeCloseToPixel(189);
expect(xScale.getPixelForValue(10, 0, 0)).toBeCloseToPixel(143);
expect(xScale.getPixelForValue(63, 0, 0)).toBeCloseToPixel(49);
});
});