-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
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
Add tickmode "proportional" #6827
base: master
Are you sure you want to change the base?
Changes from 30 commits
e7a2ffa
6d48a3b
00e884a
931199e
fced9ce
b2abf08
910163e
e21af96
ddfaad7
d42dd73
5d7b1b9
db1f82e
a2ac023
1fedfc7
e8f2052
c3f590d
7e93370
afba178
aca7a92
195dfa5
a788ccc
ecffc49
3089c4a
99d336a
4476d38
3502d49
09ebcfc
3fe254b
eb82723
fe6f8d0
b3956a0
7176049
15387ed
2ab0b41
f1a4db8
ee17af2
93e4bb8
61efdef
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 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -682,10 +682,13 @@ axes.prepTicks = function(ax, opts) { | |||||||||||||||||||||||||||
if(ax._name === 'radialaxis') nt *= 2; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if(!(ax.minor && ax.minor.tickmode !== 'array')) { | ||||||||||||||||||||||||||||
if(!(ax.minor && | ||||||||||||||||||||||||||||
(ax.minor.tickmode !== 'array' && | ||||||||||||||||||||||||||||
ax.minor.tickmode !== 'domain array' && | ||||||||||||||||||||||||||||
ax.minor.tickmode !== 'full domain'))) { | ||||||||||||||||||||||||||||
// add a couple of extra digits for filling in ticks when we | ||||||||||||||||||||||||||||
// have explicit tickvals without tick text | ||||||||||||||||||||||||||||
if(ax.tickmode === 'array') nt *= 100; | ||||||||||||||||||||||||||||
if(ax.tickmode === 'array' || ax.tickmode === 'domain array' || ax.tickmode === 'full domain') nt *= 100; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
ax._roughDTick = Math.abs(rng[1] - rng[0]) / nt; | ||||||||||||||||||||||||||||
|
@@ -920,7 +923,12 @@ axes.calcTicks = function calcTicks(ax, opts) { | |||||||||||||||||||||||||||
var minorTicks = []; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var tickVals = []; | ||||||||||||||||||||||||||||
var tickFractionalVals = []; | ||||||||||||||||||||||||||||
tickFractionalVals._isSet = false; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var minorTickVals = []; | ||||||||||||||||||||||||||||
var minorTickFractionalVals = []; | ||||||||||||||||||||||||||||
minorTickFractionalVals._isSet = false; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var hasMinor = ax.minor && (ax.minor.ticks || ax.minor.showgrid); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
@@ -944,9 +952,61 @@ axes.calcTicks = function calcTicks(ax, opts) { | |||||||||||||||||||||||||||
axes.prepTicks(mockAx, opts); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if(mockAx.tickmode === 'full domain') { | ||||||||||||||||||||||||||||
var nt = mockAx.nticks; // does mockAx have nitkcs? | ||||||||||||||||||||||||||||
if(nt === undefined) nt = 0; | ||||||||||||||||||||||||||||
if(nt === 0) { | ||||||||||||||||||||||||||||
// pass | ||||||||||||||||||||||||||||
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. For plotly.js/src/plots/cartesian/axes.js Lines 671 to 683 in 620a56b
ie ending up somewhere between 5 and 10 depending on the graph size. For This also reminds me: the new tickmodes should not be allowed at all on category or multicategory axes. 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. Silent fail or throw error if they tried to put tickmode in category or multicategory? |
||||||||||||||||||||||||||||
} else if(nt === 1) { | ||||||||||||||||||||||||||||
tickVals = [0]; | ||||||||||||||||||||||||||||
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.
Suggested change
If you just want one tick I'd put it in the middle. Not that it matters much, this is horrible whatever we choose since you can't tell the scale at all. |
||||||||||||||||||||||||||||
} else if(nt === 2) { | ||||||||||||||||||||||||||||
tickVals = [0, 1]; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
var increment = 1 / (nt - 1); // (nt-2) + 1 | ||||||||||||||||||||||||||||
tickVals.push(0); | ||||||||||||||||||||||||||||
for(var tickIndex = 0; tickIndex < nt - 2; tickIndex++) { | ||||||||||||||||||||||||||||
tickVals.push((tickIndex + 1) * increment); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
tickVals.push(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. For major ticks this is good. For minor, with the existing What about other major/minor tickmode combinations? I think it'd be reasonable to restrict the allowed
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'll take a look at getting minor ticks spaced out between major ticks. Also since I'm working on it I'll take a look at some of the other stuff. Does plotly throw/raise errors on invalid combinations, or is silent? |
||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
if(major) { | ||||||||||||||||||||||||||||
Lib.nestedProperty(ax, 'tickvals').set(tickVals); | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
Lib.nestedProperty(ax.minor, 'tickvals').set(tickVals); | ||||||||||||||||||||||||||||
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. We should try to avoid altering real attribute values after the Also kudos on figuring out |
||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
// tickmode 'domain array' is just 'array' but with a pre-calc step | ||||||||||||||||||||||||||||
// original comment: | ||||||||||||||||||||||||||||
// now that we've figured out the auto values for formatting | ||||||||||||||||||||||||||||
// in case we're missing some ticktext, we can break out for array ticks | ||||||||||||||||||||||||||||
if(mockAx.tickmode === 'array') { | ||||||||||||||||||||||||||||
if(mockAx.tickmode === 'array' || mockAx.tickmode === 'domain array' || mockAx.tickmode === 'full domain') { | ||||||||||||||||||||||||||||
// Mapping proportions to array: | ||||||||||||||||||||||||||||
if(mockAx.tickmode === 'domain array' || mockAx.tickmode === 'full domain') { | ||||||||||||||||||||||||||||
var width = (maxRange - minRange); | ||||||||||||||||||||||||||||
if(axrev) width *= -1; | ||||||||||||||||||||||||||||
var offset = !axrev ? minRange : maxRange; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var currentFractionalVals = []; | ||||||||||||||||||||||||||||
var currentValsProp; | ||||||||||||||||||||||||||||
if(major) { | ||||||||||||||||||||||||||||
currentValsProp = Lib.nestedProperty(ax, 'tickvals'); // Do we need this? | ||||||||||||||||||||||||||||
currentFractionalVals = tickFractionalVals = currentValsProp.get(); | ||||||||||||||||||||||||||||
tickFractionalVals._isSet = true; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
currentValsProp = Lib.nestedProperty(ax.minor, 'tickvals'); | ||||||||||||||||||||||||||||
currentFractionalVals = minorTickFractionalVals = currentValsProp.get(); | ||||||||||||||||||||||||||||
minorTickFractionalVals._isSet = true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var mappedVals = Lib.simpleMap(currentFractionalVals, | ||||||||||||||||||||||||||||
function(fraction, offset, width, type) { | ||||||||||||||||||||||||||||
var mapped = offset + (width * fraction); | ||||||||||||||||||||||||||||
return (type === 'log') ? Math.pow(10, mapped) : mapped; | ||||||||||||||||||||||||||||
}, offset, width, type); | ||||||||||||||||||||||||||||
currentValsProp.set(mappedVals); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Original 'array' only code | ||||||||||||||||||||||||||||
if(major) { | ||||||||||||||||||||||||||||
tickVals = []; | ||||||||||||||||||||||||||||
ticksOut = arrayTicks(ax, !isMinor); | ||||||||||||||||||||||||||||
|
@@ -1204,6 +1264,7 @@ axes.calcTicks = function calcTicks(ax, opts) { | |||||||||||||||||||||||||||
ticksOut.push(t); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
ticksOut = ticksOut.concat(minorTicks); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
ax._inCalcTicks = false; | ||||||||||||||||||||||||||||
|
@@ -1213,6 +1274,18 @@ axes.calcTicks = function calcTicks(ax, opts) { | |||||||||||||||||||||||||||
ticksOut[0].noTick = true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Reset tickvals back to domain array | ||||||||||||||||||||||||||||
if(tickFractionalVals._isSet) { | ||||||||||||||||||||||||||||
delete tickFractionalVals._isSet; | ||||||||||||||||||||||||||||
if(ax.tickmode === 'full domain') tickFractionalVals = []; | ||||||||||||||||||||||||||||
Lib.nestedProperty(ax, 'tickvals').set(tickFractionalVals); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
if(minorTickFractionalVals._isSet) { | ||||||||||||||||||||||||||||
delete tickFractionalVals._isSet; | ||||||||||||||||||||||||||||
if(ax.minor.tickmode === 'full domain') tickFractionalVals = []; | ||||||||||||||||||||||||||||
Lib.nestedProperty(ax.minor, 'tickvals').set(minorTickFractionalVals); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
return ticksOut; | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
@@ -1617,7 +1690,7 @@ axes.tickFirst = function(ax, opts) { | |||||||||||||||||||||||||||
// more precision for hovertext | ||||||||||||||||||||||||||||
axes.tickText = function(ax, x, hover, noSuffixPrefix) { | ||||||||||||||||||||||||||||
var out = tickTextObj(ax, x); | ||||||||||||||||||||||||||||
var arrayMode = ax.tickmode === 'array'; | ||||||||||||||||||||||||||||
var arrayMode = (ax.tickmode === 'array' || ax.tickmode === 'domain array' || ax.tickmode === 'full domain'); | ||||||||||||||||||||||||||||
var extraPrecision = hover || arrayMode; | ||||||||||||||||||||||||||||
var axType = ax.type; | ||||||||||||||||||||||||||||
// TODO multicategory, if we allow ticktext / tickvals | ||||||||||||||||||||||||||||
|
@@ -3333,7 +3406,7 @@ axes.drawGrid = function(gd, ax, opts) { | |||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
var counterAx = opts.counterAxis; | ||||||||||||||||||||||||||||
if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) { | ||||||||||||||||||||||||||||
var isArrayMode = ax.tickmode === 'array'; | ||||||||||||||||||||||||||||
var isArrayMode = (ax.tickmode === 'array' || ax.tickmode === 'domain array' || ax.tickmode === 'full domain'); | ||||||||||||||||||||||||||||
for(var i = 0; i < majorVals.length; i++) { | ||||||||||||||||||||||||||||
var xi = majorVals[i].x; | ||||||||||||||||||||||||||||
if(isArrayMode ? !xi : (Math.abs(xi) < ax.dtick / 100)) { | ||||||||||||||||||||||||||||
|
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.
Yep, you ensured that in tick_value_defaults, then (for minor ticks) this gets pulled into
mockAx
by theextendFlat
.