Skip to content

Commit 1fd9560

Browse files
authored
Merge pull request #3605 from plotly/automargin-edge-cases
Automargin edge cases
2 parents dab105c + 18f827d commit 1fd9560

File tree

8 files changed

+449
-172
lines changed

8 files changed

+449
-172
lines changed

src/plots/cartesian/axes.js

+24
Original file line numberDiff line numberDiff line change
@@ -1984,6 +1984,30 @@ axes.drawOne = function(gd, ax, opts) {
19841984
if(ax.title.text !== fullLayout._dfltTitle[axLetter]) {
19851985
push[s] += ax.title.font.size;
19861986
}
1987+
1988+
if(axLetter === 'x' && bbox.width > 0) {
1989+
var rExtra = bbox.right - (ax._offset + ax._length);
1990+
if(rExtra > 0) {
1991+
push.x = 1;
1992+
push.r = rExtra;
1993+
}
1994+
var lExtra = ax._offset - bbox.left;
1995+
if(lExtra > 0) {
1996+
push.x = 0;
1997+
push.l = lExtra;
1998+
}
1999+
} else if(axLetter === 'y' && bbox.height > 0) {
2000+
var bExtra = bbox.bottom - (ax._offset + ax._length);
2001+
if(bExtra > 0) {
2002+
push.y = 0;
2003+
push.b = bExtra;
2004+
}
2005+
var tExtra = ax._offset - bbox.top;
2006+
if(tExtra > 0) {
2007+
push.y = 1;
2008+
push.t = tExtra;
2009+
}
2010+
}
19872011
}
19882012

19892013
Plots.autoMargin(gd, axAutoMarginID(ax), push);

src/plots/cartesian/set_convert.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -484,15 +484,14 @@ module.exports = function setConvert(ax, fullLayout) {
484484
ax._length = gs.h * (ax.domain[1] - ax.domain[0]);
485485
ax._m = ax._length / (rl0 - rl1);
486486
ax._b = -ax._m * rl1;
487-
}
488-
else {
487+
} else {
489488
ax._offset = gs.l + ax.domain[0] * gs.w;
490489
ax._length = gs.w * (ax.domain[1] - ax.domain[0]);
491490
ax._m = ax._length / (rl1 - rl0);
492491
ax._b = -ax._m * rl0;
493492
}
494493

495-
if(!isFinite(ax._m) || !isFinite(ax._b)) {
494+
if(!isFinite(ax._m) || !isFinite(ax._b) || ax._length < 0) {
496495
fullLayout._replotting = false;
497496
throw new Error('Something went wrong with axis scaling');
498497
}

src/plots/plots.js

+14-16
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,8 @@ plots.doAutoMargin = function(gd) {
18411841
var mr = margin.r;
18421842
var mt = margin.t;
18431843
var mb = margin.b;
1844+
var width = fullLayout.width;
1845+
var height = fullLayout.height;
18441846
var pushMargin = fullLayout._pushmargin;
18451847
var pushMarginIds = fullLayout._pushmarginIds;
18461848

@@ -1876,13 +1878,11 @@ plots.doAutoMargin = function(gd) {
18761878
var pr = pushMargin[k2].r.size;
18771879

18781880
if(fr > fl) {
1879-
var newl = (pl * fr +
1880-
(pr - fullLayout.width) * fl) / (fr - fl);
1881-
var newr = (pr * (1 - fl) +
1882-
(pl - fullLayout.width) * (1 - fr)) / (fr - fl);
1883-
if(newl >= 0 && newr >= 0 && newl + newr > ml + mr) {
1884-
ml = newl;
1885-
mr = newr;
1881+
var newL = (pl * fr + (pr - width) * fl) / (fr - fl);
1882+
var newR = (pr * (1 - fl) + (pl - width) * (1 - fr)) / (fr - fl);
1883+
if(newL >= 0 && newR >= 0 && width - (newL + newR) > 0 && newL + newR > ml + mr) {
1884+
ml = newL;
1885+
mr = newR;
18861886
}
18871887
}
18881888
}
@@ -1892,13 +1892,11 @@ plots.doAutoMargin = function(gd) {
18921892
var pt = pushMargin[k2].t.size;
18931893

18941894
if(ft > fb) {
1895-
var newb = (pb * ft +
1896-
(pt - fullLayout.height) * fb) / (ft - fb);
1897-
var newt = (pt * (1 - fb) +
1898-
(pb - fullLayout.height) * (1 - ft)) / (ft - fb);
1899-
if(newb >= 0 && newt >= 0 && newb + newt > mb + mt) {
1900-
mb = newb;
1901-
mt = newt;
1895+
var newB = (pb * ft + (pt - height) * fb) / (ft - fb);
1896+
var newT = (pt * (1 - fb) + (pb - height) * (1 - ft)) / (ft - fb);
1897+
if(newB >= 0 && newT >= 0 && height - (newT + newB) > 0 && newB + newT > mb + mt) {
1898+
mb = newB;
1899+
mt = newT;
19021900
}
19031901
}
19041902
}
@@ -1911,8 +1909,8 @@ plots.doAutoMargin = function(gd) {
19111909
gs.t = Math.round(mt);
19121910
gs.b = Math.round(mb);
19131911
gs.p = Math.round(margin.pad);
1914-
gs.w = Math.round(fullLayout.width) - gs.l - gs.r;
1915-
gs.h = Math.round(fullLayout.height) - gs.t - gs.b;
1912+
gs.w = Math.round(width) - gs.l - gs.r;
1913+
gs.h = Math.round(height) - gs.t - gs.b;
19161914

19171915
// if things changed and we're not already redrawing, trigger a redraw
19181916
if(!fullLayout._replotting &&
46.7 KB
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
{
2+
"data": [
3+
{
4+
"x": [
5+
"12 AM diagonal",
6+
"1 AM diagonal",
7+
"2 AM diagonal",
8+
"3 AM diagonal",
9+
"4 AM diagonal",
10+
"5 AM diagonal",
11+
"6 AM diagonal",
12+
"7 AM diagonal",
13+
"8 AM diagonal",
14+
"9 AM diagonal",
15+
"10 AM diagonal",
16+
"11 AM diagonal"
17+
],
18+
"y": [
19+
59.44,
20+
68.75,
21+
87.5,
22+
100.5,
23+
95.56,
24+
92.8,
25+
85.25,
26+
77.4,
27+
76.4,
28+
73.94,
29+
74.56,
30+
81.06
31+
]
32+
},
33+
{
34+
"x": [
35+
"12 AM diagonal",
36+
"1 AM diagonal",
37+
"2 AM diagonal",
38+
"3 AM diagonal",
39+
"4 AM diagonal",
40+
"5 AM diagonal",
41+
"6 AM diagonal",
42+
"7 AM diagonal",
43+
"8 AM diagonal",
44+
"9 AM diagonal",
45+
"10 AM diagonal",
46+
"11 AM diagonal"
47+
],
48+
"y": [
49+
59.44,
50+
68.75,
51+
87.5,
52+
100.5,
53+
95.56,
54+
92.8,
55+
85.25,
56+
77.4,
57+
76.4,
58+
73.94,
59+
74.56,
60+
81.06
61+
],
62+
"xaxis": "x2",
63+
"yaxis": "y2"
64+
}
65+
],
66+
"layout": {
67+
"grid": {
68+
"columns": 2,
69+
"rows": 1,
70+
"pattern": "independent"
71+
},
72+
"margin": {
73+
"l": 0,
74+
"r": 0,
75+
"t": 0,
76+
"b": 0
77+
},
78+
"xaxis": {
79+
"showgrid": false,
80+
"showline": true,
81+
"zeroline": true,
82+
"automargin": true,
83+
"side": "top",
84+
"tickangle": 45
85+
},
86+
"yaxis": {
87+
"side": "right",
88+
"showgrid": false,
89+
"showline": true,
90+
"zeroline": true,
91+
"automargin": true
92+
},
93+
"xaxis2": {
94+
"showgrid": false,
95+
"showline": true,
96+
"zeroline": true,
97+
"automargin": true,
98+
"tickangle": 45
99+
},
100+
"yaxis2": {
101+
"side": "left",
102+
"showgrid": false,
103+
"showline": true,
104+
"zeroline": true,
105+
"automargin": true
106+
},
107+
"showlegend": false
108+
}
109+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
{
2+
"data": [
3+
{
4+
"y": [
5+
"12 AM diagonal",
6+
"1 AM diagonal",
7+
"2 AM diagonal",
8+
"3 AM diagonal",
9+
"4 AM diagonal",
10+
"5 AM diagonal",
11+
"6 AM diagonal",
12+
"7 AM diagonal",
13+
"8 AM diagonal",
14+
"9 AM diagonal",
15+
"10 AM diagonal",
16+
"11 AM diagonal"
17+
],
18+
"x": [
19+
59.44,
20+
68.75,
21+
87.5,
22+
100.5,
23+
95.56,
24+
92.8,
25+
85.25,
26+
77.4,
27+
76.4,
28+
73.94,
29+
74.56,
30+
81.06
31+
]
32+
},
33+
{
34+
"y": [
35+
"12 AM diagonal",
36+
"1 AM diagonal",
37+
"2 AM diagonal",
38+
"3 AM diagonal",
39+
"4 AM diagonal",
40+
"5 AM diagonal",
41+
"6 AM diagonal",
42+
"7 AM diagonal",
43+
"8 AM diagonal",
44+
"9 AM diagonal",
45+
"10 AM diagonal",
46+
"11 AM diagonal"
47+
],
48+
"x": [
49+
81.06,
50+
74.56,
51+
73.94,
52+
76.4,
53+
77.4,
54+
85.25,
55+
92.8,
56+
95.56,
57+
100.5,
58+
87.5,
59+
68.75,
60+
59.44
61+
],
62+
"xaxis": "x2",
63+
"yaxis": "y2"
64+
}
65+
],
66+
"layout": {
67+
"grid": {
68+
"columns": 1,
69+
"rows": 2,
70+
"pattern": "independent"
71+
},
72+
"margin": {
73+
"l": 0,
74+
"r": 0,
75+
"t": 0,
76+
"b": 0
77+
},
78+
"xaxis": {
79+
"showgrid": false,
80+
"showline": true,
81+
"zeroline": true,
82+
"automargin": true,
83+
"side": "bottom"
84+
},
85+
"yaxis": {
86+
"side": "right",
87+
"showgrid": false,
88+
"showline": true,
89+
"zeroline": true,
90+
"automargin": true,
91+
"tickangle": -45
92+
},
93+
"xaxis2": {
94+
"showgrid": false,
95+
"showline": true,
96+
"zeroline": true,
97+
"automargin": true,
98+
"side": "top"
99+
},
100+
"yaxis2": {
101+
"showgrid": false,
102+
"showline": true,
103+
"zeroline": true,
104+
"automargin": true,
105+
"tickangle": -45
106+
},
107+
"showlegend": false
108+
}
109+
}

0 commit comments

Comments
 (0)