Compare commits
1491 Commits
compathelp
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a7a1f2e2a | ||
|
|
18b11a71e3 | ||
|
|
9e34ed0383 | ||
|
|
561839a029 | ||
|
|
88f2541288 | ||
|
|
92611ea3b4 | ||
|
|
3e1bad0971 | ||
|
|
a13d4d8554 | ||
|
|
b76dc2d7a3 | ||
|
|
137d339e0b | ||
|
|
e06143ce33 | ||
|
|
06220420a3 | ||
|
|
d8da3c60d9 | ||
|
|
9e92ada61a | ||
|
|
cebca5174b | ||
|
|
e3e86aa6cd | ||
|
|
add8364bbd | ||
|
|
09abf2e40f | ||
|
|
182d4683e6 | ||
|
|
a681f3e307 | ||
|
|
1c59b19343 | ||
|
|
6773666549 | ||
|
|
42bf100ad3 | ||
|
|
e826c87114 | ||
|
|
616d72476a | ||
|
|
4f9a708f66 | ||
|
|
4b73b8b5d5 | ||
|
|
99ad317590 | ||
|
|
90975d95f8 | ||
|
|
f0a1ef8a0c | ||
|
|
49aee2d204 | ||
|
|
02351a45b4 | ||
|
|
e691a42b90 | ||
|
|
8a584ceab4 | ||
|
|
cc1bd28ccd | ||
|
|
4446a63135 | ||
|
|
412a8993ad | ||
|
|
d9fb8b8ef3 | ||
|
|
37eb1db8d2 | ||
|
|
dc3e3176f2 | ||
|
|
2cd3331f30 | ||
|
|
db932d62f6 | ||
|
|
caf4d1857c | ||
|
|
bbde8ad1b1 | ||
|
|
d3449331c9 | ||
|
|
eb746d1641 | ||
|
|
a33c0205b2 | ||
|
|
65ab68c3b5 | ||
|
|
0f4a0c7154 | ||
|
|
02d08beb1e | ||
|
|
d3817796a4 | ||
|
|
dbe81dabd5 | ||
|
|
5c2cc926a6 | ||
|
|
bcc66caf7d | ||
|
|
0686461686 | ||
|
|
5c4fbc5e1a | ||
|
|
5872bdefc4 | ||
|
|
a4849da775 | ||
|
|
afe24f46bc | ||
|
|
79638b7789 | ||
|
|
e82e95c8e3 | ||
|
|
843226bfe1 | ||
|
|
317bfc918a | ||
|
|
4665f5caab | ||
|
|
1520705fa7 | ||
|
|
b60cf3cc53 | ||
|
|
092fb67017 | ||
|
|
4ebadb7612 | ||
|
|
fcd3246e4a | ||
|
|
5f858fe6f6 | ||
|
|
8a4aea1fc7 | ||
|
|
3483799cfc | ||
|
|
a5f52be5c2 | ||
|
|
2b7e304c7e | ||
|
|
6c77801835 | ||
|
|
b34f8b87c1 | ||
|
|
5130da5a40 | ||
|
|
95fd48ed9b | ||
|
|
e31d056820 | ||
|
|
afe85207e1 | ||
|
|
204b2178d0 | ||
|
|
51358717ee | ||
|
|
ed9f0bcab3 | ||
|
|
d342672dd2 | ||
|
|
64d275e7cb | ||
|
|
a919fe59d3 | ||
|
|
88cd04b46a | ||
|
|
325d60e8b8 | ||
|
|
20f576211c | ||
|
|
bb99e7a5ce | ||
|
|
0813b18d69 | ||
|
|
6c67908a3a | ||
|
|
a361ba60b8 | ||
|
|
34c22970f2 | ||
|
|
5d8acf5189 | ||
|
|
59cd5c180e | ||
|
|
77e465a453 | ||
|
|
eb3e10ffa6 | ||
|
|
bf5d1aa060 | ||
|
|
ce70ec26a6 | ||
|
|
6e4cb5fedc | ||
|
|
2a7d2d710e | ||
|
|
e3ea97199f | ||
|
|
2896c5a25a | ||
|
|
824dbe9948 | ||
|
|
3e8db4532b | ||
|
|
0ba580bcaa | ||
|
|
46e19d9ad5 | ||
|
|
b204918b23 | ||
|
|
5d5239834c | ||
|
|
2ddedf97bf | ||
|
|
5facd2bf55 | ||
|
|
915df5d3ee | ||
|
|
2eaf9f3b15 | ||
|
|
91bb983c08 | ||
|
|
311831ca4e | ||
|
|
ab698da5a4 | ||
|
|
34e581ff3f | ||
|
|
acb5d5ac4b | ||
|
|
e8ac74a390 | ||
|
|
806e769185 | ||
|
|
bcd98737bb | ||
|
|
f333cb284a | ||
|
|
1f49839529 | ||
|
|
536712359c | ||
|
|
b13f3d5021 | ||
|
|
2e4344b9b5 | ||
|
|
16e5a49800 | ||
|
|
67bd08614a | ||
|
|
a24fb93ab1 | ||
|
|
b1c11cca33 | ||
|
|
cffeba7609 | ||
|
|
2872c7a345 | ||
|
|
3313780b4e | ||
|
|
47ca50d037 | ||
|
|
1014b8f494 | ||
|
|
ece53c5fd1 | ||
|
|
c34d4e950e | ||
|
|
b6d7bd82e6 | ||
|
|
e5883a3447 | ||
|
|
ead9d87942 | ||
|
|
0beba9d1c8 | ||
|
|
6e79cf4a3e | ||
|
|
693391e135 | ||
|
|
95d1fa0001 | ||
|
|
30d2f01d9d | ||
|
|
834a1523af | ||
|
|
e0bc4b1406 | ||
|
|
492f94bf10 | ||
|
|
cb359c0d4e | ||
|
|
3af92908ee | ||
|
|
5d97de1345 | ||
|
|
f784010c29 | ||
|
|
d618f2e2ca | ||
|
|
d970a6568e | ||
|
|
7de50f91de | ||
|
|
15ce6ebfeb | ||
|
|
75938bf747 | ||
|
|
b3e6e92698 | ||
|
|
b3002c5457 | ||
|
|
6b44955bc4 | ||
|
|
c28bf96c4a | ||
|
|
096d293550 | ||
|
|
cab76f67e2 | ||
|
|
461476f4ed | ||
|
|
11eea2453f | ||
|
|
b51cddceb5 | ||
|
|
60222095b6 | ||
|
|
5dd0ca27a5 | ||
|
|
249ce48cb4 | ||
|
|
5f7c2a5eae | ||
|
|
9e23082a7d | ||
|
|
ef3038314d | ||
|
|
c4752b786b | ||
|
|
a75b17e42f | ||
|
|
c7e3049dac | ||
|
|
3405d2991a | ||
|
|
ca0e52b622 | ||
|
|
b1c56126fb | ||
|
|
e1f507b77f | ||
|
|
0b1ca841cd | ||
|
|
b341df1cb8 | ||
|
|
79cf62cf91 | ||
|
|
c32dbeef8a | ||
|
|
06bc99ef68 | ||
|
|
9305cd41ab | ||
|
|
7427a85661 | ||
|
|
8abae0c575 | ||
|
|
3963957e70 | ||
|
|
58381822d9 | ||
|
|
2472ce164b | ||
|
|
c94cf1855d | ||
|
|
6baa120245 | ||
|
|
7e5ba301fd | ||
|
|
138589bb61 | ||
|
|
c2af71756e | ||
|
|
c1e88d0360 | ||
|
|
e0ea601239 | ||
|
|
e471ce8d28 | ||
|
|
1bdec476c3 | ||
|
|
b23c620d77 | ||
|
|
21c3ac4c45 | ||
|
|
861f537736 | ||
|
|
e9ae75dfa4 | ||
|
|
07bcecd47c | ||
|
|
af3ebe9936 | ||
|
|
9d3ce54c37 | ||
|
|
6df1f38492 | ||
|
|
c4b7757e22 | ||
|
|
d1309c6c7b | ||
|
|
58ed4a60de | ||
|
|
70dec42308 | ||
|
|
fdbd2c397c | ||
|
|
c337f15e18 | ||
|
|
1fe9a9f536 | ||
|
|
41cf64b400 | ||
|
|
19b70c06ff | ||
|
|
40fe8eed9a | ||
|
|
4b94384c7d | ||
|
|
35e96a5302 | ||
|
|
e84905c2a0 | ||
|
|
1c621feacc | ||
|
|
e8356965e9 | ||
|
|
72428000cc | ||
|
|
d9116d577f | ||
|
|
96dbd07627 | ||
|
|
804fab45ad | ||
|
|
2e67e84361 | ||
|
|
b298711379 | ||
|
|
bacf2d2f06 | ||
|
|
bb9cd718a5 | ||
|
|
0af22a8fe6 | ||
|
|
3b0950f915 | ||
|
|
31d3bf3e06 | ||
|
|
c487a10f79 | ||
|
|
ef3417617c | ||
|
|
0d2d516ca6 | ||
|
|
12a1d83595 | ||
|
|
9eba5964d9 | ||
|
|
d74ee63710 | ||
|
|
9941563b0b | ||
|
|
fb82722dd3 | ||
|
|
86a9b8bf6d | ||
|
|
5a19673eaf | ||
|
|
c26561eab3 | ||
|
|
f0ad66da36 | ||
|
|
aca2aa49b8 | ||
|
|
9d56e72f6a | ||
|
|
f06225655d | ||
|
|
4f0f84f400 | ||
|
|
a65cda8b7e | ||
|
|
37744d7b6a | ||
|
|
09a66224ce | ||
|
|
405bc0820b | ||
|
|
1c89bd8727 | ||
|
|
8e17a182f9 | ||
|
|
032c5d1638 | ||
|
|
8d95333d1e | ||
|
|
7bfc97285c | ||
|
|
acca707f34 | ||
|
|
6fa3dae166 | ||
|
|
866cb0c335 | ||
|
|
4d40bae9cc | ||
|
|
5a48002d31 | ||
|
|
0cd81243ad | ||
|
|
ed3bab0e6f | ||
|
|
4621c18b23 | ||
|
|
4f8a265c6a | ||
|
|
e2539a3d19 | ||
|
|
85739932f0 | ||
|
|
9d84e53bcb | ||
|
|
82f31c48b7 | ||
|
|
81571fe534 | ||
|
|
293b8b112e | ||
|
|
d988d4c9d1 | ||
|
|
85bd3ea53f | ||
|
|
cd6a8c87b6 | ||
|
|
175c87cec6 | ||
|
|
c3f45dd712 | ||
|
|
198a59b621 | ||
|
|
c5d7283473 | ||
|
|
7a1bc88f66 | ||
|
|
ad5cd2f1da | ||
|
|
6cf01229bb | ||
|
|
0a9d30f7ac | ||
|
|
7da990b23f | ||
|
|
942fb38dcd | ||
|
|
7ba99d1b06 | ||
|
|
6b82a82d04 | ||
|
|
7c882a7288 | ||
|
|
5343873f72 | ||
|
|
e3a5f2b11e | ||
|
|
34758c82a3 | ||
|
|
748104c807 | ||
|
|
0d2bc3f227 | ||
|
|
c45352d153 | ||
|
|
b833b6582a | ||
|
|
b28a261b39 | ||
|
|
1a1cc08992 | ||
|
|
31d33e6be4 | ||
|
|
2dc812aa15 | ||
|
|
bdbe300412 | ||
|
|
70b635dbe1 | ||
|
|
1e44dd7035 | ||
|
|
4744152f86 | ||
|
|
dc51f2c159 | ||
|
|
cc1f662b3a | ||
|
|
7b77527f80 | ||
|
|
8b6073c088 | ||
|
|
09d35d7b9f | ||
|
|
0a9da21443 | ||
|
|
ea686c331b | ||
|
|
25a36bab85 | ||
|
|
b227fb8943 | ||
|
|
22651e8728 | ||
|
|
5acf967a9e | ||
|
|
5afeba656b | ||
|
|
7b8bd5b253 | ||
|
|
ded808477d | ||
|
|
854d5ba5c9 | ||
|
|
07a619e5ae | ||
|
|
1426c95fd4 | ||
|
|
52ec432cfa | ||
|
|
0742d475bc | ||
|
|
10802baf6e | ||
|
|
c67da7d7b8 | ||
|
|
f85f668f18 | ||
|
|
c4208c7560 | ||
|
|
35fd604e07 | ||
|
|
214663aa4b | ||
|
|
d56a03975f | ||
|
|
ede106073f | ||
|
|
6e8228826d | ||
|
|
8147c59b2f | ||
|
|
54a6518d59 | ||
|
|
c5db139bbb | ||
|
|
a3eca8244e | ||
|
|
9164ee09cb | ||
|
|
ffca3c1305 | ||
|
|
1c84704a81 | ||
|
|
9e824367bb | ||
|
|
10e9325635 | ||
|
|
13141feb4f | ||
|
|
f9833214ce | ||
|
|
a67a006501 | ||
|
|
40b5df38f4 | ||
|
|
c171cd0cf5 | ||
|
|
b7b4c850b6 | ||
|
|
ba4c4d7bfb | ||
|
|
62b6075407 | ||
|
|
c0ff6e3dee | ||
|
|
67f441f152 | ||
|
|
ed7b6f7f64 | ||
|
|
1ccd4ae699 | ||
|
|
bd70951afa | ||
|
|
39cb596868 | ||
|
|
5c13f00716 | ||
|
|
f331bfa010 | ||
|
|
c4681682a1 | ||
|
|
a72b4a3481 | ||
|
|
ff2ae4fe4f | ||
|
|
2df85eb0fd | ||
|
|
508c47895c | ||
|
|
07d32197a1 | ||
|
|
d6878a8ea0 | ||
|
|
b79a2d32fe | ||
|
|
7b1941b129 | ||
|
|
c6d9332cf1 | ||
|
|
670fba56a7 | ||
|
|
9985157eb8 | ||
|
|
9308dd74a8 | ||
|
|
52be7387f2 | ||
|
|
a94c49ab95 | ||
|
|
b7c6a65921 | ||
|
|
d8a40f5400 | ||
|
|
e4c8921ae9 | ||
|
|
fe8d08123c | ||
|
|
defe808619 | ||
|
|
85fa05464d | ||
|
|
a9a24841fe | ||
|
|
0b989cd33e | ||
|
|
773c7a90b4 | ||
|
|
f49f5d1638 | ||
|
|
478868a6a2 | ||
|
|
806dc3aa43 | ||
|
|
0f54c86865 | ||
|
|
5a5864d087 | ||
|
|
baac498532 | ||
|
|
9fba70db5e | ||
|
|
af610735eb | ||
|
|
204adc3e36 | ||
|
|
603dc10788 | ||
|
|
bf16a97cd5 | ||
|
|
8ebe9e8204 | ||
|
|
40cc74bea6 | ||
|
|
92cad5376b | ||
|
|
a3e1a43358 | ||
|
|
2fcd907165 | ||
|
|
2769702687 | ||
|
|
bf43b9ecec | ||
|
|
80748eb5e9 | ||
|
|
7863ab9b3b | ||
|
|
5bc96cfe68 | ||
|
|
2938950bda | ||
|
|
88b86be17a | ||
|
|
aa6b636793 | ||
|
|
dc3d302353 | ||
|
|
4ed13644c4 | ||
|
|
34bf55c033 | ||
|
|
982c79baa7 | ||
|
|
e9b3208d41 | ||
|
|
77a9fe3b47 | ||
|
|
4078424f3c | ||
|
|
b45400b1d3 | ||
|
|
dc3e15b4c9 | ||
|
|
1e3cb4b4ea | ||
|
|
57b48da670 | ||
|
|
e9e95968a9 | ||
|
|
1889f5b7f9 | ||
|
|
2c72882865 | ||
|
|
36a9e3b386 | ||
|
|
03fbc25b33 | ||
|
|
cbb83e9820 | ||
|
|
4420e2009f | ||
|
|
f394698458 | ||
|
|
3ec86e983a | ||
|
|
5dab21e9ba | ||
|
|
330d3231f6 | ||
|
|
74b70fc039 | ||
|
|
01d5ff1580 | ||
|
|
95804039f4 | ||
|
|
2dec8c1192 | ||
|
|
d3380f4ee8 | ||
|
|
cbc0417cea | ||
|
|
914ea027d0 | ||
|
|
434656def6 | ||
|
|
e16e46db47 | ||
|
|
9e66eb5737 | ||
|
|
5c02648cdd | ||
|
|
fd46fd4add | ||
|
|
ac6c7fda11 | ||
|
|
4755635fbd | ||
|
|
c82a3c35ee | ||
|
|
83bce6e895 | ||
|
|
07c5019259 | ||
|
|
093181d358 | ||
|
|
0085706f6f | ||
|
|
31359610bd | ||
|
|
34c6c76cb8 | ||
|
|
734b301abc | ||
|
|
e2907b973f | ||
|
|
9e3ff15522 | ||
|
|
ce8255a462 | ||
|
|
aedb1fbb0b | ||
|
|
cebcdfb3b5 | ||
|
|
b4632c8b48 | ||
|
|
cd4ab0fd24 | ||
|
|
e3cd14944c | ||
|
|
cac0c8d8d3 | ||
|
|
4f352d8e7c | ||
|
|
aa32561fe8 | ||
|
|
f470e6a590 | ||
|
|
ca0041639b | ||
|
|
73208ac3bd | ||
|
|
0112e78c50 | ||
|
|
a3f209b100 | ||
|
|
573c0cf1bf | ||
|
|
a0c939b7c7 | ||
|
|
f4ed35c3b6 | ||
|
|
50b0ae3b0f | ||
|
|
f049f56e0b | ||
|
|
6a459d4c22 | ||
|
|
f576456617 | ||
|
|
a7c4eef861 | ||
|
|
741684251c | ||
|
|
75bd9dbd01 | ||
|
|
42c60a4fd6 | ||
|
|
92caf2e15f | ||
|
|
99188f7a7e | ||
|
|
a9d11cb2be | ||
|
|
8a3fd8f77e | ||
|
|
bb29abb8a4 | ||
|
|
b801b2b272 | ||
|
|
371d9f8dd7 | ||
|
|
49f8e48399 | ||
|
|
dbc14ac761 | ||
|
|
c0e35f2358 | ||
|
|
3ce4e23f1b | ||
|
|
d4d4d5732b | ||
|
|
86a732e9c5 | ||
|
|
530768064e | ||
|
|
89f59532c1 | ||
|
|
c41e586385 | ||
|
|
8cbfe74863 | ||
|
|
27032a3e21 | ||
|
|
07a786a946 | ||
|
|
ad0f623386 | ||
|
|
4fa567aa5b | ||
|
|
c5ae99374a | ||
|
|
e79740d3bd | ||
|
|
dbe6c8dc57 | ||
|
|
9bd075d06b | ||
|
|
1c68a13d2c | ||
|
|
86d3097123 | ||
|
|
6c2d969316 | ||
|
|
30e728213e | ||
|
|
4c9fd4e4b7 | ||
|
|
458d72b36b | ||
|
|
26ddb62a27 | ||
|
|
4aa9d74a28 | ||
|
|
878e590125 | ||
|
|
4e5b490b6c | ||
|
|
f3aa61293b | ||
|
|
cd06648ec3 | ||
|
|
fe7d957be3 | ||
|
|
a39582c06e | ||
|
|
86fbb39723 | ||
|
|
6f49ec112c | ||
|
|
6594b93126 | ||
|
|
f9a1e2e92d | ||
|
|
e58bd8b657 | ||
|
|
5f31ab7169 | ||
|
|
b85468162c | ||
|
|
0550033065 | ||
|
|
89db9025c5 | ||
|
|
10ed39cf83 | ||
|
|
237fa4be7b | ||
|
|
192eb6ffbb | ||
|
|
4fc0f85cf1 | ||
|
|
aecce08a0f | ||
|
|
3ad2e0674a | ||
|
|
05f585f8ad | ||
|
|
c6ba6dd899 | ||
|
|
fcf75a195a | ||
|
|
3195a67915 | ||
|
|
aa837bb027 | ||
|
|
7bb2a29356 | ||
|
|
f0afadf43a | ||
|
|
0525ade990 | ||
|
|
6b22f45dd5 | ||
|
|
fc0e9a1245 | ||
|
|
2ec78be9a1 | ||
|
|
4449398614 | ||
|
|
946f90d3e4 | ||
|
|
c046e6461f | ||
|
|
411de69765 | ||
|
|
4bc6412b46 | ||
|
|
798de8b17c | ||
|
|
b0ff0e58b3 | ||
|
|
5cca5e9148 | ||
|
|
90e0074f44 | ||
|
|
3e14a47e17 | ||
|
|
5d608d1e77 | ||
|
|
20e24cfa8d | ||
|
|
2d0191cd70 | ||
|
|
12d5accf0a | ||
|
|
c02dbca31d | ||
|
|
bb493a872a | ||
|
|
0e25767cd3 | ||
|
|
5d935d29c5 | ||
|
|
f5e6ae9f98 | ||
|
|
4a18098944 | ||
|
|
3994e47d3c | ||
|
|
39d52a5c57 | ||
|
|
91e91ac821 | ||
|
|
e9949251a6 | ||
|
|
16e41f0690 | ||
|
|
6f4400411e | ||
|
|
1bba6afde5 | ||
|
|
909ad3314a | ||
|
|
68a56fee91 | ||
|
|
9f4e32aa4d | ||
|
|
434e189f1e | ||
|
|
c9f7c6b45d | ||
|
|
e58fdf970f | ||
|
|
c97900f7ee | ||
|
|
1b881619e3 | ||
|
|
fbd5d79d49 | ||
|
|
db7420fd5f | ||
|
|
09356ee3b5 | ||
|
|
0122d70640 | ||
|
|
5974d0ac31 | ||
|
|
81170b4342 | ||
|
|
ee316e2913 | ||
|
|
ef93aa87be | ||
|
|
88ebb8152d | ||
|
|
124d2d6aa3 | ||
|
|
cdbafd60c8 | ||
|
|
5eb62abb25 | ||
|
|
3f110d6a6c | ||
|
|
293b43013b | ||
|
|
3536acbcc8 | ||
|
|
0ca5bc9124 | ||
|
|
14b38354da | ||
|
|
06c551ba51 | ||
|
|
f63ee6d79e | ||
|
|
b3f698c460 | ||
|
|
829860fa2d | ||
|
|
1523ef67d5 | ||
|
|
e049b082f3 | ||
|
|
f78899a1ef | ||
|
|
e42b4ad34d | ||
|
|
a7c629f775 | ||
|
|
1ddc673201 | ||
|
|
bba971f7ea | ||
|
|
3f9105054c | ||
|
|
a64ae3d13c | ||
|
|
7b0066c433 | ||
|
|
d657c0cb33 | ||
|
|
50f63cf1eb | ||
|
|
2b22dae757 | ||
|
|
7ca32b5edd | ||
|
|
3f5a1287be | ||
|
|
990e0f3f7f | ||
|
|
849d31d57f | ||
|
|
cfe5ba24a6 | ||
|
|
be1c263df9 | ||
|
|
203af856cd | ||
|
|
019a742c84 | ||
|
|
5330776040 | ||
|
|
fcdb3c1c0d | ||
|
|
cc290818d7 | ||
|
|
14b3852060 | ||
|
|
387f918080 | ||
|
|
d0d95c6cc7 | ||
|
|
d51059f0e9 | ||
|
|
4723c513be | ||
|
|
d1373d8b89 | ||
|
|
9f51b96269 | ||
|
|
601df0c9a9 | ||
|
|
700b5782ec | ||
|
|
6a62d96751 | ||
|
|
25b57cfb55 | ||
|
|
fb390d1872 | ||
|
|
5fafddb995 | ||
|
|
697e5a87cf | ||
|
|
77ba81de19 | ||
|
|
e43f3ee373 | ||
|
|
8f055fef3d | ||
|
|
ce530ef518 | ||
|
|
827462dc21 | ||
|
|
1ecec912a1 | ||
|
|
ca8e775b83 | ||
|
|
c0e50588d3 | ||
|
|
de7717b85f | ||
|
|
a1311e5c60 | ||
|
|
4069b73563 | ||
|
|
a7d6e93af3 | ||
|
|
058983165e | ||
|
|
97036e689e | ||
|
|
d3589db840 | ||
|
|
15bd9c537d | ||
|
|
27764bbc67 | ||
|
|
788e28d18a | ||
|
|
d544647b1b | ||
|
|
3cb81d6d04 | ||
|
|
61f2d825b6 | ||
|
|
5df64bd45b | ||
|
|
7e997da6bd | ||
|
|
35658bf4fe | ||
|
|
f355ff9904 | ||
|
|
8893782b13 | ||
|
|
78f7db138f | ||
|
|
23567964e7 | ||
|
|
0c7f7ba011 | ||
|
|
4731477920 | ||
|
|
57ba6aa5a9 | ||
|
|
3c472f24b5 | ||
|
|
5a4651a0ec | ||
|
|
7bb2132b18 | ||
|
|
fd50469e20 | ||
|
|
e3d13aa17a | ||
|
|
476de3d2a2 | ||
|
|
c986bfa1e6 | ||
|
|
dfd8fada9d | ||
|
|
d4298bf1cc | ||
|
|
02437562a7 | ||
|
|
8cf268a390 | ||
|
|
fbf3878ca5 | ||
|
|
e449d3221c | ||
|
|
a359f21325 | ||
|
|
9da550ba3b | ||
|
|
0a7035979f | ||
|
|
6376d40ae2 | ||
|
|
67f4d79c4a | ||
|
|
50adb6cd9c | ||
|
|
64f3d589b6 | ||
|
|
07b05e075e | ||
|
|
1ceb3a561f | ||
|
|
e1e0f8d1c9 | ||
|
|
f39ba03da5 | ||
|
|
7d7212ba3e | ||
|
|
17a942998d | ||
|
|
6a829e2b1a | ||
|
|
011591ff55 | ||
|
|
c56654c6cf | ||
|
|
90255913a4 | ||
|
|
67d7b4d771 | ||
|
|
3051ce9e57 | ||
|
|
09e90c0ca6 | ||
|
|
dbe9a2c52b | ||
|
|
56a0673713 | ||
|
|
22f1dd72c9 | ||
|
|
9ad3654d4f | ||
|
|
d2c85bdff9 | ||
|
|
ec7a912b58 | ||
|
|
b63e41904b | ||
|
|
78f078ccc2 | ||
|
|
727ced25f1 | ||
|
|
378cabcb73 | ||
|
|
f4fb0862ea | ||
|
|
cda8dae829 | ||
|
|
86c400500e | ||
|
|
23f8ba1db8 | ||
|
|
014b86a44c | ||
|
|
0ac71c6b1e | ||
|
|
29604fd7f2 | ||
|
|
53272b8a9d | ||
|
|
a0b104f563 | ||
|
|
9581a7cc49 | ||
|
|
7d22d84595 | ||
|
|
bf23b8f7a1 | ||
|
|
005dcbc77a | ||
|
|
ad1216639a | ||
|
|
ce778ff7be | ||
|
|
711a8448dc | ||
|
|
0a84ff8caf | ||
|
|
23cbfe9378 | ||
|
|
1cb434ac26 | ||
|
|
138a2fa34a | ||
|
|
60c59a4be0 | ||
|
|
bea1378ff1 | ||
|
|
d46f59e4be | ||
|
|
52da386df1 | ||
|
|
bb26bb0557 | ||
|
|
b3bf5db9bc | ||
|
|
074c56867d | ||
|
|
71fd38fe26 | ||
|
|
4841c13311 | ||
|
|
89dea71874 | ||
|
|
1a9532f9fc | ||
|
|
2b3fa980ee | ||
|
|
0d528b7c82 | ||
|
|
c2cb60ff12 | ||
|
|
ddf6aa9760 | ||
|
|
50f1106cd7 | ||
|
|
3bb406e0ea | ||
|
|
10fa36cdd9 | ||
|
|
0508d05299 | ||
|
|
59a1faf590 | ||
|
|
c0824bdc62 | ||
|
|
606b86c962 | ||
|
|
a50661dd44 | ||
|
|
34f4d318ea | ||
|
|
9fc1d574cd | ||
|
|
9300dffcc3 | ||
|
|
796f9ef47b | ||
|
|
da2dc2cb1b | ||
|
|
f76390c20d | ||
|
|
ef82e53eef | ||
|
|
219939525c | ||
|
|
ae99ed2588 | ||
|
|
8e13bb4ccc | ||
|
|
66db3ceae0 | ||
|
|
060162c356 | ||
|
|
271d93c1ed | ||
|
|
664af999cd | ||
|
|
a1ace08d22 | ||
|
|
4d5f76b80d | ||
|
|
b8c2d62c32 | ||
|
|
6201dfe580 | ||
|
|
d44b7e89e7 | ||
|
|
08e3224f8f | ||
|
|
e9b78e7191 | ||
|
|
f418acf387 | ||
|
|
f097549e3b | ||
|
|
c8b882d17a | ||
|
|
dbbece413c | ||
|
|
9cee7a2c47 | ||
|
|
d6a72a5df5 | ||
|
|
37252ec562 | ||
|
|
1d3e0a5d5d | ||
|
|
a85c10dcdd | ||
|
|
97caa18fb4 | ||
|
|
6af91c7f71 | ||
|
|
e9cd69ea2f | ||
|
|
6724a3a2fe | ||
|
|
a75d309d20 | ||
|
|
5cc08a17b6 | ||
|
|
2220dbc465 | ||
|
|
66250acfaa | ||
|
|
395cc9294b | ||
|
|
3f13a186e7 | ||
|
|
2d8b2332fb | ||
|
|
2cee039dbc | ||
|
|
6193519b1f | ||
|
|
65dac58338 | ||
|
|
164725079d | ||
|
|
42b3c5625f | ||
|
|
cd851df28a | ||
|
|
57b0a81c1c | ||
|
|
1ef15934cc | ||
|
|
0a6edd5d60 | ||
|
|
e8437d76fd | ||
|
|
2e2f7044e2 | ||
|
|
100da5ccae | ||
|
|
d59f6c96d5 | ||
|
|
0628fb9dc3 | ||
|
|
6b71bd961d | ||
|
|
9569f34ae0 | ||
|
|
d830f64cbc | ||
|
|
dd785c3bd3 | ||
|
|
663d556a06 | ||
|
|
e06a51b420 | ||
|
|
da3e0294cd | ||
|
|
57e98ac12d | ||
|
|
740f231d5f | ||
|
|
cf96ddcd30 | ||
|
|
ec532b2cbb | ||
|
|
7989673eb4 | ||
|
|
897a5eee87 | ||
|
|
0665ff907c | ||
|
|
1fc0892551 | ||
|
|
8d7375dc4f | ||
|
|
2594b577d7 | ||
|
|
9b174084f7 | ||
|
|
d196952571 | ||
|
|
df8fe4d28b | ||
|
|
76cf8f0f3d | ||
|
|
748a913ce2 | ||
|
|
10f0e83a38 | ||
|
|
9531fdd122 | ||
|
|
65a84a7215 | ||
|
|
a6d42d3e0f | ||
|
|
23ae2c5a17 | ||
|
|
0e03d7ff95 | ||
|
|
f656179d54 | ||
|
|
33c734a60b | ||
|
|
781e6d2a16 | ||
|
|
4f270fc6dc | ||
|
|
19bb7340f1 | ||
|
|
4ac81d12df | ||
|
|
8bd76ee4bd | ||
|
|
8ae0d8c808 | ||
|
|
b66e134838 | ||
|
|
6dbf004d5f | ||
|
|
928c6d5e6c | ||
|
|
c478c3c9f0 | ||
|
|
a04946e832 | ||
|
|
f9ff2c8962 | ||
|
|
8190d1fdfc | ||
|
|
cc005c6246 | ||
|
|
97c43eb031 | ||
|
|
3907ae7f21 | ||
|
|
c402161845 | ||
|
|
6fb0d69cb3 | ||
|
|
1a4bceace7 | ||
|
|
651548526a | ||
|
|
1f6089d715 | ||
|
|
5dde27eb08 | ||
|
|
52ba52f4e4 | ||
|
|
60dbf77a96 | ||
|
|
880190cea1 | ||
|
|
e591332b71 | ||
|
|
2b44cb5a35 | ||
|
|
d538c4387f | ||
|
|
60bc127925 | ||
|
|
e6cc826174 | ||
|
|
f257c563fb | ||
|
|
8a2a41f75b | ||
|
|
da1b9adc17 | ||
|
|
9d3514224e | ||
|
|
142bb8cc56 | ||
|
|
fb27704d2b | ||
|
|
96ed4b2616 | ||
|
|
6d4353d0b1 | ||
|
|
a2be60b5d1 | ||
|
|
d92990a5f0 | ||
|
|
99ca1074de | ||
|
|
8a908c0de8 | ||
|
|
3c9580fb2f | ||
|
|
309f2db3b1 | ||
|
|
0b8755db4b | ||
|
|
ac2fbadc07 | ||
|
|
535d95334c | ||
|
|
6332aecc60 | ||
|
|
8efe35f5f8 | ||
|
|
493ab0c6b4 | ||
|
|
fa8d437836 | ||
|
|
e95ddc3ef8 | ||
|
|
50a6dd9fb3 | ||
|
|
509a8cdc7e | ||
|
|
672b3a6038 | ||
|
|
4bcafe3f51 | ||
|
|
49eba0bf2f | ||
|
|
d0e01a8d88 | ||
|
|
eb1c126dbc | ||
|
|
6c8fb87635 | ||
|
|
7b8609ea1a | ||
|
|
f478a649a0 | ||
|
|
85ca402790 | ||
|
|
2ebc97d92a | ||
|
|
2bda216d8a | ||
|
|
ca7f69eaa3 | ||
|
|
fcbfda10fb | ||
|
|
51df476015 | ||
|
|
c08555a638 | ||
|
|
93825e2c86 | ||
|
|
c64bbf826c | ||
|
|
91608a6eab | ||
|
|
8cc6d9d487 | ||
|
|
17f3faf672 | ||
|
|
2e25d86daa | ||
|
|
0f349be952 | ||
|
|
8f0d4c4145 | ||
|
|
d61bbcce56 | ||
|
|
2b376a0e4a | ||
|
|
62af64f08a | ||
|
|
882bb1b517 | ||
|
|
a403f9e44b | ||
|
|
0c4623873c | ||
|
|
d1671ea6f0 | ||
|
|
f905d6b697 | ||
|
|
bc144b64c8 | ||
|
|
10c94c739d | ||
|
|
38ada46a43 | ||
|
|
0e73bcdc4e | ||
|
|
e57a9349f6 | ||
|
|
120d63f53f | ||
|
|
b885687187 | ||
|
|
80285061c9 | ||
|
|
fa48e5c490 | ||
|
|
1fcdac4c9e | ||
|
|
352df39026 | ||
|
|
9ab4c31d5c | ||
|
|
e9e6750481 | ||
|
|
bb3e053eb3 | ||
|
|
0bc41f22bb | ||
|
|
de03c3bca8 | ||
|
|
f2b8e8512e | ||
|
|
4c95ca5089 | ||
|
|
9ba633bb59 | ||
|
|
0b932ecb17 | ||
|
|
f6627f3c5c | ||
|
|
06a823a3be | ||
|
|
8c49652add | ||
|
|
0849471bf6 | ||
|
|
e9a4231a5f | ||
|
|
c9b1de33f6 | ||
|
|
2013215ef2 | ||
|
|
8a3ee7bb75 | ||
|
|
eea73202e2 | ||
|
|
cd450f49d4 | ||
|
|
4b0d69b6a4 | ||
|
|
02008284aa | ||
|
|
c857d59400 | ||
|
|
b5c8474e3f | ||
|
|
aafb34f5f5 | ||
|
|
8451b8da0f | ||
|
|
94ca183a5b | ||
|
|
2774b155b4 | ||
|
|
99dff99504 | ||
|
|
10e83b63b6 | ||
|
|
2ef9bb1c0b | ||
|
|
a955ded5c8 | ||
|
|
5861b1f11f | ||
|
|
7e8eb5af31 | ||
|
|
abebbdd54a | ||
|
|
d1aa2097be | ||
|
|
9c0b2ea090 | ||
|
|
60a7e41442 | ||
|
|
a38e4734ac | ||
|
|
40e13793e8 | ||
|
|
5d26068eae | ||
|
|
ac8e1d7f21 | ||
|
|
f3b6221daa | ||
|
|
501f33f5c1 | ||
|
|
967bc89a6d | ||
|
|
3b367f8759 | ||
|
|
c43c19a24f | ||
|
|
445f27a525 | ||
|
|
e7212961dd | ||
|
|
1402ff5ea0 | ||
|
|
693c014064 | ||
|
|
32e681d158 | ||
|
|
d3315a5dae | ||
|
|
591d485e09 | ||
|
|
d3f2a55b59 | ||
|
|
092c7376c8 | ||
|
|
dafd0a620f | ||
|
|
e9970637e0 | ||
|
|
405daa3cfd | ||
|
|
d77899c5a1 | ||
|
|
711754edbc | ||
|
|
3725a8d387 | ||
|
|
93998fee00 | ||
|
|
9ee2e65225 | ||
|
|
e5d9b8ba48 | ||
|
|
d9c2b7bf37 | ||
|
|
dee3ed263c | ||
|
|
dc7bdc6f69 | ||
|
|
e21f40bd9a | ||
|
|
fe2bae37f3 | ||
|
|
e7c7daff0c | ||
|
|
6df6b40d3d | ||
|
|
6286c67c01 | ||
|
|
d89b93fe8f | ||
|
|
e5959d97e4 | ||
|
|
7a809697c4 | ||
|
|
2a4f00b80a | ||
|
|
a18809b922 | ||
|
|
dcae18cde2 | ||
|
|
059fbdfb6d | ||
|
|
978ffb799b | ||
|
|
ec97ec3994 | ||
|
|
6cbdd696cd | ||
|
|
e15da664b0 | ||
|
|
16b9fc08ac | ||
|
|
5660ea9501 | ||
|
|
8ce603d3eb | ||
|
|
54fdd4e177 | ||
|
|
9b24b38767 | ||
|
|
00351ebcf1 | ||
|
|
d3343c43a1 | ||
|
|
c0b375a153 | ||
|
|
f5cb54f223 | ||
|
|
e95b2a2a8f | ||
|
|
8ee5ee062e | ||
|
|
d34b33b4ae | ||
|
|
fdbeace33a | ||
|
|
26f877ec47 | ||
|
|
8dc3d9805a | ||
|
|
08932633d0 | ||
|
|
959fee92a6 | ||
|
|
70c4954e16 | ||
|
|
dffb699fca | ||
|
|
08f993a67f | ||
|
|
c4ee343ef2 | ||
|
|
17acb45653 | ||
|
|
842b8fa70d | ||
|
|
e236005d72 | ||
|
|
c7955420e3 | ||
|
|
c9b186c6ac | ||
|
|
072b6f42f6 | ||
|
|
86bec68b42 | ||
|
|
2a09bd8266 | ||
|
|
2be5756cb8 | ||
|
|
015b48eede | ||
|
|
7fe6a69a21 | ||
|
|
60dcfa9a90 | ||
|
|
3d2f7571a0 | ||
|
|
86c26085b3 | ||
|
|
2d5ad2828b | ||
|
|
bae04d05a3 | ||
|
|
bd287f4656 | ||
|
|
638fe6d245 | ||
|
|
3f05dc3570 | ||
|
|
44150ccbe4 | ||
|
|
c15483d593 | ||
|
|
363f401474 | ||
|
|
a532c97ce2 | ||
|
|
df07dc9377 | ||
|
|
9cf9edffe0 | ||
|
|
2ef13c19ea | ||
|
|
103f0b28ac | ||
|
|
f157c8dc3f | ||
|
|
ade0a2dfdc | ||
|
|
71189e113e | ||
|
|
9fe1f55410 | ||
|
|
827dba1991 | ||
|
|
6ac7b41eb0 | ||
|
|
4c7156ca5e | ||
|
|
9dfc33dc12 | ||
|
|
317069e2a8 | ||
|
|
cb54dc071f | ||
|
|
b413f0d44e | ||
|
|
1784d6179a | ||
|
|
954f002dfe | ||
|
|
083fe89905 | ||
|
|
5906d1c8a5 | ||
|
|
bd46b51b94 | ||
|
|
63e73bc9f0 | ||
|
|
915eafcea0 | ||
|
|
63d9363505 | ||
|
|
721b4b1312 | ||
|
|
f96e239bc0 | ||
|
|
a13e137770 | ||
|
|
6a1af1c888 | ||
|
|
729219f5a0 | ||
|
|
bdcc8cdb8d | ||
|
|
23b852da8f | ||
|
|
8255096bce | ||
|
|
abde25efe0 | ||
|
|
efb5816bc1 | ||
|
|
994b543add | ||
|
|
bb11c62413 | ||
|
|
b8222b46fe | ||
|
|
1f6244195a | ||
|
|
f4fe4b8a05 | ||
|
|
514a7c4fff | ||
|
|
75e65bff8c | ||
|
|
f03e8bbc83 | ||
|
|
fc54177029 | ||
|
|
5a932146cf | ||
|
|
ba09334845 | ||
|
|
5ccf1e965e | ||
|
|
e932c76d93 | ||
|
|
078a675d1a | ||
|
|
408aad6e35 | ||
|
|
f4c15b4b5b | ||
|
|
d0c709a014 | ||
|
|
bf8b828957 | ||
|
|
3964cc19a6 | ||
|
|
3e14a0db95 | ||
|
|
11f3715453 | ||
|
|
e7ab664120 | ||
|
|
2aa3e1a5fc | ||
|
|
f58100b400 | ||
|
|
b918c509ac | ||
|
|
08a4b34c22 | ||
|
|
becd95b9b5 | ||
|
|
f0612ad1b3 | ||
|
|
46fbff72db | ||
|
|
0536be3bf7 | ||
|
|
86561b0af0 | ||
|
|
747181c370 | ||
|
|
c3f8710175 | ||
|
|
4cfcef1066 | ||
|
|
ab0cfd09a4 | ||
|
|
cef5b0293e | ||
|
|
363c842ab4 | ||
|
|
33832fef70 | ||
|
|
51527705de | ||
|
|
44bd1812e0 | ||
|
|
1e536dda4b | ||
|
|
6a03da5837 | ||
|
|
9df962fcce | ||
|
|
b46e460d12 | ||
|
|
e1755dcee7 | ||
|
|
87c44e231b | ||
|
|
c81fe1ea76 | ||
|
|
49555ecc2f | ||
|
|
0425f656ae | ||
|
|
8fabc5f861 | ||
|
|
0deb8f6469 | ||
|
|
df12ddb629 | ||
|
|
33f2f75b00 | ||
|
|
12e0616712 | ||
|
|
a9eeb451fc | ||
|
|
b854f1cc16 | ||
|
|
31fb9f09b4 | ||
|
|
3ba712dde0 | ||
|
|
d38379defb | ||
|
|
3431833a9d | ||
|
|
9c4890d794 | ||
|
|
52cb6fbd3a | ||
|
|
b91aa2bbfc | ||
|
|
c392cc1227 | ||
|
|
a5cd06f3de | ||
|
|
f2e128e8b6 | ||
|
|
a87a5db6d9 | ||
|
|
744f4d3db9 | ||
|
|
d2c6b800d8 | ||
|
|
1f4a471340 | ||
|
|
6b57149619 | ||
|
|
94e4005b0b | ||
|
|
5e15ef8ccb | ||
|
|
b1d509cba0 | ||
|
|
6a3d5202e6 | ||
|
|
ea25f373bd | ||
|
|
e223e9c736 | ||
|
|
f9053ae06f | ||
|
|
46b4a202e5 | ||
|
|
79e6096142 | ||
|
|
08ca46748a | ||
|
|
5b5e298b84 | ||
|
|
773f364e0d | ||
|
|
531e705301 | ||
|
|
b7fedc42d3 | ||
|
|
3301c4b9e0 | ||
|
|
312661aae5 | ||
|
|
977838b573 | ||
|
|
4052ce83a2 | ||
|
|
3136c8f999 | ||
|
|
0b91d51a40 | ||
|
|
8ffac4d20e | ||
|
|
85bdca8f1a | ||
|
|
6ae2d8a291 | ||
|
|
9334711e19 | ||
|
|
aa6712c9df | ||
|
|
7515491698 | ||
|
|
0230e29c62 | ||
|
|
d1cfdd7d3d | ||
|
|
293fd6caaf | ||
|
|
f97bfbba9d | ||
|
|
76429cde7a | ||
|
|
66986a0cbd | ||
|
|
ccec5053b3 | ||
|
|
72e3cac531 | ||
|
|
24267ed286 | ||
|
|
c9b8475a9c | ||
|
|
a90ec5975d | ||
|
|
71ee8d362f | ||
|
|
abb7eb04a6 | ||
|
|
bd7f0dc8d4 | ||
|
|
f23e6c224d | ||
|
|
449d35ebf2 | ||
|
|
1b70fb18e4 | ||
|
|
960e7dbcd9 | ||
|
|
2dee74a3c5 | ||
|
|
9d78772660 | ||
|
|
b44735830a | ||
|
|
448589413b | ||
|
|
f870b01245 | ||
|
|
48de7e33a5 | ||
|
|
d6bebe1ce2 | ||
|
|
e2c387894f | ||
|
|
bf85afe9d6 | ||
|
|
217e67fb7f | ||
|
|
3053bb4cc2 | ||
|
|
8dcff1f73d | ||
|
|
c73a5aaabc | ||
|
|
806d4671ce | ||
|
|
c4a64351ca | ||
|
|
345bceb526 | ||
|
|
5673ced5d7 | ||
|
|
a929903a63 | ||
|
|
b9cf8c3928 | ||
|
|
9b573dce49 | ||
|
|
c2bb17cece | ||
|
|
7e122bdfea | ||
|
|
1ee999af33 | ||
|
|
381f14b657 | ||
|
|
3fec5ae1cf | ||
|
|
b154a1a3e4 | ||
|
|
cef0a55870 | ||
|
|
61e80e96cf | ||
|
|
0db321aecc | ||
|
|
8b7f87506a | ||
|
|
f9f6e0ff57 | ||
|
|
6f36d0998f | ||
|
|
943bdca05e | ||
|
|
bece65e922 | ||
|
|
2fb315af0e | ||
|
|
849c2911a7 | ||
|
|
fa720d6ad4 | ||
|
|
1ab681f509 | ||
|
|
0d776fd09d | ||
|
|
45e33f5b6f | ||
|
|
1c4910f90e | ||
|
|
2f4eb7b558 | ||
|
|
07ed5e7162 | ||
|
|
03716289c3 | ||
|
|
0d38f34e54 | ||
|
|
2544808000 | ||
|
|
02ca049bc6 | ||
|
|
cd20518323 | ||
|
|
ff7235e9b8 | ||
|
|
fb5307ace6 | ||
|
|
e3512b0f0d | ||
|
|
376fae0d79 | ||
|
|
e0e240bfd2 | ||
|
|
079152a69a | ||
|
|
ffed7ebc21 | ||
|
|
cc7c0f1251 | ||
|
|
30c683b201 | ||
|
|
c3fa7c8941 | ||
|
|
ddc89e54f1 | ||
|
|
ed2d5be538 | ||
|
|
c0adba6615 | ||
|
|
22cf3e127e | ||
|
|
0a929d6022 | ||
|
|
698f9d8c9e | ||
|
|
f97a5153b0 | ||
|
|
065089a1a3 | ||
|
|
79fac7a85e | ||
|
|
a46ffbe218 | ||
|
|
dc81c6aa8c | ||
|
|
fc89578536 | ||
|
|
6425ff8f4c | ||
|
|
032f76c69b | ||
|
|
ebaa965604 | ||
|
|
fa44e39030 | ||
|
|
a2aad6be66 | ||
|
|
3f521b3322 | ||
|
|
16618430ed | ||
|
|
4f791a394e | ||
|
|
cfab4e35cc | ||
|
|
3ea521793b | ||
|
|
2511d2128b | ||
|
|
d0920ac919 | ||
|
|
acd6cfabc1 | ||
|
|
86b92698cc | ||
|
|
fb402d9901 | ||
|
|
ddcf443f89 | ||
|
|
3dd3808895 | ||
|
|
12df81f390 | ||
|
|
dbd28bc57b | ||
|
|
171c2f8e33 | ||
|
|
88c94e11b9 | ||
|
|
949e245e15 | ||
|
|
f1db5d6502 | ||
|
|
94086a0ed1 | ||
|
|
8d67577711 | ||
|
|
657f6224d1 | ||
|
|
d98481fca8 | ||
|
|
1c694ca81c | ||
|
|
c52d5e44c7 | ||
|
|
f2a2797c34 | ||
|
|
d14fac5d1e | ||
|
|
2f8e27ab01 | ||
|
|
2dce036477 | ||
|
|
f98ef14f15 | ||
|
|
c1ccf16830 | ||
|
|
0b31e26007 | ||
|
|
96ec035811 | ||
|
|
474f0f922d | ||
|
|
2fcbb093ac | ||
|
|
8e3f76cb6f | ||
|
|
07146e84e5 | ||
|
|
47590b2538 | ||
|
|
d036794576 | ||
|
|
b6234a9ea0 | ||
|
|
d1b2c7f751 | ||
|
|
d353dca531 | ||
|
|
709a8a9609 | ||
|
|
0942b14905 | ||
|
|
d6af1da35a | ||
|
|
bbbee44c66 | ||
|
|
9499cef25d | ||
|
|
7c8952fadf | ||
|
|
8b2d3e926a | ||
|
|
fb40ed1f59 | ||
|
|
e88654cca5 | ||
|
|
a9b9b3c357 | ||
|
|
99c8bfe12d | ||
|
|
3eb2b783dc | ||
|
|
a20b275eaf | ||
|
|
c29694ae70 | ||
|
|
ebc93b6935 | ||
|
|
7dcbe911b1 | ||
|
|
c2df99cc66 | ||
|
|
a992effa5e | ||
|
|
e49eb9bc83 | ||
|
|
f2d7d394bb | ||
|
|
87d40cd34d | ||
|
|
5f24f88f12 | ||
|
|
9c465b58db | ||
|
|
ad4a00c055 | ||
|
|
54671c15d7 | ||
|
|
fff8f84acf | ||
|
|
4d8ea50f69 | ||
|
|
43f31cbc98 | ||
|
|
d98e76e36d | ||
|
|
e2a5e40019 | ||
|
|
3c2c2c18d7 | ||
|
|
0ee1d867c9 | ||
|
|
b145ea9ef5 | ||
|
|
73971896ee | ||
|
|
f5f4128e30 | ||
|
|
70dfa52a9a | ||
|
|
2e53c57114 | ||
|
|
0485b1313a | ||
|
|
f0f28086a9 | ||
|
|
580ac8a9d1 | ||
|
|
84fc6b0be0 | ||
|
|
de81220c01 | ||
|
|
ee1f948448 | ||
|
|
995c7d349e | ||
|
|
4389160a6a | ||
|
|
8c6295658b | ||
|
|
a270e342b7 | ||
|
|
42e2266530 | ||
|
|
02e6d729c1 | ||
|
|
baac9a0578 | ||
|
|
b73dd46521 | ||
|
|
7bbb2070a7 | ||
|
|
8859518f2d | ||
|
|
7f063c71b5 | ||
|
|
1e9691a7c0 | ||
|
|
e5269bcf95 | ||
|
|
fdd76a6ca1 | ||
|
|
d19525c269 | ||
|
|
593331dec2 | ||
|
|
b780d90097 | ||
|
|
2f9ce790e4 | ||
|
|
d8f4519b0c | ||
|
|
702e41f55d | ||
|
|
682ac29fcd | ||
|
|
c6ce23d0af | ||
|
|
9ae7d2dd9d | ||
|
|
6ec05628d5 | ||
|
|
f26ebdc2f1 | ||
|
|
c97255fc08 | ||
|
|
9d1ede016b | ||
|
|
7eb8f2452c | ||
|
|
0a6e691222 | ||
|
|
238aca6a78 | ||
|
|
1f039b3adc | ||
|
|
219465d599 | ||
|
|
1963cee94a | ||
|
|
ae43e05f6f | ||
|
|
5cd2ba7296 | ||
|
|
4a00018f25 | ||
|
|
32c725e770 | ||
|
|
4e2ee35125 | ||
|
|
35b0751714 | ||
|
|
28ebc0ccd8 | ||
|
|
3d693d88e0 | ||
|
|
6ddf31d465 | ||
|
|
5c1ea707ca | ||
|
|
a6669f89a0 | ||
|
|
2a2d509c36 | ||
|
|
fd4efb3f33 | ||
|
|
e90ab0b898 | ||
|
|
44367c54da | ||
|
|
3273a65889 | ||
|
|
0aa606d835 | ||
|
|
40848e7432 | ||
|
|
fe4cc4d58c | ||
|
|
56f90ffaf3 | ||
|
|
dfb556339f | ||
|
|
61f5a7f437 | ||
|
|
3be9b8d076 | ||
|
|
2a138dee40 | ||
|
|
712ef74b81 | ||
|
|
ba8ca424cf | ||
|
|
c6784a779b | ||
|
|
d667cb7e57 | ||
|
|
10a5c2ed1d | ||
|
|
8cce78c890 | ||
|
|
294ade8aad | ||
|
|
a59e8411c9 | ||
|
|
d973f437ef | ||
|
|
d5ce2c1431 | ||
|
|
834e2a99e3 | ||
|
|
f8e9e33347 | ||
|
|
a0c7781296 | ||
|
|
2ea998983d | ||
|
|
e44b220b84 | ||
|
|
756cccb114 | ||
|
|
af9982b804 | ||
|
|
1b946a18d2 | ||
|
|
a397bfd549 | ||
|
|
d276ac6857 | ||
|
|
475d1c2398 | ||
|
|
d6ae848aec | ||
|
|
8976fc4ae4 | ||
|
|
095191f8e6 | ||
|
|
83ad031c13 | ||
|
|
2b1673df6f | ||
|
|
b867ad58f8 | ||
|
|
8b897c3460 | ||
|
|
e5cb36af7a | ||
|
|
cdaa10be27 | ||
|
|
fe3813b5af | ||
|
|
311bbdc99b | ||
|
|
c90fa4d63c | ||
|
|
04c1c6c0ed | ||
|
|
47a8294d99 | ||
|
|
f3cf8d884a | ||
|
|
fe2d46d1eb | ||
|
|
a0ba0e232e | ||
|
|
6565515446 | ||
|
|
65b0f44626 | ||
|
|
b80ba99100 | ||
|
|
60980f7f7f | ||
|
|
5132bebc7f | ||
|
|
275738e7ea | ||
|
|
5759fd61ea | ||
|
|
577acbdeb6 | ||
|
|
4d94725797 | ||
|
|
ad4f92e36d | ||
|
|
577ac33826 | ||
|
|
3275719f12 | ||
|
|
f636edf4c0 | ||
|
|
84039a79de | ||
|
|
d64ba707e9 | ||
|
|
703bdf6cfe | ||
|
|
e7f79e9144 | ||
|
|
79fd7f282d | ||
|
|
3078a44fce | ||
|
|
ba4f2665e0 | ||
|
|
5504f59098 | ||
|
|
265439fb2b | ||
|
|
450b36bdde | ||
|
|
f1e7e3a4de | ||
|
|
becfa33ee8 | ||
|
|
ec5fa44f2a | ||
|
|
3152d4b4fe | ||
|
|
66d2e4746a |
12
.JuliaFormatter.toml
Normal file
12
.JuliaFormatter.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
always_for_in = true
|
||||||
|
import_to_using = false
|
||||||
|
align_pair_arrow = true
|
||||||
|
align_assignment = true
|
||||||
|
align_conditional = true
|
||||||
|
always_use_return = false
|
||||||
|
conditional_to_if = false
|
||||||
|
whitespace_in_kwargs = true
|
||||||
|
remove_extra_newlines = true
|
||||||
|
whitespace_ops_in_indices = true
|
||||||
|
short_to_long_function_def = false
|
||||||
|
annotate_untyped_fields_with_any = false
|
||||||
6
.gitattributes
vendored
Normal file
6
.gitattributes
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Set default behaviour to automatically normalize line endings.
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
# Force bash scripts to always use lf line endings so that if a repo is accessed
|
||||||
|
# in Unix via a file share from Windows, the scripts will work.
|
||||||
|
*.sh text eol=lf
|
||||||
7
.github/ISSUE_TEMPLATE/bug.md
vendored
7
.github/ISSUE_TEMPLATE/bug.md
vendored
@ -7,7 +7,7 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Please search existing issues to avoid duplicates.
|
<!-- Please search existing issues to avoid duplicates. -->
|
||||||
|
|
||||||
## Details
|
## Details
|
||||||
|
|
||||||
@ -20,13 +20,14 @@ Backend | yes | no | untested
|
|||||||
-------------|-----|-----|---------
|
-------------|-----|-----|---------
|
||||||
gr (default) | | |
|
gr (default) | | |
|
||||||
pyplot | | |
|
pyplot | | |
|
||||||
plotly | | |
|
|
||||||
plotlyjs | | |
|
plotlyjs | | |
|
||||||
pgfplotsx | | |
|
pgfplotsx | | |
|
||||||
|
unicodeplots | | |
|
||||||
inspectdr | | |
|
inspectdr | | |
|
||||||
|
gaston | | |
|
||||||
|
|
||||||
### Versions
|
### Versions
|
||||||
|
|
||||||
Plots.jl version:
|
Plots.jl version:
|
||||||
Backend version:
|
Backend version (`]st -m <backend(s)>`):
|
||||||
Output of `versioninfo()`:
|
Output of `versioninfo()`:
|
||||||
|
|||||||
13
.github/workflows/CompatHelper.yml
vendored
13
.github/workflows/CompatHelper.yml
vendored
@ -2,23 +2,16 @@ name: CompatHelper
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '00 * * * *'
|
- cron: '00 00 * * *'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
CompatHelper:
|
CompatHelper:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
julia-version: [1.2.0]
|
|
||||||
julia-arch: [x86]
|
|
||||||
os: [ubuntu-latest]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: julia-actions/setup-julia@latest
|
|
||||||
with:
|
|
||||||
version: ${{ matrix.julia-version }}
|
|
||||||
- name: Pkg.add("CompatHelper")
|
- name: Pkg.add("CompatHelper")
|
||||||
run: julia -e 'using Pkg; Pkg.add("CompatHelper")'
|
run: julia -e 'using Pkg; Pkg.add("CompatHelper")'
|
||||||
- name: CompatHelper.main()
|
- name: CompatHelper.main()
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
COMPATHELPER_PRIV: ${{ secrets.COMPATHELPER_PRIV }} # optional
|
||||||
run: julia -e 'using CompatHelper; CompatHelper.main()'
|
run: julia -e 'using CompatHelper; CompatHelper.main()'
|
||||||
|
|||||||
108
.github/workflows/SnoopCompile.yml
vendored
Normal file
108
.github/workflows/SnoopCompile.yml
vendored
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# NOTE: this file should be named 'SnoopCompile.yml', cf github.com/aminya/CompileBot.jl/blob/master/src/CompileBot.jl#L57
|
||||||
|
|
||||||
|
name: SnoopCompile
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master # NOTE: to run the bot only on pushes to master
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
SnoopCompile:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
env:
|
||||||
|
GKS_ENCODING: "utf8"
|
||||||
|
GKSwstype: "nul"
|
||||||
|
PLOTS_TEST: "true"
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
continue-on-error: ${{ matrix.version == '~1.8.0-0' }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
version: # NOTE: the versions below should match those in your botconfig
|
||||||
|
- '1.6' # ⎤
|
||||||
|
- '1.7' # |
|
||||||
|
- '~1.8.0-0' # |
|
||||||
|
# - 'nightly' # ⎦ <<< keep these versions in sync with deps/SnoopCompile/snoop_bot_config.jl
|
||||||
|
# ^^^^^^^^^ for 'nightly', see github.com/JuliaPlots/Plots.jl/issues/4079
|
||||||
|
os: # NOTE: should match the os setting of your botconfig
|
||||||
|
- ubuntu-latest
|
||||||
|
arch:
|
||||||
|
- x64
|
||||||
|
steps:
|
||||||
|
# Setup environment
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: julia-actions/setup-julia@latest
|
||||||
|
with:
|
||||||
|
version: ${{matrix.version}}
|
||||||
|
|
||||||
|
- name: Set Swap Space
|
||||||
|
uses: pierotofy/set-swap-space@master
|
||||||
|
with:
|
||||||
|
swap-size-gb: 10 # required (not enough memory on github actions virtual machine)
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
cat /proc/cpuinfo
|
||||||
|
cat /proc/meminfo
|
||||||
|
cat /proc/swaps
|
||||||
|
free
|
||||||
|
df -h
|
||||||
|
julia --project -e 'using Pkg; Pkg.instantiate()'
|
||||||
|
julia -e 'using Pkg; Pkg.add(PackageSpec(name="CompileBot", version="1")); Pkg.develop(PackageSpec(; path=pwd())); using CompileBot; CompileBot.addtestdep()'
|
||||||
|
|
||||||
|
# TESTCMD
|
||||||
|
- name: Default TESTCMD
|
||||||
|
run: echo "TESTCMD=julia" >> $GITHUB_ENV
|
||||||
|
- name: Ubuntu TESTCMD
|
||||||
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
|
run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# Generate precompile files
|
||||||
|
- name: Generating precompile files
|
||||||
|
run: $TESTCMD --project -e 'include("deps/SnoopCompile/snoop_bot.jl")' # NOTE: must match path
|
||||||
|
|
||||||
|
# Run benchmarks
|
||||||
|
- name: Running Benchmark
|
||||||
|
run: $TESTCMD --project -e 'include("deps/SnoopCompile/snoop_bench.jl")' # NOTE: optional, if have benchmark file
|
||||||
|
|
||||||
|
- name: Upload all
|
||||||
|
uses: actions/upload-artifact@v2.0.1
|
||||||
|
with:
|
||||||
|
path: ./
|
||||||
|
|
||||||
|
Create_PR:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
needs: SnoopCompile
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Download all
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
|
||||||
|
- name: CompileBot postprocess
|
||||||
|
run: |
|
||||||
|
if ! grep -m1 -q 'format: off' artifact/src/precompile_includer.jl; then sed -i '1 i\#! format: off' artifact/src/precompile_includer.jl; fi
|
||||||
|
julia -e 'using Pkg; Pkg.add(PackageSpec(name="CompileBot", version="1")); using CompileBot; CompileBot.postprocess()'
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v3
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
commit-message: Update precompile_*.jl file [skip ci]
|
||||||
|
title: "[AUTO] Update precompiles [skip ci]"
|
||||||
|
labels: |
|
||||||
|
SnoopCompile
|
||||||
|
no changelog
|
||||||
|
branch: "Test_SnoopCompile_AutoPR_${{ github.ref }}"
|
||||||
|
|
||||||
|
Skip:
|
||||||
|
if: "contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Skip CI 🚫
|
||||||
|
run: echo skip ci
|
||||||
8
.github/workflows/TagBot.yml
vendored
8
.github/workflows/TagBot.yml
vendored
@ -1,11 +1,15 @@
|
|||||||
name: TagBot
|
name: TagBot
|
||||||
on:
|
on:
|
||||||
schedule:
|
issue_comment:
|
||||||
- cron: 0 * * * *
|
types:
|
||||||
|
- created
|
||||||
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
TagBot:
|
TagBot:
|
||||||
|
if: github.event_name == 'workflow_dispatch' || github.actor == 'JuliaTagBot'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: JuliaRegistries/TagBot@v1
|
- uses: JuliaRegistries/TagBot@v1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
ssh: ${{ secrets.TAGBOT_KEY }}
|
||||||
|
|||||||
31
.github/workflows/benchmark.yml
vendored
Normal file
31
.github/workflows/benchmark.yml
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
name: benchmarks
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Benchmark:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: julia-actions/setup-julia@latest
|
||||||
|
with:
|
||||||
|
version: '1.7'
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
- name: Ubuntu TESTCMD
|
||||||
|
run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
|
||||||
|
- name: Install Plots dependencies
|
||||||
|
uses: julia-actions/julia-buildpkg@latest
|
||||||
|
- name: Install Benchmarking dependencies
|
||||||
|
run: julia -e 'using Pkg; pkg"add PkgBenchmark BenchmarkCI@0.1"'
|
||||||
|
|
||||||
|
- name: Run benchmarks
|
||||||
|
run: $TESTCMD -e 'using BenchmarkCI; BenchmarkCI.judge()'
|
||||||
|
- name: Print judgement
|
||||||
|
run: julia -e 'using BenchmarkCI; BenchmarkCI.displayjudgement()'
|
||||||
|
- name: Post results
|
||||||
|
run: julia -e 'using BenchmarkCI; BenchmarkCI.postjudge()'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
93
.github/workflows/ci.yml
vendored
Normal file
93
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
CI:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
env:
|
||||||
|
GKS_ENCODING: "utf8"
|
||||||
|
GKSwstype: "nul"
|
||||||
|
|
||||||
|
name: Julia ${{ matrix.version }} - ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
continue-on-error: ${{ matrix.version == 'nightly' }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
version:
|
||||||
|
- '1.6' # LTS
|
||||||
|
- '1.7' # latest stable
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
- windows-latest
|
||||||
|
- macos-latest
|
||||||
|
arch:
|
||||||
|
- x64
|
||||||
|
# - x86
|
||||||
|
include:
|
||||||
|
- version: 'nightly'
|
||||||
|
os: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# Setup environment
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: julia-actions/setup-julia@latest
|
||||||
|
with:
|
||||||
|
version: ${{ matrix.version }}
|
||||||
|
- name: Cache artifacts
|
||||||
|
uses: actions/cache@v1
|
||||||
|
env:
|
||||||
|
cache-name: cache-artifacts
|
||||||
|
with:
|
||||||
|
path: ~/.julia/artifacts
|
||||||
|
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-test-${{ env.cache-name }}-
|
||||||
|
${{ runner.os }}-test-
|
||||||
|
${{ runner.os }}-
|
||||||
|
|
||||||
|
# TESTCMD
|
||||||
|
- name: Default TESTCMD
|
||||||
|
run: echo "TESTCMD=julia" >> $GITHUB_ENV
|
||||||
|
- name: Ubuntu TESTCMD
|
||||||
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
|
run: |
|
||||||
|
echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install gnuplot poppler-utils texlive-{latex-base,latex-extra,luatex}
|
||||||
|
sudo fc-cache -vr
|
||||||
|
|
||||||
|
# Julia Dependencies
|
||||||
|
- name: Install Julia dependencies
|
||||||
|
uses: julia-actions/julia-buildpkg@latest
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
- name: Run Graphical test
|
||||||
|
run: |
|
||||||
|
$TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true)'
|
||||||
|
$TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("StatsPlots"); Pkg.test("StatsPlots")'
|
||||||
|
$TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("GraphRecipes"); Pkg.test("GraphRecipes")'
|
||||||
|
|
||||||
|
# Codecov
|
||||||
|
- uses: julia-actions/julia-processcoverage@v1
|
||||||
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
|
- uses: codecov/codecov-action@v2
|
||||||
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
|
with:
|
||||||
|
file: lcov.info
|
||||||
|
|
||||||
|
Skip:
|
||||||
|
if: "contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Skip CI 🚫
|
||||||
|
run: echo skip ci
|
||||||
34
.github/workflows/docs.yml
vendored
Normal file
34
.github/workflows/docs.yml
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
name: docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags: '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Build_docs:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: JuliaPlots/PlotDocs.jl
|
||||||
|
- uses: julia-actions/setup-julia@v1
|
||||||
|
- name: Cache artifacts
|
||||||
|
uses: actions/cache@v1
|
||||||
|
env:
|
||||||
|
cache-name: cache-artifacts
|
||||||
|
with:
|
||||||
|
path: ~/.julia/artifacts
|
||||||
|
key: ${{runner.os}}-test-${{env.cache-name}}-${{hashFiles('**/Project.toml')}}
|
||||||
|
restore-keys: |
|
||||||
|
${{runner.os}}-test-${{env.cache-name}}-
|
||||||
|
${{runner.os}}-test-
|
||||||
|
${{runner.os}}-
|
||||||
|
- name: Build documentation
|
||||||
|
env:
|
||||||
|
PYTHON: ""
|
||||||
|
DOCUMENTER_KEY: ${{secrets.DOCUMENTER_KEY}}
|
||||||
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
run: bash docs/ci_build.sh
|
||||||
54
.github/workflows/format_check.yml
vendored
Normal file
54
.github/workflows/format_check.yml
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
name: format
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
code-style:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: julia-actions/setup-julia@v1
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
using Pkg
|
||||||
|
Pkg.add([
|
||||||
|
PackageSpec("JuliaFormatter"),
|
||||||
|
PackageSpec(url = "https://github.com/tkf/JuliaProjectFormatter.jl.git"),
|
||||||
|
])
|
||||||
|
shell: julia --color=yes {0}
|
||||||
|
|
||||||
|
- name: Format Julia files
|
||||||
|
run: |
|
||||||
|
using JuliaFormatter
|
||||||
|
format(["src", "test"])
|
||||||
|
shell: julia --color=yes --compile=min -O0 {0}
|
||||||
|
- name: suggester / JuliaFormatter
|
||||||
|
uses: reviewdog/action-suggester@v1
|
||||||
|
with:
|
||||||
|
tool_name: JuliaFormatter
|
||||||
|
fail_on_error: true
|
||||||
|
|
||||||
|
# reviewdog/action-suggester not using `cleanup` flag?
|
||||||
|
- name: Cleanup
|
||||||
|
if: success() || failure()
|
||||||
|
run: |
|
||||||
|
git checkout -- .
|
||||||
|
git clean --force
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Format Julia project files
|
||||||
|
if: success() || failure()
|
||||||
|
run: |
|
||||||
|
using JuliaProjectFormatter
|
||||||
|
format_projects()
|
||||||
|
shell: julia --color=yes --compile=min -O0 {0}
|
||||||
|
- name: suggester / JuliaProjectFormatter
|
||||||
|
if: success() || failure()
|
||||||
|
uses: reviewdog/action-suggester@v1
|
||||||
|
with:
|
||||||
|
tool_name: JuliaProjectFormatter
|
||||||
|
fail_on_error: true
|
||||||
35
.github/workflows/format_pr.yml
vendored
Normal file
35
.github/workflows/format_pr.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: format
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 1 * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pr:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install JuliaFormatter and format
|
||||||
|
run: |
|
||||||
|
julia -e 'using Pkg; Pkg.add(PackageSpec(name="JuliaFormatter"))'
|
||||||
|
julia -e 'using JuliaFormatter; [format(["src", "test"]) for _ in 1:2]'
|
||||||
|
git diff --exit-code
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
if: ${{ failure() }}
|
||||||
|
id: cpr
|
||||||
|
uses: peter-evans/create-pull-request@v3
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
commit-message: "Format .jl files [skip ci]"
|
||||||
|
title: 'Automatic JuliaFormatter.jl run'
|
||||||
|
branch: auto-juliaformatter-pr
|
||||||
|
delete-branch: true
|
||||||
|
labels: formatting, automated pr, no changelog
|
||||||
|
|
||||||
|
- name: Check outputs
|
||||||
|
if: ${{ failure() }}
|
||||||
|
run: |
|
||||||
|
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
|
||||||
|
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
|
||||||
5
.gitignore
vendored
5
.gitignore
vendored
@ -4,9 +4,12 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
examples/.ipynb_checkpoints/*
|
examples/.ipynb_checkpoints/*
|
||||||
examples/meetup/.ipynb_checkpoints/*
|
examples/meetup/.ipynb_checkpoints/*
|
||||||
deps/plotly-latest.min.js
|
deps/plotly-*
|
||||||
deps/build.log
|
deps/build.log
|
||||||
deps/deps.jl
|
deps/deps.jl
|
||||||
Manifest.toml
|
Manifest.toml
|
||||||
dev/
|
dev/
|
||||||
test/tmpplotsave.hdf5
|
test/tmpplotsave.hdf5
|
||||||
|
/.benchmarkci
|
||||||
|
/benchmark/*.json
|
||||||
|
.vscode/
|
||||||
|
|||||||
44
.travis.yml
44
.travis.yml
@ -1,44 +0,0 @@
|
|||||||
# Documentation: http://docs.travis-ci.com/user/languages/julia/
|
|
||||||
language: julia
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
# - osx
|
|
||||||
julia:
|
|
||||||
- 1.0
|
|
||||||
- 1
|
|
||||||
- nightly
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- julia: nightly
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- at-spi2-core
|
|
||||||
- libgtk-3-dev
|
|
||||||
- xauth
|
|
||||||
- xvfb
|
|
||||||
|
|
||||||
env:
|
|
||||||
- GKS_ENCODING="utf8"
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.julia/artifacts
|
|
||||||
|
|
||||||
sudo: required
|
|
||||||
before_install:
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pwd ; fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./test/install_wkhtmltoimage.sh ; fi
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: true
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- julia -e 'using Pkg; Pkg.add("Coverage"); using Coverage; Codecov.submit(process_folder())'
|
|
||||||
|
|
||||||
script:
|
|
||||||
- if [[ -a .git/shallow ]]; then git fetch --unshallow; fi
|
|
||||||
- if [[ `uname` = "Linux" ]]; then TESTCMD="xvfb-run julia"; else TESTCMD="julia"; fi
|
|
||||||
- $TESTCMD -e 'using Pkg; Pkg.build(); Pkg.test(coverage=true)'
|
|
||||||
722
.zenodo.json
Normal file
722
.zenodo.json
Normal file
@ -0,0 +1,722 @@
|
|||||||
|
{
|
||||||
|
"title": "Plots.jl",
|
||||||
|
"license": "MIT",
|
||||||
|
"creators": [
|
||||||
|
{
|
||||||
|
"affiliation": "Headlands Technologies",
|
||||||
|
"name": "Tom Breloff"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contributors":[
|
||||||
|
{
|
||||||
|
"affiliation": "TU Wien",
|
||||||
|
"name": "Daniel Schwabeneder",
|
||||||
|
"orcid": "0000-0002-0412-0777",
|
||||||
|
"type": "ProjectLeader"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "GLOBE Institute, University of Copenhagen",
|
||||||
|
"name": "Michael Krabbe Borregaard",
|
||||||
|
"orcid": "0000-0002-8146-8435",
|
||||||
|
"type": "ProjectLeader"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Leibniz Universit\u00e4t Hannover",
|
||||||
|
"name": "Simon Christ",
|
||||||
|
"orcid": "0000-0002-5866-1472",
|
||||||
|
"type": "ProjectLeader"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Forschungszentrum J\u00fclich",
|
||||||
|
"name": "Josef Heinen",
|
||||||
|
"orcid": "0000-0001-6509-1925",
|
||||||
|
"type": "ProjectMember"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Yuval",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andrew Palugniok",
|
||||||
|
"type": "ProjectMember"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "@beacon-biosignals",
|
||||||
|
"name": "Simon Danisch",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Veos Digital (https://veos.digital/)",
|
||||||
|
"name": "Pietro Vertechi",
|
||||||
|
"type": "ProjectMember"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Korea Advanced Inst. of Science and Technology (KAIST)",
|
||||||
|
"name": "Zhanibek Omarov",
|
||||||
|
"type": "ProjectMember",
|
||||||
|
"orcid": "0000-0002-8783-8791"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Thatcher Chamberlin",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@ma-laforge",
|
||||||
|
"type": "ProjectMember"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Massachusetts Institute of Technology",
|
||||||
|
"name": "Christopher Rackauckas",
|
||||||
|
"orcid": "0000-0001-5850-0663",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Max Planck Institute for Physics",
|
||||||
|
"name": "Oliver Schulz",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "@JuliaComputing",
|
||||||
|
"name": "Sebastian Pfitzner",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Takafumi Arakaki",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "University of Manitoba",
|
||||||
|
"name": "Amin Yahyaabadi",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jack Devine",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Pech",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "@JuliaComputing",
|
||||||
|
"name": "Patrick Kofod Mogensen",
|
||||||
|
"type": "Other",
|
||||||
|
"orcid": "0000-0002-4910-1932"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Samuel S. Watson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "UC Davis",
|
||||||
|
"name": "Naoki Saito",
|
||||||
|
"orcid": "0000-0001-5234-4719",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "University of Southern California (USC)",
|
||||||
|
"name": "Benoit Pasquier",
|
||||||
|
"orcid": "0000-0002-3838-5976",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "NTNU Trondheim",
|
||||||
|
"name": "Ronny Bergmann",
|
||||||
|
"orcid": "0000-0001-8342-7218",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andy Nowacki",
|
||||||
|
"affiliation": "University of Leeds",
|
||||||
|
"orcid": "0000-0001-7669-7383",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ian Butterworth",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "Lund University",
|
||||||
|
"name": "David Gustavsson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Anshul Singhvi",
|
||||||
|
"affiliation": "Columbia University",
|
||||||
|
"orcid": "0000-0001-6055-1291",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "david-macmahon",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fredrik Ekre",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Maaz Bin Tahir Saeed",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Kristoffer Carlsson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Will Kearney",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Niklas Korsbo",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Miles Lucas",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@Godisemo",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Florian Oswald",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Diego Javier Zea",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@WillRam",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fedor Bezrukov",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Spencer Lyon",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Darwin Darakananda",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Lukas Hauertmann",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Huckleberry Febbo",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@H-M-H",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Josh Day",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@wfgra",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sheehan Olver",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jerry Ling",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jks Liu",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Seth Axen",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@o01eg",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Micluța-Câmpeanu",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tim Holy",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tony Kelman",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Antoine Levitt",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Iblis Lin",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Harry Scholes",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@djsegal",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Goran Nakerst",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Felix Hagemann",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matthieu Gomez",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@biggsbiggsby",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jonathan Anderson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Michael Kraus",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Carlo Lucibello",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Robin Deits",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Misha Mkhasenko",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Benoît Legat",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steven G. Johnson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "John Verzani",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mattias Fält",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rashika Karki",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Morten Piibeleht",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Filippo Vicentini",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "David Anthoff",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Leon Wabeke",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Yusuke Kominami",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Oscar Dowson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Max G",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fabian Greimel",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jérémy",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Pearl Li",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "David P. Sanders",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Asbjørn Nilsen Riseth",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jan Weidner",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@jakkor2",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Pablo Zubieta",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hamza Yusuf Çakır",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "John Rinehart",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Martin Biel",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Moritz Schauer",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mosè Giodano",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@olegshtch",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Leon Shen",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jeff Fessler",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@hustf",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Asim H Dar",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@8uurg",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Abel Siqueira",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Adrian Dawid",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Alberto Lusiani",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Balázs Mezei",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ben Ide",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Benjamin Lungwitz",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "University of Graz",
|
||||||
|
"name": "Bernd Riederer",
|
||||||
|
"type": "Other",
|
||||||
|
"orcid": "0000-0001-8390-0087"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christina Lee",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christof Stocker",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christoph Finkensiep",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@Cornelius-G",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Daniel Høegh",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Denny Biasiolli",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dieter Castel",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Elliot Saba",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fengyang Wang",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fons van der Plas",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fredrik Bagge Carlson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Graham Smith",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hayato Ikoma",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hessam Mehr",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@InfiniteChai",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jack Dunn",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jeff Bezanson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jeff Eldredge",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jinay Jain",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Johan Blåbäck",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@jmert",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Lakshya Khatri",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Lia Siegelmann",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@marekkukan-tw",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "ETH Zurich",
|
||||||
|
"name": "Mauro Werder",
|
||||||
|
"type": "Other",
|
||||||
|
"orcid": "0000-0003-0137-9377"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Maxim Grechkin",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Michael Cawte",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@milesfrain",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nicholas Bauer",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nicolau Leal Werneck",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@nilshg",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Oliver Evans",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Peter Gagarinov",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Páll Haraldsson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rik Huijzer",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Romain Franconville",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ronan Pigott",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Roshan Shariff",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Scott Thomas",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Rollén",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Seth Bromberger",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Siva Swaminathan",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tim DuBois",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Travis DePrato",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Will Thompson",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Yakir Luc Gagnon",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Benjamin Chislett",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@hhaensel",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@improbable22",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Johannes Fleck",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Peter Czaban",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@innerlee",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mats Cronqvist",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Shi Pengcheng",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@wg030",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"affiliation": "University of Cambridge",
|
||||||
|
"name": "Will Tebbutt",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@t-bltg",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fred Callaway",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jan Thorben Schneider",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orcid": "0000-0003-4102-2460",
|
||||||
|
"affiliation": "Alogus Research Corporation",
|
||||||
|
"name": "Lee Phillips",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tom Gillam",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steve Leung",
|
||||||
|
"type": "Other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Xu Zhi-Yuan",
|
||||||
|
"type": "Other"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"upload_type": "software"
|
||||||
|
}
|
||||||
2
NEWS.md
2
NEWS.md
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#### notes on release changes, ongoing development, and future planned work
|
#### notes on release changes, ongoing development, and future planned work
|
||||||
|
|
||||||
## (current master)
|
## NOTE: this file is deprecated, see the [TagBot](https://github.com/marketplace/actions/julia-tagbot) auto-generated changelogs instead
|
||||||
|
|
||||||
## 0.28.3
|
## 0.28.3
|
||||||
- support generalized array interface
|
- support generalized array interface
|
||||||
|
|||||||
62
Project.toml
62
Project.toml
@ -1,17 +1,19 @@
|
|||||||
name = "Plots"
|
name = "Plots"
|
||||||
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
||||||
author = ["Tom Breloff (@tbreloff)"]
|
author = ["Tom Breloff (@tbreloff)"]
|
||||||
version = "1.0.14"
|
version = "1.29.0"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
||||||
Contour = "d38c429a-6771-53c6-b99e-75d170b6e991"
|
Contour = "d38c429a-6771-53c6-b99e-75d170b6e991"
|
||||||
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
||||||
|
Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
|
||||||
FFMPEG = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
|
FFMPEG = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
|
||||||
FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
|
FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
|
||||||
GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
|
GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
|
||||||
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
|
GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
|
||||||
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||||
|
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
|
||||||
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
|
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
|
||||||
Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
|
Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
|
||||||
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
|
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
|
||||||
@ -25,49 +27,67 @@ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
|
|||||||
RecipesPipeline = "01d81517-befc-4cb6-b9ec-a95719d0359c"
|
RecipesPipeline = "01d81517-befc-4cb6-b9ec-a95719d0359c"
|
||||||
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
|
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
|
||||||
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
|
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
|
||||||
|
Scratch = "6c6a2e73-6563-6170-7368-637461726353"
|
||||||
Showoff = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
|
Showoff = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
|
||||||
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
|
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
|
||||||
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
|
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
|
||||||
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
|
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
|
||||||
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
|
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
|
||||||
|
UnicodeFun = "1cfade01-22cf-5700-b092-accc4b62d6e1"
|
||||||
|
Unzip = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d"
|
||||||
|
|
||||||
[compat]
|
[compat]
|
||||||
Contour = "0.5"
|
Contour = "0.5"
|
||||||
FFMPEG = "0.2, 0.3"
|
FFMPEG = "0.2 - 0.4"
|
||||||
FixedPointNumbers = "0.6, 0.7, 0.8"
|
FixedPointNumbers = "0.6 - 0.8"
|
||||||
GR = "0.46, 0.47, 0.48"
|
GR = "0.64"
|
||||||
GeometryTypes = "0.7, 0.8"
|
GeometryBasics = "0.2, 0.3.1, 0.4"
|
||||||
JSON = "0.21"
|
JSON = "0.21, 1"
|
||||||
|
Latexify = "0.14 - 0.15"
|
||||||
Measures = "0.3"
|
Measures = "0.3"
|
||||||
NaNMath = "0.3"
|
NaNMath = "0.3, 1"
|
||||||
PGFPlotsX = "1.2.0"
|
PGFPlotsX = "1"
|
||||||
PlotThemes = "1"
|
PlotThemes = "2, 3"
|
||||||
PlotUtils = "0.6.5"
|
PlotUtils = "1"
|
||||||
RecipesBase = "1"
|
PlotlyBase = "0.7"
|
||||||
RecipesPipeline = "0.1.1"
|
PlotlyJS = "0.18"
|
||||||
Reexport = "0.2"
|
PyPlot = "2"
|
||||||
Requires = "0.5, 1"
|
RecipesBase = "1.2"
|
||||||
Showoff = "0.3.1"
|
RecipesPipeline = "0.5"
|
||||||
StatsBase = "0.32, 0.33"
|
Reexport = "0.2, 1.0"
|
||||||
julia = "1"
|
Requires = "1"
|
||||||
|
Scratch = "1"
|
||||||
|
Showoff = "0.3.1, 1.0"
|
||||||
|
StatsBase = "0.32 - 0.33"
|
||||||
|
UnicodeFun = "0.4"
|
||||||
|
UnicodePlots = "2.10"
|
||||||
|
Unzip = "0.1"
|
||||||
|
julia = "1.6"
|
||||||
|
|
||||||
[extras]
|
[extras]
|
||||||
|
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
|
||||||
|
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
|
||||||
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
||||||
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
|
Gaston = "4b11ee91-296f-5714-9832-002c20994614"
|
||||||
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
||||||
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
||||||
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
|
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
|
||||||
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
|
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
|
||||||
|
InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d"
|
||||||
LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433"
|
LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433"
|
||||||
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
|
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
|
||||||
PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925"
|
PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925"
|
||||||
|
PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
|
||||||
|
PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a"
|
||||||
|
PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee"
|
||||||
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
||||||
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
|
||||||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
||||||
StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd"
|
StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd"
|
||||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
||||||
|
TestImages = "5e47fb64-e119-507b-a336-dd2b206d9990"
|
||||||
UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228"
|
UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228"
|
||||||
VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92"
|
VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92"
|
||||||
|
|
||||||
[targets]
|
[targets]
|
||||||
test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "HDF5", "Random", "RDatasets", "StaticArrays", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"]
|
test = ["Colors", "Distributions", "FileIO", "Gaston", "Gtk", "ImageMagick", "Images", "InspectDR", "LibGit2", "OffsetArrays", "PGFPlotsX", "PlotlyJS", "PlotlyBase", "PyPlot", "HDF5", "RDatasets", "StableRNGs", "StaticArrays", "StatsPlots", "Test", "TestImages", "UnicodePlots", "VisualRegressionTests"]
|
||||||
|
|||||||
18
README.md
18
README.md
@ -1,10 +1,7 @@
|
|||||||
# Plots
|
# Plots
|
||||||
|
|
||||||
[travis-img]: https://img.shields.io/travis/JuliaPlots/Plots.jl?logo=travis
|
[gh-ci-img]: https://github.com/JuliaPlots/Plots.jl/workflows/ci/badge.svg?branch=master
|
||||||
[travis-url]: https://travis-ci.org/JuliaPlots/Plots.jl
|
[gh-ci-url]: https://github.com/JuliaPlots/Plots.jl/actions?query=workflow%3Aci
|
||||||
|
|
||||||
[appveyor-img]: https://ci.appveyor.com/api/projects/status/github/juliaplots/plots.jl?branch=master&svg=true
|
|
||||||
[appveyor-url]: https://ci.appveyor.com/project/mkborregaard/plots-jl
|
|
||||||
|
|
||||||
[pkgeval-img]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/P/Plots.svg
|
[pkgeval-img]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/P/Plots.svg
|
||||||
[pkgeval-url]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/report.html
|
[pkgeval-url]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/report.html
|
||||||
@ -13,14 +10,17 @@
|
|||||||
[gitter-url]: https://gitter.im/tbreloff/Plots.jl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
[gitter-url]: https://gitter.im/tbreloff/Plots.jl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
||||||
|
|
||||||
[docs-img]: https://img.shields.io/badge/docs-stable-blue.svg
|
[docs-img]: https://img.shields.io/badge/docs-stable-blue.svg
|
||||||
[docs-url]: http://docs.juliaplots.org/latest/
|
[docs-url]: https://docs.juliaplots.org/stable/
|
||||||
|
|
||||||
[![][travis-img]][travis-url]
|
[![][gh-ci-img]][gh-ci-url]
|
||||||
[![][appveyor-img]][appveyor-url]
|
|
||||||
[![][pkgeval-img]][pkgeval-url]
|
[![][pkgeval-img]][pkgeval-url]
|
||||||
[![][gitter-img]][gitter-url]
|
[](https://julialang.zulipchat.com/#narrow/stream/236493-plots)
|
||||||
[![][docs-img]][docs-url]
|
[![][docs-img]][docs-url]
|
||||||
[](https://codecov.io/gh/JuliaPlots/Plots.jl)
|
[](https://codecov.io/gh/JuliaPlots/Plots.jl)
|
||||||
|
[](https://pkgs.genieframework.com?packages=Plots)
|
||||||
|
|
||||||
|
[](https://doi.org/10.5281/zenodo.4725317)
|
||||||
|
This is the DOI for all Versions, please follow the link to get the DOI for a specific version.
|
||||||
|
|
||||||
#### Created by Tom Breloff (@tbreloff)
|
#### Created by Tom Breloff (@tbreloff)
|
||||||
|
|
||||||
|
|||||||
46
appveyor.yml
46
appveyor.yml
@ -1,46 +0,0 @@
|
|||||||
environment:
|
|
||||||
matrix:
|
|
||||||
- julia_version: 1.0
|
|
||||||
- julia_version: 1
|
|
||||||
- julia_version: nightly
|
|
||||||
|
|
||||||
platform:
|
|
||||||
- x86 # 32-bit
|
|
||||||
- x64 # 64-bit
|
|
||||||
|
|
||||||
# # Uncomment the following lines to allow failures on nightly julia
|
|
||||||
# # (tests will run but not make your overall status red)
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- julia_version: nightly
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- /release-.*/
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- '%USERPROFILE%\.julia\artifacts'
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
- provider: Email
|
|
||||||
on_build_success: false
|
|
||||||
on_build_failure: false
|
|
||||||
on_build_status_changed: false
|
|
||||||
|
|
||||||
install:
|
|
||||||
- ps: iex ((new-object net.webclient).DownloadString("https://raw.githubusercontent.com/JuliaCI/Appveyor.jl/version-1/bin/install.ps1"))
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- echo "%JL_TEST_SCRIPT%"
|
|
||||||
- C:\julia\bin\julia -e "%JL_BUILD_SCRIPT%"
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
- echo "%JL_TEST_SCRIPT%"
|
|
||||||
- C:\julia\bin\julia -e "%JL_TEST_SCRIPT%"
|
|
||||||
|
|
||||||
# # Uncomment to support code coverage upload. Should only be enabled for packages
|
|
||||||
# # which would have coverage gaps without running on Windows
|
|
||||||
# on_success:
|
|
||||||
# - echo "%JL_CODECOV_SCRIPT%"
|
|
||||||
# - C:\julia\bin\julia -e "%JL_CODECOV_SCRIPT%"
|
|
||||||
5
benchmark/Project.toml
Normal file
5
benchmark/Project.toml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[deps]
|
||||||
|
BenchmarkCI = "20533458-34a3-403d-a444-e18f38190b5b"
|
||||||
|
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
|
||||||
|
PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d"
|
||||||
|
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
||||||
10
benchmark/benchmarks.jl
Normal file
10
benchmark/benchmarks.jl
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using BenchmarkTools
|
||||||
|
using Plots
|
||||||
|
|
||||||
|
const SUITE = BenchmarkGroup()
|
||||||
|
julia_cmd = split(get(ENV, "TESTCMD", Base.JLOptions().julia_bin))
|
||||||
|
|
||||||
|
SUITE["load_plot_display"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots; display(plot(1:0.1:10, sin.(1:0.1:10)))'`)
|
||||||
|
SUITE["load"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots'`)
|
||||||
|
SUITE["plot"] = @benchmarkable p = plot(1:0.1:10, sin.(1:0.1:10)) samples=1 evals=1
|
||||||
|
SUITE["display"] = @benchmarkable display(p) setup=(p = plot(1:0.1:10, sin.(1:0.1:10))) samples=1 evals=1
|
||||||
@ -1,3 +1,6 @@
|
|||||||
|
github_checks:
|
||||||
|
annotations: false
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
- "src/backends/inspectdr.jl"
|
- "src/backends/inspectdr.jl"
|
||||||
- "src/backends/orca.jl"
|
- "src/backends/orca.jl"
|
||||||
|
|||||||
451
deps/SnoopCompile/precompile/1.6/precompile_Plots.jl
vendored
Normal file
451
deps/SnoopCompile/precompile/1.6/precompile_Plots.jl
vendored
Normal file
@ -0,0 +1,451 @@
|
|||||||
|
# Use
|
||||||
|
# @warnpcfail precompile(args...)
|
||||||
|
# if you want to be warned when a precompile directive fails
|
||||||
|
macro warnpcfail(ex::Expr)
|
||||||
|
modl = __module__
|
||||||
|
file = __source__.file === nothing ? "?" : String(__source__.file)
|
||||||
|
line = __source__.line
|
||||||
|
quote
|
||||||
|
$(esc(ex)) || @warn """precompile directive
|
||||||
|
$($(Expr(:quote, ex)))
|
||||||
|
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
const __bodyfunction__ = Dict{Method,Any}()
|
||||||
|
|
||||||
|
# Find keyword "body functions" (the function that contains the body
|
||||||
|
# as written by the developer, called after all missing keyword-arguments
|
||||||
|
# have been assigned values), in a manner that doesn't depend on
|
||||||
|
# gensymmed names.
|
||||||
|
# `mnokw` is the method that gets called when you invoke it without
|
||||||
|
# supplying any keywords.
|
||||||
|
function __lookup_kwbody__(mnokw::Method)
|
||||||
|
function getsym(arg)
|
||||||
|
isa(arg, Symbol) && return arg
|
||||||
|
@assert isa(arg, GlobalRef)
|
||||||
|
return arg.name
|
||||||
|
end
|
||||||
|
|
||||||
|
f = get(__bodyfunction__, mnokw, nothing)
|
||||||
|
if f === nothing
|
||||||
|
fmod = mnokw.module
|
||||||
|
# The lowered code for `mnokw` should look like
|
||||||
|
# %1 = mkw(kwvalues..., #self#, args...)
|
||||||
|
# return %1
|
||||||
|
# where `mkw` is the name of the "active" keyword body-function.
|
||||||
|
ast = Base.uncompressed_ast(mnokw)
|
||||||
|
if isa(ast, Core.CodeInfo) && length(ast.code) >= 2
|
||||||
|
callexpr = ast.code[end-1]
|
||||||
|
if isa(callexpr, Expr) && callexpr.head == :call
|
||||||
|
fsym = callexpr.args[1]
|
||||||
|
if isa(fsym, Symbol)
|
||||||
|
f = getfield(fmod, fsym)
|
||||||
|
elseif isa(fsym, GlobalRef)
|
||||||
|
if fsym.mod === Core && fsym.name === :_apply
|
||||||
|
f = getfield(mnokw.module, getsym(callexpr.args[2]))
|
||||||
|
elseif fsym.mod === Core && fsym.name === :_apply_iterate
|
||||||
|
f = getfield(mnokw.module, getsym(callexpr.args[3]))
|
||||||
|
else
|
||||||
|
f = getfield(fsym.mod, fsym.name)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
__bodyfunction__[mnokw] = f
|
||||||
|
end
|
||||||
|
return f
|
||||||
|
end
|
||||||
|
|
||||||
|
function _precompile_()
|
||||||
|
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{GRBackend}}},Type{Subplot},GRBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Tuple{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(areaplot)),Any,typeof(areaplot),Any,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{RGBA{Float64}, Bool, Float64, Symbol, Int64}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :flip, :minorgrid, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Float64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Float64, Float64}, Bool}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :guide), Tuple{Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :mirror, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guidefonthalign, :guide_position, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, StepRange{Int64, Int64}, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid, :scale, :guide), Tuple{Bool, Symbol, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{UnitRange{Int64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:shape,), Tuple{Symbol}},typeof(default)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :halign, :valign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :valign, :halign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{:π}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:xgrid,), Tuple{Tuple{Symbol, Symbol, Int64, Symbol, Float64}}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!),Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:annotations, :leg), Tuple{Tuple{Int64, Float64, PlotText}, Bool}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:aspect_ratio, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{String},Vector{String},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, String, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector{T} where T}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector{T} where T},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},UnitRange{Int64},Matrix{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Int64}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64}, LinRange{Float64}}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriescolor, :fillalpha), Tuple{Matrix{Symbol}, Matrix{Float64}}},typeof(plot),AreaPlot})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(scatter!)),Any,typeof(scatter!),Any})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Type{GridLayout},Int64,Vararg{Int64, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barbins}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:steppre}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(_bin_centers),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Float64},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Int64},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Nothing},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Symbol},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),UnitRange{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},StepRange{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Int64},StepRange{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_heatmap_edges),Vector{Float64},Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_plot!),Plot,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
|
||||||
|
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
|
||||||
|
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64},Tuple{Int64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(default),Symbol,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(fakedata),MersenneTwister,Int64,Vararg{Int64, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,Base.OneTo{Int64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Vector{Int64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_3d_axis_angle),Vector{Float64},Float64,Float64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_polyline),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text_size),String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :blank), Tuple{Symbol, Bool}}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :width, :height), Tuple{Symbol, Symbol, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(make_fillrange_side),UnitRange{Int64},LinRange{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(processGridArg!),Dict{Symbol, Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Segments{Tuple{Float64, Float64, Float64}},Tuple{Int64, Int64, Float64},Tuple{Int64, Int64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(resetfontsizes)})
|
||||||
|
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
|
||||||
|
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{RGBA{Float64}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(spy),Any})
|
||||||
|
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(title!),AbstractString})
|
||||||
|
Base.precompile(Tuple{typeof(vline!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any, N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
|
||||||
|
isdefined(Plots, Symbol("#166#167")) && Base.precompile(Tuple{getfield(Plots, Symbol("#166#167")),Any})
|
||||||
|
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
|
||||||
|
isdefined(Plots, Symbol("#295#331")) && Base.precompile(Tuple{getfield(Plots, Symbol("#295#331"))})
|
||||||
|
isdefined(Plots, Symbol("#316#352")) && Base.precompile(Tuple{getfield(Plots, Symbol("#316#352"))})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#100")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#100")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#101")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#101")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
|
||||||
|
let fbody = try __lookup_kwbody__(which(font, (Font,Vararg{Any, N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}},typeof(font),Font,Vararg{Any, N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(gr_polyline, (Vector{Float64},Vector{Float64},typeof(GR.fillarea),))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Symbol,Symbol,typeof(gr_polyline),Vector{Float64},Vector{Float64},typeof(GR.fillarea),))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(gr_set_font, (Font,Subplot{GRBackend},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Symbol,Symbol,RGBA{Float64},Float64,typeof(gr_set_font),Font,Subplot{GRBackend},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Any,Vararg{Any, N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Any,Vararg{Any, N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Plot,Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Plot,Plot,Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,Vararg{Plot, N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Plot,Plot,Plot,Vararg{Plot, N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot, (Any,Vararg{Any, N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Any,Vararg{Any, N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(scatter, (Any,Vararg{Any, N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(scatter),Any,Vararg{Any, N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(title!, (AbstractString,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(title!),AbstractString,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
487
deps/SnoopCompile/precompile/1.7/precompile_Plots.jl
vendored
Normal file
487
deps/SnoopCompile/precompile/1.7/precompile_Plots.jl
vendored
Normal file
@ -0,0 +1,487 @@
|
|||||||
|
# Use
|
||||||
|
# @warnpcfail precompile(args...)
|
||||||
|
# if you want to be warned when a precompile directive fails
|
||||||
|
macro warnpcfail(ex::Expr)
|
||||||
|
modl = __module__
|
||||||
|
file = __source__.file === nothing ? "?" : String(__source__.file)
|
||||||
|
line = __source__.line
|
||||||
|
quote
|
||||||
|
$(esc(ex)) || @warn """precompile directive
|
||||||
|
$($(Expr(:quote, ex)))
|
||||||
|
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
const __bodyfunction__ = Dict{Method,Any}()
|
||||||
|
|
||||||
|
# Find keyword "body functions" (the function that contains the body
|
||||||
|
# as written by the developer, called after all missing keyword-arguments
|
||||||
|
# have been assigned values), in a manner that doesn't depend on
|
||||||
|
# gensymmed names.
|
||||||
|
# `mnokw` is the method that gets called when you invoke it without
|
||||||
|
# supplying any keywords.
|
||||||
|
function __lookup_kwbody__(mnokw::Method)
|
||||||
|
function getsym(arg)
|
||||||
|
isa(arg, Symbol) && return arg
|
||||||
|
@assert isa(arg, GlobalRef)
|
||||||
|
return arg.name
|
||||||
|
end
|
||||||
|
|
||||||
|
f = get(__bodyfunction__, mnokw, nothing)
|
||||||
|
if f === nothing
|
||||||
|
fmod = mnokw.module
|
||||||
|
# The lowered code for `mnokw` should look like
|
||||||
|
# %1 = mkw(kwvalues..., #self#, args...)
|
||||||
|
# return %1
|
||||||
|
# where `mkw` is the name of the "active" keyword body-function.
|
||||||
|
ast = Base.uncompressed_ast(mnokw)
|
||||||
|
if isa(ast, Core.CodeInfo) && length(ast.code) >= 2
|
||||||
|
callexpr = ast.code[end-1]
|
||||||
|
if isa(callexpr, Expr) && callexpr.head == :call
|
||||||
|
fsym = callexpr.args[1]
|
||||||
|
if isa(fsym, Symbol)
|
||||||
|
f = getfield(fmod, fsym)
|
||||||
|
elseif isa(fsym, GlobalRef)
|
||||||
|
if fsym.mod === Core && fsym.name === :_apply
|
||||||
|
f = getfield(mnokw.module, getsym(callexpr.args[2]))
|
||||||
|
elseif fsym.mod === Core && fsym.name === :_apply_iterate
|
||||||
|
f = getfield(mnokw.module, getsym(callexpr.args[3]))
|
||||||
|
else
|
||||||
|
f = getfield(fsym.mod, fsym.name)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f = missing
|
||||||
|
end
|
||||||
|
__bodyfunction__[mnokw] = f
|
||||||
|
end
|
||||||
|
return f
|
||||||
|
end
|
||||||
|
|
||||||
|
function _precompile_()
|
||||||
|
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},GRBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{GRBackend}}},Type{Subplot},GRBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{PlotlyBackend}}},Type{Subplot},PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Tuple{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(areaplot)),Any,typeof(areaplot),Any,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:flip,), Tuple{Bool}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{RGBA{Float64}, Bool, Float64, Symbol, Int64}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{Symbol}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :flip, :minorgrid, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Float64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Float64, Float64}, Bool}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :guide), Tuple{Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :mirror, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid,), Tuple{Bool}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guidefonthalign, :guide_position, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, StepRange{Int64, Int64}, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid, :scale, :guide), Tuple{Bool, Symbol, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid,), Tuple{Bool}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:rotation,), Tuple{Int64}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{UnitRange{Int64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:shape,), Tuple{Symbol}},typeof(default)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :halign, :valign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :valign, :halign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(lens!)),Any,typeof(lens!),Any,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{:π}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:xgrid,), Tuple{Tuple{Symbol, Symbol, Int64, Symbol, Float64}}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:annotations, :leg), Tuple{Tuple{Int64, Float64, PlotText}, Bool}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:arrow,), Tuple{Int64}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:aspect_ratio, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{String},Vector{String},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, String, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:labels,), Tuple{Matrix{String}}},typeof(plot),PortfolioComposition})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},UnitRange{Int64},Matrix{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Int64}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64, Int64}, LinRange{Float64, Int64}}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriescolor, :fillalpha), Tuple{Matrix{Symbol}, Matrix{Float64}}},typeof(plot),AreaPlot})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(scatter!)),Any,typeof(scatter!),Any})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(yaxis!)),Any,typeof(yaxis!),Any,Any})
|
||||||
|
Base.precompile(Tuple{Type{GridLayout},Int64,Vararg{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{<:GeometryBasics.Point}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barbins}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:spy}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:steppre}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plot{GRBackend},Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plot{PlotlyBackend},Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Float64},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Int64},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Nothing},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Symbol},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Base.OneTo{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),UnitRange{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},StepRange{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Int64},StepRange{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_heatmap_edges),Vector{Float64},Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_plot!),Plot,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_replace_markershape),Vector{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(annotate!),AbstractVector{<:Tuple}})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
|
||||||
|
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
|
||||||
|
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Int64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(discrete_value!),Axis,Vector{Union{Missing, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(fakedata),TaskLocalRNG,Int64,Vararg{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,Base.OneTo{Int64},Vector{Float64},Tuple{Float64, Float64},Int64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,Base.OneTo{Int64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_markers),Series,UnitRange{Int64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Vector{Int64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Int64},Vector{Int64},Nothing,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_3d_axis_angle),Vector{Float64},Float64,Float64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Int64}, Vector{String}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_polyline),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text_size),String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),Matrix{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :blank), Tuple{Symbol, Bool}}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :width, :height), Tuple{Symbol, Symbol, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(make_fillrange_side),UnitRange{Int64},LinRange{Float64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(partialcircle),Float64,Float64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(processGridArg!),Dict{Symbol, Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Stroke})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(quiver_using_arrows),DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(resetfontsizes)})
|
||||||
|
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
|
||||||
|
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{PlotUtils.ContinuousColorGradient},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{RGBA{Float64}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{String},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Symbol},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(spy),Any})
|
||||||
|
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(text),String,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(title!),AbstractString})
|
||||||
|
Base.precompile(Tuple{typeof(vline!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plot{PlotlyBackend},Symbol,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
|
||||||
|
isdefined(Plots, Symbol("#168#169")) && Base.precompile(Tuple{getfield(Plots, Symbol("#168#169")),Any})
|
||||||
|
isdefined(Plots, Symbol("#170#171")) && Base.precompile(Tuple{getfield(Plots, Symbol("#170#171")),Any})
|
||||||
|
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
|
||||||
|
isdefined(Plots, Symbol("#301#337")) && Base.precompile(Tuple{getfield(Plots, Symbol("#301#337"))})
|
||||||
|
isdefined(Plots, Symbol("#322#358")) && Base.precompile(Tuple{getfield(Plots, Symbol("#322#358"))})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#102")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#102")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#103")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#103")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
|
||||||
|
let fbody = try __lookup_kwbody__(which(annotate!, (AbstractVector{<:Tuple},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(annotate!),AbstractVector{<:Tuple},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(font, (Font,Vararg{Any},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}},typeof(font),Font,Vararg{Any},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(gr_polyline, (Vector{Float64},Vector{Float64},typeof(GR.fillarea),))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Symbol,Symbol,typeof(gr_polyline),Vector{Float64},Vector{Float64},typeof(GR.fillarea),))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(gr_set_font, (Font,Subplot{GRBackend},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Symbol,Symbol,RGBA{Float64},Float64,typeof(gr_set_font),Font,Subplot{GRBackend},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Any,Vararg{Any},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Any,Vararg{Any},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,Vararg{Plot},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,Plot,Vararg{Plot},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(plot, (Any,Vararg{Any},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot),Any,Vararg{Any},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(title!, (AbstractString,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(title!),AbstractString,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(yaxis!, (Any,Vararg{Any},))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(yaxis!),Any,Vararg{Any},))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
282
deps/SnoopCompile/precompile/1.8/precompile_Plots.jl
vendored
Normal file
282
deps/SnoopCompile/precompile/1.8/precompile_Plots.jl
vendored
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
# Use
|
||||||
|
# @warnpcfail precompile(args...)
|
||||||
|
# if you want to be warned when a precompile directive fails
|
||||||
|
macro warnpcfail(ex::Expr)
|
||||||
|
modl = __module__
|
||||||
|
file = __source__.file === nothing ? "?" : String(__source__.file)
|
||||||
|
line = __source__.line
|
||||||
|
quote
|
||||||
|
$(esc(ex)) || @warn """precompile directive
|
||||||
|
$($(Expr(:quote, ex)))
|
||||||
|
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function _precompile_()
|
||||||
|
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{:π}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:annotations, :leg), Tuple{Tuple{Int64, Float64, PlotText}, Bool}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:aspect_ratio, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{String},Vector{String},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, String, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},UnitRange{Int64},Matrix{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64, Int64}, LinRange{Float64, Int64}}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(yaxis!)),Any,typeof(yaxis!),Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},StepRange{Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(annotate!),AbstractVector{<:Tuple}})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
|
||||||
|
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
|
||||||
|
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Int64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_text_size),String})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(is_marker_supported),GRBackend,Vector{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(layout_args),Matrix{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(link_axes!),GridLayout,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText,Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol},Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String},Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText,Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol},Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String},Font})
|
||||||
|
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Segments{Tuple{Float64, Float64, Float64}},Tuple{Float64, Int64, Int64},Tuple{Float64, Int64, Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(resetfontsizes)})
|
||||||
|
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
|
||||||
|
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(spy),Any})
|
||||||
|
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(title!),AbstractString})
|
||||||
|
Base.precompile(Tuple{typeof(update_child_bboxes!),GridLayout})
|
||||||
|
Base.precompile(Tuple{typeof(update_clims),Float64,Float64,SubArray{Int64, 1, Vector{Int64}, Tuple{UnitRange{Int64}}, true},typeof(ignorenan_extrema)})
|
||||||
|
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plot{PlotlyBackend},Symbol,Vararg{Any}})
|
||||||
|
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
|
||||||
|
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
|
||||||
|
isdefined(Plots, Symbol("#322#358")) && Base.precompile(Tuple{getfield(Plots, Symbol("#322#358"))})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#102")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#102")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
|
||||||
|
isdefined(Plots, Symbol("#add_major_or_minor_segments#103")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#103")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
|
||||||
|
end
|
||||||
4
deps/SnoopCompile/precompile_script.jl
vendored
Normal file
4
deps/SnoopCompile/precompile_script.jl
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
using Plots
|
||||||
|
|
||||||
|
Plots.test_examples(:gr, skip = Plots._backend_skips[:gr])
|
||||||
|
Plots.test_examples(:plotly, skip = Plots._backend_skips[:plotly], disp = false)
|
||||||
6
deps/SnoopCompile/snoop_bench.jl
vendored
Normal file
6
deps/SnoopCompile/snoop_bench.jl
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
include("snoop_bot_config.jl")
|
||||||
|
|
||||||
|
snoop_bench(
|
||||||
|
botconfig,
|
||||||
|
joinpath(@__DIR__, "precompile_script.jl"),
|
||||||
|
)
|
||||||
6
deps/SnoopCompile/snoop_bot.jl
vendored
Normal file
6
deps/SnoopCompile/snoop_bot.jl
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
include("snoop_bot_config.jl")
|
||||||
|
|
||||||
|
snoop_bot(
|
||||||
|
botconfig,
|
||||||
|
joinpath(@__DIR__, "precompile_script.jl"),
|
||||||
|
)
|
||||||
7
deps/SnoopCompile/snoop_bot_config.jl
vendored
Normal file
7
deps/SnoopCompile/snoop_bot_config.jl
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
using CompileBot
|
||||||
|
|
||||||
|
botconfig = BotConfig(
|
||||||
|
"Plots",
|
||||||
|
version = ["1.6", "1.7", "1.8", "nightly"], # <<< keep these versions in sync with .github/workflows/SnoopCompile.yml
|
||||||
|
# else_version = "nightly",
|
||||||
|
)
|
||||||
18
deps/build.jl
vendored
18
deps/build.jl
vendored
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
#TODO: download https://cdn.plot.ly/plotly-latest.min.js to deps/ if it doesn't exist
|
|
||||||
file_path = ""
|
|
||||||
if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true"
|
|
||||||
global file_path
|
|
||||||
local_fn = joinpath(dirname(@__FILE__), "plotly-latest.min.js")
|
|
||||||
if !isfile(local_fn)
|
|
||||||
@info("Cannot find deps/plotly-latest.min.js... downloading latest version.")
|
|
||||||
download("https://cdn.plot.ly/plotly-latest.min.js", local_fn)
|
|
||||||
isfile(local_fn) && (file_path = local_fn)
|
|
||||||
else
|
|
||||||
file_path = local_fn
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
open("deps.jl", "w") do io
|
|
||||||
println(io, "const plotly_local_file_path = $(repr(file_path))")
|
|
||||||
end
|
|
||||||
53
deps/generateprecompiles.jl
vendored
53
deps/generateprecompiles.jl
vendored
@ -1,53 +0,0 @@
|
|||||||
# To figure out what should be precompiled, run this script, then move
|
|
||||||
# precompile_Plots.jl in precompiles_path (see below) to src/precompile.jl
|
|
||||||
|
|
||||||
# This script works by using SnoopCompile to log compilations that take place
|
|
||||||
# while running the examples on the GR backend. So SnoopCompile must be
|
|
||||||
# installed, and StatsPlots, RDatasets, and FileIO are also required for
|
|
||||||
# certain examples.
|
|
||||||
|
|
||||||
# If precompilation fails with an UndefVarError for a module, probably what is
|
|
||||||
# happening is that the module appears in the precompile statements, but is
|
|
||||||
# only visible to one of Plots' dependencies, and not Plots itself. Adding the
|
|
||||||
# module to the blacklist below will remove these precompile statements.
|
|
||||||
|
|
||||||
# Anonymous functions may appear in precompile statements as functions with
|
|
||||||
# hashes in their name. Those of the form "#something##kw" have to do with
|
|
||||||
# compiling functions with keyword arguments, and are named reproducibly, so
|
|
||||||
# can be kept. Others generally will not work. Currently, SnoopCompile includes
|
|
||||||
# some anonymous functions that not reproducible, but SnoopCompile PR #30
|
|
||||||
# (which looks about to be merged) will ensure that anonymous functions are
|
|
||||||
# actually defined before attempting to precompile them. Alternatively, we can
|
|
||||||
# keep only the keyword argument related anonymous functions by changing the
|
|
||||||
# regex that SnoopCompile uses to detect anonymous functions to
|
|
||||||
# r"#{1,2}[^\"#]+#{1,2}\d+" (see anonrex in SnoopCompile.jl). To exclude all
|
|
||||||
# precompile statements involving anonymous functions, "#" can also be added to
|
|
||||||
# the blacklist below.
|
|
||||||
|
|
||||||
using SnoopCompile
|
|
||||||
|
|
||||||
project_flag = string("--project=", joinpath(homedir(), ".julia", "dev", "Plots"))
|
|
||||||
log_path = joinpath(tempdir(), "compiles.log")
|
|
||||||
precompiles_path = joinpath(tempdir(), "precompile")
|
|
||||||
|
|
||||||
# run examples with GR backend, logging what needs to be compiled
|
|
||||||
SnoopCompile.@snoopc project_flag log_path begin
|
|
||||||
using Plots
|
|
||||||
Plots.test_examples(:gr)
|
|
||||||
Plots.test_examples(:plotly, skip = Plots._backend_skips[:plotly])
|
|
||||||
end
|
|
||||||
|
|
||||||
# precompile calls containing the following strings are dropped
|
|
||||||
blacklist = [
|
|
||||||
# functions defined in examples
|
|
||||||
"PlotExampleModule",
|
|
||||||
# the following are not visible to Plots, only its dependencies
|
|
||||||
"CategoricalArrays",
|
|
||||||
"FixedPointNumbers",
|
|
||||||
"SparseArrays",
|
|
||||||
r"#{1,2}[^\"#]+#{1,2}\d+",
|
|
||||||
]
|
|
||||||
|
|
||||||
data = SnoopCompile.read(log_path)
|
|
||||||
pc = SnoopCompile.parcel(reverse!(data[2]), blacklist=blacklist)
|
|
||||||
SnoopCompile.write(precompiles_path, pc)
|
|
||||||
137
src/Plots.jl
137
src/Plots.jl
@ -1,46 +1,61 @@
|
|||||||
module Plots
|
module Plots
|
||||||
|
|
||||||
|
using Pkg
|
||||||
|
|
||||||
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@optlevel"))
|
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@optlevel"))
|
||||||
@eval Base.Experimental.@optlevel 1
|
@eval Base.Experimental.@optlevel 1
|
||||||
end
|
end
|
||||||
|
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@max_methods"))
|
||||||
|
@eval Base.Experimental.@max_methods 1
|
||||||
|
end
|
||||||
|
|
||||||
const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2])
|
const _plots_project = Pkg.Types.read_project(normpath(@__DIR__, "..", "Project.toml"))
|
||||||
|
const _current_plots_version = _plots_project.version
|
||||||
|
const _plots_compats = _plots_project.compat
|
||||||
|
function _check_compat(sim::Module)
|
||||||
|
sim_str = string(sim)
|
||||||
|
if !haskey(_plots_compats, sim_str)
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
be_v = Pkg.Types.read_project(joinpath(Base.pkgdir(sim), "Project.toml")).version
|
||||||
|
be_c = _plots_compats[sim_str]
|
||||||
|
if be_c isa String # julia 1.6
|
||||||
|
if !(be_v in Pkg.Types.semver_spec(be_c))
|
||||||
|
@warn "$sim $be_v is not compatible with this version of Plots. The declared compatibility is $(be_c)."
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if isempty(intersect(be_v, be_c.val))
|
||||||
|
@warn "$sim $be_v is not compatible with this version of Plots. The declared compatibility is $(be_c.str)."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
using Reexport
|
using Reexport
|
||||||
|
|
||||||
import GeometryTypes
|
import GeometryBasics
|
||||||
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
|
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random, Unzip
|
||||||
import SparseArrays: findnz
|
using SparseArrays
|
||||||
|
|
||||||
using FFMPEG
|
using FFMPEG
|
||||||
|
|
||||||
@reexport using RecipesBase
|
@reexport using RecipesBase
|
||||||
import RecipesBase: plot, plot!, animate, is_explicit
|
import RecipesBase: plot, plot!, animate, is_explicit, grid
|
||||||
using Base.Meta
|
using Base.Meta
|
||||||
@reexport using PlotUtils
|
@reexport using PlotUtils
|
||||||
@reexport using PlotThemes
|
@reexport using PlotThemes
|
||||||
import Showoff
|
import UnicodeFun
|
||||||
import StatsBase
|
import StatsBase
|
||||||
|
import Downloads
|
||||||
|
import Showoff
|
||||||
import JSON
|
import JSON
|
||||||
|
|
||||||
using Requires
|
using Requires
|
||||||
|
|
||||||
if isfile(joinpath(@__DIR__, "..", "deps", "deps.jl"))
|
#! format: off
|
||||||
include(joinpath(@__DIR__, "..", "deps", "deps.jl"))
|
|
||||||
else
|
|
||||||
# This is a bit dirty, but I don't really see why anyone should be forced
|
|
||||||
# to build Plots, while it will just include exactly the below line
|
|
||||||
# as long as `ENV["PLOTS_HOST_DEPENDENCY_LOCAL"] = "true"` is not set.
|
|
||||||
# If the above env is set + `plotly_local_file_path == ""``,
|
|
||||||
# it will warn in the __init__ function to run build
|
|
||||||
const plotly_local_file_path = ""
|
|
||||||
end
|
|
||||||
|
|
||||||
export
|
export
|
||||||
grid,
|
grid,
|
||||||
bbox,
|
bbox,
|
||||||
plotarea,
|
plotarea,
|
||||||
@layout,
|
|
||||||
KW,
|
KW,
|
||||||
|
|
||||||
wrap,
|
wrap,
|
||||||
@ -108,6 +123,7 @@ export
|
|||||||
gif,
|
gif,
|
||||||
mov,
|
mov,
|
||||||
mp4,
|
mp4,
|
||||||
|
webm,
|
||||||
animate,
|
animate,
|
||||||
@animate,
|
@animate,
|
||||||
@gif,
|
@gif,
|
||||||
@ -123,8 +139,11 @@ export
|
|||||||
center,
|
center,
|
||||||
BezierCurve,
|
BezierCurve,
|
||||||
|
|
||||||
plotattr
|
plotattr,
|
||||||
|
scalefontsize,
|
||||||
|
scalefontsizes,
|
||||||
|
resetfontsizes
|
||||||
|
#! format: on
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
import NaNMath # define functions that ignores NaNs. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563
|
import NaNMath # define functions that ignores NaNs. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563
|
||||||
@ -143,7 +162,6 @@ ignorenan_extrema(x) = Base.extrema(x)
|
|||||||
# This makes it impossible to create row vectors of String and Symbol with the transpose operator.
|
# This makes it impossible to create row vectors of String and Symbol with the transpose operator.
|
||||||
# This solves this issue, internally in Plots at least.
|
# This solves this issue, internally in Plots at least.
|
||||||
|
|
||||||
|
|
||||||
# commented out on the insistence of the METADATA maintainers
|
# commented out on the insistence of the METADATA maintainers
|
||||||
|
|
||||||
#Base.transpose(x::Symbol) = x
|
#Base.transpose(x::Symbol) = x
|
||||||
@ -154,12 +172,21 @@ ignorenan_extrema(x) = Base.extrema(x)
|
|||||||
import Measures
|
import Measures
|
||||||
module PlotMeasures
|
module PlotMeasures
|
||||||
import Measures
|
import Measures
|
||||||
import Measures: Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h
|
import Measures:
|
||||||
|
Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h
|
||||||
const BBox = Measures.Absolute2DBox
|
const BBox = Measures.Absolute2DBox
|
||||||
|
|
||||||
# allow pixels and percentages
|
# allow pixels and percentages
|
||||||
const px = AbsoluteLength(0.254)
|
const px = AbsoluteLength(0.254)
|
||||||
const pct = Length{:pct, Float64}(1.0)
|
const pct = Length{:pct,Float64}(1.0)
|
||||||
|
|
||||||
|
Base.convert(::Type{<:Measure}, x::Float64) = x * pct
|
||||||
|
|
||||||
|
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
|
||||||
|
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
|
||||||
|
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
|
||||||
|
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
|
||||||
|
|
||||||
export BBox, BoundingBox, mm, cm, inch, px, pct, pt, w, h
|
export BBox, BoundingBox, mm, cm, inch, px, pct, pt, w, h
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -168,7 +195,8 @@ import .PlotMeasures: Length, AbsoluteLength, Measure, width, height
|
|||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
import RecipesPipeline
|
import RecipesPipeline
|
||||||
import RecipesPipeline: SliceIt,
|
import RecipesPipeline:
|
||||||
|
SliceIt,
|
||||||
DefaultsDict,
|
DefaultsDict,
|
||||||
Formatted,
|
Formatted,
|
||||||
AbstractSurface,
|
AbstractSurface,
|
||||||
@ -182,16 +210,21 @@ import RecipesPipeline: SliceIt,
|
|||||||
pop_kw!,
|
pop_kw!,
|
||||||
scale_func,
|
scale_func,
|
||||||
inverse_scale_func,
|
inverse_scale_func,
|
||||||
unzip,
|
|
||||||
dateformatter,
|
dateformatter,
|
||||||
datetimeformatter,
|
datetimeformatter,
|
||||||
timeformatter
|
timeformatter
|
||||||
|
|
||||||
|
# Use fixed version of Plotly instead of the latest one for stable dependency
|
||||||
|
# Ref: https://github.com/JuliaPlots/Plots.jl/pull/2779
|
||||||
|
const _plotly_min_js_filename = "plotly-2.6.3.min.js"
|
||||||
|
|
||||||
include("types.jl")
|
include("types.jl")
|
||||||
include("utils.jl")
|
include("utils.jl")
|
||||||
include("components.jl")
|
include("colorbars.jl")
|
||||||
include("axes.jl")
|
include("axes.jl")
|
||||||
include("args.jl")
|
include("args.jl")
|
||||||
|
include("components.jl")
|
||||||
|
include("consts.jl")
|
||||||
include("themes.jl")
|
include("themes.jl")
|
||||||
include("plot.jl")
|
include("plot.jl")
|
||||||
include("pipeline.jl")
|
include("pipeline.jl")
|
||||||
@ -207,6 +240,7 @@ include("output.jl")
|
|||||||
include("ijulia.jl")
|
include("ijulia.jl")
|
||||||
include("fileio.jl")
|
include("fileio.jl")
|
||||||
include("init.jl")
|
include("init.jl")
|
||||||
|
include("legend.jl")
|
||||||
|
|
||||||
include("backends/plotly.jl")
|
include("backends/plotly.jl")
|
||||||
include("backends/gr.jl")
|
include("backends/gr.jl")
|
||||||
@ -214,38 +248,35 @@ include("backends/web.jl")
|
|||||||
|
|
||||||
include("shorthands.jl")
|
include("shorthands.jl")
|
||||||
|
|
||||||
let PlotOrSubplot = Union{Plot, Subplot}
|
let PlotOrSubplot = Union{Plot,Subplot}
|
||||||
global title!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; title = s, kw...)
|
global title!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; title = s, kw...)
|
||||||
global xlabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; xlabel = s, kw...)
|
global xlabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; xlabel = s, kw...)
|
||||||
global ylabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; ylabel = s, kw...)
|
global ylabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; ylabel = s, kw...)
|
||||||
global xlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; xlims = lims, kw...)
|
global xlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; xlims = lims, kw...)
|
||||||
global ylims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; ylims = lims, kw...)
|
global ylims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; ylims = lims, kw...)
|
||||||
global zlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; zlims = lims, kw...)
|
global zlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; zlims = lims, kw...)
|
||||||
global xlims!(plt::PlotOrSubplot, xmin::Real, xmax::Real; kw...) = plot!(plt; xlims = (xmin,xmax), kw...)
|
global xlims!(plt::PlotOrSubplot, xmin::Real, xmax::Real; kw...) = plot!(plt; xlims = (xmin, xmax), kw...)
|
||||||
global ylims!(plt::PlotOrSubplot, ymin::Real, ymax::Real; kw...) = plot!(plt; ylims = (ymin,ymax), kw...)
|
global ylims!(plt::PlotOrSubplot, ymin::Real, ymax::Real; kw...) = plot!(plt; ylims = (ymin, ymax), kw...)
|
||||||
global zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin,zmax), kw...)
|
global zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin, zmax), kw...)
|
||||||
global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) where {T<:Real} = plot!(plt; xticks = ticks, kw...)
|
global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; xticks = ticks, kw...)
|
||||||
global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) where {T<:Real} = plot!(plt; yticks = ticks, kw...)
|
global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; yticks = ticks, kw...)
|
||||||
global xticks!(plt::PlotOrSubplot,
|
global xticks!(plt::PlotOrSubplot, ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks, labels), kw...)
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks,labels), kw...)
|
global yticks!(plt::PlotOrSubplot, ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; yticks = (ticks, labels), kw...)
|
||||||
global yticks!(plt::PlotOrSubplot,
|
global xgrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xgrid = args, kw...)
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; yticks = (ticks,labels), kw...)
|
global ygrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; ygrid = args, kw...)
|
||||||
global xgrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xgrid = args, kw...)
|
global annotate!(plt::PlotOrSubplot, anns...; kw...) = plot!(plt; annotation = anns, kw...)
|
||||||
global ygrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; ygrid = args, kw...)
|
global annotate!(plt::PlotOrSubplot, anns::AVec{T}; kw...) where {T<:Tuple} = plot!(plt; annotation = anns, kw...)
|
||||||
global annotate!(plt::PlotOrSubplot, anns...; kw...) = plot!(plt; annotation = anns, kw...)
|
global xflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; xflip = flip, kw...)
|
||||||
global annotate!(plt::PlotOrSubplot, anns::AVec{T}; kw...) where {T<:Tuple} = plot!(plt; annotation = anns, kw...)
|
global yflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; yflip = flip, kw...)
|
||||||
global xflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; xflip = flip, kw...)
|
global xaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xaxis = args, kw...)
|
||||||
global yflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; yflip = flip, kw...)
|
global yaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; yaxis = args, kw...)
|
||||||
global xaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xaxis = args, kw...)
|
|
||||||
global yaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; yaxis = args, kw...)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
const CURRENT_BACKEND = CurrentBackend(:none)
|
const CURRENT_BACKEND = CurrentBackend(:none)
|
||||||
|
const PLOTS_SEED = 1234
|
||||||
|
|
||||||
include("precompile.jl")
|
include("precompile_includer.jl")
|
||||||
_precompile_()
|
|
||||||
|
|
||||||
end # module
|
end # module
|
||||||
|
|||||||
157
src/animation.jl
157
src/animation.jl
@ -14,23 +14,24 @@ end
|
|||||||
|
|
||||||
Add a plot (the current plot if not specified) to an existing animation
|
Add a plot (the current plot if not specified) to an existing animation
|
||||||
"""
|
"""
|
||||||
function frame(anim::Animation, plt::P=current()) where P<:AbstractPlot
|
function frame(anim::Animation, plt::P = current()) where {P<:AbstractPlot}
|
||||||
i = length(anim.frames) + 1
|
i = length(anim.frames) + 1
|
||||||
filename = @sprintf("%06d.png", i)
|
filename = @sprintf("%06d.png", i)
|
||||||
png(plt, joinpath(anim.dir, filename))
|
png(plt, joinpath(anim.dir, filename))
|
||||||
push!(anim.frames, filename)
|
push!(anim.frames, filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
giffn() = (isijulia() ? "tmp.gif" : tempname()*".gif")
|
giffn() = (isijulia() ? "tmp.gif" : tempname() * ".gif")
|
||||||
movfn() = (isijulia() ? "tmp.mov" : tempname()*".mov")
|
movfn() = (isijulia() ? "tmp.mov" : tempname() * ".mov")
|
||||||
mp4fn() = (isijulia() ? "tmp.mp4" : tempname()*".mp4")
|
mp4fn() = (isijulia() ? "tmp.mp4" : tempname() * ".mp4")
|
||||||
|
webmfn() = (isijulia() ? "tmp.webm" : tempname() * ".webm")
|
||||||
|
|
||||||
mutable struct FrameIterator
|
mutable struct FrameIterator
|
||||||
itr
|
itr
|
||||||
every::Int
|
every::Int
|
||||||
kw
|
kw
|
||||||
end
|
end
|
||||||
FrameIterator(itr; every=1, kw...) = FrameIterator(itr, every, kw)
|
FrameIterator(itr; every = 1, kw...) = FrameIterator(itr, every, kw)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Animate from an iterator which returns the plot args each iteration.
|
Animate from an iterator which returns the plot args each iteration.
|
||||||
@ -47,8 +48,8 @@ function animate(fitr::FrameIterator, fn = giffn(); kw...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# most things will implement this
|
# most things will implement this
|
||||||
function animate(obj, fn = giffn(); every=1, fps=20, loop=0, kw...)
|
function animate(obj, fn = giffn(); every = 1, fps = 20, loop = 0, kw...)
|
||||||
animate(FrameIterator(obj, every, kw), fn; fps=fps, loop=loop)
|
animate(FrameIterator(obj, every, kw), fn; fps = fps, loop = loop)
|
||||||
end
|
end
|
||||||
|
|
||||||
# -----------------------------------------------
|
# -----------------------------------------------
|
||||||
@ -63,16 +64,21 @@ file_extension(fn) = Base.Filesystem.splitext(fn)[2][2:end]
|
|||||||
gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim, fn; kw...)
|
gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim, fn; kw...)
|
||||||
mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim, fn, false; kw...)
|
mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim, fn, false; kw...)
|
||||||
mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim, fn, false; kw...)
|
mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim, fn, false; kw...)
|
||||||
|
webm(anim::Animation, fn = webmfn(); kw...) = buildanimation(anim, fn, false; kw...)
|
||||||
|
|
||||||
ffmpeg_framerate(fps) = "$fps"
|
ffmpeg_framerate(fps) = "$fps"
|
||||||
ffmpeg_framerate(fps::Rational) = "$(fps.num)/$(fps.den)"
|
ffmpeg_framerate(fps::Rational) = "$(fps.num)/$(fps.den)"
|
||||||
|
|
||||||
function buildanimation(anim::Animation, fn::AbstractString,
|
function buildanimation(
|
||||||
is_animated_gif::Bool=true;
|
anim::Animation,
|
||||||
fps::Real = 20, loop::Integer = 0,
|
fn::AbstractString,
|
||||||
variable_palette::Bool=false,
|
is_animated_gif::Bool = true;
|
||||||
verbose=false,
|
fps::Real = 20,
|
||||||
show_msg::Bool=true)
|
loop::Integer = 0,
|
||||||
|
variable_palette::Bool = false,
|
||||||
|
verbose = false,
|
||||||
|
show_msg::Bool = true,
|
||||||
|
)
|
||||||
if length(anim.frames) == 0
|
if length(anim.frames) == 0
|
||||||
throw(ArgumentError("Cannot build empty animations"))
|
throw(ArgumentError("Cannot build empty animations"))
|
||||||
end
|
end
|
||||||
@ -80,41 +86,49 @@ function buildanimation(anim::Animation, fn::AbstractString,
|
|||||||
fn = abspath(expanduser(fn))
|
fn = abspath(expanduser(fn))
|
||||||
animdir = anim.dir
|
animdir = anim.dir
|
||||||
framerate = ffmpeg_framerate(fps)
|
framerate = ffmpeg_framerate(fps)
|
||||||
verbose_level = (verbose isa Int ? verbose :
|
verbose_level = (verbose isa Int ? verbose : verbose ? 32 : 16) # "error"
|
||||||
verbose ? 32 # "info"
|
|
||||||
: 16) # "error"
|
|
||||||
|
|
||||||
if is_animated_gif
|
if is_animated_gif
|
||||||
if variable_palette
|
if variable_palette
|
||||||
# generate a colorpalette for each frame for highest quality, but larger filesize
|
# generate a colorpalette for each frame for highest quality, but larger filesize
|
||||||
palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1"
|
palette = "palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1"
|
||||||
ffmpeg_exe(`-v $verbose_level -framerate $framerate -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`)
|
ffmpeg_exe(
|
||||||
|
`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -lavfi "$palette" -loop $loop -y $fn`,
|
||||||
|
)
|
||||||
else
|
else
|
||||||
# generate a colorpalette first so ffmpeg does not have to guess it
|
# generate a colorpalette first so ffmpeg does not have to guess it
|
||||||
ffmpeg_exe(`-v $verbose_level -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`)
|
ffmpeg_exe(
|
||||||
|
`-v $verbose_level -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`,
|
||||||
|
)
|
||||||
# then apply the palette to get better results
|
# then apply the palette to get better results
|
||||||
ffmpeg_exe(`-v $verbose_level -framerate $framerate -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`)
|
ffmpeg_exe(
|
||||||
|
`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -loop $loop -y $fn`,
|
||||||
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
ffmpeg_exe(`-v $verbose_level -framerate $framerate -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`)
|
ffmpeg_exe(
|
||||||
|
`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -vf format=yuv420p -loop $loop -y $fn`,
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
show_msg && @info("Saved animation to ", fn)
|
show_msg && @info("Saved animation to ", fn)
|
||||||
AnimatedGif(fn)
|
AnimatedGif(fn)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# write out html to view the gif
|
# write out html to view the gif
|
||||||
function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif)
|
function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif)
|
||||||
ext = file_extension(agif.filename)
|
ext = file_extension(agif.filename)
|
||||||
if ext == "gif"
|
if ext == "gif"
|
||||||
html = "<img src=\"data:image/gif;base64," * base64encode(read(agif.filename)) * "\" />"
|
html =
|
||||||
elseif ext in ("mov", "mp4")
|
"<img src=\"data:image/gif;base64," *
|
||||||
mimetype = ext == "mov" ? "video/quicktime" : "video/mp4"
|
base64encode(read(agif.filename)) *
|
||||||
html = "<video controls><source src=\"data:$mimetype;base64," *
|
"\" />"
|
||||||
base64encode(read(agif.filename)) *
|
elseif ext in ("mov", "mp4", "webm")
|
||||||
"\" type = \"$mimetype\"></video>"
|
mimetype = ext == "mov" ? "video/quicktime" : "video/$ext"
|
||||||
|
html =
|
||||||
|
"<video controls><source src=\"data:$mimetype;base64," *
|
||||||
|
base64encode(read(agif.filename)) *
|
||||||
|
"\" type = \"$mimetype\"></video>"
|
||||||
else
|
else
|
||||||
error("Cannot show animation with extension $ext: $agif")
|
error("Cannot show animation with extension $ext: $agif")
|
||||||
end
|
end
|
||||||
@ -123,64 +137,67 @@ function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif)
|
|||||||
return nothing
|
return nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Only gifs can be shown via image/gif
|
# Only gifs can be shown via image/gif
|
||||||
Base.showable(::MIME"image/gif", agif::AnimatedGif) = file_extension(agif.filename) == "gif"
|
Base.showable(::MIME"image/gif", agif::AnimatedGif) = file_extension(agif.filename) == "gif"
|
||||||
|
|
||||||
function Base.show(io::IO, ::MIME"image/gif", agif::AnimatedGif)
|
function Base.show(io::IO, ::MIME"image/gif", agif::AnimatedGif)
|
||||||
open(fio-> write(io, fio), agif.filename)
|
open(fio -> write(io, fio), agif.filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------
|
# -----------------------------------------------
|
||||||
|
|
||||||
function _animate(forloop::Expr, args...; callgif = false)
|
function _animate(forloop::Expr, args...; callgif = false)
|
||||||
if forloop.head != :for
|
if forloop.head ∉ (:for, :while)
|
||||||
error("@animate macro expects a for-block. got: $(forloop.head)")
|
error("@animate macro expects a for- or while-block. got: $(forloop.head)")
|
||||||
end
|
end
|
||||||
|
|
||||||
# add the call to frame to the end of each iteration
|
# add the call to frame to the end of each iteration
|
||||||
animsym = gensym("anim")
|
animsym = gensym("anim")
|
||||||
countersym = gensym("counter")
|
countersym = gensym("counter")
|
||||||
freqassert = :()
|
freqassert = :()
|
||||||
block = forloop.args[2]
|
block = forloop.args[2]
|
||||||
|
|
||||||
# create filter
|
# create filter
|
||||||
n = length(args)
|
n = length(args)
|
||||||
filterexpr = if n == 0
|
filterexpr = if n == 0
|
||||||
# no filter... every iteration gets a frame
|
# no filter... every iteration gets a frame
|
||||||
true
|
true
|
||||||
|
|
||||||
elseif args[1] == :every
|
elseif args[1] == :every
|
||||||
# filter every `freq` frames (starting with the first frame)
|
# filter every `freq` frames (starting with the first frame)
|
||||||
@assert n == 2
|
@assert n == 2
|
||||||
freq = args[2]
|
freq = args[2]
|
||||||
freqassert = :(@assert isa($freq, Integer) && $freq > 0)
|
freqassert = :(@assert isa($freq, Integer) && $freq > 0)
|
||||||
:(mod1($countersym, $freq) == 1)
|
:(mod1($countersym, $freq) == 1)
|
||||||
|
|
||||||
elseif args[1] == :when
|
elseif args[1] == :when
|
||||||
# filter on custom expression
|
# filter on custom expression
|
||||||
@assert n == 2
|
@assert n == 2
|
||||||
args[2]
|
args[2]
|
||||||
|
|
||||||
else
|
else
|
||||||
error("Unsupported animate filter: $args")
|
error("Unsupported animate filter: $args")
|
||||||
end
|
end
|
||||||
|
|
||||||
push!(block.args, :(if $filterexpr; Plots.frame($animsym); end))
|
push!(block.args, :(
|
||||||
push!(block.args, :(global $countersym += 1))
|
if $filterexpr
|
||||||
|
Plots.frame($animsym)
|
||||||
|
end
|
||||||
|
))
|
||||||
|
push!(block.args, :($countersym += 1))
|
||||||
|
|
||||||
# add a final call to `gif(anim)`?
|
# add a final call to `gif(anim)`?
|
||||||
retval = callgif ? :(Plots.gif($animsym)) : animsym
|
retval = callgif ? :(Plots.gif($animsym)) : animsym
|
||||||
|
|
||||||
# full expression:
|
# full expression:
|
||||||
esc(quote
|
esc(quote
|
||||||
$freqassert # if filtering, check frequency is an Integer > 0
|
$freqassert # if filtering, check frequency is an Integer > 0
|
||||||
$animsym = Plots.Animation() # init animation object
|
$animsym = Plots.Animation() # init animation object
|
||||||
global $countersym = 1 # init iteration counter
|
let $countersym = 1 # init iteration counter
|
||||||
$forloop # for loop, saving a frame after each iteration
|
$forloop # for loop, saving a frame after each iteration
|
||||||
$retval # return the animation object, or the gif
|
end
|
||||||
end)
|
$retval # return the animation object, or the gif
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
342
src/arg_desc.jl
342
src/arg_desc.jl
@ -1,164 +1,192 @@
|
|||||||
|
|
||||||
const _arg_desc = KW(
|
const _arg_desc = KW(
|
||||||
|
|
||||||
# series args
|
# series args
|
||||||
:label => "String type. The label for a series, which appears in a legend. If empty, no legend entry is added.",
|
:label => "String type. The label for a series, which appears in a legend. If empty, no legend entry is added.",
|
||||||
:seriescolor => "Color Type. The base color for this series. `:auto` (the default) will select a color from the subplot's `color_palette`, based on the order it was added to the subplot",
|
:seriescolor => "Color Type. The base color for this series. `:auto` (the default) will select a color from the subplot's `color_palette`, based on the order it was added to the subplot",
|
||||||
:seriesalpha => "Number in [0,1]. The alpha/opacity override for the series. `nothing` (the default) means it will take the alpha value of the color.",
|
:seriesalpha => "Number in [0,1]. The alpha/opacity override for the series. `nothing` (the default) means it will take the alpha value of the color.",
|
||||||
:seriestype => "Symbol. This is the identifier of the type of visualization for this series. Choose from $(_allTypes) or any series recipes which are defined.",
|
:seriestype => "Symbol. This is the identifier of the type of visualization for this series. Choose from $(_allTypes) or any series recipes which are defined.",
|
||||||
:linestyle => "Symbol. Style of the line (for path and bar stroke). Choose from $(_allStyles)",
|
:linestyle => "Symbol. Style of the line (for path and bar stroke). Choose from $(_allStyles)",
|
||||||
:linewidth => "Number. Width of the line (in pixels)",
|
:linewidth => "Number. Width of the line (in pixels)",
|
||||||
:linecolor => "Color Type. Color of the line (for path and bar stroke). `:match` will take the value from `:seriescolor`, (though histogram/bar types use `:black` as a default).",
|
:linecolor => "Color Type. Color of the line (for path and bar stroke). `:match` will take the value from `:seriescolor`, (though histogram/bar types use `:black` as a default).",
|
||||||
:linealpha => "Number in [0,1]. The alpha/opacity override for the line. `nothing` (the default) means it will take the alpha value of linecolor.",
|
:linealpha => "Number in [0,1]. The alpha/opacity override for the line. `nothing` (the default) means it will take the alpha value of linecolor.",
|
||||||
:fillrange => "Number or AbstractVector. Fills area between fillrange and y for line-types, sets the base for bar/stick types, and similar for other types.",
|
:fillrange => "Number or AbstractVector. Fills area between fillrange and y for line-types, sets the base for bar/stick types, and similar for other types.",
|
||||||
:fillcolor => "Color Type. Color of the filled area of path or bar types. `:match` will take the value from `:seriescolor`.",
|
:fillcolor => "Color Type. Color of the filled area of path or bar types. `:match` will take the value from `:seriescolor`.",
|
||||||
:fillalpha => "Number in [0,1]. The alpha/opacity override for the fill area. `nothing` (the default) means it will take the alpha value of fillcolor.",
|
:fillalpha => "Number in [0,1]. The alpha/opacity override for the fill area. `nothing` (the default) means it will take the alpha value of fillcolor.",
|
||||||
:markershape => "Symbol, Shape, or AbstractVector. Choose from $(_allMarkers).",
|
:markershape => "Symbol, Shape, or AbstractVector. Choose from $(_allMarkers).",
|
||||||
:markercolor => "Color Type. Color of the interior of the marker or shape. `:match` will take the value from `:seriescolor`.",
|
:fillstyle => "Symbol. Style of the fill area. `nothing` (the default) means solid fill. Choose from :/, :\\, :|, :-, :+, :x",
|
||||||
:markeralpha => "Number in [0,1]. The alpha/opacity override for the marker interior. `nothing` (the default) means it will take the alpha value of markercolor.",
|
:markercolor => "Color Type. Color of the interior of the marker or shape. `:match` will take the value from `:seriescolor`.",
|
||||||
:markersize => "Number or AbstractVector. Size (radius pixels) of the markers.",
|
:markeralpha => "Number in [0,1]. The alpha/opacity override for the marker interior. `nothing` (the default) means it will take the alpha value of markercolor.",
|
||||||
:markerstrokestyle => "Symbol. Style of the marker stroke (border). Choose from $(_allStyles)",
|
:markersize => "Number or AbstractVector. Size (radius pixels) of the markers",
|
||||||
:markerstrokewidth => "Number. Width of the marker stroke (border. in pixels)",
|
:markerstrokestyle => "Symbol. Style of the marker stroke (border). Choose from $(_allStyles)",
|
||||||
:markerstrokecolor => "Color Type. Color of the marker stroke (border). `:match` will take the value from `:foreground_color_subplot`.",
|
:markerstrokewidth => "Number. Width of the marker stroke (border) in pixels",
|
||||||
:markerstrokealpha => "Number in [0,1]. The alpha/opacity override for the marker stroke (border). `nothing` (the default) means it will take the alpha value of markerstrokecolor.",
|
:markerstrokecolor => "Color Type. Color of the marker stroke (border). `:match` will take the value from `:foreground_color_subplot`.",
|
||||||
:bins => "Integer, NTuple{2,Integer}, AbstractVector or Symbol. Default is :auto (the Freedman-Diaconis rule). For histogram-types, defines the approximate number of bins to aim for, or the auto-binning algorithm to use (:sturges, :sqrt, :rice, :scott or :fd). For fine-grained control pass a Vector of break values, e.g. `range(minimum(x), stop = maximum(x), length = 25)`",
|
:markerstrokealpha => "Number in [0,1]. The alpha/opacity override for the marker stroke (border). `nothing` (the default) means it will take the alpha value of markerstrokecolor.",
|
||||||
:smooth => "Bool. Add a regression line?",
|
:bins => "Integer, NTuple{2,Integer}, AbstractVector or Symbol. Default is :auto (the Freedman-Diaconis rule). For histogram-types, defines the approximate number of bins to aim for, or the auto-binning algorithm to use (:sturges, :sqrt, :rice, :scott or :fd). For fine-grained control pass a Vector of break values, e.g. `range(minimum(x), stop = maximum(x), length = 25)`",
|
||||||
:group => "AbstractVector. Data is split into a separate series, one for each unique value in `group`.",
|
:smooth => "Bool. Add a regression line?",
|
||||||
:x => "Various. Input data. First Dimension",
|
:group => "AbstractVector. Data is split into a separate series, one for each unique value in `group`",
|
||||||
:y => "Various. Input data. Second Dimension",
|
:x => "Various. Input data. First Dimension",
|
||||||
:z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.",
|
:y => "Various. Input data. Second Dimension",
|
||||||
:marker_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.",
|
:z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.",
|
||||||
:line_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series line segment, which correspond to the color to be used from a linecolor gradient. Note that for N points, only the first N-1 values are used (one per line-segment).",
|
:marker_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.",
|
||||||
:fill_z => "Matrix{Float64} of the same size as z matrix, which specifies the color of the 3D surface; the default value is `nothing`.",
|
:line_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series line segment, which correspond to the color to be used from a linecolor gradient. Note that for N points, only the first N-1 values are used (one per line-segment).",
|
||||||
:levels => "Integer, NTuple{2,Integer}, or AbstractVector. Levels or number of levels (or x-levels/y-levels) for a contour type.",
|
:fill_z => "Matrix{Float64} of the same size as z matrix, which specifies the color of the 3D surface; the default value is `nothing`.",
|
||||||
:orientation => "Symbol. Horizontal or vertical orientation for bar types. Values `:h`, `:hor`, `:horizontal` correspond to horizontal (sideways, anchored to y-axis), and `:v`, `:vert`, and `:vertical` correspond to vertical (the default).",
|
:levels => "Integer (number of contours) or AbstractVector (contour values). Determines contour levels for a contour type.",
|
||||||
:bar_position => "Symbol. Choose from `:overlay` (default), `:stack`. (warning: May not be implemented fully)",
|
:permute => "Tuple{Symbol,Symbol}. Permutes data and axis properties of the axes given in the tuple. E.g. (:x, :y).",
|
||||||
:bar_width => "nothing or Number. Width of bars in data coordinates. When nothing, chooses based on x (or y when `orientation = :h`).",
|
:orientation => "Symbol. (deprecated) Horizontal or vertical orientation for bar types. Values `:h`, `:hor`, `:horizontal` correspond to horizontal (sideways, anchored to y-axis), and `:v`, `:vert`, and `:vertical` correspond to vertical (the default).",
|
||||||
:bar_edges => "Bool. Align bars to edges (true), or centers (the default)?",
|
:bar_position => "Symbol. Choose from `:overlay` (default), `:stack`. (warning: May not be implemented fully)",
|
||||||
:xerror => "AbstractVector or 2-Tuple of Vectors. x (horizontal) error relative to x-value. If 2-tuple of vectors, the first vector corresponds to the left error (and the second to the right)",
|
:bar_width => "nothing or Number. Width of bars in data coordinates. When nothing, chooses based on x (or y when `orientation = :h`).",
|
||||||
:yerror => "AbstractVector or 2-Tuple of Vectors. y (vertical) error relative to y-value. If 2-tuple of vectors, the first vector corresponds to the bottom error (and the second to the top)",
|
:bar_edges => "Bool. Align bars to edges (true), or centers (the default)?",
|
||||||
:ribbon => "Number or AbstractVector. Creates a fillrange around the data points.",
|
:xerror => "AbstractVector or 2-Tuple of Vectors. x (horizontal) error relative to x-value. If 2-tuple of vectors, the first vector corresponds to the left error (and the second to the right)",
|
||||||
:quiver => "AbstractVector or 2-Tuple of vectors. The directional vectors U,V which specify velocity/gradient vectors for a quiver plot.",
|
:yerror => "AbstractVector or 2-Tuple of Vectors. y (vertical) error relative to y-value. If 2-tuple of vectors, the first vector corresponds to the bottom error (and the second to the top)",
|
||||||
:arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.",
|
:ribbon => "Number or AbstractVector. Creates a fillrange around the data points.",
|
||||||
:normalize => "Bool or Symbol. Histogram normalization mode. Possible values are: false/:none (no normalization, default), true/:pdf (normalize to a discrete Probability Density Function, where the total area of the bins is 1), :probability (bin heights sum to 1) and :density (the area of each bin, rather than the height, is equal to the counts - useful for uneven bin sizes).",
|
:quiver => "AbstractVector or 2-Tuple of vectors. The directional vectors U,V which specify velocity/gradient vectors for a quiver plot.",
|
||||||
:weights => "AbstractVector. Used in histogram types for weighted counts.",
|
:arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.",
|
||||||
:show_empty_bins => "Bool. Whether empty bins in a 2D histogram are colored as 0 (true), or transparent (the default).",
|
:normalize => "Bool or Symbol. Histogram normalization mode. Possible values are: false/:none (no normalization, default), true/:pdf (normalize to a discrete Probability Density Function, where the total area of the bins is 1), :probability (bin heights sum to 1) and :density (the area of each bin, rather than the height, is equal to the counts - useful for uneven bin sizes).",
|
||||||
:contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.",
|
:weights => "AbstractVector. Used in histogram types for weighted counts.",
|
||||||
:contour_labels => "Bool. Show labels at the contour lines?",
|
:show_empty_bins => "Bool. Whether empty bins in a 2D histogram are colored as 0 (true), or transparent (the default)",
|
||||||
:match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.",
|
:contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.",
|
||||||
:subplot => "Integer (subplot index) or Subplot object. The subplot that this series belongs to.",
|
:contour_labels => "Bool. Show labels at the contour lines?",
|
||||||
:series_annotations => "AbstractVector of String or PlotText. These are annotations which are mapped to data points/positions.",
|
:match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.",
|
||||||
:primary => "Bool. Does this count as a 'real series'? For example, you could have a path (primary), and a scatter (secondary) as 2 separate series, maybe with different data (see sticks recipe for an example). The secondary series will get the same color, etc as the primary.",
|
:subplot => "Integer (subplot index) or Subplot object. The subplot that this series belongs to.",
|
||||||
:hover => "nothing or vector of strings. Text to display when hovering over each data point.",
|
:series_annotations => "AbstractVector of String or PlotText. These are annotations which are mapped to data points/positions.",
|
||||||
:colorbar_entry => "Bool. Include this series in the color bar? Set to `false` to exclude.",
|
:primary => "Bool. Does this count as a 'real series'? For example, you could have a path (primary), and a scatter (secondary) as 2 separate series, maybe with different data (see sticks recipe for an example). The secondary series will get the same color, etc as the primary.",
|
||||||
|
:hover => "nothing or vector of strings. Text to display when hovering over each data point.",
|
||||||
|
:colorbar_entry => "Bool. Include this series in the color bar? Set to `false` to exclude.",
|
||||||
|
:z_order => "Symbol or Integer. :front (default), :back or index of position where 1 is farest in the background.",
|
||||||
|
|
||||||
# plot args
|
# plot args
|
||||||
:plot_title => "String. Title for the whole plot (not the subplots) (Note: Not currently implemented)",
|
:plot_title => "String. Title for the whole plot (not the subplots)",
|
||||||
:background_color => "Color Type. Base color for all backgrounds.",
|
:plot_titlevspan => "Number in [0,1]. Vertical span of the whole plot title (fraction of the plot height)",
|
||||||
:background_color_outside => "Color Type or `:match` (matches `:background_color`). Color outside the plot area(s)",
|
:background_color => "Color Type. Base color for all backgrounds.",
|
||||||
:foreground_color => "Color Type. Base color for all foregrounds.",
|
:background_color_outside => "Color Type or `:match` (matches `:background_color`). Color outside the plot area(s)",
|
||||||
:size => "NTuple{2,Int}. (width_px, height_px) of the whole Plot",
|
:foreground_color => "Color Type. Base color for all foregrounds.",
|
||||||
:pos => "NTuple{2,Int}. (left_px, top_px) position of the GUI window (note: currently unimplemented)",
|
:size => "NTuple{2,Int}. (width_px, height_px) of the whole Plot",
|
||||||
:window_title => "String. Title of the window.",
|
:pos => "NTuple{2,Int}. (left_px, top_px) position of the GUI window (note: currently unimplemented)",
|
||||||
:show => "Bool. Should this command open/refresh a GUI/display? This allows displaying in scripts or functions without explicitly calling `display`",
|
:window_title => "String. Title of the standalone gui-window.",
|
||||||
:layout => "Integer (number of subplots), NTuple{2,Integer} (grid dimensions), AbstractLayout (for example `grid(2,2)`), or the return from the `@layout` macro. This builds the layout of subplots.",
|
:show => "Bool. Should this command open/refresh a GUI/display? This allows displaying in scripts or functions without explicitly calling `display`",
|
||||||
:link => "Symbol. How/whether to link axis limits between subplots. Values: `:none`, `:x` (x axes are linked by columns), `:y` (y axes are linked by rows), `:both` (x and y are linked), `:all` (every subplot is linked together regardless of layout position).",
|
:layout => "Integer (number of subplots), NTuple{2,Integer} (grid dimensions), AbstractLayout (for example `grid(2,2)`), or the return from the `@layout` macro. This builds the layout of subplots.",
|
||||||
:overwrite_figure => "Bool. Should we reuse the same GUI window/figure when plotting (true) or open a new one (false).",
|
:link => "Symbol. How/whether to link axis limits between subplots. Values: `:none`, `:x` (x axes are linked by columns), `:y` (y axes are linked by rows), `:both` (x and y are linked), `:all` (every subplot is linked together regardless of layout position).",
|
||||||
:html_output_format => "Symbol. When writing html output, what is the format? `:png` and `:svg` are currently supported.",
|
:overwrite_figure => "Bool. Should we reuse the same GUI window/figure when plotting (true) or open a new one (false).",
|
||||||
:tex_output_standalone => "Bool. When writing tex output, should the source include a preamble for a standalone document class.",
|
:html_output_format => "Symbol. When writing html output, what is the format? `:png` and `:svg` are currently supported.",
|
||||||
:inset_subplots => "nothing or vector of 2-tuple (parent,bbox). optionally pass a vector of (parent,bbox) tuples which are the parent layout and the relative bounding box of inset subplots",
|
:tex_output_standalone => "Bool. When writing tex output, should the source include a preamble for a standalone document class.",
|
||||||
:dpi => "Number. Dots Per Inch of output figures",
|
:inset_subplots => "nothing or vector of 2-tuple (parent,bbox). optionally pass a vector of (parent,bbox) tuples which are the parent layout and the relative bounding box of inset subplots",
|
||||||
:thickness_scaling => "Number. Scale for the thickness of all line elements like lines, borders, axes, grid lines, ... defaults to 1.",
|
:dpi => "Number. Dots Per Inch of output figures",
|
||||||
:display_type => "Symbol (`:auto`, `:gui`, or `:inline`). When supported, `display` will either open a GUI window or plot inline.",
|
:thickness_scaling => "Number. Scale for the thickness of all line elements like lines, borders, axes, grid lines, ... defaults to 1.",
|
||||||
:extra_kwargs => "KW (Dict{Symbol,Any}). Pass a map of extra keyword args which may be specific to a backend.",
|
:display_type => "Symbol (`:auto`, `:gui`, or `:inline`). When supported, `display` will either open a GUI window or plot inline.",
|
||||||
:fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides",
|
:extra_kwargs => "Either one of (`:plot`, `:subplot`, `:series`) to specify for which element extra keyword args are collected or a KW (Dict{Symbol,Any}) to pass a map of extra keyword args which may be specific to a backend. Default: `:series`.\n Example: `pgfplotsx(); scatter(1:5, extra_kwargs=Dict(:subplot=>Dict(\"axis line shift\" => \"10pt\"))`",
|
||||||
:warn_on_unsupported => "Bool. Warn on unsupported attributes, series types and marker shapes",
|
:fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides",
|
||||||
|
:warn_on_unsupported => "Bool. Warn on unsupported attributes, series types and marker shapes",
|
||||||
|
|
||||||
# subplot args
|
# subplot args
|
||||||
:title => "String. Subplot title.",
|
:title => "String. Subplot title.",
|
||||||
:titlelocation => "Symbol. Position of subplot title. Values: `:left`, `:center`, `:right`",
|
:titlelocation => "Symbol. Position of subplot title. Values: `:left`, `:center`, `:right`",
|
||||||
:titlefontfamily => "String or Symbol. Font family of subplot title.",
|
:titlefontfamily => "String or Symbol. Font family of subplot title.",
|
||||||
:titlefontsize => "Integer. Font pointsize of subplot title.",
|
:titlefontsize => "Integer. Font pointsize of subplot title.",
|
||||||
:titlefonthalign => "Symbol. Font horizontal alignment of subplot title: :hcenter, :left, :right or :center",
|
:titlefonthalign => "Symbol. Font horizontal alignment of subplot title: :hcenter, :left, :right or :center",
|
||||||
:titlefontvalign => "Symbol. Font vertical alignment of subplot title: :vcenter, :top, :bottom or :center",
|
:titlefontvalign => "Symbol. Font vertical alignment of subplot title: :vcenter, :top, :bottom or :center",
|
||||||
:titlefontrotation => "Real. Font rotation of subplot title",
|
:titlefontrotation => "Real. Font rotation of subplot title",
|
||||||
:titlefontcolor => "Color Type. Font color of subplot title",
|
:titlefontcolor => "Color Type. Font color of subplot title",
|
||||||
:background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.",
|
:background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.",
|
||||||
:background_color_legend => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.",
|
:legend_background_color => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.",
|
||||||
:background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).",
|
:background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).",
|
||||||
:foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.",
|
:foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.",
|
||||||
:foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
|
:legend_foreground_color => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
|
||||||
:foreground_color_title => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of subplot title.",
|
:foreground_color_title => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of subplot title.",
|
||||||
:color_palette => "Vector of colors (cycle through) or color gradient (generate list from gradient) or `:auto` (generate a color list using `Colors.distiguishable_colors` and custom seed colors chosen to contrast with the background). The color palette is a color list from which series colors are automatically chosen.",
|
:color_palette => "Vector of colors (cycle through) or color gradient (generate list from gradient) or `:auto` (generate a color list using `Colors.distiguishable_colors` and custom seed colors chosen to contrast with the background). The color palette is a color list from which series colors are automatically chosen.",
|
||||||
:legend => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position). Bottom left corner of legend is placed at (x,y). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:inside`, `:legend`, `:topright`, `:topleft`, `:bottomleft`, `:bottomright` , `:inline` (note: only some may be supported in each backend)",
|
:legend_position => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position) or angle or (angle,inout) tuple. Bottom left corner of legend is placed at (x,y). Symbol values: `:none`; `:best`; `:inline`; `:inside`; `:legend`; any valid combination of `:(outer ?)(top/bottom ?)(right/left ?)`, i.e.: `:top`, `:topright`, `:outerleft`, `:outerbottomright` ... (note: only some may be supported in each backend)",
|
||||||
:legendfontfamily => "String or Symbol. Font family of legend entries.",
|
:legend_column => "Integer. Number of columns in the legend. `-1` stands for maximum number of colums (horizontal legend).",
|
||||||
:legendfontsize => "Integer. Font pointsize of legend entries.",
|
:legend_title_font => "Font. Font of the legend title.",
|
||||||
:legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
|
:legend_font_family => "String or Symbol. Font family of legend entries.",
|
||||||
:legendfontvalign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center",
|
:legend_font_pointsize => "Integer. Font pointsize of legend entries.",
|
||||||
:legendfontrotation => "Real. Font rotation of legend entries",
|
:legend_font_halign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
|
||||||
:legendfontcolor => "Color Type. Font color of legend entries",
|
:legend_font_valign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center",
|
||||||
:legendtitlefontfamily => "String or Symbol. Font family of the legend title.",
|
:legend_font_rotation => "Real. Font rotation of legend entries",
|
||||||
:legendtitlefontsize => "Integer. Font pointsize the legend title.",
|
:legend_font_color => "Color Type. Font color of legend entries",
|
||||||
:legendtitlefonthalign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center",
|
:legend_title => "String. Legend title.",
|
||||||
:legendtitlefontvalign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center",
|
:legend_title_font_family => "String or Symbol. Font family of the legend title.",
|
||||||
:legendtitlefontrotation => "Real. Font rotation of the legend title",
|
:legend_title_font_pointsize => "Integer. Font pointsize the legend title.",
|
||||||
:legendtitlefontcolor => "Color Type. Font color of the legend title",
|
:legend_title_font_halign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center",
|
||||||
:colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)",
|
:legend_title_font_valign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center",
|
||||||
:clims => "`:auto` or NTuple{2,Number}. Fixes the limits of the colorbar.",
|
:legend_title_font_rotation => "Real. Font rotation of the legend title",
|
||||||
:legendfont => "Font. Font of legend items.",
|
:legend_title_font_color => "Color Type. Font color of the legend title",
|
||||||
:legendtitlefont => "Font. Font of the legend title.",
|
:colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)",
|
||||||
:annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String or PlotText (created with `text(args...)`) Add one-off text annotations at the x,y coordinates.",
|
:clims => "`:auto`, NTuple{2,Number}, or a function that takes series data in and returns NTuple{2,Number}. Fixes the limits of the colorbar.",
|
||||||
:projection => "Symbol or String. '3d' or 'polar'",
|
:colorbar_fontfamily => "String or Symbol. Font family of colobar entries.",
|
||||||
:aspect_ratio => "Symbol (:equal) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units.",
|
:colorbar_ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`",
|
||||||
:margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.",
|
:colorbar_tickfontfamily => "String or Symbol. Font family of colorbar tick labels.",
|
||||||
:left_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the left of the subplot.",
|
:colorbar_tickfontsize => "Integer. Font pointsize of colorbar tick entries.",
|
||||||
:top_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the top of the subplot.",
|
:colorbar_tickfontcolor => "Color Type. Font color of colorbar tick entries",
|
||||||
:right_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the right of the subplot.",
|
:colorbar_scale => "Symbol. Scale of the colorbar axis: `:none`, `:ln`, `:log2`, `:log10`",
|
||||||
:bottom_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the bottom of the subplot.",
|
:colorbar_formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.",
|
||||||
:subplot_index => "Integer. Internal (not set by user). Specifies the index of this subplot in the Plot's `plt.subplot` list.",
|
:legend_font => "Font. Font of legend items.",
|
||||||
:colorbar_title => "String. Title of colorbar.",
|
:legend_titlefont => "Font. Font of the legend title.",
|
||||||
:framestyle => "Symbol. Style of the axes frame. Choose from $(_allFramestyles)",
|
:annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String, PlotText (created with `text(args...)`), or a tuple of arguments to `text` (e.g., `(\"Label\", 8, :red, :top)`). Add one-off text annotations at the x,y coordinates.",
|
||||||
:camera => "NTuple{2, Real}. Sets the view angle (azimuthal, elevation) for 3D plots",
|
:annotationfontfamily => "String or Symbol. Font family of annotations.",
|
||||||
|
:annotationfontsize => "Integer. Font pointsize of annotations.",
|
||||||
|
:annotationhalign => "Symbol. horizontal alignment of annotations, :hcenter, :left, :right or :center.",
|
||||||
|
:annotationvalign => "Symbol. Vertical alignment of annotations, :vcenter, :top, :bottom or :center.",
|
||||||
|
:annotationrotation => "Float. Rotation of annotations in degrees.",
|
||||||
|
:annotationcolor => "Colorant or :match. Color of annotations.",
|
||||||
|
:projection => "Symbol or String. '3d' or 'polar'",
|
||||||
|
:aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.",
|
||||||
|
:margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.",
|
||||||
|
:left_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the left of the subplot.",
|
||||||
|
:top_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the top of the subplot.",
|
||||||
|
:right_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the right of the subplot.",
|
||||||
|
:bottom_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the bottom of the subplot.",
|
||||||
|
:subplot_index => "Integer. Internal (not set by user). Specifies the index of this subplot in the Plot's `plt.subplot` list.",
|
||||||
|
:colorbar_title => "String. Title of colorbar.",
|
||||||
|
:framestyle => "Symbol. Style of the axes frame. Choose from $(_allFramestyles)",
|
||||||
|
:camera => "NTuple{2, Real}. Sets the view angle (azimuthal, elevation) for 3D plots",
|
||||||
|
|
||||||
# axis args
|
# axis args
|
||||||
:guide => "String. Axis guide (label).",
|
:guide => "String. Axis guide (label).",
|
||||||
:guide_position => "Symbol. Position of axis guides: :top, :bottom, :left or :right",
|
:guide_position => "Symbol. Position of axis guides: :top, :bottom, :left or :right",
|
||||||
:lims => "NTuple{2,Number} or Symbol. Force axis limits. Only finite values are used (you can set only the right limit with `xlims = (-Inf, 2)` for example). `:round` widens the limit to the nearest round number ie. [0.1,3.6]=>[0.0,4.0]",
|
:lims => """
|
||||||
:ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`",
|
NTuple{2,Number} or Symbol. Force axis limits. Only finite values are used (you can set only the right limit with `xlims = (-Inf, 2)` for example).
|
||||||
:scale => "Symbol. Scale of the axis: `:none`, `:ln`, `:log2`, `:log10`",
|
`:round` widens the limit to the nearest round number ie. [0.1,3.6]=>[0.0,4.0]
|
||||||
:rotation => "Number. Degrees rotation of tick labels.",
|
`:symmetric` sets the limits to be symmetric around zero.
|
||||||
:flip => "Bool. Should we flip (reverse) the axis?",
|
Set widen=true to widen the specified limits (as occurs when lims are not specified).
|
||||||
:formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.",
|
""",
|
||||||
:tickfontfamily => "String or Symbol. Font family of tick labels.",
|
:ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`",
|
||||||
:tickfontsize => "Integer. Font pointsize of tick labels.",
|
:scale => "Symbol. Scale of the axis: `:none`, `:ln`, `:log2`, `:log10`",
|
||||||
:tickfonthalign => "Symbol. Font horizontal alignment of tick labels: :hcenter, :left, :right or :center",
|
:rotation => "Number. Degrees rotation of tick labels.",
|
||||||
:tickfontvalign => "Symbol. Font vertical alignment of tick labels: :vcenter, :top, :bottom or :center",
|
:flip => "Bool. Should we flip (reverse) the axis?",
|
||||||
:tickfontrotation => "Real. Font rotation of tick labels",
|
:formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.",
|
||||||
:tickfontcolor => "Color Type. Font color of tick labels",
|
:tickfontfamily => "String or Symbol. Font family of tick labels.",
|
||||||
:guidefontfamily => "String or Symbol. Font family of axes guides.",
|
:tickfontsize => "Integer. Font pointsize of tick labels.",
|
||||||
:guidefontsize => "Integer. Font pointsize of axes guides.",
|
:tickfonthalign => "Symbol. Font horizontal alignment of tick labels: :hcenter, :left, :right or :center",
|
||||||
:guidefonthalign => "Symbol. Font horizontal alignment of axes guides: :hcenter, :left, :right or :center",
|
:tickfontvalign => "Symbol. Font vertical alignment of tick labels: :vcenter, :top, :bottom or :center",
|
||||||
:guidefontvalign => "Symbol. Font vertical alignment of axes guides: :vcenter, :top, :bottom or :center",
|
:tickfontrotation => "Real. Font rotation of tick labels",
|
||||||
:guidefontrotation => "Real. Font rotation of axes guides",
|
:tickfontcolor => "Color Type. Font color of tick labels",
|
||||||
:guidefontcolor => "Color Type. Font color of axes guides",
|
:guidefontfamily => "String or Symbol. Font family of axes guides.",
|
||||||
:foreground_color_axis => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis ticks.",
|
:guidefontsize => "Integer. Font pointsize of axes guides.",
|
||||||
:foreground_color_border => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of plot area border (spines).",
|
:guidefonthalign => "Symbol. Font horizontal alignment of axes guides: :hcenter, :left, :right or :center",
|
||||||
:foreground_color_text => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of tick labels.",
|
:guidefontvalign => "Symbol. Font vertical alignment of axes guides: :vcenter, :top, :bottom or :center",
|
||||||
:foreground_color_guide => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis guides (axis labels).",
|
:guidefontrotation => "Real. Font rotation of axes guides",
|
||||||
:mirror => "Bool. Switch the side of the tick labels (right or top).",
|
:guidefontcolor => "Color Type. Font color of axes guides",
|
||||||
:grid => "Bool, Symbol, String or `nothing`. Show the grid lines? `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:none`, `:off`",
|
:foreground_color_axis => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis ticks.",
|
||||||
:foreground_color_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of grid lines.",
|
:foreground_color_border => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of plot area border (spines).",
|
||||||
:gridalpha => "Number in [0,1]. The alpha/opacity override for the grid lines.",
|
:foreground_color_text => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of tick labels.",
|
||||||
:gridstyle => "Symbol. Style of the grid lines. Choose from $(_allStyles)",
|
:foreground_color_guide => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis guides (axis labels).",
|
||||||
:gridlinewidth => "Number. Width of the grid lines (in pixels)",
|
:mirror => "Bool. Switch the side of the tick labels (right or top).",
|
||||||
:foreground_color_minor_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of minor grid lines.",
|
:grid => "Bool, Symbol, String or `nothing`. Show the grid lines? `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:none`, `:off`",
|
||||||
:minorgrid => "Bool. Adds minor grid lines and ticks to the plot. Set minorticks to change number of gridlines",
|
:foreground_color_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of grid lines.",
|
||||||
:minorticks => "Integer. Intervals to divide the gap between major ticks into",
|
:gridalpha => "Number in [0,1]. The alpha/opacity override for the grid lines.",
|
||||||
:minorgridalpha => "Number in [0,1]. The alpha/opacity override for the minorgrid lines.",
|
:gridstyle => "Symbol. Style of the grid lines. Choose from $(_allStyles)",
|
||||||
:minorgridstyle => "Symbol. Style of the minor grid lines. Choose from $(_allStyles)",
|
:gridlinewidth => "Number. Width of the grid lines (in pixels)",
|
||||||
:minorgridlinewidth => "Number. Width of the minor grid lines (in pixels)",
|
:foreground_color_minor_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of minor grid lines.",
|
||||||
:tick_direction => "Symbol. Direction of the ticks. `:in` or `:out`",
|
:minorgrid => "Bool. Adds minor grid lines and ticks to the plot. Set minorticks to change number of gridlines",
|
||||||
:showaxis => "Bool, Symbol or String. Show the axis. `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:off`",
|
:minorticks => "Integer. Intervals to divide the gap between major ticks into",
|
||||||
:widen => "Bool. Widen the axis limits by a small factor to avoid cut-off markers and lines at the borders. Defaults to `true`.",
|
:minorgridalpha => "Number in [0,1]. The alpha/opacity override for the minorgrid lines.",
|
||||||
:draw_arrow => "Bool. Draw arrow at the end of the axis.",
|
:minorgridstyle => "Symbol. Style of the minor grid lines. Choose from $(_allStyles)",
|
||||||
|
:minorgridlinewidth => "Number. Width of the minor grid lines (in pixels)",
|
||||||
|
:tick_direction => "Symbol. Direction of the ticks. `:in`, `:out` or `:none`",
|
||||||
|
:showaxis => "Bool, Symbol or String. Show the axis. `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:off`",
|
||||||
|
:widen => """
|
||||||
|
Bool or :auto. Widen the axis limits by a small factor to avoid cut-off markers and lines at the borders.
|
||||||
|
Defaults to `:auto`, which widens unless limits were manually set.
|
||||||
|
""",
|
||||||
|
:draw_arrow => "Bool. Draw arrow at the end of the axis.",
|
||||||
)
|
)
|
||||||
|
|||||||
1823
src/args.jl
1823
src/args.jl
File diff suppressed because it is too large
Load Diff
1027
src/axes.jl
1027
src/axes.jl
File diff suppressed because it is too large
Load Diff
989
src/backends.jl
989
src/backends.jl
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
# significant contributions by: @pkofod
|
# significant contributions by: @pkofod
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------
|
||||||
|
# COV_EXCL_START
|
||||||
const _pgfplots_linestyles = KW(
|
const _pgfplots_linestyles = KW(
|
||||||
:solid => "solid",
|
:solid => "solid",
|
||||||
:dash => "dashed",
|
:dash => "dashed",
|
||||||
@ -27,7 +27,7 @@ const _pgfplots_markers = KW(
|
|||||||
:diamond => "diamond*",
|
:diamond => "diamond*",
|
||||||
:pentagon => "pentagon*",
|
:pentagon => "pentagon*",
|
||||||
:hline => "-",
|
:hline => "-",
|
||||||
:vline => "|"
|
:vline => "|",
|
||||||
)
|
)
|
||||||
|
|
||||||
const _pgfplots_legend_pos = KW(
|
const _pgfplots_legend_pos = KW(
|
||||||
@ -38,7 +38,6 @@ const _pgfplots_legend_pos = KW(
|
|||||||
:outertopright => "outer north east",
|
:outertopright => "outer north east",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
const _pgf_series_extrastyle = KW(
|
const _pgf_series_extrastyle = KW(
|
||||||
:steppre => "const plot mark right",
|
:steppre => "const plot mark right",
|
||||||
:stepmid => "const plot mark mid",
|
:stepmid => "const plot mark mid",
|
||||||
@ -50,11 +49,7 @@ const _pgf_series_extrastyle = KW(
|
|||||||
|
|
||||||
# PGFPlots uses the anchors to define orientations for example to align left
|
# PGFPlots uses the anchors to define orientations for example to align left
|
||||||
# one needs to use the right edge as anchor
|
# one needs to use the right edge as anchor
|
||||||
const _pgf_annotation_halign = KW(
|
const _pgf_annotation_halign = KW(:center => "", :left => "right", :right => "left")
|
||||||
:center => "",
|
|
||||||
:left => "right",
|
|
||||||
:right => "left"
|
|
||||||
)
|
|
||||||
|
|
||||||
const _pgf_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none]
|
const _pgf_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none]
|
||||||
const _pgf_framestyle_defaults = Dict(:semi => :box)
|
const _pgf_framestyle_defaults = Dict(:semi => :box)
|
||||||
@ -63,7 +58,9 @@ function pgf_framestyle(style::Symbol)
|
|||||||
return style
|
return style
|
||||||
else
|
else
|
||||||
default_style = get(_pgf_framestyle_defaults, style, :axes)
|
default_style = get(_pgf_framestyle_defaults, style, :axes)
|
||||||
@warn("Framestyle :$style is not (yet) supported by the PGFPlots backend. :$default_style was cosen instead.")
|
@warn(
|
||||||
|
"Framestyle :$style is not (yet) supported by the PGFPlots backend. :$default_style was cosen instead."
|
||||||
|
)
|
||||||
default_style
|
default_style
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -78,15 +75,15 @@ end
|
|||||||
|
|
||||||
function pgf_color(grad::ColorGradient)
|
function pgf_color(grad::ColorGradient)
|
||||||
# Can't handle ColorGradient here, fallback to defaults.
|
# Can't handle ColorGradient here, fallback to defaults.
|
||||||
cstr = @sprintf("{rgb,1:red,%.8f;green,%.8f;blue,%.8f}", 0.0, 0.60560316,0.97868012)
|
cstr = @sprintf("{rgb,1:red,%.8f;green,%.8f;blue,%.8f}", 0.0, 0.60560316, 0.97868012)
|
||||||
cstr, 1
|
cstr, 1
|
||||||
end
|
end
|
||||||
|
|
||||||
# Generates a colormap for pgfplots based on a ColorGradient
|
# Generates a colormap for pgfplots based on a ColorGradient
|
||||||
function pgf_colormap(grad::ColorGradient)
|
function pgf_colormap(grad::ColorGradient)
|
||||||
join(map(grad.colors) do c
|
join(map(grad.colors) do c
|
||||||
@sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c))
|
@sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c))
|
||||||
end,", ")
|
end, ", ")
|
||||||
end
|
end
|
||||||
|
|
||||||
pgf_thickness_scaling(plt::Plot) = plt[:thickness_scaling]
|
pgf_thickness_scaling(plt::Plot) = plt[:thickness_scaling]
|
||||||
@ -94,7 +91,7 @@ pgf_thickness_scaling(sp::Subplot) = pgf_thickness_scaling(sp.plt)
|
|||||||
pgf_thickness_scaling(series) = pgf_thickness_scaling(series[:subplot])
|
pgf_thickness_scaling(series) = pgf_thickness_scaling(series[:subplot])
|
||||||
|
|
||||||
function pgf_fillstyle(plotattributes, i = 1)
|
function pgf_fillstyle(plotattributes, i = 1)
|
||||||
cstr,a = pgf_color(get_fillcolor(plotattributes, i))
|
cstr, a = pgf_color(get_fillcolor(plotattributes, i))
|
||||||
fa = get_fillalpha(plotattributes, i)
|
fa = get_fillalpha(plotattributes, i)
|
||||||
if fa !== nothing
|
if fa !== nothing
|
||||||
a = fa
|
a = fa
|
||||||
@ -126,8 +123,15 @@ end
|
|||||||
|
|
||||||
function pgf_marker(plotattributes, i = 1)
|
function pgf_marker(plotattributes, i = 1)
|
||||||
shape = _cycle(plotattributes[:markershape], i)
|
shape = _cycle(plotattributes[:markershape], i)
|
||||||
cstr, a = pgf_color(plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i)))
|
cstr, a = pgf_color(
|
||||||
cstr_stroke, a_stroke = pgf_color(plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i)))
|
plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i)),
|
||||||
|
)
|
||||||
|
cstr_stroke, a_stroke = pgf_color(
|
||||||
|
plot_color(
|
||||||
|
get_markerstrokecolor(plotattributes, i),
|
||||||
|
get_markerstrokealpha(plotattributes, i),
|
||||||
|
),
|
||||||
|
)
|
||||||
return string(
|
return string(
|
||||||
"mark = $(get(_pgfplots_markers, shape, "*")),\n",
|
"mark = $(get(_pgfplots_markers, shape, "*")),\n",
|
||||||
"mark size = $(pgf_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i)),\n",
|
"mark size = $(pgf_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i)),\n",
|
||||||
@ -138,22 +142,28 @@ function pgf_marker(plotattributes, i = 1)
|
|||||||
line width = $(pgf_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i)),
|
line width = $(pgf_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i)),
|
||||||
rotate = $(shape == :dtriangle ? 180 : 0),
|
rotate = $(shape == :dtriangle ? 180 : 0),
|
||||||
$(get(_pgfplots_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid"))
|
$(get(_pgfplots_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid"))
|
||||||
}"
|
}",
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
function pgf_add_annotation!(o, x, y, val, thickness_scaling = 1)
|
function pgf_add_annotation!(o, x, y, val, thickness_scaling = 1)
|
||||||
# Construct the style string.
|
# Construct the style string.
|
||||||
# Currently supports color and orientation
|
# Currently supports color and orientation
|
||||||
cstr,a = pgf_color(val.font.color)
|
cstr, a = pgf_color(val.font.color)
|
||||||
push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text
|
push!(
|
||||||
x, y,
|
o,
|
||||||
style="""
|
PGFPlots.Plots.Node(
|
||||||
$(get(_pgf_annotation_halign,val.font.halign,"")),
|
val.str, # Annotation Text
|
||||||
color=$cstr, draw opacity=$(convert(Float16,a)),
|
x,
|
||||||
rotate=$(val.font.rotation),
|
y,
|
||||||
font=$(pgf_font(val.font.pointsize, thickness_scaling))
|
style = """
|
||||||
"""))
|
$(get(_pgf_annotation_halign,val.font.halign,"")),
|
||||||
|
color=$cstr, draw opacity=$(convert(Float16,a)),
|
||||||
|
rotate=$(val.font.rotation),
|
||||||
|
font=$(pgf_font(val.font.pointsize, thickness_scaling))
|
||||||
|
""",
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------
|
||||||
@ -217,7 +227,7 @@ function pgf_series(sp::Subplot, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# add to legend?
|
# add to legend?
|
||||||
if i == 1 && sp[:legend] != :none && should_add_to_legend(series)
|
if i == 1 && sp[:legend_position] != :none && should_add_to_legend(series)
|
||||||
if plotattributes[:fillrange] !== nothing
|
if plotattributes[:fillrange] !== nothing
|
||||||
push!(style, "forget plot")
|
push!(style, "forget plot")
|
||||||
push!(series_collection, pgf_fill_legend_hack(plotattributes, args))
|
push!(series_collection, pgf_fill_legend_hack(plotattributes, args))
|
||||||
@ -241,7 +251,15 @@ function pgf_series(sp::Subplot, series::Series)
|
|||||||
|
|
||||||
# add fillrange
|
# add fillrange
|
||||||
if series[:fillrange] !== nothing && st != :shape
|
if series[:fillrange] !== nothing && st != :shape
|
||||||
push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...))
|
push!(
|
||||||
|
series_collection,
|
||||||
|
pgf_fillrange_series(
|
||||||
|
series,
|
||||||
|
i,
|
||||||
|
_cycle(series[:fillrange], rng),
|
||||||
|
seg_args...,
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# build/return the series object
|
# build/return the series object
|
||||||
@ -313,7 +331,7 @@ end
|
|||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
function pgf_axis(sp::Subplot, letter)
|
function pgf_axis(sp::Subplot, letter)
|
||||||
axis = sp[Symbol(letter,:axis)]
|
axis = sp[get_attr_symbol(letter, :axis)]
|
||||||
style = []
|
style = []
|
||||||
kw = KW()
|
kw = KW()
|
||||||
|
|
||||||
@ -324,7 +342,7 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
framestyle = pgf_framestyle(sp[:framestyle])
|
framestyle = pgf_framestyle(sp[:framestyle])
|
||||||
|
|
||||||
# axis guide
|
# axis guide
|
||||||
kw[Symbol(letter,:label)] = axis[:guide]
|
kw[get_attr_symbol(letter, :label)] = axis[:guide]
|
||||||
|
|
||||||
# axis label position
|
# axis label position
|
||||||
labelpos = ""
|
labelpos = ""
|
||||||
@ -336,7 +354,23 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
|
|
||||||
# Add label font
|
# Add label font
|
||||||
cstr, α = pgf_color(plot_color(axis[:guidefontcolor]))
|
cstr, α = pgf_color(plot_color(axis[:guidefontcolor]))
|
||||||
push!(style, string(letter, "label style = {", labelpos ,"font = ", pgf_font(axis[:guidefontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", axis[:guidefontrotation], "}"))
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
letter,
|
||||||
|
"label style = {",
|
||||||
|
labelpos,
|
||||||
|
"font = ",
|
||||||
|
pgf_font(axis[:guidefontsize], pgf_thickness_scaling(sp)),
|
||||||
|
", color = ",
|
||||||
|
cstr,
|
||||||
|
", draw opacity = ",
|
||||||
|
α,
|
||||||
|
", rotate = ",
|
||||||
|
axis[:guidefontrotation],
|
||||||
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
# flip/reverse?
|
# flip/reverse?
|
||||||
axis[:flip] && push!(style, "$letter dir=reverse")
|
axis[:flip] && push!(style, "$letter dir=reverse")
|
||||||
@ -344,7 +378,7 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
# scale
|
# scale
|
||||||
scale = axis[:scale]
|
scale = axis[:scale]
|
||||||
if scale in (:log2, :ln, :log10)
|
if scale in (:log2, :ln, :log10)
|
||||||
kw[Symbol(letter,:mode)] = "log"
|
kw[get_attr_symbol(letter, :mode)] = "log"
|
||||||
scale == :ln || push!(style, "log basis $letter=$(scale == :log2 ? 2 : 10)")
|
scale == :ln || push!(style, "log basis $letter=$(scale == :log2 ? 2 : 10)")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -363,16 +397,20 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
# limits
|
# limits
|
||||||
# TODO: support zlims
|
# TODO: support zlims
|
||||||
if letter != :z
|
if letter != :z
|
||||||
lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter)
|
lims =
|
||||||
kw[Symbol(letter,:min)] = lims[1]
|
ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) :
|
||||||
kw[Symbol(letter,:max)] = lims[2]
|
axis_limits(sp, letter)
|
||||||
|
kw[get_attr_symbol(letter, :min)] = lims[1]
|
||||||
|
kw[get_attr_symbol(letter, :max)] = lims[2]
|
||||||
end
|
end
|
||||||
|
|
||||||
if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none
|
if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none
|
||||||
ticks = get_ticks(sp, axis)
|
ticks = get_ticks(sp, axis)
|
||||||
#pgf plot ignores ticks with angle below 90 when xmin = 90 so shift values
|
#pgf plot ignores ticks with angle below 90 when xmin = 90 so shift values
|
||||||
tick_values = ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : ticks[1]
|
tick_values =
|
||||||
push!(style, string(letter, "tick = {", join(tick_values,","), "}"))
|
ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] :
|
||||||
|
ticks[1]
|
||||||
|
push!(style, string(letter, "tick = {", join(tick_values, ","), "}"))
|
||||||
if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto
|
if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto
|
||||||
# wrap the power part of label with }
|
# wrap the power part of label with }
|
||||||
tick_labels = Vector{String}(undef, length(ticks[2]))
|
tick_labels = Vector{String}(undef, length(ticks[2]))
|
||||||
@ -381,21 +419,59 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
power = string("{", power, "}")
|
power = string("{", power, "}")
|
||||||
tick_labels[i] = string(base, "^", power)
|
tick_labels[i] = string(base, "^", power)
|
||||||
end
|
end
|
||||||
push!(style, string(letter, "ticklabels = {\$", join(tick_labels,"\$,\$"), "\$}"))
|
push!(
|
||||||
|
style,
|
||||||
|
string(letter, "ticklabels = {\$", join(tick_labels, "\$,\$"), "\$}"),
|
||||||
|
)
|
||||||
elseif axis[:showaxis]
|
elseif axis[:showaxis]
|
||||||
tick_labels = ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2]
|
tick_labels =
|
||||||
|
ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2]
|
||||||
if axis[:formatter] in (:scientific, :auto)
|
if axis[:formatter] in (:scientific, :auto)
|
||||||
tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$")
|
tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$")
|
||||||
tick_labels = replace.(tick_labels, Ref("×" => "\\times"))
|
tick_labels = replace.(tick_labels, Ref("×" => "\\times"))
|
||||||
end
|
end
|
||||||
push!(style, string(letter, "ticklabels = {", join(tick_labels,","), "}"))
|
push!(style, string(letter, "ticklabels = {", join(tick_labels, ","), "}"))
|
||||||
else
|
else
|
||||||
push!(style, string(letter, "ticklabels = {}"))
|
push!(style, string(letter, "ticklabels = {}"))
|
||||||
end
|
end
|
||||||
push!(style, string(letter, "tick align = ", (axis[:tick_direction] == :out ? "outside" : "inside")))
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
letter,
|
||||||
|
"tick align = ",
|
||||||
|
(axis[:tick_direction] == :out ? "outside" : "inside"),
|
||||||
|
),
|
||||||
|
)
|
||||||
cstr, α = pgf_color(plot_color(axis[:tickfontcolor]))
|
cstr, α = pgf_color(plot_color(axis[:tickfontcolor]))
|
||||||
push!(style, string(letter, "ticklabel style = {font = ", pgf_font(axis[:tickfontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", axis[:tickfontrotation], "}"))
|
push!(
|
||||||
push!(style, string(letter, " grid style = {", pgf_linestyle(pgf_thickness_scaling(sp) * axis[:gridlinewidth], axis[:foreground_color_grid], axis[:gridalpha], axis[:gridstyle]), "}"))
|
style,
|
||||||
|
string(
|
||||||
|
letter,
|
||||||
|
"ticklabel style = {font = ",
|
||||||
|
pgf_font(axis[:tickfontsize], pgf_thickness_scaling(sp)),
|
||||||
|
", color = ",
|
||||||
|
cstr,
|
||||||
|
", draw opacity = ",
|
||||||
|
α,
|
||||||
|
", rotate = ",
|
||||||
|
axis[:tickfontrotation],
|
||||||
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
letter,
|
||||||
|
" grid style = {",
|
||||||
|
pgf_linestyle(
|
||||||
|
pgf_thickness_scaling(sp) * axis[:gridlinewidth],
|
||||||
|
axis[:foreground_color_grid],
|
||||||
|
axis[:gridalpha],
|
||||||
|
axis[:gridstyle],
|
||||||
|
),
|
||||||
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# framestyle
|
# framestyle
|
||||||
@ -412,7 +488,20 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
if framestyle == :zerolines
|
if framestyle == :zerolines
|
||||||
push!(style, string("extra ", letter, " ticks = 0"))
|
push!(style, string("extra ", letter, " ticks = 0"))
|
||||||
push!(style, string("extra ", letter, " tick labels = "))
|
push!(style, string("extra ", letter, " tick labels = "))
|
||||||
push!(style, string("extra ", letter, " tick style = {grid = major, major grid style = {", pgf_linestyle(pgf_thickness_scaling(sp), axis[:foreground_color_border], 1.0), "}}"))
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
"extra ",
|
||||||
|
letter,
|
||||||
|
" tick style = {grid = major, major grid style = {",
|
||||||
|
pgf_linestyle(
|
||||||
|
pgf_thickness_scaling(sp),
|
||||||
|
axis[:foreground_color_border],
|
||||||
|
1.0,
|
||||||
|
),
|
||||||
|
"}}",
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
if !axis[:showaxis]
|
if !axis[:showaxis]
|
||||||
@ -421,7 +510,19 @@ function pgf_axis(sp::Subplot, letter)
|
|||||||
if !axis[:showaxis] || framestyle in (:zerolines, :grid, :none)
|
if !axis[:showaxis] || framestyle in (:zerolines, :grid, :none)
|
||||||
push!(style, string(letter, " axis line style = {draw opacity = 0}"))
|
push!(style, string(letter, " axis line style = {draw opacity = 0}"))
|
||||||
else
|
else
|
||||||
push!(style, string(letter, " axis line style = {", pgf_linestyle(pgf_thickness_scaling(sp), axis[:foreground_color_border], 1.0), "}"))
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
letter,
|
||||||
|
" axis line style = {",
|
||||||
|
pgf_linestyle(
|
||||||
|
pgf_thickness_scaling(sp),
|
||||||
|
axis[:foreground_color_border],
|
||||||
|
1.0,
|
||||||
|
),
|
||||||
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# return the style list and KW args
|
# return the style list and KW args
|
||||||
@ -430,7 +531,6 @@ end
|
|||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
||||||
plt.o = PGFPlots.Axis[]
|
plt.o = PGFPlots.Axis[]
|
||||||
# Obtain the total height of the plot by extracting the maximal bottom
|
# Obtain the total height of the plot by extracting the maximal bottom
|
||||||
@ -438,7 +538,7 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
|||||||
total_height = bottom(bbox(plt.layout))
|
total_height = bottom(bbox(plt.layout))
|
||||||
|
|
||||||
for sp in plt.subplots
|
for sp in plt.subplots
|
||||||
# first build the PGFPlots.Axis object
|
# first build the PGFPlots.Axis object
|
||||||
style = ["unbounded coords=jump"]
|
style = ["unbounded coords=jump"]
|
||||||
kw = KW()
|
kw = KW()
|
||||||
|
|
||||||
@ -456,40 +556,66 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
|||||||
# A round on 2 decimal places should be enough precision for 300 dpi
|
# A round on 2 decimal places should be enough precision for 300 dpi
|
||||||
# plots.
|
# plots.
|
||||||
bb = bbox(sp)
|
bb = bbox(sp)
|
||||||
push!(style, """
|
push!(
|
||||||
xshift = $(left(bb).value)mm,
|
style,
|
||||||
yshift = $(round((total_height - (bottom(bb))).value, digits=2))mm,
|
"""
|
||||||
axis background/.style={fill=$(pgf_color(sp[:background_color_inside])[1])}
|
xshift = $(left(bb).value)mm,
|
||||||
""")
|
yshift = $(round((total_height - (bottom(bb))).value, digits=2))mm,
|
||||||
|
axis background/.style={fill=$(pgf_color(sp[:background_color_inside])[1])}
|
||||||
|
""",
|
||||||
|
)
|
||||||
kw[:width] = "$(width(bb).value)mm"
|
kw[:width] = "$(width(bb).value)mm"
|
||||||
kw[:height] = "$(height(bb).value)mm"
|
kw[:height] = "$(height(bb).value)mm"
|
||||||
|
|
||||||
if sp[:title] != ""
|
if sp[:title] != ""
|
||||||
kw[:title] = "$(sp[:title])"
|
kw[:title] = "$(sp[:title])"
|
||||||
cstr, α = pgf_color(plot_color(sp[:titlefontcolor]))
|
cstr, α = pgf_color(plot_color(sp[:titlefontcolor]))
|
||||||
push!(style, string("title style = {font = ", pgf_font(sp[:titlefontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", sp[:titlefontrotation], "}"))
|
push!(
|
||||||
|
style,
|
||||||
|
string(
|
||||||
|
"title style = {font = ",
|
||||||
|
pgf_font(sp[:titlefontsize], pgf_thickness_scaling(sp)),
|
||||||
|
", color = ",
|
||||||
|
cstr,
|
||||||
|
", draw opacity = ",
|
||||||
|
α,
|
||||||
|
", rotate = ",
|
||||||
|
sp[:titlefontrotation],
|
||||||
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
if get_aspect_ratio(sp) in (1, :equal)
|
if get_aspect_ratio(sp) in (1, :equal)
|
||||||
kw[:axisEqual] = "true"
|
kw[:axisEqual] = "true"
|
||||||
end
|
end
|
||||||
|
|
||||||
legpos = sp[:legend]
|
legpos = sp[:legend_position]
|
||||||
if haskey(_pgfplots_legend_pos, legpos)
|
if haskey(_pgfplots_legend_pos, legpos)
|
||||||
kw[:legendPos] = _pgfplots_legend_pos[legpos]
|
kw[:legendPos] = _pgfplots_legend_pos[legpos]
|
||||||
end
|
end
|
||||||
cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend]))
|
cstr, bg_alpha = pgf_color(plot_color(sp[:legend_background_color]))
|
||||||
fg_alpha = alpha(plot_color(sp[:foreground_color_legend]))
|
fg_alpha = alpha(plot_color(sp[:legend_foreground_color]))
|
||||||
|
|
||||||
push!(style, string(
|
push!(
|
||||||
"legend style = {",
|
style,
|
||||||
pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",",
|
string(
|
||||||
|
"legend style = {",
|
||||||
|
pgf_linestyle(
|
||||||
|
pgf_thickness_scaling(sp),
|
||||||
|
sp[:legend_foreground_color],
|
||||||
|
fg_alpha,
|
||||||
|
"solid",
|
||||||
|
),
|
||||||
|
",",
|
||||||
"fill = $cstr,",
|
"fill = $cstr,",
|
||||||
"fill opacity = $bg_alpha,",
|
"fill opacity = $bg_alpha,",
|
||||||
"text opacity = $(alpha(plot_color(sp[:legendfontcolor]))),",
|
"text opacity = $(alpha(plot_color(sp[:legend_font_color]))),",
|
||||||
"font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)),
|
"font = ",
|
||||||
"}",
|
pgf_font(sp[:legend_font_pointsize], pgf_thickness_scaling(sp)),
|
||||||
))
|
"}",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
if any(s[:seriestype] == :contour for s in series_list(sp))
|
if any(s[:seriestype] == :contour for s in series_list(sp))
|
||||||
kw[:view] = "{0}{90}"
|
kw[:view] = "{0}{90}"
|
||||||
@ -520,7 +646,10 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
|||||||
for series in series_list(sp)
|
for series in series_list(sp)
|
||||||
for col in (:markercolor, :fillcolor, :linecolor)
|
for col in (:markercolor, :fillcolor, :linecolor)
|
||||||
if typeof(series.plotattributes[col]) == ColorGradient
|
if typeof(series.plotattributes[col]) == ColorGradient
|
||||||
push!(style,"colormap={plots}{$(pgf_colormap(series.plotattributes[col]))}")
|
push!(
|
||||||
|
style,
|
||||||
|
"colormap={plots}{$(pgf_colormap(series.plotattributes[col]))}",
|
||||||
|
)
|
||||||
|
|
||||||
if sp[:colorbar] == :none
|
if sp[:colorbar] == :none
|
||||||
kw[:colorbar] = "false"
|
kw[:colorbar] = "false"
|
||||||
@ -543,17 +672,26 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend})
|
|||||||
|
|
||||||
# add series annotations
|
# add series annotations
|
||||||
anns = series[:series_annotations]
|
anns = series[:series_annotations]
|
||||||
for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y])
|
for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y])
|
||||||
pgf_add_annotation!(o, xi, yi, PlotText(str, fnt), pgf_thickness_scaling(series))
|
pgf_add_annotation!(
|
||||||
|
o,
|
||||||
|
xi,
|
||||||
|
yi,
|
||||||
|
PlotText(str, fnt),
|
||||||
|
pgf_thickness_scaling(series),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# add the annotations
|
# add the annotations
|
||||||
for ann in sp[:annotations]
|
for ann in sp[:annotations]
|
||||||
pgf_add_annotation!(o, locate_annotation(sp, ann...)..., pgf_thickness_scaling(sp))
|
pgf_add_annotation!(
|
||||||
|
o,
|
||||||
|
locate_annotation(sp, ann...)...,
|
||||||
|
pgf_thickness_scaling(sp),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# add the PGFPlots.Axis to the list
|
# add the PGFPlots.Axis to the list
|
||||||
push!(plt.o, o)
|
push!(plt.o, o)
|
||||||
end
|
end
|
||||||
@ -568,7 +706,7 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsBackend})
|
|||||||
pgfplt = PGFPlots.plot(plt.o)
|
pgfplt = PGFPlots.plot(plt.o)
|
||||||
|
|
||||||
# save a pdf
|
# save a pdf
|
||||||
fn = tempname()*".pdf"
|
fn = tempname() * ".pdf"
|
||||||
PGFPlots.save(PGFPlots.PDF(fn), pgfplt)
|
PGFPlots.save(PGFPlots.PDF(fn), pgfplt)
|
||||||
|
|
||||||
# read it into io
|
# read it into io
|
||||||
@ -579,8 +717,12 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsBackend})
|
|||||||
end
|
end
|
||||||
|
|
||||||
function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsBackend})
|
function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsBackend})
|
||||||
fn = tempname()*".tex"
|
fn = tempname() * ".tex"
|
||||||
PGFPlots.save(fn, backend_object(plt), include_preamble=plt.attr[:tex_output_standalone])
|
PGFPlots.save(
|
||||||
|
fn,
|
||||||
|
backend_object(plt),
|
||||||
|
include_preamble = plt.attr[:tex_output_standalone],
|
||||||
|
)
|
||||||
write(io, read(open(fn), String))
|
write(io, read(open(fn), String))
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -598,3 +740,5 @@ function _display(plt::Plot{PGFPlotsBackend})
|
|||||||
# cleanup
|
# cleanup
|
||||||
PGFPlots.cleanup(plt.o)
|
PGFPlots.cleanup(plt.o)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# COV_EXCL_STOP
|
||||||
604
src/backends/gaston.jl
Normal file
604
src/backends/gaston.jl
Normal file
@ -0,0 +1,604 @@
|
|||||||
|
# https://github.com/mbaz/Gaston.
|
||||||
|
|
||||||
|
should_warn_on_unsupported(::GastonBackend) = false
|
||||||
|
|
||||||
|
# Create the window/figure for this backend.
|
||||||
|
function _create_backend_figure(plt::Plot{GastonBackend})
|
||||||
|
state_handle = Gaston.nexthandle() # for now all the figures will be kept
|
||||||
|
plt.o = Gaston.newfigure(state_handle)
|
||||||
|
end
|
||||||
|
|
||||||
|
function _before_layout_calcs(plt::Plot{GastonBackend})
|
||||||
|
# Initialize all the subplots first
|
||||||
|
plt.o.subplots = Gaston.SubPlot[]
|
||||||
|
|
||||||
|
n1 = n2 = 0
|
||||||
|
if length(plt.inset_subplots) > 0
|
||||||
|
n1, sps = gaston_get_subplots(0, plt.inset_subplots, plt.layout)
|
||||||
|
gaston_init_subplots(plt, sps)
|
||||||
|
end
|
||||||
|
|
||||||
|
if length(plt.subplots) > 0
|
||||||
|
n2, sps = gaston_get_subplots(0, plt.subplots, plt.layout)
|
||||||
|
end
|
||||||
|
|
||||||
|
if (n = n1 + n2) != length(plt.subplots)
|
||||||
|
@error "Gaston: $n != $(length(plt.subplots))"
|
||||||
|
end
|
||||||
|
|
||||||
|
plt.o.layout = gaston_init_subplots(plt, sps)
|
||||||
|
|
||||||
|
# Then add the series (curves in gaston)
|
||||||
|
for series in plt.series_list
|
||||||
|
gaston_add_series(plt, series)
|
||||||
|
end
|
||||||
|
|
||||||
|
for sp in plt.subplots
|
||||||
|
sp === nothing && continue
|
||||||
|
for ann in sp[:annotations]
|
||||||
|
x, y, val = locate_annotation(sp, ann...)
|
||||||
|
sp.o.axesconf *= "\nset label '$(val.str)' at $x,$y $(gaston_font(val.font))"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function _update_min_padding!(sp::Subplot{GastonBackend})
|
||||||
|
sp.minpad = 0mm, 0mm, 0mm, 0mm
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function _update_plot_object(plt::Plot{GastonBackend})
|
||||||
|
# respect the layout ratio
|
||||||
|
dat = gaston_multiplot_pos_size(plt.layout, (0, 0, 1, 1))
|
||||||
|
gaston_multiplot_pos_size!(dat)
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
for (mime, term) in (
|
||||||
|
"application/eps" => "epscairo",
|
||||||
|
"image/eps" => "epslatex",
|
||||||
|
"application/pdf" => "pdfcairo",
|
||||||
|
"application/postscript" => "postscript",
|
||||||
|
"image/png" => "png",
|
||||||
|
"image/svg+xml" => "svg",
|
||||||
|
"text/latex" => "tikz",
|
||||||
|
"application/x-tex" => "epslatex",
|
||||||
|
"text/plain" => "dumb",
|
||||||
|
)
|
||||||
|
@eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{GastonBackend})
|
||||||
|
term = String($term)
|
||||||
|
tmpfile = "$(Gaston.tempname()).$term"
|
||||||
|
|
||||||
|
Gaston.save(
|
||||||
|
term = term,
|
||||||
|
output = tmpfile,
|
||||||
|
handle = plt.o.handle,
|
||||||
|
saveopts = gaston_saveopts(plt),
|
||||||
|
)
|
||||||
|
while !isfile(tmpfile)
|
||||||
|
end # avoid race condition with read in next line
|
||||||
|
write(io, read(tmpfile))
|
||||||
|
rm(tmpfile, force = true)
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
_display(plt::Plot{GastonBackend}) = display(plt.o)
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
# These functions are gaston specific
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
function gaston_saveopts(plt::Plot{GastonBackend})
|
||||||
|
saveopts = String["size $(join(plt.attr[:size], ","))"]
|
||||||
|
|
||||||
|
push!(
|
||||||
|
saveopts,
|
||||||
|
gaston_font(
|
||||||
|
plottitlefont(plt),
|
||||||
|
rot = false,
|
||||||
|
align = false,
|
||||||
|
color = false,
|
||||||
|
scale = 1,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
push!(saveopts, "background $(gaston_color(plt.attr[:background_color]))")
|
||||||
|
|
||||||
|
# push!(saveopts, "title '$(plt.attr[:window_title])'")
|
||||||
|
|
||||||
|
# Scale all plot elements to match Plots.jl DPI standard
|
||||||
|
scaling = plt.attr[:dpi] / Plots.DPI
|
||||||
|
push!(saveopts, "fontscale $scaling lw $scaling dl $scaling") # ps $scaling
|
||||||
|
|
||||||
|
return join(saveopts, " ")
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_get_subplots(n, plt_subplots, layout)
|
||||||
|
nr, nc = size(layout)
|
||||||
|
sps = Array{Any}(nothing, nr, nc)
|
||||||
|
for r in 1:nr, c in 1:nc # NOTE: col major
|
||||||
|
l = layout[r, c]
|
||||||
|
if l isa GridLayout
|
||||||
|
n, sub = gaston_get_subplots(n, plt_subplots, l)
|
||||||
|
sps[r, c] = size(sub) == (1, 1) ? only(sub) : sub
|
||||||
|
else
|
||||||
|
sps[r, c] = get(l.attr, :blank, false) ? nothing : plt_subplots[n += 1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return n, sps
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_init_subplots(plt, sps)
|
||||||
|
sz = nr, nc = size(sps)
|
||||||
|
for c in 1:nc, r in 1:nr # NOTE: row major
|
||||||
|
sp = sps[r, c]
|
||||||
|
if sp isa Subplot || sp === nothing
|
||||||
|
gaston_init_subplot(plt, sp)
|
||||||
|
else
|
||||||
|
gaston_init_subplots(plt, sp)
|
||||||
|
sz = max.(sz, size(sp))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return sz
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_init_subplot(
|
||||||
|
plt::Plot{GastonBackend},
|
||||||
|
sp::Union{Nothing,Subplot{GastonBackend}},
|
||||||
|
)
|
||||||
|
if sp === nothing
|
||||||
|
push!(plt.o.subplots, sp)
|
||||||
|
else
|
||||||
|
dims =
|
||||||
|
RecipesPipeline.is3d(sp) ||
|
||||||
|
sp.attr[:projection] == "3d" ||
|
||||||
|
needs_any_3d_axes(sp) ? 3 : 2
|
||||||
|
any_label = false
|
||||||
|
for series in series_list(sp)
|
||||||
|
if dims == 2 && series[:seriestype] ∈ (:heatmap, :contour)
|
||||||
|
dims = 3 # we need heatmap/contour to use splot, not plot
|
||||||
|
end
|
||||||
|
any_label |= should_add_to_legend(series)
|
||||||
|
end
|
||||||
|
sp.o = Gaston.Plot(
|
||||||
|
dims = dims,
|
||||||
|
curves = [],
|
||||||
|
axesconf = gaston_parse_axes_args(plt, sp, dims, any_label),
|
||||||
|
)
|
||||||
|
push!(plt.o.subplots, sp.o)
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_multiplot_pos_size(layout, parent_xy_wh)
|
||||||
|
nr, nc = size(layout)
|
||||||
|
dat = Array{Any}(nothing, nr, nc)
|
||||||
|
for r in 1:nr, c in 1:nc
|
||||||
|
l = layout[r, c]
|
||||||
|
# width and height (pct) are multiplicative (parent)
|
||||||
|
w = layout.widths[c].value * parent_xy_wh[3]
|
||||||
|
h = layout.heights[r].value * parent_xy_wh[4]
|
||||||
|
if isa(l, EmptyLayout)
|
||||||
|
dat[r, c] = (c - 1) * w, (r - 1) * h, w, h, nothing
|
||||||
|
else
|
||||||
|
# previous position (origin)
|
||||||
|
prev_r = r > 1 ? dat[r - 1, c] : nothing
|
||||||
|
prev_c = c > 1 ? dat[r, c - 1] : nothing
|
||||||
|
prev_r isa Array && (prev_r = prev_r[end, end])
|
||||||
|
prev_c isa Array && (prev_c = prev_c[end, end])
|
||||||
|
x = prev_c !== nothing ? prev_c[1] + prev_c[3] : parent_xy_wh[1]
|
||||||
|
y = prev_r !== nothing ? prev_r[2] + prev_r[4] : parent_xy_wh[2]
|
||||||
|
if l isa GridLayout
|
||||||
|
sub = gaston_multiplot_pos_size(l, (x, y, w, h))
|
||||||
|
dat[r, c] = size(sub) == (1, 1) ? only(sub) : sub
|
||||||
|
else
|
||||||
|
dat[r, c] = x, y, w, h, l
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return dat
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_multiplot_pos_size!(dat)
|
||||||
|
nr, nc = size(dat)
|
||||||
|
for r in 1:nr, c in 1:nc
|
||||||
|
xy_wh_sp = dat[r, c]
|
||||||
|
if xy_wh_sp isa Array
|
||||||
|
gaston_multiplot_pos_size!(xy_wh_sp)
|
||||||
|
elseif xy_wh_sp isa Tuple
|
||||||
|
x, y, w, h, sp = xy_wh_sp
|
||||||
|
sp === nothing && continue
|
||||||
|
sp.o === nothing && continue
|
||||||
|
# gnuplot screen coordinates: bottom left at 0,0 and top right at 1,1
|
||||||
|
sp.o.axesconf = "set origin $x, $(1 - y - h)\nset size $w, $h\n" * sp.o.axesconf
|
||||||
|
end
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_add_series(plt::Plot{GastonBackend}, series::Series)
|
||||||
|
sp = series[:subplot]
|
||||||
|
gsp = sp.o
|
||||||
|
x, y, z = series[:x], series[:y], series[:z]
|
||||||
|
st = series[:seriestype]
|
||||||
|
curves = []
|
||||||
|
if gsp.dims == 2 && z === nothing
|
||||||
|
for (n, seg) in enumerate(series_segments(series, st; check = true))
|
||||||
|
i, rng = seg.attr_index, seg.range
|
||||||
|
fr = _cycle(series[:fillrange], 1:length(x[rng]))
|
||||||
|
for sc in gaston_seriesconf!(sp, series, i, n == 1)
|
||||||
|
push!(curves, Gaston.Curve(x[rng], y[rng], nothing, fr, sc))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if z isa Surface
|
||||||
|
z = z.surf
|
||||||
|
if st == :image
|
||||||
|
z = reverse(Float32.(Gray.(z)), dims = 1) # flip y axis
|
||||||
|
nr, nc = size(z)
|
||||||
|
if (ly = length(y)) == 2 && ly != nr
|
||||||
|
y = collect(range(y[1], y[2], length = nr))
|
||||||
|
end
|
||||||
|
if (lx = length(x)) == 2 && lx != nc
|
||||||
|
x = collect(range(x[1], x[2], length = nc))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
length(x) == size(z, 2) + 1 && (x = (x[1:(end - 1)] + x[2:end]) / 2)
|
||||||
|
length(y) == size(z, 1) + 1 && (y = (y[1:(end - 1)] + y[2:end]) / 2)
|
||||||
|
end
|
||||||
|
if st == :mesh3d
|
||||||
|
x, y, z = mesh3d_triangles(x, y, z, series[:connections])
|
||||||
|
end
|
||||||
|
for sc in gaston_seriesconf!(sp, series, 1, true)
|
||||||
|
push!(curves, Gaston.Curve(x, y, z, nothing, sc))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for c in curves
|
||||||
|
append = length(gsp.curves) > 0
|
||||||
|
push!(gsp.curves, c)
|
||||||
|
Gaston.write_data(c, gsp.dims, gsp.datafile, append = append)
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_seriesconf!(
|
||||||
|
sp::Subplot{GastonBackend},
|
||||||
|
series::Series,
|
||||||
|
i::Int,
|
||||||
|
add_to_legend::Bool,
|
||||||
|
)
|
||||||
|
#=
|
||||||
|
gnuplot abbreviations (see gnuplot/src/set.c)
|
||||||
|
---------------------------------------------
|
||||||
|
dl: dashlength
|
||||||
|
dt: dashtype
|
||||||
|
fc: fillcolor
|
||||||
|
fs: fillstyle
|
||||||
|
lc: linecolor
|
||||||
|
lp: linespoints
|
||||||
|
ls: linestyle
|
||||||
|
lt: linetype
|
||||||
|
lw: linewidth
|
||||||
|
pi: pointinterval
|
||||||
|
pn: pointnumber
|
||||||
|
ps: pointscale
|
||||||
|
pt: pointtype
|
||||||
|
tc: textcolor
|
||||||
|
w: with
|
||||||
|
=#
|
||||||
|
gsp = sp.o
|
||||||
|
st = series[:seriestype]
|
||||||
|
extra = []
|
||||||
|
add_to_legend &= should_add_to_legend(series)
|
||||||
|
curveconf = String[add_to_legend ? "title '$(series[:label])'" : "notitle"]
|
||||||
|
|
||||||
|
clims = get_clims(sp, series)
|
||||||
|
if st ∈ (:scatter, :scatter3d)
|
||||||
|
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
|
||||||
|
pt, ps, mc = gaston_mk_ms_mc(series, clims, i)
|
||||||
|
push!(curveconf, "w points pt $pt ps $ps lc $mc")
|
||||||
|
elseif st ∈ (:path, :straightline, :path3d)
|
||||||
|
fr = series[:fillrange]
|
||||||
|
fc = gaston_color(get_fillcolor(series, i), get_fillalpha(series, i))
|
||||||
|
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
|
||||||
|
if fr !== nothing # filled curves, but not filled curves with markers
|
||||||
|
push!(
|
||||||
|
curveconf,
|
||||||
|
"w filledcurves fc $fc fs solid border lc $lc lw $lw dt $dt,'' w lines lc $lc lw $lw dt $dt",
|
||||||
|
)
|
||||||
|
elseif series[:markershape] == :none # simplepath
|
||||||
|
push!(curveconf, "w lines lc $lc dt $dt lw $lw")
|
||||||
|
else
|
||||||
|
pt, ps, mc = gaston_mk_ms_mc(series, clims, i)
|
||||||
|
push!(curveconf, "w lp lc $mc dt $dt lw $lw pt $pt ps $ps")
|
||||||
|
end
|
||||||
|
elseif st == :shape
|
||||||
|
fc = gaston_color(get_fillcolor(series, i), get_fillalpha(series, i))
|
||||||
|
lc, _ = gaston_lc_ls_lw(series, clims, i)
|
||||||
|
push!(curveconf, "w filledcurves fc $fc fs solid border lc $lc")
|
||||||
|
elseif st ∈ (:steppre, :stepmid, :steppost)
|
||||||
|
step = if st == :steppre
|
||||||
|
"fsteps"
|
||||||
|
elseif st == :stepmid
|
||||||
|
"histeps"
|
||||||
|
elseif st == :steppost
|
||||||
|
"steps"
|
||||||
|
end
|
||||||
|
push!(curveconf, "w $step")
|
||||||
|
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
|
||||||
|
push!(extra, "w points lc $lc dt $dt lw $lw notitle")
|
||||||
|
elseif st == :image
|
||||||
|
palette = gaston_palette(series[:seriescolor])
|
||||||
|
gsp.axesconf *= "\nset palette model RGB defined $palette"
|
||||||
|
push!(curveconf, "w image pixels")
|
||||||
|
elseif st ∈ (:contour, :contour3d)
|
||||||
|
push!(curveconf, "w lines")
|
||||||
|
st == :contour && (gsp.axesconf *= "\nset view map\nunset surface") # 2D
|
||||||
|
levels = join(map(string, collect(contour_levels(series, clims))), ", ")
|
||||||
|
gsp.axesconf *= "\nset contour base\nset cntrparam levels discrete $levels"
|
||||||
|
elseif st ∈ (:surface, :heatmap)
|
||||||
|
push!(curveconf, "w pm3d")
|
||||||
|
palette = gaston_palette(series[:seriescolor])
|
||||||
|
gsp.axesconf *= "\nset palette model RGB defined $palette"
|
||||||
|
st == :heatmap && (gsp.axesconf *= "\nset view map")
|
||||||
|
elseif st ∈ (:wireframe, :mesh3d)
|
||||||
|
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
|
||||||
|
push!(curveconf, "w lines lc $lc dt $dt lw $lw")
|
||||||
|
elseif st == :quiver
|
||||||
|
push!(curveconf, "w vectors filled")
|
||||||
|
else
|
||||||
|
@warn "Gaston: $st is not implemented yet"
|
||||||
|
end
|
||||||
|
|
||||||
|
return [join(curveconf, " "), extra...]
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_parse_axes_args(
|
||||||
|
plt::Plot{GastonBackend},
|
||||||
|
sp::Subplot{GastonBackend},
|
||||||
|
dims::Int,
|
||||||
|
any_label::Bool,
|
||||||
|
)
|
||||||
|
# axesconf = String["set margins 2, 2, 2, 2"] # left, right, bottom, top
|
||||||
|
axesconf = String[]
|
||||||
|
|
||||||
|
polar = ispolar(sp) && dims == 2 # cannot splot in polar coordinates
|
||||||
|
|
||||||
|
for letter in (:x, :y, :z)
|
||||||
|
(letter == :z && dims == 2) && continue
|
||||||
|
axis = sp.attr[get_attr_symbol(letter, :axis)]
|
||||||
|
# label names
|
||||||
|
push!(
|
||||||
|
axesconf,
|
||||||
|
"set $(letter)label '$(axis[:guide])' $(gaston_font(guidefont(axis)))",
|
||||||
|
)
|
||||||
|
mirror = axis[:mirror] ? "mirror" : "nomirror"
|
||||||
|
|
||||||
|
if axis[:scale] == :identity
|
||||||
|
logscale, base = "nologscale", ""
|
||||||
|
elseif axis[:scale] == :log10
|
||||||
|
logscale, base = "logscale", "10"
|
||||||
|
elseif axis[:scale] == :log2
|
||||||
|
logscale, base = "logscale", "2"
|
||||||
|
elseif axis[:scale] == :ln
|
||||||
|
logscale, base = "logscale", "e"
|
||||||
|
end
|
||||||
|
push!(axesconf, "set $logscale $letter $base")
|
||||||
|
|
||||||
|
# handle ticks
|
||||||
|
if polar
|
||||||
|
push!(axesconf, "set size square\nunset $(letter)tics")
|
||||||
|
else
|
||||||
|
push!(
|
||||||
|
axesconf,
|
||||||
|
"set $(letter)tics $(mirror) $(axis[:tick_direction]) $(gaston_font(tickfont(axis)))",
|
||||||
|
)
|
||||||
|
|
||||||
|
# major tick locations
|
||||||
|
if axis[:ticks] != :native
|
||||||
|
if axis[:flip]
|
||||||
|
hi, lo = axis_limits(sp, letter)
|
||||||
|
else
|
||||||
|
lo, hi = axis_limits(sp, letter)
|
||||||
|
end
|
||||||
|
push!(axesconf, "set $(letter)range [$lo:$hi]")
|
||||||
|
|
||||||
|
ticks = get_ticks(sp, axis)
|
||||||
|
gaston_set_ticks!(axesconf, ticks, letter, "", "")
|
||||||
|
|
||||||
|
if axis[:minorticks] != :native
|
||||||
|
minor_ticks = get_minor_ticks(sp, axis, ticks)
|
||||||
|
gaston_set_ticks!(axesconf, minor_ticks, letter, "m", "add")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if axis[:grid]
|
||||||
|
push!(axesconf, "set grid " * (polar ? "polar" : "$(letter)tics"))
|
||||||
|
axis[:minorgrid] &&
|
||||||
|
push!(axesconf, "set grid " * (polar ? "polar" : "m$(letter)tics"))
|
||||||
|
end
|
||||||
|
|
||||||
|
ratio = get_aspect_ratio(sp)
|
||||||
|
if ratio != :none
|
||||||
|
ratio == :equal && (ratio = -1)
|
||||||
|
push!(axesconf, "set size ratio $ratio")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
gaston_set_legend!(axesconf, sp, any_label)
|
||||||
|
|
||||||
|
if hascolorbar(sp)
|
||||||
|
push!(axesconf, "set cbtics $(gaston_font(colorbartitlefont(sp)))")
|
||||||
|
end
|
||||||
|
|
||||||
|
if sp[:title] !== nothing
|
||||||
|
push!(axesconf, "set title '$(sp[:title])' $(gaston_font(titlefont(sp)))")
|
||||||
|
end
|
||||||
|
|
||||||
|
if polar
|
||||||
|
push!(axesconf, "unset border\nset polar\nset border polar")
|
||||||
|
tmin, tmax = axis_limits(sp, :x, false, false)
|
||||||
|
rmin, rmax = axis_limits(sp, :y, false, false)
|
||||||
|
rticks = get_ticks(sp, :y)
|
||||||
|
if (ttype = ticksType(rticks)) == :ticks
|
||||||
|
gaston_ticks = string.(rticks)
|
||||||
|
elseif ttype == :ticks_and_labels
|
||||||
|
gaston_ticks = String["'$l' $t" for (t, l) in zip(rticks...)]
|
||||||
|
end
|
||||||
|
push!(
|
||||||
|
axesconf,
|
||||||
|
"set rtics ( " *
|
||||||
|
join(gaston_ticks, ", ") *
|
||||||
|
" ) $(gaston_font(tickfont(sp.attr[:yaxis])))",
|
||||||
|
)
|
||||||
|
push!(axesconf, "set trange [$(min(0, tmin)):$(max(2π, tmax))]")
|
||||||
|
push!(axesconf, "set rrange [$rmin:$rmax]")
|
||||||
|
push!(
|
||||||
|
axesconf,
|
||||||
|
"set ttics 0,30 format \"%g\".GPVAL_DEGREE_SIGN $(gaston_font(tickfont(sp.attr[:xaxis])))",
|
||||||
|
)
|
||||||
|
push!(axesconf, "set mttics 3")
|
||||||
|
end
|
||||||
|
|
||||||
|
return join(axesconf, "\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_set_ticks!(axesconf, ticks, letter, maj_min, add)
|
||||||
|
ticks == :auto && return
|
||||||
|
if ticks ∈ (:none, nothing, false)
|
||||||
|
push!(axesconf, "unset $(maj_min)$(letter)tics")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
gaston_ticks = String[]
|
||||||
|
if (ttype = ticksType(ticks)) == :ticks
|
||||||
|
tick_locs = @view ticks[:]
|
||||||
|
for i in eachindex(tick_locs)
|
||||||
|
tick = if maj_min == "m"
|
||||||
|
"'' $(tick_locs[i]) 1" # see gnuplot manual 'Mxtics'
|
||||||
|
else
|
||||||
|
"$(tick_locs[i])"
|
||||||
|
end
|
||||||
|
push!(gaston_ticks, tick)
|
||||||
|
end
|
||||||
|
elseif ttype == :ticks_and_labels
|
||||||
|
tick_locs = @view ticks[1][:]
|
||||||
|
tick_labels = @view ticks[2][:]
|
||||||
|
for i in eachindex(tick_locs)
|
||||||
|
lab = gaston_enclose_tick_string(tick_labels[i])
|
||||||
|
push!(gaston_ticks, "'$lab' $(tick_locs[i])")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
gaston_ticks = nothing
|
||||||
|
@error "Gaston: invalid input for $(maj_min)$(letter)ticks: $ticks"
|
||||||
|
end
|
||||||
|
if gaston_ticks !== nothing
|
||||||
|
push!(axesconf, "set $(letter)tics $add (" * join(gaston_ticks, ", ") * ")")
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_set_legend!(axesconf, sp, any_label)
|
||||||
|
leg = sp[:legend_position]
|
||||||
|
if sp[:legend_position] ∉ (:none, :inline) && any_label
|
||||||
|
leg == :best && (leg = :topright)
|
||||||
|
|
||||||
|
push!(
|
||||||
|
axesconf,
|
||||||
|
"set key " * (occursin("outer", string(leg)) ? "outside" : "inside"),
|
||||||
|
)
|
||||||
|
for position in ("top", "bottom", "left", "right")
|
||||||
|
occursin(position, string(leg)) && push!(axesconf, "set key $position")
|
||||||
|
end
|
||||||
|
push!(axesconf, "set key $(gaston_font(legendfont(sp), rot=false, align=false))")
|
||||||
|
if sp[:legend_title] !== nothing
|
||||||
|
# NOTE: cannot use legendtitlefont(sp) as it will override legendfont
|
||||||
|
push!(axesconf, "set key title '$(sp[:legend_title])'")
|
||||||
|
end
|
||||||
|
push!(axesconf, "set key box lw 1 opaque")
|
||||||
|
push!(axesconf, "set border back")
|
||||||
|
else
|
||||||
|
push!(axesconf, "set key off")
|
||||||
|
end
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
# Helpers
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
gaston_halign(k) = (left = :left, hcenter = :center, right = :right)[k]
|
||||||
|
gaston_valign(k) = (top = :top, vcenter = :center, bottom = :bottom)[k]
|
||||||
|
|
||||||
|
gaston_alpha(alpha) = alpha === nothing ? 0 : alpha
|
||||||
|
|
||||||
|
gaston_lc_ls_lw(series::Series, clims, i::Int) = (
|
||||||
|
gaston_color(get_linecolor(series, clims, i), get_linealpha(series, i)),
|
||||||
|
gaston_linestyle(get_linestyle(series, i)),
|
||||||
|
get_linewidth(series, i),
|
||||||
|
)
|
||||||
|
|
||||||
|
gaston_mk_ms_mc(series::Series, clims, i::Int) = (
|
||||||
|
gaston_marker(_cycle(series[:markershape], i), get_markeralpha(series, i)),
|
||||||
|
_cycle(series[:markersize], i) * 1.3 / 5,
|
||||||
|
gaston_color(get_markercolor(series, clims, i), get_markeralpha(series, i)),
|
||||||
|
)
|
||||||
|
|
||||||
|
function gaston_font(f; rot = true, align = true, color = true, scale = 1)
|
||||||
|
font = String["font '$(f.family),$(round(Int, scale * f.pointsize))'"]
|
||||||
|
align && push!(font, "$(gaston_halign(f.halign))")
|
||||||
|
rot && push!(font, "rotate by $(f.rotation)")
|
||||||
|
color && push!(font, "textcolor $(gaston_color(f.color))")
|
||||||
|
return join(font, " ")
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_palette(gradient)
|
||||||
|
palette = String[]
|
||||||
|
n = -1
|
||||||
|
for rgba in gradient # FIXME: naive conversion, inefficient ?
|
||||||
|
push!(palette, "$(n += 1) $(rgba.r) $(rgba.g) $(rgba.b)")
|
||||||
|
end
|
||||||
|
return '(' * join(palette, ", ") * ')'
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_marker(marker, alpha)
|
||||||
|
# NOTE: :rtriangle, :ltriangle, :hexagon, :heptagon, :octagon seems unsupported by gnuplot
|
||||||
|
filled = gaston_alpha(alpha) == 0
|
||||||
|
marker == :none && return -1
|
||||||
|
marker == :pixel && return 0
|
||||||
|
marker ∈ (:+, :cross) && return 1
|
||||||
|
marker ∈ (:x, :xcross) && return 2
|
||||||
|
marker == :star5 && return 3
|
||||||
|
marker == :rect && return filled ? 5 : 4
|
||||||
|
marker == :circle && return filled ? 7 : 6
|
||||||
|
marker == :utriangle && return filled ? 9 : 8
|
||||||
|
marker == :dtriangle && return filled ? 11 : 10
|
||||||
|
marker == :diamond && return filled ? 13 : 12
|
||||||
|
marker == :pentagon && return filled ? 15 : 14
|
||||||
|
|
||||||
|
@warn "Gaston: unsupported marker $marker"
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_color(col, alpha = 0)
|
||||||
|
col = single_color(col) # in case of gradients
|
||||||
|
col = alphacolor(col, gaston_alpha(alpha)) # add a default alpha if non existent
|
||||||
|
return "rgb '#$(hex(col, :aarrggbb))'"
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_linestyle(style)
|
||||||
|
style == :solid && return "1"
|
||||||
|
style == :dash && return "2"
|
||||||
|
style == :dot && return "3"
|
||||||
|
style == :dashdot && return "4"
|
||||||
|
style == :dashdotdot && return "5"
|
||||||
|
end
|
||||||
|
|
||||||
|
function gaston_enclose_tick_string(tick_string)
|
||||||
|
findfirst("^", tick_string) === nothing && return tick_string
|
||||||
|
base, power = split(tick_string, "^")
|
||||||
|
return "$base^{$power}"
|
||||||
|
end
|
||||||
2729
src/backends/gr.jl
2729
src/backends/gr.jl
File diff suppressed because it is too large
Load Diff
1008
src/backends/hdf5.jl
1008
src/backends/hdf5.jl
File diff suppressed because it is too large
Load Diff
@ -13,13 +13,10 @@ Add in functionality to Plots.jl:
|
|||||||
:aspect_ratio,
|
:aspect_ratio,
|
||||||
=#
|
=#
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
should_warn_on_unsupported(::InspectDRBackend) = false
|
||||||
|
|
||||||
is_marker_supported(::InspectDRBackend, shape::Shape) = true
|
is_marker_supported(::InspectDRBackend, shape::Shape) = true
|
||||||
|
|
||||||
_inspectdr_to_pixels(bb::BoundingBox) =
|
|
||||||
InspectDR.BoundingBox(to_pixels(left(bb)), to_pixels(right(bb)), to_pixels(top(bb)), to_pixels(bottom(bb)))
|
|
||||||
|
|
||||||
#Do we avoid Map to avoid possible pre-comile issues?
|
#Do we avoid Map to avoid possible pre-comile issues?
|
||||||
function _inspectdr_mapglyph(s::Symbol)
|
function _inspectdr_mapglyph(s::Symbol)
|
||||||
s == :rect && return :square
|
s == :rect && return :square
|
||||||
@ -47,16 +44,16 @@ _inspectdr_mapcolor(v::Colorant) = v
|
|||||||
function _inspectdr_mapcolor(g::PlotUtils.ColorGradient)
|
function _inspectdr_mapcolor(g::PlotUtils.ColorGradient)
|
||||||
@warn("Color gradients are currently unsupported in InspectDR.")
|
@warn("Color gradients are currently unsupported in InspectDR.")
|
||||||
#Pick middle color:
|
#Pick middle color:
|
||||||
_inspectdr_mapcolor(g.colors[div(1+end,2)])
|
_inspectdr_mapcolor(g.colors[div(1 + end, 2)])
|
||||||
end
|
end
|
||||||
function _inspectdr_mapcolor(v::AVec)
|
function _inspectdr_mapcolor(v::AVec)
|
||||||
@warn("Vectors of colors are currently unsupported in InspectDR.")
|
@warn("Vectors of colors are currently unsupported in InspectDR.")
|
||||||
#Pick middle color:
|
#Pick middle color:
|
||||||
_inspectdr_mapcolor(v[div(1+end,2)])
|
_inspectdr_mapcolor(v[div(1 + end, 2)])
|
||||||
end
|
end
|
||||||
|
|
||||||
#Hack: suggested point size does not seem adequate relative to plot size, for some reason.
|
#Hack: suggested point size does not seem adequate relative to plot size, for some reason.
|
||||||
_inspectdr_mapptsize(v) = 1.5*v
|
_inspectdr_mapptsize(v) = 1.5 * v
|
||||||
|
|
||||||
function _inspectdr_add_annotations(plot, x, y, val)
|
function _inspectdr_add_annotations(plot, x, y, val)
|
||||||
#What kind of annotation is this?
|
#What kind of annotation is this?
|
||||||
@ -64,14 +61,21 @@ end
|
|||||||
|
|
||||||
#plot::InspectDR.Plot2D
|
#plot::InspectDR.Plot2D
|
||||||
function _inspectdr_add_annotations(plot, x, y, val::PlotText)
|
function _inspectdr_add_annotations(plot, x, y, val::PlotText)
|
||||||
vmap = Dict{Symbol, Symbol}(:top=>:t, :bottom=>:b) #:vcenter
|
vmap = Dict{Symbol,Symbol}(:top => :t, :bottom => :b) #:vcenter
|
||||||
hmap = Dict{Symbol, Symbol}(:left=>:l, :right=>:r) #:hcenter
|
hmap = Dict{Symbol,Symbol}(:left => :l, :right => :r) #:hcenter
|
||||||
align = Symbol(get(vmap, val.font.valign, :c), get(hmap, val.font.halign, :c))
|
align = Symbol(get(vmap, val.font.valign, :c), get(hmap, val.font.halign, :c))
|
||||||
fnt = InspectDR.Font(val.font.family, val.font.pointsize,
|
fnt = InspectDR.Font(
|
||||||
color =_inspectdr_mapcolor(val.font.color)
|
val.font.family,
|
||||||
|
val.font.pointsize,
|
||||||
|
color = _inspectdr_mapcolor(val.font.color),
|
||||||
)
|
)
|
||||||
ann = InspectDR.atext(val.str, x=x, y=y,
|
ann = InspectDR.atext(
|
||||||
font=fnt, angle=val.font.rotation, align=align
|
texmath2unicode(val.str),
|
||||||
|
x = x,
|
||||||
|
y = y,
|
||||||
|
font = fnt,
|
||||||
|
angle = val.font.rotation,
|
||||||
|
align = align,
|
||||||
)
|
)
|
||||||
InspectDR.add(plot, ann)
|
InspectDR.add(plot, ann)
|
||||||
return
|
return
|
||||||
@ -79,9 +83,63 @@ end
|
|||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function _inspectdr_getaxisticks(ticks, gridlines, xfrm)
|
||||||
|
TickCustom = InspectDR.TickCustom
|
||||||
|
_xfrm(coord) = InspectDR.axis2aloc(Float64(coord), xfrm.spec) #Ensure Float64 - in case
|
||||||
|
|
||||||
|
ttype = ticksType(ticks)
|
||||||
|
if ticks == :native
|
||||||
|
#keep current
|
||||||
|
elseif ttype == :ticks_and_labels
|
||||||
|
pos = ticks[1]
|
||||||
|
labels = ticks[2]
|
||||||
|
nticks = length(ticks[1])
|
||||||
|
newticks = TickCustom[TickCustom(_xfrm(pos[i]), labels[i]) for i in 1:nticks]
|
||||||
|
gridlines = InspectDR.GridLinesCustom(gridlines)
|
||||||
|
gridlines.major = newticks
|
||||||
|
gridlines.minor = []
|
||||||
|
gridlines.displayminor = false
|
||||||
|
elseif ttype == :ticks
|
||||||
|
nticks = length(ticks)
|
||||||
|
gridlines.major = Float64[_xfrm(t) for t in ticks]
|
||||||
|
gridlines.minor = []
|
||||||
|
gridlines.displayminor = false
|
||||||
|
elseif isnothing(ticks)
|
||||||
|
gridlines.major = []
|
||||||
|
gridlines.minor = []
|
||||||
|
else #Assume ticks == :native
|
||||||
|
#keep current
|
||||||
|
end
|
||||||
|
|
||||||
|
return gridlines #keep current
|
||||||
|
end
|
||||||
|
|
||||||
|
function _inspectdr_setticks(sp::Subplot, plot, strip, xaxis, yaxis)
|
||||||
|
InputXfrm1D = InspectDR.InputXfrm1D
|
||||||
|
_get_ticks(axis) = :native == axis[:ticks] ? (:native) : get_ticks(sp, axis)
|
||||||
|
wantnative(ticks) = (:native == ticks)
|
||||||
|
|
||||||
|
xticks = _get_ticks(xaxis)
|
||||||
|
yticks = _get_ticks(yaxis)
|
||||||
|
|
||||||
|
if wantnative(xticks) && wantnative(yticks)
|
||||||
|
#Don't "eval" tick values
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
#TODO: Allow InspectDR to independently "eval" x or y ticks
|
||||||
|
ext = InspectDR.getextents_aloc(plot, 1)
|
||||||
|
grid = InspectDR._eval(strip.grid, plot.xscale, strip.yscale, ext)
|
||||||
|
grid.xlines = _inspectdr_getaxisticks(xticks, grid.xlines, InputXfrm1D(plot.xscale))
|
||||||
|
grid.ylines = _inspectdr_getaxisticks(yticks, grid.ylines, InputXfrm1D(strip.yscale))
|
||||||
|
strip.grid = grid
|
||||||
|
end
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
function _inspectdr_getscale(s::Symbol, yaxis::Bool)
|
function _inspectdr_getscale(s::Symbol, yaxis::Bool)
|
||||||
#TODO: Support :asinh, :sqrt
|
#TODO: Support :asinh, :sqrt
|
||||||
kwargs = yaxis ? (:tgtmajor=>8, :tgtminor=>2) : () #More grid lines on y-axis
|
kwargs = yaxis ? (:tgtmajor => 8, :tgtminor => 2) : () #More grid lines on y-axis
|
||||||
if :log2 == s
|
if :log2 == s
|
||||||
return InspectDR.AxisScale(:log2; kwargs...)
|
return InspectDR.AxisScale(:log2; kwargs...)
|
||||||
elseif :log10 == s
|
elseif :log10 == s
|
||||||
@ -96,13 +154,12 @@ end
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
#Glyph used when plotting "Shape"s:
|
#Glyph used when plotting "Shape"s:
|
||||||
INSPECTDR_GLYPH_SHAPE = InspectDR.GlyphPolyline(
|
INSPECTDR_GLYPH_SHAPE =
|
||||||
2*InspectDR.GLYPH_SQUARE.x, InspectDR.GLYPH_SQUARE.y
|
InspectDR.GlyphPolyline(2 * InspectDR.GLYPH_SQUARE.x, InspectDR.GLYPH_SQUARE.y)
|
||||||
)
|
|
||||||
|
|
||||||
mutable struct InspecDRPlotRef
|
mutable struct InspecDRPlotRef
|
||||||
mplot::Union{Nothing, InspectDR.Multiplot}
|
mplot::Union{Nothing,InspectDR.Multiplot}
|
||||||
gui::Union{Nothing, InspectDR.GtkPlot}
|
gui::Union{Nothing,InspectDR.GtkPlot}
|
||||||
end
|
end
|
||||||
|
|
||||||
_inspectdr_getmplot(::Any) = nothing
|
_inspectdr_getmplot(::Any) = nothing
|
||||||
@ -151,7 +208,9 @@ end
|
|||||||
function _initialize_subplot(plt::Plot{InspectDRBackend}, sp::Subplot{InspectDRBackend})
|
function _initialize_subplot(plt::Plot{InspectDRBackend}, sp::Subplot{InspectDRBackend})
|
||||||
plot = sp.o
|
plot = sp.o
|
||||||
#Don't do anything without a "subplot" object: Will process later.
|
#Don't do anything without a "subplot" object: Will process later.
|
||||||
if nothing == plot; return; end
|
if nothing == plot
|
||||||
|
return
|
||||||
|
end
|
||||||
plot.data = []
|
plot.data = []
|
||||||
plot.userannot = [] #Clear old markers/text annotation/polyline "annotation"
|
plot.userannot = [] #Clear old markers/text annotation/polyline "annotation"
|
||||||
return plot
|
return plot
|
||||||
@ -167,9 +226,12 @@ function _series_added(plt::Plot{InspectDRBackend}, series::Series)
|
|||||||
st = series[:seriestype]
|
st = series[:seriestype]
|
||||||
sp = series[:subplot]
|
sp = series[:subplot]
|
||||||
plot = sp.o
|
plot = sp.o
|
||||||
|
clims = get_clims(sp, series)
|
||||||
|
|
||||||
#Don't do anything without a "subplot" object: Will process later.
|
#Don't do anything without a "subplot" object: Will process later.
|
||||||
if nothing == plot; return; end
|
if nothing == plot
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
_vectorize(v) = isa(v, Vector) ? v : collect(v) #InspectDR only supports vectors
|
_vectorize(v) = isa(v, Vector) ? v : collect(v) #InspectDR only supports vectors
|
||||||
x, y = if st == :straightline
|
x, y = if st == :straightline
|
||||||
@ -180,30 +242,33 @@ function _series_added(plt::Plot{InspectDRBackend}, series::Series)
|
|||||||
|
|
||||||
#No support for polar grid... but can still perform polar transformation:
|
#No support for polar grid... but can still perform polar transformation:
|
||||||
if ispolar(sp)
|
if ispolar(sp)
|
||||||
Θ = x; r = y
|
Θ = x
|
||||||
x = r.*cos.(Θ); y = r.*sin.(Θ)
|
r = y
|
||||||
|
x = r .* cos.(Θ)
|
||||||
|
y = r .* sin.(Θ)
|
||||||
end
|
end
|
||||||
|
|
||||||
# doesn't handle mismatched x/y - wrap data (pyplot behaviour):
|
# doesn't handle mismatched x/y - wrap data (pyplot behaviour):
|
||||||
nx = length(x); ny = length(y)
|
nx = length(x)
|
||||||
|
ny = length(y)
|
||||||
if nx < ny
|
if nx < ny
|
||||||
series[:x] = Float64[x[mod1(i,nx)] for i=1:ny]
|
series[:x] = Float64[x[mod1(i, nx)] for i in 1:ny]
|
||||||
elseif ny > nx
|
elseif ny > nx
|
||||||
series[:y] = Float64[y[mod1(i,ny)] for i=1:nx]
|
series[:y] = Float64[y[mod1(i, ny)] for i in 1:nx]
|
||||||
end
|
end
|
||||||
|
|
||||||
#= TODO: Eventually support
|
#= TODO: Eventually support
|
||||||
series[:fillcolor] #I think this is fill under line
|
series[:fillcolor] #I think this is fill under line
|
||||||
zorder = series[:series_plotindex]
|
zorder = series[:series_plotindex]
|
||||||
|
|
||||||
For st in :shape:
|
For st in :shape:
|
||||||
zorder = series[:series_plotindex],
|
zorder = series[:series_plotindex],
|
||||||
=#
|
=#
|
||||||
|
|
||||||
if st in (:shape,)
|
if st in (:shape,)
|
||||||
x, y = shape_data(series)
|
x, y = shape_data(series)
|
||||||
nmax = 0
|
nmax = 0
|
||||||
for (i,rng) in enumerate(iter_segments(x, y))
|
for (i, rng) in enumerate(iter_segments(x, y))
|
||||||
nmax = i
|
nmax = i
|
||||||
if length(rng) > 1
|
if length(rng) > 1
|
||||||
linewidth = series[:linewidth]
|
linewidth = series[:linewidth]
|
||||||
@ -211,11 +276,12 @@ For st in :shape:
|
|||||||
linecolor = _inspectdr_mapcolor(_cycle(c, i))
|
linecolor = _inspectdr_mapcolor(_cycle(c, i))
|
||||||
c = plot_color(get_fillcolor(series), get_fillalpha(series))
|
c = plot_color(get_fillcolor(series), get_fillalpha(series))
|
||||||
fillcolor = _inspectdr_mapcolor(_cycle(c, i))
|
fillcolor = _inspectdr_mapcolor(_cycle(c, i))
|
||||||
line = InspectDR.line(
|
line = InspectDR.line(style = :solid, width = linewidth, color = linecolor)
|
||||||
style=:solid, width=linewidth, color=linecolor
|
|
||||||
)
|
|
||||||
apline = InspectDR.PolylineAnnotation(
|
apline = InspectDR.PolylineAnnotation(
|
||||||
x[rng], y[rng], line=line, fillcolor=fillcolor
|
x[rng],
|
||||||
|
y[rng],
|
||||||
|
line = line,
|
||||||
|
fillcolor = fillcolor,
|
||||||
)
|
)
|
||||||
InspectDR.add(plot, apline)
|
InspectDR.add(plot, apline)
|
||||||
end
|
end
|
||||||
@ -228,21 +294,24 @@ For st in :shape:
|
|||||||
linecolor = _inspectdr_mapcolor(_cycle(c, i))
|
linecolor = _inspectdr_mapcolor(_cycle(c, i))
|
||||||
c = plot_color(get_fillcolor(series), get_fillalpha(series))
|
c = plot_color(get_fillcolor(series), get_fillalpha(series))
|
||||||
fillcolor = _inspectdr_mapcolor(_cycle(c, i))
|
fillcolor = _inspectdr_mapcolor(_cycle(c, i))
|
||||||
wfrm = InspectDR.add(plot, Float64[], Float64[], id=series[:label])
|
wfrm = InspectDR.add(plot, Float64[], Float64[], id = series[:label])
|
||||||
wfrm.line = InspectDR.line(
|
wfrm.line = InspectDR.line(
|
||||||
style=:none, width=linewidth, #linewidth affects glyph
|
style = :none,
|
||||||
|
width = linewidth, #linewidth affects glyph
|
||||||
)
|
)
|
||||||
wfrm.glyph = InspectDR.glyph(
|
wfrm.glyph = InspectDR.glyph(
|
||||||
shape = INSPECTDR_GLYPH_SHAPE, size = 8,
|
shape = INSPECTDR_GLYPH_SHAPE,
|
||||||
color = linecolor, fillcolor = fillcolor
|
size = 8,
|
||||||
|
color = linecolor,
|
||||||
|
fillcolor = fillcolor,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
elseif st in (:path, :scatter, :straightline) #, :steppre, :steppost)
|
elseif st in (:path, :scatter, :straightline) #, :steppre, :stepmid, :steppost)
|
||||||
#NOTE: In Plots.jl, :scatter plots have 0-linewidths (I think).
|
#NOTE: In Plots.jl, :scatter plots have 0-linewidths (I think).
|
||||||
linewidth = series[:linewidth]
|
linewidth = series[:linewidth]
|
||||||
#More efficient & allows some support for markerstrokewidth:
|
#More efficient & allows some support for markerstrokewidth:
|
||||||
_style = (0==linewidth ? :none : series[:linestyle])
|
_style = (0 == linewidth ? :none : series[:linestyle])
|
||||||
wfrm = InspectDR.add(plot, x, y, id=series[:label])
|
wfrm = InspectDR.add(plot, x, y, id = series[:label])
|
||||||
wfrm.line = InspectDR.line(
|
wfrm.line = InspectDR.line(
|
||||||
style = _style,
|
style = _style,
|
||||||
width = series[:linewidth],
|
width = series[:linewidth],
|
||||||
@ -256,14 +325,18 @@ For st in :shape:
|
|||||||
wfrm.glyph = InspectDR.glyph(
|
wfrm.glyph = InspectDR.glyph(
|
||||||
shape = _inspectdr_mapglyph(series[:markershape]),
|
shape = _inspectdr_mapglyph(series[:markershape]),
|
||||||
size = _inspectdr_mapglyphsize(series[:markersize]),
|
size = _inspectdr_mapglyphsize(series[:markersize]),
|
||||||
color = _inspectdr_mapcolor(plot_color(series[:markerstrokecolor], series[:markerstrokealpha])),
|
color = _inspectdr_mapcolor(
|
||||||
fillcolor = _inspectdr_mapcolor(plot_color(series[:markercolor], series[:markeralpha])),
|
plot_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
|
||||||
|
),
|
||||||
|
fillcolor = _inspectdr_mapcolor(
|
||||||
|
plot_color(get_markercolor(series, clims), get_markeralpha(series)),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# this is all we need to add the series_annotations text
|
# this is all we need to add the series_annotations text
|
||||||
anns = series[:series_annotations]
|
anns = series[:series_annotations]
|
||||||
for (xi,yi,str,fnt) in EachAnn(anns, x, y)
|
for (xi, yi, str, fnt) in EachAnn(anns, x, y)
|
||||||
_inspectdr_add_annotations(plot, xi, yi, PlotText(str, fnt))
|
_inspectdr_add_annotations(plot, xi, yi, PlotText(str, fnt))
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
@ -283,72 +356,90 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend})
|
|||||||
plot = sp.o
|
plot = sp.o
|
||||||
strip = plot.strips[1] #Only 1 strip supported with Plots.jl
|
strip = plot.strips[1] #Only 1 strip supported with Plots.jl
|
||||||
|
|
||||||
xaxis = sp[:xaxis]; yaxis = sp[:yaxis]
|
xaxis = sp[:xaxis]
|
||||||
|
yaxis = sp[:yaxis]
|
||||||
xgrid_show = xaxis[:grid]
|
xgrid_show = xaxis[:grid]
|
||||||
ygrid_show = yaxis[:grid]
|
ygrid_show = yaxis[:grid]
|
||||||
|
|
||||||
strip.grid = InspectDR.GridRect(
|
strip.grid = InspectDR.GridRect(
|
||||||
vmajor=xgrid_show, # vminor=xgrid_show,
|
vmajor = xgrid_show, # vminor=xgrid_show,
|
||||||
hmajor=ygrid_show, # hminor=ygrid_show,
|
hmajor = ygrid_show, # hminor=ygrid_show,
|
||||||
)
|
)
|
||||||
|
|
||||||
plot.xscale = _inspectdr_getscale(xaxis[:scale], false)
|
plot.xscale = _inspectdr_getscale(xaxis[:scale], false)
|
||||||
strip.yscale = _inspectdr_getscale(yaxis[:scale], true)
|
strip.yscale = _inspectdr_getscale(yaxis[:scale], true)
|
||||||
xmin, xmax = axis_limits(sp, :x)
|
xmin, xmax = axis_limits(sp, :x)
|
||||||
ymin, ymax = axis_limits(sp, :y)
|
ymin, ymax = axis_limits(sp, :y)
|
||||||
if ispolar(sp)
|
if ispolar(sp)
|
||||||
#Plots.jl appears to give (xmin,xmax) ≜ (Θmin,Θmax) & (ymin,ymax) ≜ (rmin,rmax)
|
#Plots.jl appears to give (xmin,xmax) ≜ (Θmin,Θmax) & (ymin,ymax) ≜ (rmin,rmax)
|
||||||
rmax = NaNMath.max(abs(ymin), abs(ymax))
|
rmax = NaNMath.max(abs(ymin), abs(ymax))
|
||||||
xmin, xmax = -rmax, rmax
|
xmin, xmax = -rmax, rmax
|
||||||
ymin, ymax = -rmax, rmax
|
ymin, ymax = -rmax, rmax
|
||||||
end
|
end
|
||||||
plot.xext = InspectDR.PExtents1D() #reset
|
plot.xext_full = InspectDR.PExtents1D(xmin, xmax)
|
||||||
strip.yext = InspectDR.PExtents1D() #reset
|
strip.yext_full = InspectDR.PExtents1D(ymin, ymax)
|
||||||
plot.xext_full = InspectDR.PExtents1D(xmin, xmax)
|
#Set current extents = full extents (needed for _eval(strip.grid,...))
|
||||||
strip.yext_full = InspectDR.PExtents1D(ymin, ymax)
|
plot.xext = plot.xext_full
|
||||||
a = plot.annotation
|
strip.yext = strip.yext_full
|
||||||
a.title = sp[:title]
|
_inspectdr_setticks(sp, plot, strip, xaxis, yaxis)
|
||||||
a.xlabel = xaxis[:guide]; a.ylabels = [yaxis[:guide]]
|
|
||||||
|
|
||||||
l = plot.layout
|
a = plot.annotation
|
||||||
l[:frame_canvas].fillcolor = _inspectdr_mapcolor(sp[:background_color_subplot])
|
a.title = texmath2unicode(sp[:title])
|
||||||
l[:frame_data].fillcolor = _inspectdr_mapcolor(sp[:background_color_inside])
|
a.xlabel = texmath2unicode(xaxis[:guide])
|
||||||
l[:frame_data].line.color = _inspectdr_mapcolor(xaxis[:foreground_color_axis])
|
a.ylabels = [texmath2unicode(yaxis[:guide])]
|
||||||
l[:font_title] = InspectDR.Font(sp[:titlefontfamily],
|
|
||||||
_inspectdr_mapptsize(sp[:titlefontsize]),
|
#Modify base layout of new object:
|
||||||
color = _inspectdr_mapcolor(sp[:titlefontcolor])
|
l = plot.layout.defaults = deepcopy(InspectDR.defaults.plotlayout)
|
||||||
)
|
#IMPORTANT: Must deepcopy to ensure we don't change layouts of other plots.
|
||||||
#Cannot independently control fonts of axes with InspectDR:
|
#Works because plot uses defaults (not user-overwritten `layout.values`)
|
||||||
l[:font_axislabel] = InspectDR.Font(xaxis[:guidefontfamily],
|
l.frame_canvas.fillcolor = _inspectdr_mapcolor(sp[:background_color_subplot])
|
||||||
_inspectdr_mapptsize(xaxis[:guidefontsize]),
|
l.frame_data.fillcolor = _inspectdr_mapcolor(sp[:background_color_inside])
|
||||||
color = _inspectdr_mapcolor(xaxis[:guidefontcolor])
|
l.frame_data.line.color = _inspectdr_mapcolor(xaxis[:foreground_color_axis])
|
||||||
)
|
l.font_title = InspectDR.Font(
|
||||||
l[:font_ticklabel] = InspectDR.Font(xaxis[:tickfontfamily],
|
sp[:titlefontfamily],
|
||||||
_inspectdr_mapptsize(xaxis[:tickfontsize]),
|
_inspectdr_mapptsize(sp[:titlefontsize]),
|
||||||
color = _inspectdr_mapcolor(xaxis[:tickfontcolor])
|
color = _inspectdr_mapcolor(sp[:titlefontcolor]),
|
||||||
)
|
)
|
||||||
l[:enable_legend] = (sp[:legend] != :none)
|
#Cannot independently control fonts of axes with InspectDR:
|
||||||
#l[:halloc_legend] = 150 #TODO: compute???
|
l.font_axislabel = InspectDR.Font(
|
||||||
l[:font_legend] = InspectDR.Font(sp[:legendfontfamily],
|
xaxis[:guidefontfamily],
|
||||||
_inspectdr_mapptsize(sp[:legendfontsize]),
|
_inspectdr_mapptsize(xaxis[:guidefontsize]),
|
||||||
color = _inspectdr_mapcolor(sp[:legendfontcolor])
|
color = _inspectdr_mapcolor(xaxis[:guidefontcolor]),
|
||||||
)
|
)
|
||||||
l[:frame_legend].fillcolor = _inspectdr_mapcolor(sp[:background_color_legend])
|
l.font_ticklabel = InspectDR.Font(
|
||||||
|
xaxis[:tickfontfamily],
|
||||||
|
_inspectdr_mapptsize(xaxis[:tickfontsize]),
|
||||||
|
color = _inspectdr_mapcolor(xaxis[:tickfontcolor]),
|
||||||
|
)
|
||||||
|
l.enable_legend = (sp[:legend_position] != :none)
|
||||||
|
#l.halloc_legend = 150 #TODO: compute???
|
||||||
|
l.font_legend = InspectDR.Font(
|
||||||
|
sp[:legend_font_family],
|
||||||
|
_inspectdr_mapptsize(sp[:legend_font_pointsize]),
|
||||||
|
color = _inspectdr_mapcolor(sp[:legend_font_color]),
|
||||||
|
)
|
||||||
|
l.frame_legend.fillcolor = _inspectdr_mapcolor(sp[:legend_background_color])
|
||||||
|
#_round!() ensures values use integer spacings (looks better on screen):
|
||||||
|
InspectDR._round!(InspectDR.autofit2font!(l, legend_width = 10.0)) #10 "em"s wide
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
# called just before updating layout bounding boxes... in case you need to prep
|
# called just before updating layout bounding boxes... in case you need to prep
|
||||||
# for the calcs
|
# for the calcs
|
||||||
function _before_layout_calcs(plt::Plot{InspectDRBackend})
|
function _before_layout_calcs(plt::Plot{InspectDRBackend})
|
||||||
mplot = _inspectdr_getmplot(plt.o)
|
mplot = _inspectdr_getmplot(plt.o)
|
||||||
if nothing == mplot; return; end
|
if nothing == mplot
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
mplot.title = plt[:plot_title]
|
mplot.title = plt[:plot_title]
|
||||||
if "" == mplot.title
|
if "" == mplot.title
|
||||||
#Don't use window_title... probably not what you want.
|
#Don't use window_title... probably not what you want.
|
||||||
#mplot.title = plt[:window_title]
|
#mplot.title = plt[:window_title]
|
||||||
end
|
end
|
||||||
mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside])
|
|
||||||
|
|
||||||
|
mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside])
|
||||||
|
mplot.layout[:frame] = mplot.layout[:frame] #register changes
|
||||||
resize!(mplot.subplots, length(plt.subplots))
|
resize!(mplot.subplots, length(plt.subplots))
|
||||||
nsubplots = length(plt.subplots)
|
nsubplots = length(plt.subplots)
|
||||||
for (i, sp) in enumerate(plt.subplots)
|
for (i, sp) in enumerate(plt.subplots)
|
||||||
@ -392,17 +483,19 @@ end
|
|||||||
# to fit ticks, tick labels, guides, colorbars, etc.
|
# to fit ticks, tick labels, guides, colorbars, etc.
|
||||||
function _update_min_padding!(sp::Subplot{InspectDRBackend})
|
function _update_min_padding!(sp::Subplot{InspectDRBackend})
|
||||||
plot = sp.o
|
plot = sp.o
|
||||||
if !isa(plot, InspectDR.Plot2D); return sp.minpad; end
|
if !isa(plot, InspectDR.Plot2D)
|
||||||
|
return sp.minpad
|
||||||
|
end
|
||||||
#Computing plotbounds with 0-BoundingBox returns required padding:
|
#Computing plotbounds with 0-BoundingBox returns required padding:
|
||||||
bb = InspectDR.plotbounds(plot.layout.values, InspectDR.BoundingBox(0,0,0,0))
|
bb = InspectDR.plotbounds(plot.layout.values, InspectDR.BoundingBox(0, 0, 0, 0))
|
||||||
#NOTE: plotbounds always pads for titles, legends, etc. even if not in use.
|
#NOTE: plotbounds always pads for titles, legends, etc. even if not in use.
|
||||||
#TODO: possibly zero-out items not in use??
|
#TODO: possibly zero-out items not in use??
|
||||||
|
|
||||||
# add in the user-specified margin to InspectDR padding:
|
# add in the user-specified margin to InspectDR padding:
|
||||||
leftpad = abs(bb.xmin)*px + sp[:left_margin]
|
leftpad = abs(bb.xmin) * px + sp[:left_margin]
|
||||||
toppad = abs(bb.ymin)*px + sp[:top_margin]
|
toppad = abs(bb.ymin) * px + sp[:top_margin]
|
||||||
rightpad = abs(bb.xmax)*px + sp[:right_margin]
|
rightpad = abs(bb.xmax) * px + sp[:right_margin]
|
||||||
bottompad = abs(bb.ymax)*px + sp[:bottom_margin]
|
bottompad = abs(bb.ymax) * px + sp[:bottom_margin]
|
||||||
sp.minpad = (leftpad, toppad, rightpad, bottompad)
|
sp.minpad = (leftpad, toppad, rightpad, bottompad)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -411,16 +504,25 @@ end
|
|||||||
# Override this to update plot items (title, xlabel, etc), and add annotations (plotattributes[:annotations])
|
# Override this to update plot items (title, xlabel, etc), and add annotations (plotattributes[:annotations])
|
||||||
function _update_plot_object(plt::Plot{InspectDRBackend})
|
function _update_plot_object(plt::Plot{InspectDRBackend})
|
||||||
mplot = _inspectdr_getmplot(plt.o)
|
mplot = _inspectdr_getmplot(plt.o)
|
||||||
if nothing == mplot; return; end
|
if nothing == mplot
|
||||||
|
return
|
||||||
|
end
|
||||||
|
mplot.bblist = InspectDR.BoundingBox[]
|
||||||
|
|
||||||
for (i, sp) in enumerate(plt.subplots)
|
for (i, sp) in enumerate(plt.subplots)
|
||||||
graphbb = _inspectdr_to_pixels(plotarea(sp))
|
figw, figh = sp.plt[:size]
|
||||||
plot = mplot.subplots[i]
|
pcts = bbox_to_pcts(sp.bbox, figw * px, figh * px)
|
||||||
plot.plotbb = InspectDR.plotbounds(plot.layout.values, graphbb)
|
_left, _bottom, _width, _height = pcts
|
||||||
|
ymax = 1.0 - _bottom
|
||||||
|
ymin = ymax - _height
|
||||||
|
bb = InspectDR.BoundingBox(_left, _left + _width, ymin, ymax)
|
||||||
|
push!(mplot.bblist, bb)
|
||||||
end
|
end
|
||||||
|
|
||||||
gplot = _inspectdr_getgui(plt.o)
|
gplot = _inspectdr_getgui(plt.o)
|
||||||
if nothing == gplot; return; end
|
if nothing == gplot
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
gplot.src = mplot #Ensure still references current plot
|
gplot.src = mplot #Ensure still references current plot
|
||||||
InspectDR.refresh(gplot)
|
InspectDR.refresh(gplot)
|
||||||
@ -429,29 +531,23 @@ end
|
|||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
const _inspectdr_mimeformats_dpi = Dict(
|
|
||||||
"image/png" => "png"
|
|
||||||
)
|
|
||||||
const _inspectdr_mimeformats_nodpi = Dict(
|
|
||||||
"image/svg+xml" => "svg",
|
|
||||||
"application/eps" => "eps",
|
|
||||||
"image/eps" => "eps",
|
|
||||||
# "application/postscript" => "ps", #TODO: support once Cairo supports PSSurface
|
|
||||||
"application/pdf" => "pdf"
|
|
||||||
)
|
|
||||||
_inspectdr_show(io::IO, mime::MIME, ::Nothing, w, h) =
|
_inspectdr_show(io::IO, mime::MIME, ::Nothing, w, h) =
|
||||||
throw(ErrorException("Cannot show(::IO, ...) plot - not yet generated"))
|
throw(ErrorException("Cannot show(::IO, ...) plot - not yet generated"))
|
||||||
function _inspectdr_show(io::IO, mime::MIME, mplot, w, h)
|
function _inspectdr_show(io::IO, mime::MIME, mplot, w, h)
|
||||||
InspectDR._show(io, mime, mplot, Float64(w), Float64(h))
|
InspectDR._show(io, mime, mplot, Float64(w), Float64(h))
|
||||||
end
|
end
|
||||||
|
|
||||||
for (mime, fmt) in _inspectdr_mimeformats_dpi
|
function _show(io::IO, mime::MIME{Symbol("image/png")}, plt::Plot{InspectDRBackend})
|
||||||
@eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{InspectDRBackend})
|
dpi = plt[:dpi] # TODO: support
|
||||||
dpi = plt[:dpi]#TODO: support
|
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
|
||||||
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
for (mime, fmt) in _inspectdr_mimeformats_nodpi
|
for (mime, fmt) in (
|
||||||
|
"image/svg+xml" => "svg",
|
||||||
|
"application/eps" => "eps",
|
||||||
|
"image/eps" => "eps",
|
||||||
|
# "application/postscript" => "ps", # TODO: support once Cairo supports PSSurface
|
||||||
|
"application/pdf" => "pdf",
|
||||||
|
)
|
||||||
@eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{InspectDRBackend})
|
@eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{InspectDRBackend})
|
||||||
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
|
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
|
||||||
end
|
end
|
||||||
@ -462,7 +558,9 @@ end
|
|||||||
# Display/show the plot (open a GUI window, or browser page, for example).
|
# Display/show the plot (open a GUI window, or browser page, for example).
|
||||||
function _display(plt::Plot{InspectDRBackend})
|
function _display(plt::Plot{InspectDRBackend})
|
||||||
mplot = _inspectdr_getmplot(plt.o)
|
mplot = _inspectdr_getmplot(plt.o)
|
||||||
if nothing == mplot; return; end
|
if nothing == mplot
|
||||||
|
return
|
||||||
|
end
|
||||||
gplot = _inspectdr_getgui(plt.o)
|
gplot = _inspectdr_getgui(plt.o)
|
||||||
|
|
||||||
if nothing == gplot
|
if nothing == gplot
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
function plotlybase_syncplot(plt::Plot)
|
|
||||||
plt.o = ORCA.PlotlyBase.Plot()
|
|
||||||
traces = ORCA.PlotlyBase.GenericTrace[]
|
|
||||||
for series_dict in plotly_series(plt)
|
|
||||||
plotly_type = pop!(series_dict, :type)
|
|
||||||
push!(traces, ORCA.PlotlyBase.GenericTrace(plotly_type; series_dict...))
|
|
||||||
end
|
|
||||||
ORCA.PlotlyBase.addtraces!(plt.o, traces...)
|
|
||||||
layout = plotly_layout(plt)
|
|
||||||
w, h = plt[:size]
|
|
||||||
ORCA.PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
|
|
||||||
return plt.o
|
|
||||||
end
|
|
||||||
|
|
||||||
const _orca_mimeformats = Dict(
|
|
||||||
"application/pdf" => "pdf",
|
|
||||||
"image/png" => "png",
|
|
||||||
"image/svg+xml" => "svg",
|
|
||||||
"image/eps" => "eps",
|
|
||||||
)
|
|
||||||
|
|
||||||
for (mime, fmt) in _orca_mimeformats
|
|
||||||
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) = ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
|
|
||||||
end
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
23
src/backends/plotlybase.jl
Normal file
23
src/backends/plotlybase.jl
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
function plotlybase_syncplot(plt::Plot)
|
||||||
|
plt.o = PlotlyBase.Plot()
|
||||||
|
traces = PlotlyBase.GenericTrace[]
|
||||||
|
for series_dict in plotly_series(plt)
|
||||||
|
plotly_type = pop!(series_dict, :type)
|
||||||
|
push!(traces, PlotlyBase.GenericTrace(plotly_type; series_dict...))
|
||||||
|
end
|
||||||
|
PlotlyBase.addtraces!(plt.o, traces...)
|
||||||
|
layout = plotly_layout(plt)
|
||||||
|
w, h = plt[:size]
|
||||||
|
PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
|
||||||
|
return plt.o
|
||||||
|
end
|
||||||
|
|
||||||
|
for (mime, fmt) in (
|
||||||
|
"application/pdf" => "pdf",
|
||||||
|
"image/png" => "png",
|
||||||
|
"image/svg+xml" => "svg",
|
||||||
|
"image/eps" => "eps",
|
||||||
|
)
|
||||||
|
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) =
|
||||||
|
PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
|
||||||
|
end
|
||||||
@ -8,6 +8,7 @@ function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend})
|
|||||||
traces = PlotlyJS.GenericTrace[]
|
traces = PlotlyJS.GenericTrace[]
|
||||||
for series_dict in plotly_series(plt)
|
for series_dict in plotly_series(plt)
|
||||||
plotly_type = pop!(series_dict, :type)
|
plotly_type = pop!(series_dict, :type)
|
||||||
|
series_dict[:transpose] = false
|
||||||
push!(traces, PlotlyJS.GenericTrace(plotly_type; series_dict...))
|
push!(traces, PlotlyJS.GenericTrace(plotly_type; series_dict...))
|
||||||
end
|
end
|
||||||
PlotlyJS.addtraces!(plt.o, traces...)
|
PlotlyJS.addtraces!(plt.o, traces...)
|
||||||
@ -19,30 +20,30 @@ end
|
|||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
const _plotlyjs_mimeformats = Dict(
|
for (mime, fmt) in (
|
||||||
"application/pdf" => "pdf",
|
"application/pdf" => "pdf",
|
||||||
"image/png" => "png",
|
"image/png" => "png",
|
||||||
"image/svg+xml" => "svg",
|
"image/svg+xml" => "svg",
|
||||||
"image/eps" => "eps",
|
"image/eps" => "eps",
|
||||||
)
|
)
|
||||||
|
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) =
|
||||||
for (mime, fmt) in _plotlyjs_mimeformats
|
PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt)
|
||||||
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Use the Plotly implementation for json and html:
|
# Use the Plotly implementation for json and html:
|
||||||
_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = plotly_show_js(io, plt)
|
_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) =
|
||||||
|
plotly_show_js(io, plt)
|
||||||
|
|
||||||
html_head(plt::Plot{PlotlyJSBackend}) = plotly_html_head(plt)
|
html_head(plt::Plot{PlotlyJSBackend}) = plotly_html_head(plt)
|
||||||
html_body(plt::Plot{PlotlyJSBackend}) = plotly_html_body(plt)
|
html_body(plt::Plot{PlotlyJSBackend}) = plotly_html_body(plt)
|
||||||
|
|
||||||
_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = write(io, standalone_html(plt))
|
_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) =
|
||||||
|
write(io, embeddable_html(plt))
|
||||||
|
|
||||||
_display(plt::Plot{PlotlyJSBackend}) = display(plotlyjs_syncplot(plt))
|
_display(plt::Plot{PlotlyJSBackend}) = display(plotlyjs_syncplot(plt))
|
||||||
|
|
||||||
function PlotlyJS.WebIO.render(plt::Plot{PlotlyJSBackend})
|
function PlotlyJS.WebIO.render(plt::Plot{PlotlyJSBackend})
|
||||||
plt_html = sprint(show, MIME("text/html"), plt)
|
return PlotlyJS.WebIO.render(plotlyjs_syncplot(plt))
|
||||||
return PlotlyJS.WebIO.render(PlotlyJS.WebIO.dom"div"(innerHTML=plt_html))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function closeall(::PlotlyJSBackend)
|
function closeall(::PlotlyJSBackend)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1,182 +1,373 @@
|
|||||||
|
# https://github.com/JuliaPlots/UnicodePlots.jl
|
||||||
|
|
||||||
# https://github.com/Evizero/UnicodePlots.jl
|
const _canvas_map = (
|
||||||
|
braille = UnicodePlots.BrailleCanvas,
|
||||||
|
density = UnicodePlots.DensityCanvas,
|
||||||
|
heatmap = UnicodePlots.HeatmapCanvas,
|
||||||
|
lookup = UnicodePlots.LookupCanvas,
|
||||||
|
ascii = UnicodePlots.AsciiCanvas,
|
||||||
|
block = UnicodePlots.BlockCanvas,
|
||||||
|
dot = UnicodePlots.DotCanvas,
|
||||||
|
)
|
||||||
|
|
||||||
|
should_warn_on_unsupported(::UnicodePlotsBackend) = false
|
||||||
|
|
||||||
# don't warn on unsupported... there's just too many warnings!!
|
function _before_layout_calcs(plt::Plot{UnicodePlotsBackend})
|
||||||
warn_on_unsupported_args(::UnicodePlotsBackend, plotattributes::KW) = nothing
|
plt.o = UnicodePlots.Plot[]
|
||||||
|
up_width = UnicodePlots.DEFAULT_WIDTH[]
|
||||||
# --------------------------------------------------------------------------------------
|
up_height = UnicodePlots.DEFAULT_HEIGHT[]
|
||||||
|
|
||||||
const _canvas_type = Ref(:auto)
|
|
||||||
|
|
||||||
function _canvas_map()
|
|
||||||
KW(
|
|
||||||
:braille => UnicodePlots.BrailleCanvas,
|
|
||||||
:ascii => UnicodePlots.AsciiCanvas,
|
|
||||||
:block => UnicodePlots.BlockCanvas,
|
|
||||||
:dot => UnicodePlots.DotCanvas,
|
|
||||||
:density => UnicodePlots.DensityCanvas,
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# do all the magic here... build it all at once, since we need to know about all the series at the very beginning
|
|
||||||
function rebuildUnicodePlot!(plt::Plot, width, height)
|
|
||||||
plt.o = []
|
|
||||||
|
|
||||||
|
has_layout = prod(size(plt.layout)) > 1
|
||||||
for sp in plt.subplots
|
for sp in plt.subplots
|
||||||
|
sp_kw = sp[:extra_kwargs]
|
||||||
xaxis = sp[:xaxis]
|
xaxis = sp[:xaxis]
|
||||||
yaxis = sp[:yaxis]
|
yaxis = sp[:yaxis]
|
||||||
xlim = axis_limits(sp, :x)
|
xlim = collect(axis_limits(sp, :x))
|
||||||
ylim = axis_limits(sp, :y)
|
ylim = collect(axis_limits(sp, :y))
|
||||||
|
zlim = collect(axis_limits(sp, :z))
|
||||||
|
F = float(eltype(xlim))
|
||||||
|
|
||||||
# make vectors
|
# We set x/y to have a single point,
|
||||||
xlim = [xlim[1], xlim[2]]
|
# since we need to create the plot with some data.
|
||||||
ylim = [ylim[1], ylim[2]]
|
# Since this point is at the bottom left corner of the plot,
|
||||||
|
# it should be hidden by consecutive plotting commands.
|
||||||
|
x = Vector{F}(xlim)
|
||||||
|
y = Vector{F}(ylim)
|
||||||
|
z = Vector{F}(zlim)
|
||||||
|
|
||||||
# we set x/y to have a single point, since we need to create the plot with some data.
|
# create a plot window with xlim/ylim set,
|
||||||
# since this point is at the bottom left corner of the plot, it shouldn't actually be shown
|
# but the X/Y vectors are outside the bounds
|
||||||
x = Float64[xlim[1]]
|
canvas = if (up_c = get(sp_kw, :canvas, :auto)) === :auto
|
||||||
y = Float64[ylim[1]]
|
isijulia() ? :ascii : :braille
|
||||||
|
|
||||||
# create a plot window with xlim/ylim set, but the X/Y vectors are outside the bounds
|
|
||||||
ct = _canvas_type[]
|
|
||||||
canvas_type = if ct == :auto
|
|
||||||
isijulia() ? UnicodePlots.AsciiCanvas : UnicodePlots.BrailleCanvas
|
|
||||||
else
|
else
|
||||||
_canvas_map()[ct]
|
up_c
|
||||||
end
|
end
|
||||||
|
|
||||||
# special handling for spy
|
border = if (up_b = get(sp_kw, :border, :auto)) === :auto
|
||||||
if length(sp.series_list) == 1
|
isijulia() ? :ascii : :solid
|
||||||
series = sp.series_list[1]
|
else
|
||||||
if series[:seriestype] == :spy
|
up_b
|
||||||
push!(plt.o, UnicodePlots.spy(
|
end
|
||||||
series[:z].surf,
|
|
||||||
width = width,
|
# blank plots will not be shown
|
||||||
height = height,
|
width = has_layout && isempty(series_list(sp)) ? 0 : get(sp_kw, :width, up_width)
|
||||||
title = sp[:title],
|
height = get(sp_kw, :height, up_height)
|
||||||
canvas = canvas_type
|
|
||||||
))
|
plot_3d = is3d(sp)
|
||||||
continue
|
blend = get(sp_kw, :blend, true)
|
||||||
|
grid = xaxis[:grid] && yaxis[:grid]
|
||||||
|
quiver = contour = false
|
||||||
|
for series in series_list(sp)
|
||||||
|
st = series[:seriestype]
|
||||||
|
blend &= get(series[:extra_kwargs], :blend, true)
|
||||||
|
quiver |= series[:arrow] isa Arrow # post-pipeline detection (:quiver -> :path)
|
||||||
|
contour |= st === :contour
|
||||||
|
if st === :histogram2d
|
||||||
|
xlim = ylim = (0, 0)
|
||||||
|
elseif st === :spy || st === :heatmap
|
||||||
|
width = height = 0
|
||||||
|
grid = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
grid &= !(quiver || contour)
|
||||||
|
blend &= !(quiver || contour)
|
||||||
|
|
||||||
# # make it a bar canvas if plotting bar
|
plot_3d && (xlim = ylim = (0, 0)) # determined using projection
|
||||||
# if any(series -> series[:seriestype] == :bar, series_list(sp))
|
azimuth, elevation = sp[:camera] # PyPlot: azimuth = -60 & elevation = 30
|
||||||
# canvas_type = UnicodePlots.BarplotGraphics
|
projection = plot_3d ? get(sp_kw, :projection, :orthographic) : nothing
|
||||||
# end
|
|
||||||
|
|
||||||
o = UnicodePlots.Plot(x, y, canvas_type;
|
kw = (
|
||||||
width = width,
|
compact = true,
|
||||||
|
title = texmath2unicode(sp[:title]),
|
||||||
|
xlabel = texmath2unicode(xaxis[:guide]),
|
||||||
|
ylabel = texmath2unicode(yaxis[:guide]),
|
||||||
|
grid = grid,
|
||||||
|
blend = blend,
|
||||||
height = height,
|
height = height,
|
||||||
title = sp[:title],
|
width = width,
|
||||||
|
xscale = xaxis[:scale],
|
||||||
|
yscale = yaxis[:scale],
|
||||||
|
border = border,
|
||||||
xlim = xlim,
|
xlim = xlim,
|
||||||
ylim = ylim,
|
ylim = ylim,
|
||||||
border = isijulia() ? :ascii : :solid
|
# 3d
|
||||||
|
projection = projection,
|
||||||
|
elevation = elevation,
|
||||||
|
azimuth = azimuth,
|
||||||
|
zoom = get(sp_kw, :zoom, 1),
|
||||||
|
up = get(sp_kw, :up, :z),
|
||||||
)
|
)
|
||||||
|
|
||||||
# set the axis labels
|
o = UnicodePlots.Plot(x, y, plot_3d ? z : nothing, _canvas_map[canvas]; kw...)
|
||||||
UnicodePlots.xlabel!(o, xaxis[:guide])
|
|
||||||
UnicodePlots.ylabel!(o, yaxis[:guide])
|
|
||||||
|
|
||||||
# now use the ! functions to add to the plot
|
|
||||||
for series in series_list(sp)
|
for series in series_list(sp)
|
||||||
addUnicodeSeries!(o, series.plotattributes, sp[:legend] != :none, xlim, ylim)
|
o = addUnicodeSeries!(
|
||||||
|
sp,
|
||||||
|
o,
|
||||||
|
kw,
|
||||||
|
series,
|
||||||
|
sp[:legend_position] !== :none,
|
||||||
|
plot_3d,
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# save the object
|
for ann in sp[:annotations]
|
||||||
push!(plt.o, o)
|
x, y, val = locate_annotation(sp, ann...)
|
||||||
|
o = UnicodePlots.annotate!(
|
||||||
|
o,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
texmath2unicode(val.str);
|
||||||
|
color = up_color(val.font.color),
|
||||||
|
halign = val.font.halign,
|
||||||
|
valign = val.font.valign,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
push!(plt.o, o) # save the object
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
up_color(col::UnicodePlots.UserColorType) = col
|
||||||
|
up_color(col::RGBA) =
|
||||||
|
(c = convert(ARGB32, col); map(Int, (red(c).i, green(c).i, blue(c).i)))
|
||||||
|
up_color(col) = :auto
|
||||||
|
|
||||||
|
function up_cmap(series)
|
||||||
|
rng = range(0, 1, length = length(UnicodePlots.COLOR_MAP_DATA[:viridis]))
|
||||||
|
[(red(c), green(c), blue(c)) for c in get(get_colorgradient(series), rng)]
|
||||||
|
end
|
||||||
|
|
||||||
# add a single series
|
# add a single series
|
||||||
function addUnicodeSeries!(o, plotattributes, addlegend::Bool, xlim, ylim)
|
function addUnicodeSeries!(
|
||||||
# get the function, or special handling for step/bar/hist
|
sp::Subplot{UnicodePlotsBackend},
|
||||||
st = plotattributes[:seriestype]
|
up::UnicodePlots.Plot,
|
||||||
if st == :histogram2d
|
kw,
|
||||||
UnicodePlots.densityplot!(o, plotattributes[:x], plotattributes[:y])
|
series,
|
||||||
return
|
addlegend::Bool,
|
||||||
end
|
plot_3d::Bool,
|
||||||
|
)
|
||||||
if st in (:path, :straightline)
|
st = series[:seriestype]
|
||||||
func = UnicodePlots.lineplot!
|
se_kw = series[:extra_kwargs]
|
||||||
elseif st == :scatter || plotattributes[:markershape] != :none
|
|
||||||
func = UnicodePlots.scatterplot!
|
|
||||||
# elseif st == :bar
|
|
||||||
# func = UnicodePlots.barplot!
|
|
||||||
elseif st == :shape
|
|
||||||
func = UnicodePlots.lineplot!
|
|
||||||
else
|
|
||||||
error("Linestyle $st not supported by UnicodePlots")
|
|
||||||
end
|
|
||||||
|
|
||||||
# get the series data and label
|
# get the series data and label
|
||||||
x, y = if st == :straightline
|
x, y = if st === :straightline
|
||||||
straightline_data(plotattributes)
|
straightline_data(series)
|
||||||
elseif st == :shape
|
elseif st === :shape
|
||||||
shape_data(plotattributes)
|
shape_data(series)
|
||||||
else
|
else
|
||||||
[collect(float(plotattributes[s])) for s in (:x, :y)]
|
series[:x], series[:y]
|
||||||
end
|
|
||||||
label = addlegend ? plotattributes[:label] : ""
|
|
||||||
|
|
||||||
# if we happen to pass in allowed color symbols, great... otherwise let UnicodePlots decide
|
|
||||||
color = plotattributes[:linecolor] in UnicodePlots.color_cycle ? plotattributes[:linecolor] : :auto
|
|
||||||
|
|
||||||
# add the series
|
|
||||||
x, y = RecipesPipeline.unzip(collect(Base.Iterators.filter(xy->isfinite(xy[1])&&isfinite(xy[2]), zip(x,y))))
|
|
||||||
func(o, x, y; color = color, name = label)
|
|
||||||
end
|
|
||||||
|
|
||||||
# -------------------------------
|
|
||||||
|
|
||||||
# since this is such a hack, it's only callable using `png`... should error during normal `show`
|
|
||||||
function png(plt::AbstractPlot{UnicodePlotsBackend}, fn::AbstractString)
|
|
||||||
fn = addExtension(fn, "png")
|
|
||||||
|
|
||||||
# make some whitespace and show the plot
|
|
||||||
println("\n\n\n\n\n\n")
|
|
||||||
gui(plt)
|
|
||||||
|
|
||||||
# @osx_only begin
|
|
||||||
@static if Sys.isapple()
|
|
||||||
# BEGIN HACK
|
|
||||||
|
|
||||||
# wait while the plot gets drawn
|
|
||||||
sleep(0.5)
|
|
||||||
|
|
||||||
# use osx screen capture when my terminal is maximized and cursor starts at the bottom (I know, right?)
|
|
||||||
# TODO: compute size of plot to adjust these numbers (or maybe implement something good??)
|
|
||||||
run(`screencapture -R50,600,700,420 $fn`)
|
|
||||||
|
|
||||||
# END HACK (phew)
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
|
||||||
error("Can only savepng on osx with UnicodePlots (though even then I wouldn't do it)")
|
if ispolar(sp) || ispolar(series)
|
||||||
|
return UnicodePlots.polarplot(x, y)
|
||||||
|
end
|
||||||
|
|
||||||
|
# special handling (src/interface)
|
||||||
|
fix_ar = get(se_kw, :fix_ar, true)
|
||||||
|
if st === :histogram2d
|
||||||
|
return UnicodePlots.densityplot(x, y; kw...)
|
||||||
|
elseif st === :spy
|
||||||
|
return UnicodePlots.spy(Array(series[:z]); fix_ar = fix_ar, kw...)
|
||||||
|
elseif st in (:contour, :heatmap) # 2D
|
||||||
|
colormap = get(se_kw, :colormap, :none)
|
||||||
|
kw = (
|
||||||
|
kw...,
|
||||||
|
zlabel = sp[:colorbar_title],
|
||||||
|
colormap = colormap === :none ? up_cmap(series) : colormap,
|
||||||
|
colorbar = hascolorbar(sp),
|
||||||
|
)
|
||||||
|
if st === :contour
|
||||||
|
isfilledcontour(series) &&
|
||||||
|
@warn "Plots(UnicodePlots): filled contour is not implemented"
|
||||||
|
return UnicodePlots.contourplot(
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
Array(series[:z]);
|
||||||
|
kw...,
|
||||||
|
levels = series[:levels],
|
||||||
|
)
|
||||||
|
elseif st === :heatmap
|
||||||
|
return UnicodePlots.heatmap(Array(series[:z]); fix_ar = fix_ar, kw...)
|
||||||
|
end
|
||||||
|
elseif st in (:surface, :wireframe) # 3D
|
||||||
|
colormap = get(se_kw, :colormap, :none)
|
||||||
|
lines = get(se_kw, :lines, st === :wireframe)
|
||||||
|
zscale = get(se_kw, :zscale, :identity)
|
||||||
|
kw = (
|
||||||
|
kw...,
|
||||||
|
zlabel = sp[:colorbar_title],
|
||||||
|
colormap = colormap === :none ? up_cmap(series) : colormap,
|
||||||
|
colorbar = hascolorbar(sp),
|
||||||
|
color = st === :wireframe ? up_color(get_linecolor(series, 1)) : nothing,
|
||||||
|
zscale = zscale,
|
||||||
|
lines = lines,
|
||||||
|
)
|
||||||
|
return UnicodePlots.surfaceplot(x, y, Array(series[:z]); kw...)
|
||||||
|
elseif st === :mesh3d
|
||||||
|
return UnicodePlots.lineplot!(
|
||||||
|
up,
|
||||||
|
mesh3d_triangles(x, y, series[:z], series[:connections])...,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# now use the ! functions to add to the plot
|
||||||
|
if st in (:path, :path3d, :straightline, :shape, :mesh3d)
|
||||||
|
func = UnicodePlots.lineplot!
|
||||||
|
series_kw = (; head_tail = series[:arrow] isa Arrow ? series[:arrow].side : nothing)
|
||||||
|
elseif st in (:scatter, :scatter3d) || series[:markershape] !== :none
|
||||||
|
func = UnicodePlots.scatterplot!
|
||||||
|
series_kw = (; marker = series[:markershape])
|
||||||
|
else
|
||||||
|
error("Plots(UnicodePlots): series type $st not supported")
|
||||||
|
end
|
||||||
|
|
||||||
|
label = addlegend ? series[:label] : ""
|
||||||
|
|
||||||
|
for (n, segment) in enumerate(series_segments(series, st; check = true))
|
||||||
|
i, rng = segment.attr_index, segment.range
|
||||||
|
lc = get_linecolor(series, i)
|
||||||
|
up = func(
|
||||||
|
up,
|
||||||
|
x[rng],
|
||||||
|
y[rng],
|
||||||
|
plot_3d ? series[:z][rng] : nothing;
|
||||||
|
color = up_color(lc),
|
||||||
|
name = n == 1 ? label : "",
|
||||||
|
series_kw...,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
for (xi, yi, str, fnt) in EachAnn(series[:series_annotations], x, y)
|
||||||
|
up = UnicodePlots.annotate!(
|
||||||
|
up,
|
||||||
|
xi,
|
||||||
|
yi,
|
||||||
|
str;
|
||||||
|
color = up_color(fnt.color),
|
||||||
|
halign = fnt.halign,
|
||||||
|
valign = fnt.valign,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
up
|
||||||
end
|
end
|
||||||
|
|
||||||
# -------------------------------
|
# ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# we don't do very much for subplots... just stack them vertically
|
function _show(io::IO, ::MIME"image/png", plt::Plot{UnicodePlotsBackend})
|
||||||
|
prepare_output(plt)
|
||||||
function unicodeplots_rebuild(plt::Plot{UnicodePlotsBackend})
|
nr, nc = size(plt.layout)
|
||||||
w, h = plt[:size]
|
s1 = zeros(Int, nr, nc)
|
||||||
plt.attr[:color_palette] = [RGB(0,0,0)]
|
s2 = zeros(Int, nr, nc)
|
||||||
rebuildUnicodePlot!(plt, div(w, 10), div(h, 20))
|
canvas_type = nothing
|
||||||
|
imgs = []
|
||||||
|
sps = 0
|
||||||
|
for r in 1:nr
|
||||||
|
for c in 1:nc
|
||||||
|
if (l = plt.layout[r, c]) isa GridLayout && size(l) != (1, 1)
|
||||||
|
error("Plots(UnicodePlots): complex nested layout is currently unsupported")
|
||||||
|
else
|
||||||
|
img = UnicodePlots.png_image(plt.o[sps += 1])
|
||||||
|
canvas_type = eltype(img)
|
||||||
|
h, w = size(img)
|
||||||
|
s1[r, c] = h
|
||||||
|
s2[r, c] = w
|
||||||
|
push!(imgs, img)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if canvas_type !== nothing
|
||||||
|
m1 = maximum(s1; dims = 2)
|
||||||
|
m2 = maximum(s2; dims = 1)
|
||||||
|
img = zeros(canvas_type, sum(m1), sum(m2))
|
||||||
|
sps = 0
|
||||||
|
n1 = 1
|
||||||
|
for r in 1:nr
|
||||||
|
n2 = 1
|
||||||
|
for c in 1:nc
|
||||||
|
sp = imgs[sps += 1]
|
||||||
|
h, w = size(sp)
|
||||||
|
img[n1:(n1 + (h - 1)), n2:(n2 + (w - 1))] = sp
|
||||||
|
n2 += m2[c]
|
||||||
|
end
|
||||||
|
n1 += m1[r]
|
||||||
|
end
|
||||||
|
stream = UnicodePlots.FileIO.Stream{UnicodePlots.FileIO.format"PNG"}(io)
|
||||||
|
UnicodePlots.FileIO.save(stream, img)
|
||||||
|
end
|
||||||
|
nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Base.show(plt::Plot{UnicodePlotsBackend}) = show(stdout, plt)
|
||||||
|
Base.show(io::IO, plt::Plot{UnicodePlotsBackend}) = _show(io, MIME("text/plain"), plt)
|
||||||
|
|
||||||
|
# NOTE: _show(...) must be kept for Base.showable (src/output.jl)
|
||||||
function _show(io::IO, ::MIME"text/plain", plt::Plot{UnicodePlotsBackend})
|
function _show(io::IO, ::MIME"text/plain", plt::Plot{UnicodePlotsBackend})
|
||||||
unicodeplots_rebuild(plt)
|
prepare_output(plt)
|
||||||
foreach(x -> show(io, x), plt.o)
|
nr, nc = size(plt.layout)
|
||||||
|
if nr == 1 && nc == 1 # fast path
|
||||||
|
n = length(plt.o)
|
||||||
|
for (i, p) in enumerate(plt.o)
|
||||||
|
show(io, p)
|
||||||
|
i < n && println(io)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
have_color = Base.get_have_color()
|
||||||
|
buf = IOContext(PipeBuffer(), :color => have_color)
|
||||||
|
lines_colored = Array{Union{Nothing,Vector{String}}}(undef, nr, nc)
|
||||||
|
lines_uncolored = have_color ? similar(lines_colored) : lines_colored
|
||||||
|
l_max = zeros(Int, nr)
|
||||||
|
w_max = zeros(Int, nc)
|
||||||
|
sps = 0
|
||||||
|
for r in 1:nr
|
||||||
|
lmax = 0
|
||||||
|
for c in 1:nc
|
||||||
|
if (l = plt.layout[r, c]) isa GridLayout && size(l) != (1, 1)
|
||||||
|
error(
|
||||||
|
"Plots(UnicodePlots): complex nested layout is currently unsupported",
|
||||||
|
)
|
||||||
|
else
|
||||||
|
if get(l.attr, :blank, false)
|
||||||
|
lines_colored[r, c] = lines_uncolored[r, c] = nothing
|
||||||
|
else
|
||||||
|
sp = plt.o[sps += 1]
|
||||||
|
show(buf, sp)
|
||||||
|
colored = read(buf, String)
|
||||||
|
lines_colored[r, c] = lu = lc = split(colored, '\n')
|
||||||
|
if have_color
|
||||||
|
uncolored = UnicodePlots.no_ansi_escape(colored)
|
||||||
|
lines_uncolored[r, c] = lu = split(uncolored, '\n')
|
||||||
|
end
|
||||||
|
lmax = max(length(lc), lmax)
|
||||||
|
w_max[c] = max(maximum(length.(lu)), w_max[c])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
l_max[r] = lmax
|
||||||
|
end
|
||||||
|
empty = String[' '^w for w in w_max]
|
||||||
|
for r in 1:nr
|
||||||
|
for n in 1:l_max[r]
|
||||||
|
for c in 1:nc
|
||||||
|
pre = c == 1 ? '\0' : ' '
|
||||||
|
lc = lines_colored[r, c]
|
||||||
|
if lc === nothing || length(lc) < n
|
||||||
|
print(io, pre, empty[c])
|
||||||
|
else
|
||||||
|
lu = lines_uncolored[r, c]
|
||||||
|
print(io, pre, lc[n], ' '^(w_max[c] - length(lu[n])))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
n < l_max[r] && println(io)
|
||||||
|
end
|
||||||
|
r < nr && println(io)
|
||||||
|
end
|
||||||
|
end
|
||||||
nothing
|
nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# we only support MIME"text/plain", hence display(...) falls back to plain-text on stdout
|
||||||
function _display(plt::Plot{UnicodePlotsBackend})
|
function _display(plt::Plot{UnicodePlotsBackend})
|
||||||
unicodeplots_rebuild(plt)
|
show(stdout, plt)
|
||||||
map(show, plt.o)
|
println(stdout)
|
||||||
nothing
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -3,7 +3,10 @@
|
|||||||
|
|
||||||
# CREDIT: parts of this implementation were inspired by @joshday's PlotlyLocal.jl
|
# CREDIT: parts of this implementation were inspired by @joshday's PlotlyLocal.jl
|
||||||
|
|
||||||
function standalone_html(plt::AbstractPlot; title::AbstractString = get(plt.attr, :window_title, "Plots.jl"))
|
function standalone_html(
|
||||||
|
plt::AbstractPlot;
|
||||||
|
title::AbstractString = get(plt.attr, :window_title, "Plots.jl"),
|
||||||
|
)
|
||||||
"""
|
"""
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@ -19,6 +22,10 @@ function standalone_html(plt::AbstractPlot; title::AbstractString = get(plt.attr
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function embeddable_html(plt::AbstractPlot)
|
||||||
|
html_head(plt) * html_body(plt)
|
||||||
|
end
|
||||||
|
|
||||||
function open_browser_window(filename::AbstractString)
|
function open_browser_window(filename::AbstractString)
|
||||||
@static if Sys.isapple()
|
@static if Sys.isapple()
|
||||||
return run(`open $(filename)`)
|
return run(`open $(filename)`)
|
||||||
@ -45,7 +52,8 @@ function standalone_html_window(plt::AbstractPlot)
|
|||||||
old = use_local_dependencies[] # save state to restore afterwards
|
old = use_local_dependencies[] # save state to restore afterwards
|
||||||
# if we open a browser ourself, we can host local files, so
|
# if we open a browser ourself, we can host local files, so
|
||||||
# when we have a local plotly downloaded this is the way to go!
|
# when we have a local plotly downloaded this is the way to go!
|
||||||
use_local_dependencies[] = isfile(plotly_local_file_path)
|
use_local_dependencies[] =
|
||||||
|
plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[])
|
||||||
filename = write_temp_html(plt)
|
filename = write_temp_html(plt)
|
||||||
open_browser_window(filename)
|
open_browser_window(filename)
|
||||||
# restore for other backends
|
# restore for other backends
|
||||||
@ -54,7 +62,9 @@ end
|
|||||||
|
|
||||||
# uses wkhtmltopdf/wkhtmltoimage: http://wkhtmltopdf.org/downloads.html
|
# uses wkhtmltopdf/wkhtmltoimage: http://wkhtmltopdf.org/downloads.html
|
||||||
function html_to_png(html_fn, png_fn, w, h)
|
function html_to_png(html_fn, png_fn, w, h)
|
||||||
run(`wkhtmltoimage -f png -q --width $w --height $h --disable-smart-width $html_fn $png_fn`)
|
run(
|
||||||
|
`wkhtmltoimage -f png -q --width $w --height $h --disable-smart-width $html_fn $png_fn`,
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
function show_png_from_html(io::IO, plt::AbstractPlot)
|
function show_png_from_html(io::IO, plt::AbstractPlot)
|
||||||
|
|||||||
105
src/colorbars.jl
Normal file
105
src/colorbars.jl
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# These functions return an operator for use in `get_clims(::Seres, op)`
|
||||||
|
process_clims(lims::Tuple{<:Number,<:Number}) =
|
||||||
|
(zlims -> ifelse.(isfinite.(lims), lims, zlims)) ∘ ignorenan_extrema
|
||||||
|
process_clims(s::Union{Symbol,Nothing,Missing}) = ignorenan_extrema
|
||||||
|
# don't specialize on ::Function otherwise python functions won't work
|
||||||
|
process_clims(f) = f
|
||||||
|
|
||||||
|
get_clims(sp::Subplot)::Tuple{Float64,Float64} =
|
||||||
|
haskey(sp.attr, :clims_calculated) ? sp[:clims_calculated] : update_clims(sp)
|
||||||
|
get_clims(series::Series)::Tuple{Float64,Float64} =
|
||||||
|
haskey(series.plotattributes, :clims_calculated) ?
|
||||||
|
series[:clims_calculated]::Tuple{Float64,Float64} : update_clims(series)
|
||||||
|
get_clims(sp::Subplot, series::Series)::Tuple{Float64,Float64} =
|
||||||
|
series[:colorbar_entry] ? get_clims(sp) : get_clims(series)
|
||||||
|
|
||||||
|
function update_clims(sp::Subplot, op = process_clims(sp[:clims]))::Tuple{Float64,Float64}
|
||||||
|
zmin, zmax = Inf, -Inf
|
||||||
|
for series in series_list(sp)
|
||||||
|
if series[:colorbar_entry]::Bool
|
||||||
|
zmin, zmax = _update_clims(zmin, zmax, update_clims(series, op)...)
|
||||||
|
else
|
||||||
|
update_clims(series, op)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return sp[:clims_calculated] = zmin <= zmax ? (zmin, zmax) : (NaN, NaN)
|
||||||
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
update_clims(::Series, op=Plots.ignorenan_extrema)
|
||||||
|
Finds the limits for the colorbar by taking the "z-values" for the series and passing them into `op`,
|
||||||
|
which must return the tuple `(zmin, zmax)`. The default op is the extrema of the finite
|
||||||
|
values of the input. The value is stored as a series property, which is retrieved by `get_clims`.
|
||||||
|
"""
|
||||||
|
function update_clims(series::Series, op = ignorenan_extrema)::Tuple{Float64,Float64}
|
||||||
|
zmin, zmax = Inf, -Inf
|
||||||
|
|
||||||
|
# keeping this unrolled has higher performance
|
||||||
|
if series[:seriestype] ∈ _z_colored_series && series[:z] !== nothing
|
||||||
|
zmin, zmax = update_clims(zmin, zmax, series[:z], op)
|
||||||
|
end
|
||||||
|
if series[:line_z] !== nothing
|
||||||
|
zmin, zmax = update_clims(zmin, zmax, series[:line_z], op)
|
||||||
|
end
|
||||||
|
if series[:marker_z] !== nothing
|
||||||
|
zmin, zmax = update_clims(zmin, zmax, series[:marker_z], op)
|
||||||
|
end
|
||||||
|
if series[:fill_z] !== nothing
|
||||||
|
zmin, zmax = update_clims(zmin, zmax, series[:fill_z], op)
|
||||||
|
end
|
||||||
|
return series[:clims_calculated] = zmin <= zmax ? (zmin, zmax) : (NaN, NaN)
|
||||||
|
end
|
||||||
|
|
||||||
|
update_clims(zmin, zmax, vals::AbstractSurface, op)::Tuple{Float64,Float64} =
|
||||||
|
update_clims(zmin, zmax, vals.surf, op)
|
||||||
|
update_clims(zmin, zmax, vals::Any, op)::Tuple{Float64,Float64} =
|
||||||
|
_update_clims(zmin, zmax, op(vals)...)
|
||||||
|
update_clims(zmin, zmax, ::Nothing, ::Any)::Tuple{Float64,Float64} = zmin, zmax
|
||||||
|
|
||||||
|
_update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax)
|
||||||
|
|
||||||
|
@enum ColorbarStyle cbar_gradient cbar_fill cbar_lines
|
||||||
|
|
||||||
|
function colorbar_style(series::Series)
|
||||||
|
colorbar_entry = series[:colorbar_entry]
|
||||||
|
if !(colorbar_entry isa Bool)
|
||||||
|
@warn "Non-boolean colorbar_entry ignored."
|
||||||
|
colorbar_entry = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if !colorbar_entry
|
||||||
|
nothing
|
||||||
|
elseif isfilledcontour(series)
|
||||||
|
cbar_fill
|
||||||
|
elseif iscontour(series)
|
||||||
|
cbar_lines
|
||||||
|
elseif series[:seriestype] ∈ (:heatmap, :surface) ||
|
||||||
|
any(series[z] !== nothing for z in [:marker_z, :line_z, :fill_z])
|
||||||
|
cbar_gradient
|
||||||
|
else
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
hascolorbar(series::Series) = colorbar_style(series) !== nothing
|
||||||
|
hascolorbar(sp::Subplot) =
|
||||||
|
sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp))
|
||||||
|
|
||||||
|
function get_colorbar_ticks(sp::Subplot; update = true)
|
||||||
|
if update || !haskey(sp.attr, :colorbar_optimized_ticks)
|
||||||
|
ticks = _transform_ticks(sp[:colorbar_ticks])
|
||||||
|
cvals = sp[:colorbar_continuous_values]
|
||||||
|
dvals = sp[:colorbar_discrete_values]
|
||||||
|
clims = get_clims(sp)
|
||||||
|
scale = sp[:colorbar_scale]
|
||||||
|
formatter = sp[:colorbar_formatter]
|
||||||
|
sp.attr[:colorbar_optimized_ticks] =
|
||||||
|
get_ticks(ticks, cvals, dvals, clims, scale, formatter)
|
||||||
|
end
|
||||||
|
return sp.attr[:colorbar_optimized_ticks]
|
||||||
|
end
|
||||||
|
|
||||||
|
function _update_subplot_colorbars(sp::Subplot)
|
||||||
|
# Dynamic callback from the pipeline if needed
|
||||||
|
update_clims(sp)
|
||||||
|
end
|
||||||
File diff suppressed because it is too large
Load Diff
88
src/consts.jl
Normal file
88
src/consts.jl
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
const _deprecated_attributes = Dict{Symbol,Symbol}(:orientation => :permute)
|
||||||
|
const _all_defaults = KW[_series_defaults, _plot_defaults, _subplot_defaults]
|
||||||
|
|
||||||
|
const _initial_defaults = deepcopy(_all_defaults)
|
||||||
|
const _initial_axis_defaults = deepcopy(_axis_defaults)
|
||||||
|
|
||||||
|
# add defaults for the letter versions
|
||||||
|
const _axis_defaults_byletter = KW()
|
||||||
|
|
||||||
|
function reset_axis_defaults_byletter!()
|
||||||
|
for letter in (:x, :y, :z)
|
||||||
|
_axis_defaults_byletter[letter] = KW()
|
||||||
|
for (k, v) in _axis_defaults
|
||||||
|
_axis_defaults_byletter[letter][k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
reset_axis_defaults_byletter!()
|
||||||
|
|
||||||
|
# to be able to reset font sizes to initial values
|
||||||
|
const _initial_plt_fontsizes =
|
||||||
|
Dict(:plot_titlefontsize => _plot_defaults[:plot_titlefontsize])
|
||||||
|
|
||||||
|
const _initial_sp_fontsizes = Dict(
|
||||||
|
:titlefontsize => _subplot_defaults[:titlefontsize],
|
||||||
|
:legend_font_pointsize => _subplot_defaults[:legend_font_pointsize],
|
||||||
|
:legend_title_font_pointsize => _subplot_defaults[:legend_title_font_pointsize],
|
||||||
|
:annotationfontsize => _subplot_defaults[:annotationfontsize],
|
||||||
|
:colorbar_tickfontsize => _subplot_defaults[:colorbar_tickfontsize],
|
||||||
|
:colorbar_titlefontsize => _subplot_defaults[:colorbar_titlefontsize],
|
||||||
|
)
|
||||||
|
|
||||||
|
const _initial_ax_fontsizes = Dict(
|
||||||
|
:tickfontsize => _axis_defaults[:tickfontsize],
|
||||||
|
:guidefontsize => _axis_defaults[:guidefontsize],
|
||||||
|
)
|
||||||
|
|
||||||
|
const _initial_fontsizes =
|
||||||
|
merge(_initial_plt_fontsizes, _initial_sp_fontsizes, _initial_ax_fontsizes)
|
||||||
|
|
||||||
|
const _internal_args =
|
||||||
|
[:plot_object, :series_plotindex, :markershape_to_add, :letter, :idxfilter]
|
||||||
|
|
||||||
|
const _axis_args = Set(keys(_axis_defaults))
|
||||||
|
const _series_args = Set(keys(_series_defaults))
|
||||||
|
const _subplot_args = Set(keys(_subplot_defaults))
|
||||||
|
const _plot_args = Set(keys(_plot_defaults))
|
||||||
|
|
||||||
|
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
|
||||||
|
const _magic_subplot_args =
|
||||||
|
[:title_font, :legend_font, :legend_title_font, :plot_title_font, :colorbar_titlefont]
|
||||||
|
const _magic_series_args = [:line, :marker, :fill]
|
||||||
|
const _all_magic_args =
|
||||||
|
Set(union(_magic_axis_args, _magic_series_args, _magic_subplot_args))
|
||||||
|
|
||||||
|
const _all_axis_args = union(_axis_args, _magic_axis_args)
|
||||||
|
const _lettered_all_axis_args =
|
||||||
|
Set([Symbol(letter, kw) for letter in (:x, :y, :z) for kw in _all_axis_args])
|
||||||
|
const _all_subplot_args = union(_subplot_args, _magic_subplot_args)
|
||||||
|
const _all_series_args = union(_series_args, _magic_series_args)
|
||||||
|
const _all_plot_args = _plot_args
|
||||||
|
|
||||||
|
const _all_args =
|
||||||
|
union(_lettered_all_axis_args, _all_subplot_args, _all_series_args, _all_plot_args)
|
||||||
|
|
||||||
|
# add all pluralized forms to the _keyAliases dict
|
||||||
|
for arg in _all_args
|
||||||
|
add_aliases(arg, makeplural(arg))
|
||||||
|
end
|
||||||
|
|
||||||
|
# fill symbol cache
|
||||||
|
for letter in (:x, :y, :z)
|
||||||
|
_attrsymbolcache[letter] = Dict{Symbol,Symbol}()
|
||||||
|
for k in _axis_args
|
||||||
|
# populate attribute cache
|
||||||
|
lk = Symbol(letter, k)
|
||||||
|
_attrsymbolcache[letter][k] = lk
|
||||||
|
# allow the underscore version too: xguide or x_guide
|
||||||
|
add_aliases(lk, Symbol(letter, "_", k))
|
||||||
|
end
|
||||||
|
for k in (_magic_axis_args..., :(_discrete_indices))
|
||||||
|
_attrsymbolcache[letter][k] = Symbol(letter, k)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# add all non_underscored forms to the _keyAliases
|
||||||
|
add_non_underscore_aliases!(_keyAliases)
|
||||||
828
src/examples.jl
828
src/examples.jl
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,10 @@
|
|||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# A backup, if no PNG generation is defined, is to try to make a PDF and use FileIO to convert
|
# A backup, if no PNG generation is defined, is to try to make a PDF and use FileIO to convert
|
||||||
|
|
||||||
_fileio_load(@nospecialize(filename::AbstractString)) = FileIO.load(filename::AbstractString)
|
_fileio_load(@nospecialize(filename::AbstractString)) =
|
||||||
_fileio_save(@nospecialize(filename::AbstractString), @nospecialize(x)) = FileIO.save(filename::AbstractString, x)
|
FileIO.load(filename::AbstractString)
|
||||||
|
_fileio_save(@nospecialize(filename::AbstractString), @nospecialize(x)) =
|
||||||
|
FileIO.save(filename::AbstractString, x)
|
||||||
|
|
||||||
function _show_pdfbackends(io::IO, ::MIME"image/png", plt::Plot)
|
function _show_pdfbackends(io::IO, ::MIME"image/png", plt::Plot)
|
||||||
fn = tempname()
|
fn = tempname()
|
||||||
@ -21,4 +23,5 @@ function _show_pdfbackends(io::IO, ::MIME"image/png", plt::Plot)
|
|||||||
write(io, read(open(pngfn), String))
|
write(io, read(open(pngfn), String))
|
||||||
end
|
end
|
||||||
|
|
||||||
const PDFBackends = Union{PGFPlotsBackend,PlotlyJSBackend,PyPlotBackend,InspectDRBackend,GRBackend}
|
const PDFBackends =
|
||||||
|
Union{PGFPlotsBackend,PlotlyJSBackend,PyPlotBackend,InspectDRBackend,GRBackend}
|
||||||
|
|||||||
@ -1,15 +1,14 @@
|
|||||||
const use_local_dependencies = Ref(false)
|
const use_local_dependencies = Ref(false)
|
||||||
const use_local_plotlyjs = Ref(false)
|
const use_local_plotlyjs = Ref(false)
|
||||||
|
|
||||||
|
|
||||||
function _init_ijulia_plotting()
|
function _init_ijulia_plotting()
|
||||||
# IJulia is more stable with local file
|
# IJulia is more stable with local file
|
||||||
use_local_plotlyjs[] = isfile(plotly_local_file_path)
|
use_local_plotlyjs[] =
|
||||||
|
plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[])
|
||||||
|
|
||||||
ENV["MPLBACKEND"] = "Agg"
|
ENV["MPLBACKEND"] = "Agg"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Add extra jupyter mimetypes to display_dict based on the plot backed.
|
Add extra jupyter mimetypes to display_dict based on the plot backed.
|
||||||
|
|
||||||
@ -20,22 +19,17 @@ frontends like jupyterlab and nteract.
|
|||||||
_ijulia__extra_mime_info!(plt::Plot, out::Dict) = out
|
_ijulia__extra_mime_info!(plt::Plot, out::Dict) = out
|
||||||
|
|
||||||
function _ijulia__extra_mime_info!(plt::Plot{PlotlyJSBackend}, out::Dict)
|
function _ijulia__extra_mime_info!(plt::Plot{PlotlyJSBackend}, out::Dict)
|
||||||
out["application/vnd.plotly.v1+json"] = Dict(
|
out["application/vnd.plotly.v1+json"] =
|
||||||
:data => plotly_series(plt),
|
Dict(:data => plotly_series(plt), :layout => plotly_layout(plt))
|
||||||
:layout => plotly_layout(plt)
|
|
||||||
)
|
|
||||||
out
|
out
|
||||||
end
|
end
|
||||||
|
|
||||||
function _ijulia__extra_mime_info!(plt::Plot{PlotlyBackend}, out::Dict)
|
function _ijulia__extra_mime_info!(plt::Plot{PlotlyBackend}, out::Dict)
|
||||||
out["application/vnd.plotly.v1+json"] = Dict(
|
out["application/vnd.plotly.v1+json"] =
|
||||||
:data => plotly_series(plt),
|
Dict(:data => plotly_series(plt), :layout => plotly_layout(plt))
|
||||||
:layout => plotly_layout(plt)
|
|
||||||
)
|
|
||||||
out
|
out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function _ijulia_display_dict(plt::Plot)
|
function _ijulia_display_dict(plt::Plot)
|
||||||
output_type = Symbol(plt.attr[:html_output_format])
|
output_type = Symbol(plt.attr[:html_output_format])
|
||||||
if output_type == :auto
|
if output_type == :auto
|
||||||
@ -54,9 +48,12 @@ function _ijulia_display_dict(plt::Plot)
|
|||||||
elseif output_type == :html
|
elseif output_type == :html
|
||||||
mime = "text/html"
|
mime = "text/html"
|
||||||
out[mime] = sprint(show, MIME(mime), plt)
|
out[mime] = sprint(show, MIME(mime), plt)
|
||||||
|
_ijulia__extra_mime_info!(plt, out)
|
||||||
|
elseif output_type == :pdf
|
||||||
|
mime = "application/pdf"
|
||||||
|
out[mime] = base64encode(show, MIME(mime), plt)
|
||||||
else
|
else
|
||||||
error("Unsupported output type $output_type")
|
error("Unsupported output type $output_type")
|
||||||
end
|
end
|
||||||
_ijulia__extra_mime_info!(plt, out)
|
|
||||||
out
|
out
|
||||||
end
|
end
|
||||||
|
|||||||
76
src/init.jl
76
src/init.jl
@ -1,5 +1,7 @@
|
|||||||
using REPL
|
using REPL
|
||||||
|
using Scratch
|
||||||
|
|
||||||
|
const plotly_local_file_path = Ref{Union{Nothing,String}}(nothing)
|
||||||
|
|
||||||
function _plots_defaults()
|
function _plots_defaults()
|
||||||
if isdefined(Main, :PLOTS_DEFAULTS)
|
if isdefined(Main, :PLOTS_DEFAULTS)
|
||||||
@ -9,91 +11,105 @@ function _plots_defaults()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function __init__()
|
function __init__()
|
||||||
user_defaults = _plots_defaults()
|
user_defaults = _plots_defaults()
|
||||||
if haskey(user_defaults, :theme)
|
if haskey(user_defaults, :theme)
|
||||||
theme(pop!(user_defaults, :theme))
|
theme(pop!(user_defaults, :theme); user_defaults...)
|
||||||
|
else
|
||||||
|
default(; user_defaults...)
|
||||||
end
|
end
|
||||||
default(; user_defaults...)
|
|
||||||
|
|
||||||
insert!(Base.Multimedia.displays, findlast(x -> x isa Base.TextDisplay || x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, PlotsDisplay())
|
insert!(
|
||||||
|
Base.Multimedia.displays,
|
||||||
|
findlast(
|
||||||
|
x -> x isa Base.TextDisplay || x isa REPL.REPLDisplay,
|
||||||
|
Base.Multimedia.displays,
|
||||||
|
) + 1,
|
||||||
|
PlotsDisplay(),
|
||||||
|
)
|
||||||
|
|
||||||
atreplinit(i -> begin
|
atreplinit(
|
||||||
while PlotsDisplay() in Base.Multimedia.displays
|
i -> begin
|
||||||
popdisplay(PlotsDisplay())
|
while PlotsDisplay() in Base.Multimedia.displays
|
||||||
end
|
popdisplay(PlotsDisplay())
|
||||||
insert!(Base.Multimedia.displays, findlast(x -> x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, PlotsDisplay())
|
end
|
||||||
end)
|
insert!(
|
||||||
|
Base.Multimedia.displays,
|
||||||
|
findlast(x -> x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1,
|
||||||
|
PlotsDisplay(),
|
||||||
|
)
|
||||||
|
end,
|
||||||
|
)
|
||||||
|
|
||||||
@require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" begin
|
@require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "hdf5.jl")
|
fn = joinpath(@__DIR__, "backends", "hdf5.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" begin
|
@require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "inspectdr.jl")
|
fn = joinpath(@__DIR__, "backends", "inspectdr.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" begin
|
@require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "pgfplots.jl")
|
fn = joinpath(@__DIR__, "backends", "deprecated", "pgfplots.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require ORCA = "47be7bcc-f1a6-5447-8b36-7eeeff7534fd" begin
|
@require PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "orca.jl")
|
fn = joinpath(@__DIR__, "backends", "plotlybase.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" begin
|
@require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "pgfplotsx.jl")
|
fn = joinpath(@__DIR__, "backends", "pgfplotsx.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" begin
|
@require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "plotlyjs.jl")
|
fn = joinpath(@__DIR__, "backends", "plotlyjs.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" begin
|
@require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "pyplot.jl")
|
fn = joinpath(@__DIR__, "backends", "pyplot.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" begin
|
@require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" begin
|
||||||
fn = joinpath(@__DIR__, "backends", "unicodeplots.jl")
|
fn = joinpath(@__DIR__, "backends", "unicodeplots.jl")
|
||||||
include(fn)
|
include(fn)
|
||||||
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
|
end
|
||||||
|
|
||||||
|
@require Gaston = "4b11ee91-296f-5714-9832-002c20994614" begin
|
||||||
|
fn = joinpath(@__DIR__, "backends", "gaston.jl")
|
||||||
|
include(fn)
|
||||||
end
|
end
|
||||||
|
|
||||||
@require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin
|
@require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin
|
||||||
if IJulia.inited
|
if IJulia.inited
|
||||||
_init_ijulia_plotting()
|
_init_ijulia_plotting()
|
||||||
|
|
||||||
IJulia.display_dict(plt::Plot) = _ijulia_display_dict(plt)
|
IJulia.display_dict(plt::Plot) = _ijulia_display_dict(plt)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if haskey(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL")
|
if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true"
|
||||||
use_local_plotlyjs[] = ENV["PLOTS_HOST_DEPENDENCY_LOCAL"] == "true"
|
global plotly_local_file_path[] =
|
||||||
use_local_dependencies[] = isfile(plotly_local_file_path) && use_local_plotlyjs[]
|
joinpath(@get_scratch!("plotly"), _plotly_min_js_filename)
|
||||||
if use_local_plotlyjs[] && !isfile(plotly_local_file_path)
|
if !isfile(plotly_local_file_path[])
|
||||||
@warn("PLOTS_HOST_DEPENDENCY_LOCAL is set to true, but no local plotly file found. run Pkg.build(\"Plots\") and make sure PLOTS_HOST_DEPENDENCY_LOCAL is set to true")
|
Downloads.download(
|
||||||
|
"https://cdn.plot.ly/$(_plotly_min_js_filename)",
|
||||||
|
plotly_local_file_path[],
|
||||||
|
)
|
||||||
end
|
end
|
||||||
else
|
|
||||||
use_local_dependencies[] = use_local_plotlyjs[]
|
use_local_plotlyjs[] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
use_local_dependencies[] = use_local_plotlyjs[]
|
||||||
|
|
||||||
@require FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" begin
|
@require FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" begin
|
||||||
_show(io::IO, mime::MIME"image/png", plt::Plot{<:PDFBackends}) = _show_pdfbackends(io, mime, plt)
|
_show(io::IO, mime::MIME"image/png", plt::Plot{<:PDFBackends}) =
|
||||||
|
_show_pdfbackends(io, mime, plt)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
410
src/layouts.jl
410
src/layouts.jl
@ -4,34 +4,6 @@
|
|||||||
to_pixels(m::AbsoluteLength) = m.value / 0.254
|
to_pixels(m::AbsoluteLength) = m.value / 0.254
|
||||||
|
|
||||||
const _cbar_width = 5mm
|
const _cbar_width = 5mm
|
||||||
|
|
||||||
#Base.broadcast(::typeof(Base.:.*), m::Measure, n::Number) = m * n
|
|
||||||
#Base.broadcast(::typeof(Base.:.*), m::Number, n::Measure) = m * n
|
|
||||||
Base.:-(m::Measure, a::AbstractArray) = map(ai -> m - ai, a)
|
|
||||||
Base.:-(a::AbstractArray, m::Measure) = map(ai -> ai - m, a)
|
|
||||||
Base.zero(::Type{typeof(mm)}) = 0mm
|
|
||||||
Base.one(::Type{typeof(mm)}) = 1mm
|
|
||||||
Base.typemin(::typeof(mm)) = -Inf*mm
|
|
||||||
Base.typemax(::typeof(mm)) = Inf*mm
|
|
||||||
Base.convert(::Type{F}, l::AbsoluteLength) where {F<:AbstractFloat} = convert(F, l.value)
|
|
||||||
|
|
||||||
# TODO: these are unintuitive and may cause tricky bugs
|
|
||||||
# Base.:+(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 + m2.value))
|
|
||||||
# Base.:+(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (1 + m1.value))
|
|
||||||
# Base.:-(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 - m2.value))
|
|
||||||
# Base.:-(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (m1.value - 1))
|
|
||||||
|
|
||||||
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
|
|
||||||
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
|
|
||||||
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
|
|
||||||
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
|
|
||||||
|
|
||||||
|
|
||||||
Base.zero(::Type{typeof(pct)}) = 0pct
|
|
||||||
Base.one(::Type{typeof(pct)}) = 1pct
|
|
||||||
Base.typemin(::typeof(pct)) = 0pct
|
|
||||||
Base.typemax(::typeof(pct)) = 1pct
|
|
||||||
|
|
||||||
const defaultbox = BoundingBox(0mm, 0mm, 0mm, 0mm)
|
const defaultbox = BoundingBox(0mm, 0mm, 0mm, 0mm)
|
||||||
|
|
||||||
left(bbox::BoundingBox) = bbox.x0[1]
|
left(bbox::BoundingBox) = bbox.x0[1]
|
||||||
@ -46,16 +18,16 @@ ispositive(m::Measure) = m.value > 0
|
|||||||
# union together bounding boxes
|
# union together bounding boxes
|
||||||
function Base.:+(bb1::BoundingBox, bb2::BoundingBox)
|
function Base.:+(bb1::BoundingBox, bb2::BoundingBox)
|
||||||
# empty boxes don't change the union
|
# empty boxes don't change the union
|
||||||
ispositive(width(bb1)) || return bb2
|
ispositive(width(bb1)) || return bb2
|
||||||
ispositive(height(bb1)) || return bb2
|
ispositive(height(bb1)) || return bb2
|
||||||
ispositive(width(bb2)) || return bb1
|
ispositive(width(bb2)) || return bb1
|
||||||
ispositive(height(bb2)) || return bb1
|
ispositive(height(bb2)) || return bb1
|
||||||
|
|
||||||
l = min(left(bb1), left(bb2))
|
l = min(left(bb1), left(bb2))
|
||||||
t = min(top(bb1), top(bb2))
|
t = min(top(bb1), top(bb2))
|
||||||
r = max(right(bb1), right(bb2))
|
r = max(right(bb1), right(bb2))
|
||||||
b = max(bottom(bb1), bottom(bb2))
|
b = max(bottom(bb1), bottom(bb2))
|
||||||
BoundingBox(l, t, r-l, b-t)
|
BoundingBox(l, t, r - l, b - t)
|
||||||
end
|
end
|
||||||
|
|
||||||
# this creates a bounding box in the parent's scope, where the child bounding box
|
# this creates a bounding box in the parent's scope, where the child bounding box
|
||||||
@ -81,7 +53,7 @@ end
|
|||||||
# convert a bounding box from absolute coords to percentages...
|
# convert a bounding box from absolute coords to percentages...
|
||||||
# returns an array of percentages of figure size: [left, bottom, width, height]
|
# returns an array of percentages of figure size: [left, bottom, width, height]
|
||||||
function bbox_to_pcts(bb::BoundingBox, figw, figh, flipy = true)
|
function bbox_to_pcts(bb::BoundingBox, figw, figh, flipy = true)
|
||||||
mms = Float64[f(bb).value for f in (left,bottom,width,height)]
|
mms = Float64[f(bb).value for f in (left, bottom, width, height)]
|
||||||
if flipy
|
if flipy
|
||||||
mms[2] = figh.value - mms[2] # flip y when origin in bottom-left
|
mms[2] = figh.value - mms[2] # flip y when origin in bottom-left
|
||||||
end
|
end
|
||||||
@ -89,7 +61,10 @@ function bbox_to_pcts(bb::BoundingBox, figw, figh, flipy = true)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Base.show(io::IO, bbox::BoundingBox)
|
function Base.show(io::IO, bbox::BoundingBox)
|
||||||
print(io, "BBox{l,t,r,b,w,h = $(left(bbox)),$(top(bbox)), $(right(bbox)),$(bottom(bbox)), $(width(bbox)),$(height(bbox))}")
|
print(
|
||||||
|
io,
|
||||||
|
"BBox{l,t,r,b,w,h = $(left(bbox)),$(top(bbox)), $(right(bbox)),$(bottom(bbox)), $(width(bbox)),$(height(bbox))}",
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
@ -111,12 +86,11 @@ function resolve_mixed(mix::MixedMeasures, sp::Subplot, letter::Symbol)
|
|||||||
end
|
end
|
||||||
if pct != 0
|
if pct != 0
|
||||||
amin, amax = axis_limits(sp, letter)
|
amin, amax = axis_limits(sp, letter)
|
||||||
xy += pct * (amax-amin)
|
xy += pct * (amax - amin)
|
||||||
end
|
end
|
||||||
xy
|
xy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
# AbstractLayout
|
# AbstractLayout
|
||||||
|
|
||||||
@ -188,7 +162,8 @@ parent_bbox(layout::AbstractLayout) = bbox(parent(layout))
|
|||||||
# padding(layout::AbstractLayout) = (padding_w(layout), padding_h(layout))
|
# padding(layout::AbstractLayout) = (padding_w(layout), padding_h(layout))
|
||||||
|
|
||||||
update_position!(layout::AbstractLayout) = nothing
|
update_position!(layout::AbstractLayout) = nothing
|
||||||
update_child_bboxes!(layout::AbstractLayout, minimum_perimeter = [0mm,0mm,0mm,0mm]) = nothing
|
update_child_bboxes!(layout::AbstractLayout, minimum_perimeter = [0mm, 0mm, 0mm, 0mm]) =
|
||||||
|
nothing
|
||||||
|
|
||||||
left(layout::AbstractLayout) = left(bbox(layout))
|
left(layout::AbstractLayout) = left(bbox(layout))
|
||||||
top(layout::AbstractLayout) = top(bbox(layout))
|
top(layout::AbstractLayout) = top(bbox(layout))
|
||||||
@ -234,7 +209,7 @@ mutable struct EmptyLayout <: AbstractLayout
|
|||||||
end
|
end
|
||||||
EmptyLayout(parent = RootLayout(); kw...) = EmptyLayout(parent, defaultbox, KW(kw))
|
EmptyLayout(parent = RootLayout(); kw...) = EmptyLayout(parent, defaultbox, KW(kw))
|
||||||
|
|
||||||
Base.size(layout::EmptyLayout) = (0,0)
|
Base.size(layout::EmptyLayout) = (0, 0)
|
||||||
Base.length(layout::EmptyLayout) = 0
|
Base.length(layout::EmptyLayout) = 0
|
||||||
Base.getindex(layout::EmptyLayout, r::Int, c::Int) = nothing
|
Base.getindex(layout::EmptyLayout, r::Int, c::Int) = nothing
|
||||||
|
|
||||||
@ -258,27 +233,30 @@ end
|
|||||||
grid(args...; kw...)
|
grid(args...; kw...)
|
||||||
|
|
||||||
Create a grid layout for subplots. `args` specify the dimensions, e.g.
|
Create a grid layout for subplots. `args` specify the dimensions, e.g.
|
||||||
`grid(3,2, widths = (0.6,04))` creates a grid with three rows and two
|
`grid(3,2, widths = (0.6,0.4))` creates a grid with three rows and two
|
||||||
columns of different width.
|
columns of different width.
|
||||||
"""
|
"""
|
||||||
grid(args...; kw...) = GridLayout(args...; kw...)
|
grid(args...; kw...) = GridLayout(args...; kw...)
|
||||||
|
|
||||||
function GridLayout(dims...;
|
function GridLayout(
|
||||||
parent = RootLayout(),
|
dims...;
|
||||||
widths = zeros(dims[2]),
|
parent = RootLayout(),
|
||||||
heights = zeros(dims[1]),
|
widths = zeros(dims[2]),
|
||||||
kw...)
|
heights = zeros(dims[1]),
|
||||||
|
kw...,
|
||||||
|
)
|
||||||
grid = Matrix{AbstractLayout}(undef, dims...)
|
grid = Matrix{AbstractLayout}(undef, dims...)
|
||||||
layout = GridLayout(
|
layout = GridLayout(
|
||||||
parent,
|
parent,
|
||||||
(20mm, 5mm, 2mm, 10mm),
|
(20mm, 5mm, 2mm, 10mm),
|
||||||
defaultbox,
|
defaultbox,
|
||||||
grid,
|
grid,
|
||||||
Measure[w*pct for w in widths],
|
Measure[w * pct for w in widths],
|
||||||
Measure[h*pct for h in heights],
|
Measure[h * pct for h in heights],
|
||||||
# convert(Vector{Float64}, widths),
|
# convert(Vector{Float64}, widths),
|
||||||
# convert(Vector{Float64}, heights),
|
# convert(Vector{Float64}, heights),
|
||||||
KW(kw))
|
KW(kw),
|
||||||
|
)
|
||||||
for i in eachindex(grid)
|
for i in eachindex(grid)
|
||||||
grid[i] = EmptyLayout(layout)
|
grid[i] = EmptyLayout(layout)
|
||||||
end
|
end
|
||||||
@ -287,9 +265,12 @@ end
|
|||||||
|
|
||||||
Base.size(layout::GridLayout) = size(layout.grid)
|
Base.size(layout::GridLayout) = size(layout.grid)
|
||||||
Base.length(layout::GridLayout) = length(layout.grid)
|
Base.length(layout::GridLayout) = length(layout.grid)
|
||||||
Base.getindex(layout::GridLayout, r::Int, c::Int) = layout.grid[r,c]
|
Base.getindex(layout::GridLayout, r::Int, c::Int) = layout.grid[r, c]
|
||||||
function Base.setindex!(layout::GridLayout, v, r::Int, c::Int)
|
function Base.setindex!(layout::GridLayout, v, r::Int, c::Int)
|
||||||
layout.grid[r,c] = v
|
layout.grid[r, c] = v
|
||||||
|
end
|
||||||
|
function Base.setindex!(layout::GridLayout, v, ci::CartesianIndex)
|
||||||
|
layout.grid[ci] = v
|
||||||
end
|
end
|
||||||
|
|
||||||
leftpad(layout::GridLayout) = layout.minpad[1]
|
leftpad(layout::GridLayout) = layout.minpad[1]
|
||||||
@ -297,7 +278,6 @@ toppad(layout::GridLayout) = layout.minpad[2]
|
|||||||
rightpad(layout::GridLayout) = layout.minpad[3]
|
rightpad(layout::GridLayout) = layout.minpad[3]
|
||||||
bottompad(layout::GridLayout) = layout.minpad[4]
|
bottompad(layout::GridLayout) = layout.minpad[4]
|
||||||
|
|
||||||
|
|
||||||
# here's how this works... first we recursively "update the minimum padding" (which
|
# here's how this works... first we recursively "update the minimum padding" (which
|
||||||
# means to calculate the minimum size needed from the edge of the subplot to plot area)
|
# means to calculate the minimum size needed from the edge of the subplot to plot area)
|
||||||
# for the whole layout tree. then we can compute the "padding borders" of this
|
# for the whole layout tree. then we can compute the "padding borders" of this
|
||||||
@ -309,14 +289,13 @@ bottompad(layout::GridLayout) = layout.minpad[4]
|
|||||||
function _update_min_padding!(layout::GridLayout)
|
function _update_min_padding!(layout::GridLayout)
|
||||||
map(_update_min_padding!, layout.grid)
|
map(_update_min_padding!, layout.grid)
|
||||||
layout.minpad = (
|
layout.minpad = (
|
||||||
maximum(map(leftpad, layout.grid[:,1])),
|
maximum(map(leftpad, layout.grid[:, 1])),
|
||||||
maximum(map(toppad, layout.grid[1,:])),
|
maximum(map(toppad, layout.grid[1, :])),
|
||||||
maximum(map(rightpad, layout.grid[:,end])),
|
maximum(map(rightpad, layout.grid[:, end])),
|
||||||
maximum(map(bottompad, layout.grid[end,:]))
|
maximum(map(bottompad, layout.grid[end, :])),
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function update_position!(layout::GridLayout)
|
function update_position!(layout::GridLayout)
|
||||||
map(update_position!, layout.grid)
|
map(update_position!, layout.grid)
|
||||||
end
|
end
|
||||||
@ -335,7 +314,9 @@ function recompute_lengths(v)
|
|||||||
end
|
end
|
||||||
leftover = 1.0pct - tot
|
leftover = 1.0pct - tot
|
||||||
if cnt > 1 && leftover.value <= 0
|
if cnt > 1 && leftover.value <= 0
|
||||||
error("Not enough length left over in layout! v = $v, cnt = $cnt, leftover = $leftover")
|
error(
|
||||||
|
"Not enough length left over in layout! v = $v, cnt = $cnt, leftover = $leftover",
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# now fill in the blanks
|
# now fill in the blanks
|
||||||
@ -343,23 +324,21 @@ function recompute_lengths(v)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# recursively compute the bounding boxes for the layout and plotarea (relative to canvas!)
|
# recursively compute the bounding boxes for the layout and plotarea (relative to canvas!)
|
||||||
function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0mm,0mm])
|
function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm, 0mm, 0mm, 0mm])
|
||||||
nr, nc = size(layout)
|
nr, nc = size(layout)
|
||||||
|
|
||||||
# # create a matrix for each minimum padding direction
|
# # create a matrix for each minimum padding direction
|
||||||
# _update_min_padding!(layout)
|
# _update_min_padding!(layout)
|
||||||
|
minpad_left = map(leftpad, layout.grid)
|
||||||
minpad_left = map(leftpad, layout.grid)
|
minpad_top = map(toppad, layout.grid)
|
||||||
minpad_top = map(toppad, layout.grid)
|
minpad_right = map(rightpad, layout.grid)
|
||||||
minpad_right = map(rightpad, layout.grid)
|
|
||||||
minpad_bottom = map(bottompad, layout.grid)
|
minpad_bottom = map(bottompad, layout.grid)
|
||||||
|
|
||||||
# get the max horizontal (left and right) padding over columns,
|
# get the max horizontal (left and right) padding over columns,
|
||||||
# and max vertical (bottom and top) padding over rows
|
# and max vertical (bottom and top) padding over rows
|
||||||
# TODO: add extra padding here
|
# TODO: add extra padding here
|
||||||
pad_left = maximum(minpad_left, dims = 1)
|
pad_left = maximum(minpad_left, dims = 1)
|
||||||
pad_top = maximum(minpad_top, dims = 2)
|
pad_top = maximum(minpad_top, dims = 2)
|
||||||
pad_right = maximum(minpad_right, dims = 1)
|
pad_right = maximum(minpad_right, dims = 1)
|
||||||
pad_bottom = maximum(minpad_bottom, dims = 2)
|
pad_bottom = maximum(minpad_bottom, dims = 2)
|
||||||
|
|
||||||
# make sure the perimeter match the parent
|
# make sure the perimeter match the parent
|
||||||
@ -373,7 +352,7 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0
|
|||||||
total_pad_vertical = sum(pad_top + pad_bottom)
|
total_pad_vertical = sum(pad_top + pad_bottom)
|
||||||
|
|
||||||
# now we can compute the total plot area in each direction
|
# now we can compute the total plot area in each direction
|
||||||
total_plotarea_horizontal = width(layout) - total_pad_horizontal
|
total_plotarea_horizontal = width(layout) - total_pad_horizontal
|
||||||
total_plotarea_vertical = height(layout) - total_pad_vertical
|
total_plotarea_vertical = height(layout) - total_pad_vertical
|
||||||
|
|
||||||
# recompute widths/heights
|
# recompute widths/heights
|
||||||
@ -385,19 +364,22 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0
|
|||||||
# denom_h = sum(layout.heights)
|
# denom_h = sum(layout.heights)
|
||||||
|
|
||||||
# we have all the data we need... lets compute the plot areas and set the bounding boxes
|
# we have all the data we need... lets compute the plot areas and set the bounding boxes
|
||||||
for r=1:nr, c=1:nc
|
for r in 1:nr, c in 1:nc
|
||||||
child = layout[r,c]
|
child = layout[r, c]
|
||||||
|
|
||||||
# get the top-left corner of this child... the first one is top-left of the parent (i.e. layout)
|
# get the top-left corner of this child... the first one is top-left of the parent (i.e. layout)
|
||||||
child_left = (c == 1 ? left(layout.bbox) : right(layout[r, c-1].bbox))
|
child_left = (c == 1 ? left(layout.bbox) : right(layout[r, c - 1].bbox))
|
||||||
child_top = (r == 1 ? top(layout.bbox) : bottom(layout[r-1, c].bbox))
|
child_top = (r == 1 ? top(layout.bbox) : bottom(layout[r - 1, c].bbox))
|
||||||
|
|
||||||
# compute plot area
|
# compute plot area
|
||||||
plotarea_left = child_left + pad_left[c]
|
plotarea_left = child_left + pad_left[c]
|
||||||
plotarea_top = child_top + pad_top[r]
|
plotarea_top = child_top + pad_top[r]
|
||||||
plotarea_width = total_plotarea_horizontal * layout.widths[c]
|
plotarea_width = total_plotarea_horizontal * layout.widths[c]
|
||||||
plotarea_height = total_plotarea_vertical * layout.heights[r]
|
plotarea_height = total_plotarea_vertical * layout.heights[r]
|
||||||
plotarea!(child, BoundingBox(plotarea_left, plotarea_top, plotarea_width, plotarea_height))
|
plotarea!(
|
||||||
|
child,
|
||||||
|
BoundingBox(plotarea_left, plotarea_top, plotarea_width, plotarea_height),
|
||||||
|
)
|
||||||
|
|
||||||
# compute child bbox
|
# compute child bbox
|
||||||
child_width = pad_left[c] + plotarea_width + pad_right[c]
|
child_width = pad_left[c] + plotarea_width + pad_right[c]
|
||||||
@ -407,10 +389,10 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0
|
|||||||
# this is the minimum perimeter as decided by this child's parent, so that
|
# this is the minimum perimeter as decided by this child's parent, so that
|
||||||
# all children on this border have the same value
|
# all children on this border have the same value
|
||||||
min_child_perimeter = [
|
min_child_perimeter = [
|
||||||
c == 1 ? layout.minpad[1] : 0mm,
|
c == 1 ? layout.minpad[1] : pad_left[c],
|
||||||
r == 1 ? layout.minpad[2] : 0mm,
|
r == 1 ? layout.minpad[2] : pad_top[r],
|
||||||
c == nc ? layout.minpad[3] : 0mm,
|
c == nc ? layout.minpad[3] : pad_right[c],
|
||||||
r == nr ? layout.minpad[4] : 0mm
|
r == nr ? layout.minpad[4] : pad_bottom[r],
|
||||||
]
|
]
|
||||||
|
|
||||||
# recursively update the child's children
|
# recursively update the child's children
|
||||||
@ -425,18 +407,21 @@ function update_inset_bboxes!(plt::Plot)
|
|||||||
p_area = Measures.resolve(plotarea(sp.parent), sp[:relative_bbox])
|
p_area = Measures.resolve(plotarea(sp.parent), sp[:relative_bbox])
|
||||||
plotarea!(sp, p_area)
|
plotarea!(sp, p_area)
|
||||||
|
|
||||||
bbox!(sp, bbox(
|
bbox!(
|
||||||
left(p_area) - leftpad(sp),
|
sp,
|
||||||
top(p_area) - toppad(sp),
|
bbox(
|
||||||
width(p_area) + leftpad(sp) + rightpad(sp),
|
left(p_area) - leftpad(sp),
|
||||||
height(p_area) + toppad(sp) + bottompad(sp)
|
top(p_area) - toppad(sp),
|
||||||
))
|
width(p_area) + leftpad(sp) + rightpad(sp),
|
||||||
|
height(p_area) + toppad(sp) + bottompad(sp),
|
||||||
|
),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
calc_num_subplots(layout::AbstractLayout) = 1
|
calc_num_subplots(layout::AbstractLayout) = get(layout.attr, :blank, false) ? 0 : 1
|
||||||
function calc_num_subplots(layout::GridLayout)
|
function calc_num_subplots(layout::GridLayout)
|
||||||
tot = 0
|
tot = 0
|
||||||
for l in layout.grid
|
for l in layout.grid
|
||||||
@ -471,7 +456,9 @@ end
|
|||||||
function layout_args(plotattributes::AKW, n_override::Integer)
|
function layout_args(plotattributes::AKW, n_override::Integer)
|
||||||
layout, n = layout_args(n_override, get(plotattributes, :layout, n_override))
|
layout, n = layout_args(n_override, get(plotattributes, :layout, n_override))
|
||||||
if n != n_override
|
if n != n_override
|
||||||
error("When doing layout, n ($n) != n_override ($(n_override)). You're probably trying to force existing plots into a layout that doesn't fit them.")
|
error(
|
||||||
|
"When doing layout, n ($n) != n_override ($(n_override)). You're probably trying to force existing plots into a layout that doesn't fit them.",
|
||||||
|
)
|
||||||
end
|
end
|
||||||
layout, n
|
layout, n
|
||||||
end
|
end
|
||||||
@ -481,32 +468,45 @@ function layout_args(n::Integer)
|
|||||||
GridLayout(nr, nc), n
|
GridLayout(nr, nc), n
|
||||||
end
|
end
|
||||||
|
|
||||||
function layout_args(sztup::NTuple{2, Integer})
|
function layout_args(sztup::NTuple{2,Integer})
|
||||||
nr, nc = sztup
|
nr, nc = sztup
|
||||||
GridLayout(nr, nc), nr*nc
|
GridLayout(nr, nc), nr * nc
|
||||||
end
|
end
|
||||||
|
|
||||||
layout_args(n_override::Integer, n::Integer) = layout_args(n)
|
layout_args(n_override::Integer, n::Integer) = layout_args(n)
|
||||||
layout_args(n, sztup::NTuple{2, Integer}) = layout_args(sztup)
|
layout_args(n, sztup::NTuple{2,Integer}) = layout_args(sztup)
|
||||||
|
|
||||||
function layout_args(n, sztup::Tuple{Colon, Integer})
|
function layout_args(n, sztup::Tuple{Colon,Integer})
|
||||||
nc = sztup[2]
|
nc = sztup[2]
|
||||||
nr = ceil(Int, n / nc)
|
nr = ceil(Int, n / nc)
|
||||||
GridLayout(nr, nc), n
|
GridLayout(nr, nc), n
|
||||||
end
|
end
|
||||||
|
|
||||||
function layout_args(n, sztup::Tuple{Integer, Colon})
|
function layout_args(n, sztup::Tuple{Integer,Colon})
|
||||||
nr = sztup[1]
|
nr = sztup[1]
|
||||||
nc = ceil(Int, n / nr)
|
nc = ceil(Int, n / nr)
|
||||||
GridLayout(nr, nc), n
|
GridLayout(nr, nc), n
|
||||||
end
|
end
|
||||||
|
|
||||||
function layout_args(sztup::NTuple{3, Integer})
|
function layout_args(sztup::NTuple{3,Integer})
|
||||||
n, nr, nc = sztup
|
n, nr, nc = sztup
|
||||||
nr, nc = compute_gridsize(n, nr, nc)
|
nr, nc = compute_gridsize(n, nr, nc)
|
||||||
GridLayout(nr, nc), n
|
GridLayout(nr, nc), n
|
||||||
end
|
end
|
||||||
|
|
||||||
|
layout_args(nt::NamedTuple) = EmptyLayout(; nt...), 1
|
||||||
|
|
||||||
|
function layout_args(m::AbstractVecOrMat)
|
||||||
|
sz = size(m)
|
||||||
|
nr = sz[1]
|
||||||
|
nc = get(sz, 2, 1)
|
||||||
|
gl = GridLayout(nr, nc)
|
||||||
|
for ci in CartesianIndices(m)
|
||||||
|
gl[ci] = layout_args(m[ci])[1]
|
||||||
|
end
|
||||||
|
layout_args(gl)
|
||||||
|
end
|
||||||
|
|
||||||
# compute number of subplots
|
# compute number of subplots
|
||||||
function layout_args(layout::GridLayout)
|
function layout_args(layout::GridLayout)
|
||||||
# recursively get the size of the grid
|
# recursively get the size of the grid
|
||||||
@ -514,57 +514,63 @@ function layout_args(layout::GridLayout)
|
|||||||
layout, n
|
layout, n
|
||||||
end
|
end
|
||||||
|
|
||||||
layout_args(n_override::Integer, layout::GridLayout) = layout_args(layout)
|
layout_args(n_override::Integer, layout::Union{AbstractVecOrMat,GridLayout}) =
|
||||||
|
layout_args(layout)
|
||||||
|
|
||||||
layout_args(huh) = error("unhandled layout type $(typeof(huh)): $huh")
|
layout_args(huh) = error("unhandled layout type $(typeof(huh)): $huh")
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
function build_layout(args...)
|
function build_layout(args...)
|
||||||
layout, n = layout_args(args...)
|
layout, n = layout_args(args...)
|
||||||
build_layout(layout, n)
|
build_layout(layout, n, Array{Plot}(undef, 0))
|
||||||
end
|
end
|
||||||
|
|
||||||
# # just a single subplot
|
# n is the number of subplots...
|
||||||
# function build_layout(sp::Subplot, n::Integer)
|
function build_layout(layout::GridLayout, n::Integer, plts::AVec{Plot})
|
||||||
# sp, Subplot[sp], SubplotMap(gensym() => sp)
|
|
||||||
# end
|
|
||||||
|
|
||||||
# n is the number of subplots... build a grid and initialize the inner subplots recursively
|
|
||||||
function build_layout(layout::GridLayout, n::Integer)
|
|
||||||
nr, nc = size(layout)
|
nr, nc = size(layout)
|
||||||
subplots = Subplot[]
|
subplots = Subplot[]
|
||||||
spmap = SubplotMap()
|
spmap = SubplotMap()
|
||||||
|
empty = isempty(plts)
|
||||||
i = 0
|
i = 0
|
||||||
for r=1:nr, c=1:nc
|
for r in 1:nr, c in 1:nc
|
||||||
l = layout[r,c]
|
l = layout[r, c]
|
||||||
if isa(l, EmptyLayout) && !get(l.attr, :blank, false)
|
if isa(l, EmptyLayout) && !get(l.attr, :blank, false)
|
||||||
sp = Subplot(backend(), parent=layout)
|
if empty
|
||||||
layout[r,c] = sp
|
# initialize the inner subplots recursively
|
||||||
push!(subplots, sp)
|
sp = Subplot(backend(), parent = layout)
|
||||||
spmap[attr(l,:label,gensym())] = sp
|
layout[r, c] = sp
|
||||||
|
push!(subplots, sp)
|
||||||
|
spmap[attr(l, :label, gensym())] = sp
|
||||||
|
inc = 1
|
||||||
|
else
|
||||||
|
# build a layout from a list of existing Plot objects
|
||||||
|
plt = popfirst!(plts) # grab the first plot out of the list
|
||||||
|
layout[r, c] = plt.layout
|
||||||
|
append!(subplots, plt.subplots)
|
||||||
|
merge!(spmap, plt.spmap)
|
||||||
|
inc = length(plt.subplots)
|
||||||
|
end
|
||||||
if get(l.attr, :width, :auto) != :auto
|
if get(l.attr, :width, :auto) != :auto
|
||||||
layout.widths[c] = attr(l,:width)
|
layout.widths[c] = attr(l, :width)
|
||||||
end
|
end
|
||||||
if get(l.attr, :height, :auto) != :auto
|
if get(l.attr, :height, :auto) != :auto
|
||||||
layout.heights[r] = attr(l,:height)
|
layout.heights[r] = attr(l, :height)
|
||||||
end
|
end
|
||||||
i += 1
|
i += inc
|
||||||
elseif isa(l, GridLayout)
|
elseif isa(l, GridLayout)
|
||||||
# sub-grid
|
# sub-grid
|
||||||
if get(l.attr, :width, :auto) != :auto
|
if get(l.attr, :width, :auto) != :auto
|
||||||
layout.widths[c] = attr(l,:width)
|
layout.widths[c] = attr(l, :width)
|
||||||
end
|
end
|
||||||
if get(l.attr, :height, :auto) != :auto
|
if get(l.attr, :height, :auto) != :auto
|
||||||
layout.heights[r] = attr(l,:height)
|
layout.heights[r] = attr(l, :height)
|
||||||
end
|
end
|
||||||
l, sps, m = build_layout(l, n-i)
|
l, sps, m = build_layout(l, n - i, plts)
|
||||||
append!(subplots, sps)
|
append!(subplots, sps)
|
||||||
merge!(spmap, m)
|
merge!(spmap, m)
|
||||||
i += length(sps)
|
i += length(sps)
|
||||||
elseif isa(l, Subplot)
|
elseif isa(l, Subplot) && empty
|
||||||
error("Subplot exists. Cannot re-use existing layout. Please make a new one.")
|
error("Subplot exists. Cannot re-use existing layout. Please make a new one.")
|
||||||
end
|
end
|
||||||
i >= n && break # only add n subplots
|
i >= n && break # only add n subplots
|
||||||
@ -573,161 +579,13 @@ function build_layout(layout::GridLayout, n::Integer)
|
|||||||
layout, subplots, spmap
|
layout, subplots, spmap
|
||||||
end
|
end
|
||||||
|
|
||||||
# build a layout from a list of existing Plot objects
|
|
||||||
# TODO... much of the logic overlaps with the method above... can we merge?
|
|
||||||
function build_layout(layout::GridLayout, numsp::Integer, plts::AVec{Plot})
|
|
||||||
nr, nc = size(layout)
|
|
||||||
subplots = Subplot[]
|
|
||||||
spmap = SubplotMap()
|
|
||||||
i = 0
|
|
||||||
for r=1:nr, c=1:nc
|
|
||||||
l = layout[r,c]
|
|
||||||
if isa(l, EmptyLayout) && !get(l.attr, :blank, false)
|
|
||||||
plt = popfirst!(plts) # grab the first plot out of the list
|
|
||||||
layout[r,c] = plt.layout
|
|
||||||
append!(subplots, plt.subplots)
|
|
||||||
merge!(spmap, plt.spmap)
|
|
||||||
if get(l.attr, :width, :auto) != :auto
|
|
||||||
layout.widths[c] = attr(l,:width)
|
|
||||||
end
|
|
||||||
if get(l.attr, :height, :auto) != :auto
|
|
||||||
layout.heights[r] = attr(l,:height)
|
|
||||||
end
|
|
||||||
i += length(plt.subplots)
|
|
||||||
elseif isa(l, GridLayout)
|
|
||||||
# sub-grid
|
|
||||||
if get(l.attr, :width, :auto) != :auto
|
|
||||||
layout.widths[c] = attr(l,:width)
|
|
||||||
end
|
|
||||||
if get(l.attr, :height, :auto) != :auto
|
|
||||||
layout.heights[r] = attr(l,:height)
|
|
||||||
end
|
|
||||||
l, sps, m = build_layout(l, numsp-i, plts)
|
|
||||||
append!(subplots, sps)
|
|
||||||
merge!(spmap, m)
|
|
||||||
i += length(sps)
|
|
||||||
end
|
|
||||||
i >= numsp && break # only add n subplots
|
|
||||||
end
|
|
||||||
layout, subplots, spmap
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
# @layout macro
|
|
||||||
|
|
||||||
function add_layout_pct!(kw::AKW, v::Expr, idx::Integer, nidx::Integer)
|
|
||||||
# dump(v)
|
|
||||||
# something like {0.2w}?
|
|
||||||
if v.head == :call && v.args[1] == :*
|
|
||||||
num = v.args[2]
|
|
||||||
if length(v.args) == 3 && isa(num, Number)
|
|
||||||
units = v.args[3]
|
|
||||||
if units == :h
|
|
||||||
return kw[:h] = num*pct
|
|
||||||
elseif units == :w
|
|
||||||
return kw[:w] = num*pct
|
|
||||||
elseif units in (:pct, :px, :mm, :cm, :inch)
|
|
||||||
idx == 1 && (kw[:w] = v)
|
|
||||||
(idx == 2 || nidx == 1) && (kw[:h] = v)
|
|
||||||
# return kw[idx == 1 ? :w : :h] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
error("Couldn't match layout curly (idx=$idx): $v")
|
|
||||||
end
|
|
||||||
|
|
||||||
function add_layout_pct!(kw::AKW, v::Number, idx::Integer)
|
|
||||||
# kw[idx == 1 ? :w : :h] = v*pct
|
|
||||||
idx == 1 && (kw[:w] = v*pct)
|
|
||||||
(idx == 2 || nidx == 1) && (kw[:h] = v*pct)
|
|
||||||
end
|
|
||||||
|
|
||||||
isrow(v) = isa(v, Expr) && v.head in (:hcat,:row)
|
|
||||||
iscol(v) = isa(v, Expr) && v.head == :vcat
|
|
||||||
rowsize(v) = isrow(v) ? length(v.args) : 1
|
|
||||||
|
|
||||||
|
|
||||||
function create_grid(expr::Expr)
|
|
||||||
if iscol(expr)
|
|
||||||
create_grid_vcat(expr)
|
|
||||||
elseif isrow(expr)
|
|
||||||
:(let cell = GridLayout(1, $(length(expr.args)))
|
|
||||||
$([:(cell[1,$i] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...)
|
|
||||||
cell
|
|
||||||
end)
|
|
||||||
|
|
||||||
elseif expr.head == :curly
|
|
||||||
create_grid_curly(expr)
|
|
||||||
else
|
|
||||||
# if it's something else, just return that (might be an existing layout?)
|
|
||||||
esc(expr)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function create_grid_vcat(expr::Expr)
|
|
||||||
rowsizes = map(rowsize, expr.args)
|
|
||||||
rmin, rmax = extrema(rowsizes)
|
|
||||||
if rmin > 0 && rmin == rmax
|
|
||||||
# we have a grid... build the whole thing
|
|
||||||
# note: rmin is the number of columns
|
|
||||||
nr = length(expr.args)
|
|
||||||
nc = rmin
|
|
||||||
body = Expr(:block)
|
|
||||||
for r=1:nr
|
|
||||||
arg = expr.args[r]
|
|
||||||
if isrow(arg)
|
|
||||||
for (c,item) in enumerate(arg.args)
|
|
||||||
push!(body.args, :(cell[$r,$c] = $(create_grid(item))))
|
|
||||||
end
|
|
||||||
else
|
|
||||||
push!(body.args, :(cell[$r,1] = $(create_grid(arg))))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
:(let cell = GridLayout($nr, $nc)
|
|
||||||
$body
|
|
||||||
cell
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
# otherwise just build one row at a time
|
|
||||||
:(let cell = GridLayout($(length(expr.args)), 1)
|
|
||||||
$([:(cell[$i,1] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...)
|
|
||||||
cell
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function create_grid_curly(expr::Expr)
|
|
||||||
kw = KW()
|
|
||||||
for (i,arg) in enumerate(expr.args[2:end])
|
|
||||||
add_layout_pct!(kw, arg, i, length(expr.args)-1)
|
|
||||||
end
|
|
||||||
s = expr.args[1]
|
|
||||||
if isa(s, Expr) && s.head == :call && s.args[1] == :grid
|
|
||||||
create_grid(:(grid($(s.args[2:end]...), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto))))))
|
|
||||||
elseif isa(s, Symbol)
|
|
||||||
:(EmptyLayout(label = $(QuoteNode(s)), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto)))))
|
|
||||||
else
|
|
||||||
error("Unknown use of curly brackets: $expr")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function create_grid(s::Symbol)
|
|
||||||
:(EmptyLayout(label = $(QuoteNode(s)), blank = $(s == :_)))
|
|
||||||
end
|
|
||||||
|
|
||||||
macro layout(mat::Expr)
|
|
||||||
create_grid(mat)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
# make all reference the same axis extrema/values.
|
# make all reference the same axis extrema/values.
|
||||||
# merge subplot lists.
|
# merge subplot lists.
|
||||||
function link_axes!(axes::Axis...)
|
function link_axes!(axes::Axis...)
|
||||||
a1 = axes[1]
|
a1 = axes[1]
|
||||||
for i=2:length(axes)
|
for i in 2:length(axes)
|
||||||
a2 = axes[i]
|
a2 = axes[i]
|
||||||
expand_extrema!(a1, ignorenan_extrema(a2))
|
expand_extrema!(a1, ignorenan_extrema(a2))
|
||||||
for k in (:extrema, :discrete_values, :continuous_values, :discrete_map)
|
for k in (:extrema, :discrete_values, :continuous_values, :discrete_map)
|
||||||
@ -749,8 +607,8 @@ function link_subplots(a::AbstractArray{AbstractLayout}, axissym::Symbol)
|
|||||||
for l in a
|
for l in a
|
||||||
if isa(l, Subplot)
|
if isa(l, Subplot)
|
||||||
push!(subplots, l)
|
push!(subplots, l)
|
||||||
elseif isa(l, GridLayout) && size(l) == (1,1)
|
elseif isa(l, GridLayout) && size(l) == (1, 1)
|
||||||
push!(subplots, l[1,1])
|
push!(subplots, l[1, 1])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
subplots
|
subplots
|
||||||
@ -766,20 +624,19 @@ function link_axes!(a::AbstractArray{AbstractLayout}, axissym::Symbol)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# don't do anything for most layout types
|
# don't do anything for most layout types
|
||||||
function link_axes!(l::AbstractLayout, link::Symbol)
|
function link_axes!(l::AbstractLayout, link::Symbol) end
|
||||||
end
|
|
||||||
|
|
||||||
# process a GridLayout, recursively linking axes according to the link symbol
|
# process a GridLayout, recursively linking axes according to the link symbol
|
||||||
function link_axes!(layout::GridLayout, link::Symbol)
|
function link_axes!(layout::GridLayout, link::Symbol)
|
||||||
nr, nc = size(layout)
|
nr, nc = size(layout)
|
||||||
if link in (:x, :both)
|
if link in (:x, :both)
|
||||||
for c=1:nc
|
for c in 1:nc
|
||||||
link_axes!(layout.grid[:,c], :xaxis)
|
link_axes!(layout.grid[:, c], :xaxis)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if link in (:y, :both)
|
if link in (:y, :both)
|
||||||
for r=1:nr
|
for r in 1:nr
|
||||||
link_axes!(layout.grid[r,:], :yaxis)
|
link_axes!(layout.grid[r, :], :yaxis)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if link == :square
|
if link == :square
|
||||||
@ -805,11 +662,20 @@ end
|
|||||||
|
|
||||||
"Adds a new, empty subplot overlayed on top of `sp`, with a mirrored y-axis and linked x-axis."
|
"Adds a new, empty subplot overlayed on top of `sp`, with a mirrored y-axis and linked x-axis."
|
||||||
function twinx(sp::Subplot)
|
function twinx(sp::Subplot)
|
||||||
sp[:right_margin] = max(sp[:right_margin], 30px)
|
plot!(
|
||||||
plot!(sp.plt, inset = (sp[:subplot_index], bbox(0,0,1,1)))
|
sp.plt,
|
||||||
|
inset = (sp[:subplot_index], bbox(0, 0, 1, 1)),
|
||||||
|
right_margin = sp[:right_margin],
|
||||||
|
left_margin = sp[:left_margin],
|
||||||
|
top_margin = sp[:top_margin],
|
||||||
|
bottom_margin = sp[:bottom_margin],
|
||||||
|
)
|
||||||
twinsp = sp.plt.subplots[end]
|
twinsp = sp.plt.subplots[end]
|
||||||
|
twinsp[:xaxis][:grid] = false
|
||||||
|
twinsp[:yaxis][:grid] = false
|
||||||
|
twinsp[:xaxis][:showaxis] = false
|
||||||
twinsp[:yaxis][:mirror] = true
|
twinsp[:yaxis][:mirror] = true
|
||||||
twinsp[:background_color_inside] = RGBA{Float64}(0,0,0,0)
|
twinsp[:background_color_inside] = RGBA{Float64}(0, 0, 0, 0)
|
||||||
link_axes!(sp[:xaxis], twinsp[:xaxis])
|
link_axes!(sp[:xaxis], twinsp[:xaxis])
|
||||||
twinsp
|
twinsp
|
||||||
end
|
end
|
||||||
|
|||||||
57
src/legend.jl
Normal file
57
src/legend.jl
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
"""
|
||||||
|
```julia
|
||||||
|
legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax, inout)
|
||||||
|
```
|
||||||
|
|
||||||
|
Return `(x,y)` at an angle `theta` degrees from
|
||||||
|
`(xcenter,ycenter)` on a rectangle defined by (`xmin`, `xmax`, `ymin`, `ymax`).
|
||||||
|
"""
|
||||||
|
function legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax)
|
||||||
|
(s, c) = sincosd(theta)
|
||||||
|
x = c < 0 ? (xmin - xcenter) / c : (xmax - xcenter) / c
|
||||||
|
y = s < 0 ? (ymin - ycenter) / s : (ymax - ycenter) / s
|
||||||
|
A = min(x, y)
|
||||||
|
return (xcenter + A * c, ycenter + A * s)
|
||||||
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
Split continuous range `[-1,1]` evenly into an integer `[1,2,3]`
|
||||||
|
"""
|
||||||
|
function legend_anchor_index(x)
|
||||||
|
x < -1 // 3 && return 1
|
||||||
|
x < 1 // 3 && return 2
|
||||||
|
return 3
|
||||||
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
Turn legend argument into a (theta, :inner) or (theta, :outer) tuple.
|
||||||
|
For backends where legend position is given in normal coordinates (0,0) -- (1,1),
|
||||||
|
so :topleft exactly corresponds to (45, :inner) etc.
|
||||||
|
|
||||||
|
If `leg` is a (::Real,::Real) tuple, keep it as is.
|
||||||
|
"""
|
||||||
|
legend_angle(leg::Real) = (leg, :inner)
|
||||||
|
legend_angle(leg::Tuple{S,T}) where {S<:Real,T<:Real} = leg
|
||||||
|
legend_angle(leg::Tuple{S,Symbol}) where {S<:Real} = leg
|
||||||
|
legend_angle(leg::Symbol) = get(
|
||||||
|
(
|
||||||
|
topleft = (135, :inner),
|
||||||
|
top = (90, :inner),
|
||||||
|
topright = (45, :inner),
|
||||||
|
left = (180, :inner),
|
||||||
|
right = (0, :inner),
|
||||||
|
bottomleft = (225, :inner),
|
||||||
|
bottom = (270, :inner),
|
||||||
|
bottomright = (315, :inner),
|
||||||
|
outertopleft = (135, :outer),
|
||||||
|
outertop = (90, :outer),
|
||||||
|
outertopright = (45, :outer),
|
||||||
|
outerleft = (180, :outer),
|
||||||
|
outerright = (0, :outer),
|
||||||
|
outerbottomleft = (225, :outer),
|
||||||
|
outerbottom = (270, :outer),
|
||||||
|
outerbottomright = (315, :outer),
|
||||||
|
),
|
||||||
|
leg,
|
||||||
|
(45, :inner),
|
||||||
|
)
|
||||||
@ -2,78 +2,68 @@
|
|||||||
defaultOutputFormat(plt::Plot) = "png"
|
defaultOutputFormat(plt::Plot) = "png"
|
||||||
|
|
||||||
function png(plt::Plot, fn::AbstractString)
|
function png(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "png")
|
open(addExtension(fn, "png"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("image/png"), plt)
|
||||||
show(io, MIME("image/png"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
png(fn::AbstractString) = png(current(), fn)
|
png(fn::AbstractString) = png(current(), fn)
|
||||||
|
|
||||||
function svg(plt::Plot, fn::AbstractString)
|
function svg(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "svg")
|
open(addExtension(fn, "svg"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("image/svg+xml"), plt)
|
||||||
show(io, MIME("image/svg+xml"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
svg(fn::AbstractString) = svg(current(), fn)
|
svg(fn::AbstractString) = svg(current(), fn)
|
||||||
|
|
||||||
function pdf(plt::Plot, fn::AbstractString)
|
function pdf(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "pdf")
|
open(addExtension(fn, "pdf"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("application/pdf"), plt)
|
||||||
show(io, MIME("application/pdf"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
pdf(fn::AbstractString) = pdf(current(), fn)
|
pdf(fn::AbstractString) = pdf(current(), fn)
|
||||||
|
|
||||||
function ps(plt::Plot, fn::AbstractString)
|
function ps(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "ps")
|
open(addExtension(fn, "ps"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("application/postscript"), plt)
|
||||||
show(io, MIME("application/postscript"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
ps(fn::AbstractString) = ps(current(), fn)
|
ps(fn::AbstractString) = ps(current(), fn)
|
||||||
|
|
||||||
function eps(plt::Plot, fn::AbstractString)
|
function eps(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "eps")
|
open(addExtension(fn, "eps"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("image/eps"), plt)
|
||||||
show(io, MIME("image/eps"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
eps(fn::AbstractString) = eps(current(), fn)
|
eps(fn::AbstractString) = eps(current(), fn)
|
||||||
|
|
||||||
function tex(plt::Plot, fn::AbstractString)
|
function tex(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "tex")
|
open(addExtension(fn, "tex"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("application/x-tex"), plt)
|
||||||
show(io, MIME("application/x-tex"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
tex(fn::AbstractString) = tex(current(), fn)
|
tex(fn::AbstractString) = tex(current(), fn)
|
||||||
|
|
||||||
function json(plt::Plot, fn::AbstractString)
|
function json(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "json")
|
open(addExtension(fn, "json"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("application/vnd.plotly.v1+json"), plt)
|
||||||
show(io, MIME("application/vnd.plotly.v1+json"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
json(fn::AbstractString) = json(current(), fn)
|
json(fn::AbstractString) = json(current(), fn)
|
||||||
|
|
||||||
function html(plt::Plot, fn::AbstractString)
|
function html(plt::Plot, fn::AbstractString)
|
||||||
fn = addExtension(fn, "html")
|
open(addExtension(fn, "html"), "w") do io
|
||||||
io = open(fn, "w")
|
show(io, MIME("text/html"), plt)
|
||||||
show(io, MIME("text/html"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
html(fn::AbstractString) = html(current(), fn)
|
html(fn::AbstractString) = html(current(), fn)
|
||||||
|
|
||||||
function txt(plt::Plot, fn::AbstractString)
|
function txt(plt::Plot, fn::AbstractString; color::Bool = true)
|
||||||
fn = addExtension(fn, "txt")
|
open(addExtension(fn, "txt"), "w") do io
|
||||||
io = open(fn, "w")
|
show(IOContext(io, :color => color), MIME("text/plain"), plt)
|
||||||
show(io, MIME("text/plain"), plt)
|
end
|
||||||
close(io)
|
|
||||||
end
|
end
|
||||||
txt(fn::AbstractString) = txt(current(), fn)
|
txt(fn::AbstractString) = txt(current(), fn)
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
const _savemap = Dict(
|
const _savemap = Dict(
|
||||||
@ -89,6 +79,13 @@ const _savemap = Dict(
|
|||||||
"txt" => txt,
|
"txt" => txt,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for out in Symbol.(unique(values(_savemap)))
|
||||||
|
@eval @doc """
|
||||||
|
$($out)([plot,], filename)
|
||||||
|
Save plot as $($out)-file.
|
||||||
|
""" $out
|
||||||
|
end
|
||||||
|
|
||||||
const _extension_map = Dict("tikz" => "tex")
|
const _extension_map = Dict("tikz" => "tex")
|
||||||
|
|
||||||
function addExtension(fn::AbstractString, ext::AbstractString)
|
function addExtension(fn::AbstractString, ext::AbstractString)
|
||||||
@ -112,7 +109,7 @@ function savefig(plt::Plot, fn::AbstractString)
|
|||||||
fn = abspath(expanduser(fn))
|
fn = abspath(expanduser(fn))
|
||||||
|
|
||||||
# get the extension
|
# get the extension
|
||||||
fn, ext = splitext(fn)
|
_, ext = splitext(fn)
|
||||||
ext = chop(ext, head = 1, tail = 0)
|
ext = chop(ext, head = 1, tail = 0)
|
||||||
if isempty(ext)
|
if isempty(ext)
|
||||||
ext = defaultOutputFormat(plt)
|
ext = defaultOutputFormat(plt)
|
||||||
@ -128,7 +125,6 @@ function savefig(plt::Plot, fn::AbstractString)
|
|||||||
end
|
end
|
||||||
savefig(fn::AbstractString) = savefig(current(), fn)
|
savefig(fn::AbstractString) = savefig(current(), fn)
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -186,18 +182,19 @@ function _show(io::IO, ::MIME"text/html", plt::Plot)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# delegate showable to _show instead
|
# delegate showable to _show instead
|
||||||
function Base.showable(m::M, plt::P) where {M <: MIME, P <: Plot}
|
function Base.showable(m::M, plt::P) where {M<:MIME,P<:Plot}
|
||||||
return hasmethod(_show, Tuple{IO, M, P})
|
return hasmethod(_show, Tuple{IO,M,P})
|
||||||
end
|
end
|
||||||
|
|
||||||
function _display(plt::Plot)
|
function _display(plt::Plot)
|
||||||
@warn("_display is not defined for this backend.")
|
@warn("_display is not defined for this backend.")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Base.show(io::IO, m::MIME"text/plain", plt::Plot) = show(io, plt)
|
||||||
# for writing to io streams... first prepare, then callback
|
# for writing to io streams... first prepare, then callback
|
||||||
for mime in (
|
for mime in (
|
||||||
"text/plain",
|
|
||||||
"text/html",
|
"text/html",
|
||||||
|
"text/latex",
|
||||||
"image/png",
|
"image/png",
|
||||||
"image/eps",
|
"image/eps",
|
||||||
"image/svg+xml",
|
"image/svg+xml",
|
||||||
@ -218,16 +215,14 @@ for mime in (
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Base.showable(::MIME"text/html", plt::Plot{UnicodePlotsBackend}) = false # Pluto
|
||||||
|
|
||||||
Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) =
|
Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) =
|
||||||
showjuno(io, MIME("text/html"), plt)
|
showjuno(io, MIME("text/html"), plt)
|
||||||
|
|
||||||
# default text/plain for all backends
|
|
||||||
_show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot) = show(io, plt)
|
|
||||||
|
|
||||||
"Close all open gui windows of the current backend"
|
"Close all open gui windows of the current backend"
|
||||||
closeall() = closeall(backend())
|
closeall() = closeall(backend())
|
||||||
|
|
||||||
|
|
||||||
# function html_output_format(fmt)
|
# function html_output_format(fmt)
|
||||||
# if fmt == "png"
|
# if fmt == "png"
|
||||||
# @eval function Base.show(io::IO, ::MIME"text/html", plt::Plot)
|
# @eval function Base.show(io::IO, ::MIME"text/html", plt::Plot)
|
||||||
@ -244,30 +239,21 @@ closeall() = closeall(backend())
|
|||||||
#
|
#
|
||||||
# html_output_format("svg")
|
# html_output_format("svg")
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Atom PlotPane
|
# Atom PlotPane
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
function showjuno(io::IO, m, plt)
|
function showjuno(io::IO, m, plt)
|
||||||
sz = collect(plt[:size])
|
|
||||||
dpi = plt[:dpi]
|
dpi = plt[:dpi]
|
||||||
thickness_scaling = plt[:thickness_scaling]
|
|
||||||
|
|
||||||
jsize = get(io, :juno_plotsize, [400, 500])
|
|
||||||
jratio = get(io, :juno_dpi_ratio, 1)
|
jratio = get(io, :juno_dpi_ratio, 1)
|
||||||
|
|
||||||
scale = minimum(jsize[i] / sz[i] for i in 1:2)
|
|
||||||
plt[:size] = [s * scale for s in sz]
|
|
||||||
plt[:dpi] = jratio * Plots.DPI
|
plt[:dpi] = jratio * Plots.DPI
|
||||||
plt[:thickness_scaling] *= scale
|
|
||||||
|
|
||||||
prepare_output(plt)
|
prepare_output(plt)
|
||||||
try
|
try
|
||||||
_showjuno(io, m, plt)
|
_showjuno(io, m, plt)
|
||||||
finally
|
finally
|
||||||
plt[:size] = sz
|
|
||||||
plt[:dpi] = dpi
|
plt[:dpi] = dpi
|
||||||
plt[:thickness_scaling] = thickness_scaling
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
246
src/pipeline.jl
246
src/pipeline.jl
@ -4,44 +4,21 @@
|
|||||||
|
|
||||||
function RecipesPipeline.warn_on_recipe_aliases!(
|
function RecipesPipeline.warn_on_recipe_aliases!(
|
||||||
plt::Plot,
|
plt::Plot,
|
||||||
plotattributes,
|
plotattributes::AKW,
|
||||||
recipe_type,
|
recipe_type::Symbol,
|
||||||
args...,
|
@nospecialize(args)
|
||||||
)
|
)
|
||||||
for k in keys(plotattributes)
|
pkeys = keys(plotattributes)
|
||||||
if !is_default_attribute(k)
|
for k in pkeys
|
||||||
dk = get(_keyAliases, k, k)
|
dk = get(_keyAliases, k, nothing)
|
||||||
if k !== dk
|
if dk !== nothing
|
||||||
@warn "Attribute alias `$k` detected in the $recipe_type recipe defined for the signature $(_signature_string(Val{recipe_type}, args...)). To ensure expected behavior it is recommended to use the default attribute `$dk`."
|
kv = RecipesPipeline.pop_kw!(plotattributes, k)
|
||||||
|
if dk ∉ pkeys
|
||||||
|
plotattributes[dk] = kv
|
||||||
end
|
end
|
||||||
plotattributes[dk] = RecipesPipeline.pop_kw!(plotattributes, k)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function RecipesPipeline.warn_on_recipe_aliases!(
|
|
||||||
plt::Plot,
|
|
||||||
v::AbstractVector,
|
|
||||||
recipe_type,
|
|
||||||
args...,
|
|
||||||
)
|
|
||||||
foreach(x -> RecipesPipeline.warn_on_recipe_aliases!(plt, x, recipe_type, args...), v)
|
|
||||||
end
|
|
||||||
function RecipesPipeline.warn_on_recipe_aliases!(
|
|
||||||
plt::Plot,
|
|
||||||
rd::RecipeData,
|
|
||||||
recipe_type,
|
|
||||||
args...,
|
|
||||||
)
|
|
||||||
RecipesPipeline.warn_on_recipe_aliases!(plt, rd.plotattributes, recipe_type, args...)
|
|
||||||
end
|
|
||||||
|
|
||||||
function _signature_string(::Type{Val{:user}}, args...)
|
|
||||||
return string("(::", join(string.(typeof.(args)), ", ::"), ")")
|
|
||||||
end
|
|
||||||
_signature_string(::Type{Val{:type}}, T) = "(::Type{$T}, ::$T)"
|
|
||||||
_signature_string(::Type{Val{:plot}}, st) = "(::Type{Val{:$st}}, ::AbstractPlot)"
|
|
||||||
_signature_string(::Type{Val{:series}}, st) = "(::Type{Val{:$st}}, x, y, z)"
|
|
||||||
|
|
||||||
|
|
||||||
## Grouping
|
## Grouping
|
||||||
|
|
||||||
@ -49,12 +26,22 @@ RecipesPipeline.splittable_attribute(plt::Plot, key, val::SeriesAnnotations, len
|
|||||||
RecipesPipeline.splittable_attribute(plt, key, val.strs, len)
|
RecipesPipeline.splittable_attribute(plt, key, val.strs, len)
|
||||||
|
|
||||||
function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, indices)
|
function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, indices)
|
||||||
split_strs = _RecipesPipeline.split_attribute(key, val.strs, indices)
|
split_strs = RecipesPipeline.split_attribute(plt, key, val.strs, indices)
|
||||||
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
|
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
## Preprocessing attributes
|
## Preprocessing attributes
|
||||||
|
function RecipesPipeline.preprocess_axis_args!(plt::Plot, plotattributes, letter)
|
||||||
|
# Fix letter for seriestypes that are x only but data gets passed as y
|
||||||
|
if treats_y_as_x(get(plotattributes, :seriestype, :path))
|
||||||
|
if get(plotattributes, :orientation, :vertical) == :vertical
|
||||||
|
letter = :x
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
plotattributes[:letter] = letter
|
||||||
|
RecipesPipeline.preprocess_axis_args!(plt, plotattributes)
|
||||||
|
end
|
||||||
|
|
||||||
RecipesPipeline.preprocess_attributes!(plt::Plot, plotattributes) =
|
RecipesPipeline.preprocess_attributes!(plt::Plot, plotattributes) =
|
||||||
RecipesPipeline.preprocess_attributes!(plotattributes) # in src/args.jl
|
RecipesPipeline.preprocess_attributes!(plotattributes) # in src/args.jl
|
||||||
@ -63,7 +50,6 @@ RecipesPipeline.is_axis_attribute(plt::Plot, attr) = is_axis_attr_noletter(attr)
|
|||||||
|
|
||||||
RecipesPipeline.is_subplot_attribute(plt::Plot, attr) = is_subplot_attr(attr) # in src/args.jl
|
RecipesPipeline.is_subplot_attribute(plt::Plot, attr) = is_subplot_attr(attr) # in src/args.jl
|
||||||
|
|
||||||
|
|
||||||
## User recipes
|
## User recipes
|
||||||
|
|
||||||
function RecipesPipeline.process_userrecipe!(plt::Plot, kw_list, kw)
|
function RecipesPipeline.process_userrecipe!(plt::Plot, kw_list, kw)
|
||||||
@ -82,23 +68,32 @@ end
|
|||||||
function _preprocess_userrecipe(kw::AKW)
|
function _preprocess_userrecipe(kw::AKW)
|
||||||
_add_markershape(kw)
|
_add_markershape(kw)
|
||||||
|
|
||||||
|
if get(kw, :permute, default(:permute)) != :none
|
||||||
|
l1, l2 = kw[:permute]
|
||||||
|
for k in _axis_args
|
||||||
|
k1 = _attrsymbolcache[l1][k]
|
||||||
|
k2 = _attrsymbolcache[l2][k]
|
||||||
|
kwk = keys(kw)
|
||||||
|
if k1 in kwk || k2 in kwk
|
||||||
|
kw[k1], kw[k2] = get(kw, k2, default(k2)), get(kw, k1, default(k1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
# map marker_z if it's a Function
|
# map marker_z if it's a Function
|
||||||
if isa(get(kw, :marker_z, nothing), Function)
|
if isa(get(kw, :marker_z, default(:marker_z)), Function)
|
||||||
# TODO: should this take y and/or z as arguments?
|
# TODO: should this take y and/or z as arguments?
|
||||||
kw[:marker_z] = isa(kw[:z], Nothing) ? map(kw[:marker_z], kw[:x], kw[:y]) :
|
kw[:marker_z] =
|
||||||
|
isa(kw[:z], Nothing) ? map(kw[:marker_z], kw[:x], kw[:y]) :
|
||||||
map(kw[:marker_z], kw[:x], kw[:y], kw[:z])
|
map(kw[:marker_z], kw[:x], kw[:y], kw[:z])
|
||||||
end
|
end
|
||||||
|
|
||||||
# map line_z if it's a Function
|
# map line_z if it's a Function
|
||||||
if isa(get(kw, :line_z, nothing), Function)
|
if isa(get(kw, :line_z, default(:line_z)), Function)
|
||||||
kw[:line_z] = isa(kw[:z], Nothing) ? map(kw[:line_z], kw[:x], kw[:y]) :
|
kw[:line_z] =
|
||||||
|
isa(kw[:z], Nothing) ? map(kw[:line_z], kw[:x], kw[:y]) :
|
||||||
map(kw[:line_z], kw[:x], kw[:y], kw[:z])
|
map(kw[:line_z], kw[:x], kw[:y], kw[:z])
|
||||||
end
|
end
|
||||||
|
|
||||||
# convert a ribbon into a fillrange
|
|
||||||
if get(kw, :ribbon, nothing) !== nothing
|
|
||||||
make_fillrange_from_ribbon(kw)
|
|
||||||
end
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -141,20 +136,48 @@ function _add_smooth_kw(kw_list::Vector{KW}, kw::AKW)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RecipesPipeline.get_axis_limits(plt::Plot, letter) = axis_limits(plt[1], letter, false)
|
||||||
RecipesPipeline.get_axis_limits(plt::Plot, f, letter) = axis_limits(plt[1], letter)
|
|
||||||
|
|
||||||
|
|
||||||
## Plot recipes
|
## Plot recipes
|
||||||
|
|
||||||
RecipesPipeline.type_alias(plt::Plot) = get(_typeAliases, st, st)
|
RecipesPipeline.type_alias(plt::Plot) = get(_typeAliases, st, st)
|
||||||
|
|
||||||
|
|
||||||
## Plot setup
|
## Plot setup
|
||||||
|
|
||||||
function RecipesPipeline.plot_setup!(plt::Plot, plotattributes, kw_list)
|
function RecipesPipeline.plot_setup!(plt::Plot, plotattributes, kw_list)
|
||||||
_plot_setup(plt, plotattributes, kw_list)
|
_plot_setup(plt, plotattributes, kw_list)
|
||||||
_subplot_setup(plt, plotattributes, kw_list)
|
_subplot_setup(plt, plotattributes, kw_list)
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function RecipesPipeline.process_sliced_series_attributes!(plt::Plots.Plot, kw_list)
|
||||||
|
# swap errors
|
||||||
|
err_inds =
|
||||||
|
findall(kw -> get(kw, :seriestype, :path) in (:xerror, :yerror, :zerror), kw_list)
|
||||||
|
for ind in err_inds
|
||||||
|
if get(kw_list[ind - 1], :seriestype, :path) == :scatter
|
||||||
|
tmp = copy(kw_list[ind])
|
||||||
|
kw_list[ind] = copy(kw_list[ind - 1])
|
||||||
|
kw_list[ind - 1] = tmp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for kw in kw_list
|
||||||
|
rib = get(kw, :ribbon, default(:ribbon))
|
||||||
|
fr = get(kw, :fillrange, default(:fillrange))
|
||||||
|
# map ribbon if it's a Function
|
||||||
|
if rib isa Function
|
||||||
|
kw[:ribbon] = map(rib, kw[:x])
|
||||||
|
end
|
||||||
|
# convert a ribbon into a fillrange
|
||||||
|
if rib !== nothing
|
||||||
|
make_fillrange_from_ribbon(kw)
|
||||||
|
# map fillrange if it's a Function
|
||||||
|
elseif fr !== nothing && fr isa Function
|
||||||
|
kw[:fillrange] = map(fr, kw[:x])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Should some of this logic be moved to RecipesPipeline?
|
# TODO: Should some of this logic be moved to RecipesPipeline?
|
||||||
@ -179,7 +202,6 @@ function _plot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
|
|||||||
plt.init = true
|
plt.init = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# handle inset subplots
|
# handle inset subplots
|
||||||
insets = plt[:inset_subplots]
|
insets = plt[:inset_subplots]
|
||||||
if insets !== nothing
|
if insets !== nothing
|
||||||
@ -212,7 +234,7 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
|
|||||||
# Subplot/Axis attributes set by a user/series recipe apply only to the
|
# Subplot/Axis attributes set by a user/series recipe apply only to the
|
||||||
# Subplot object which they belong to.
|
# Subplot object which they belong to.
|
||||||
# TODO: allow matrices to still apply to all subplots
|
# TODO: allow matrices to still apply to all subplots
|
||||||
sp_attrs = Dict{Subplot, Any}()
|
sp_attrs = Dict{Subplot,Any}()
|
||||||
for kw in kw_list
|
for kw in kw_list
|
||||||
# get the Subplot object to which the series belongs.
|
# get the Subplot object to which the series belongs.
|
||||||
sps = get(kw, :subplot, :auto)
|
sps = get(kw, :subplot, :auto)
|
||||||
@ -229,25 +251,33 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
|
|||||||
attr = KW()
|
attr = KW()
|
||||||
for (k, v) in collect(kw)
|
for (k, v) in collect(kw)
|
||||||
if is_subplot_attr(k) || is_axis_attr(k)
|
if is_subplot_attr(k) || is_axis_attr(k)
|
||||||
attr[k] = pop!(kw, k)
|
v = pop!(kw, k)
|
||||||
|
if sps isa AbstractArray && v isa AbstractArray && length(v) == length(sps)
|
||||||
|
v = v[series_idx(kw_list, kw)]
|
||||||
|
end
|
||||||
|
attr[k] = v
|
||||||
end
|
end
|
||||||
if is_axis_attr_noletter(k)
|
if is_axis_attr_noletter(k)
|
||||||
v = pop!(kw, k)
|
v = pop!(kw, k)
|
||||||
|
if sps isa AbstractArray && v isa AbstractArray && length(v) == length(sps)
|
||||||
|
v = v[series_idx(kw_list, kw)]
|
||||||
|
end
|
||||||
for letter in (:x, :y, :z)
|
for letter in (:x, :y, :z)
|
||||||
attr[Symbol(letter, k)] = v
|
attr[get_attr_symbol(letter, k)] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for k in (:scale,), letter in (:x, :y, :z)
|
end
|
||||||
# Series recipes may need access to this information
|
for k in (:scale,), letter in (:x, :y, :z)
|
||||||
lk = Symbol(letter, k)
|
# Series recipes may need access to this information
|
||||||
if haskey(attr, lk)
|
lk = get_attr_symbol(letter, k)
|
||||||
kw[lk] = attr[lk]
|
if haskey(attr, lk)
|
||||||
end
|
kw[lk] = attr[lk]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
sp_attrs[sp] = attr
|
sp_attrs[sp] = attr
|
||||||
end
|
end
|
||||||
|
|
||||||
|
_add_plot_title!(plt)
|
||||||
# override subplot/axis args. `sp_attrs` take precendence
|
# override subplot/axis args. `sp_attrs` take precendence
|
||||||
for (idx, sp) in enumerate(plt.subplots)
|
for (idx, sp) in enumerate(plt.subplots)
|
||||||
attr = if !haskey(plotattributes, :subplot) || plotattributes[:subplot] == idx
|
attr = if !haskey(plotattributes, :subplot) || plotattributes[:subplot] == idx
|
||||||
@ -260,12 +290,48 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
|
|||||||
|
|
||||||
# do we need to link any axes together?
|
# do we need to link any axes together?
|
||||||
link_axes!(plt.layout, plt[:link])
|
link_axes!(plt.layout, plt[:link])
|
||||||
|
return nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
function series_idx(kw_list::AVec{KW}, kw::AKW)
|
function series_idx(kw_list::AVec{KW}, kw::AKW)
|
||||||
Int(kw[:series_plotindex]) - Int(kw_list[1][:series_plotindex]) + 1
|
Int(kw[:series_plotindex]) - Int(kw_list[1][:series_plotindex]) + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function _add_plot_title!(plt)
|
||||||
|
plot_title = plt[:plot_title]
|
||||||
|
plot_titleindex = nothing
|
||||||
|
|
||||||
|
if plot_title != ""
|
||||||
|
# make new subplot for plot title
|
||||||
|
if plt[:plot_titleindex] == 0
|
||||||
|
the_layout = plt.layout
|
||||||
|
vspan = plt[:plot_titlevspan]
|
||||||
|
plt.layout = grid(2, 1, heights = (vspan, 1 - vspan))
|
||||||
|
plt.layout.grid[1, 1] =
|
||||||
|
subplot = Subplot(plt.backend, parent = plt.layout[1, 1])
|
||||||
|
plt.layout.grid[2, 1] = the_layout
|
||||||
|
subplot.plt = plt
|
||||||
|
|
||||||
|
top = plt.backend isa PyPlotBackend ? nothing : 0mm
|
||||||
|
bot = 0mm
|
||||||
|
plt[:force_minpad] = nothing, top, nothing, bot
|
||||||
|
subplot[:subplot_index] = last(plt.subplots)[:subplot_index] + 1
|
||||||
|
plt[:plot_titleindex] = subplot[:subplot_index]
|
||||||
|
subplot[:framestyle] = :none
|
||||||
|
subplot[:margin] = 0px
|
||||||
|
push!(plt.subplots, subplot)
|
||||||
|
end
|
||||||
|
|
||||||
|
# propagate arguments plt[:plot_titleXXX] --> subplot[:titleXXX]
|
||||||
|
plot_titleindex = plt[:plot_titleindex]
|
||||||
|
subplot = plt.subplots[plot_titleindex]
|
||||||
|
for sym in filter(x -> startswith(string(x), "plot_title"), keys(_plot_defaults))
|
||||||
|
subplot[Symbol(string(sym)[(length("plot_") + 1):end])] = plt[sym]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return plot_titleindex
|
||||||
|
end
|
||||||
|
|
||||||
## Series recipes
|
## Series recipes
|
||||||
|
|
||||||
@ -274,6 +340,7 @@ function RecipesPipeline.slice_series_attributes!(plt::Plot, kw_list, kw)
|
|||||||
# in series attributes given as vector with one element per series,
|
# in series attributes given as vector with one element per series,
|
||||||
# select the value for current series
|
# select the value for current series
|
||||||
_slice_series_args!(kw, plt, sp, series_idx(kw_list, kw))
|
_slice_series_args!(kw, plt, sp, series_idx(kw_list, kw))
|
||||||
|
return nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
RecipesPipeline.series_defaults(plt::Plot) = _series_defaults # in args.jl
|
RecipesPipeline.series_defaults(plt::Plot) = _series_defaults # in args.jl
|
||||||
@ -282,6 +349,19 @@ RecipesPipeline.is_seriestype_supported(plt::Plot, st) = is_seriestype_supported
|
|||||||
|
|
||||||
function RecipesPipeline.add_series!(plt::Plot, plotattributes)
|
function RecipesPipeline.add_series!(plt::Plot, plotattributes)
|
||||||
sp = _prepare_subplot(plt, plotattributes)
|
sp = _prepare_subplot(plt, plotattributes)
|
||||||
|
if plotattributes[:permute] != :none
|
||||||
|
letter1, letter2 = plotattributes[:permute]
|
||||||
|
if plotattributes[:markershape] == :hline &&
|
||||||
|
(plotattributes[:permute] == (:x, :y) || plotattributes[:permute] == (:y, :x))
|
||||||
|
plotattributes[:markershape] = :vline
|
||||||
|
elseif plotattributes[:markershape] == :vline && (
|
||||||
|
plotattributes[:permute] == (:x, :y) || plotattributes[:permute] == (:y, :x)
|
||||||
|
)
|
||||||
|
plotattributes[:markershape] = :hline
|
||||||
|
end
|
||||||
|
plotattributes[letter1], plotattributes[letter2] =
|
||||||
|
plotattributes[letter2], plotattributes[letter1]
|
||||||
|
end
|
||||||
_expand_subplot_extrema(sp, plotattributes, plotattributes[:seriestype])
|
_expand_subplot_extrema(sp, plotattributes, plotattributes[:seriestype])
|
||||||
_update_series_attributes!(plotattributes, plt, sp)
|
_update_series_attributes!(plotattributes, plt, sp)
|
||||||
_add_the_series(plt, sp, plotattributes)
|
_add_the_series(plt, sp, plotattributes)
|
||||||
@ -298,7 +378,10 @@ function _prepare_subplot(plt::Plot{T}, plotattributes::AKW) where {T}
|
|||||||
st = _override_seriestype_check(plotattributes, st)
|
st = _override_seriestype_check(plotattributes, st)
|
||||||
|
|
||||||
# change to a 3d projection for this subplot?
|
# change to a 3d projection for this subplot?
|
||||||
if RecipesPipeline.needs_3d_axes(st)
|
if (
|
||||||
|
RecipesPipeline.needs_3d_axes(st) ||
|
||||||
|
(st == :quiver && plotattributes[:z] !== nothing)
|
||||||
|
)
|
||||||
sp.attr[:projection] = "3d"
|
sp.attr[:projection] = "3d"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -312,10 +395,12 @@ end
|
|||||||
|
|
||||||
function _override_seriestype_check(plotattributes::AKW, st::Symbol)
|
function _override_seriestype_check(plotattributes::AKW, st::Symbol)
|
||||||
# do we want to override the series type?
|
# do we want to override the series type?
|
||||||
if !RecipesPipeline.is3d(st) && !(st in (:contour, :contour3d))
|
if !RecipesPipeline.is3d(st) && !(st in (:contour, :contour3d, :quiver))
|
||||||
z = plotattributes[:z]
|
z = plotattributes[:z]
|
||||||
if !isa(z, Nothing) &&
|
if (
|
||||||
(size(plotattributes[:x]) == size(plotattributes[:y]) == size(z))
|
z !== nothing &&
|
||||||
|
(size(plotattributes[:x]) == size(plotattributes[:y]) == size(z))
|
||||||
|
)
|
||||||
st = (st == :scatter ? :scatter3d : :path3d)
|
st = (st == :scatter ? :scatter3d : :path3d)
|
||||||
plotattributes[:seriestype] = st
|
plotattributes[:seriestype] = st
|
||||||
end
|
end
|
||||||
@ -323,6 +408,14 @@ function _override_seriestype_check(plotattributes::AKW, st::Symbol)
|
|||||||
st
|
st
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function needs_any_3d_axes(sp::Subplot)
|
||||||
|
any(
|
||||||
|
RecipesPipeline.needs_3d_axes(
|
||||||
|
_override_seriestype_check(s.plotattributes, s.plotattributes[:seriestype]),
|
||||||
|
) for s in series_list(sp)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol)
|
function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol)
|
||||||
# adjust extrema and discrete info
|
# adjust extrema and discrete info
|
||||||
if st == :image
|
if st == :image
|
||||||
@ -330,7 +423,7 @@ function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol)
|
|||||||
ymin, ymax = ignorenan_extrema(plotattributes[:y])
|
ymin, ymax = ignorenan_extrema(plotattributes[:y])
|
||||||
expand_extrema!(sp[:xaxis], (xmin, xmax))
|
expand_extrema!(sp[:xaxis], (xmin, xmax))
|
||||||
expand_extrema!(sp[:yaxis], (ymin, ymax))
|
expand_extrema!(sp[:yaxis], (ymin, ymax))
|
||||||
elseif !(st in (:pie, :histogram, :bins2d, :histogram2d))
|
elseif !(st in (:histogram, :bins2d, :histogram2d))
|
||||||
expand_extrema!(sp, plotattributes)
|
expand_extrema!(sp, plotattributes)
|
||||||
end
|
end
|
||||||
# expand for zerolines (axes through origin)
|
# expand for zerolines (axes through origin)
|
||||||
@ -341,10 +434,33 @@ function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function _add_the_series(plt, sp, plotattributes)
|
function _add_the_series(plt, sp, plotattributes)
|
||||||
warn_on_unsupported_args(plt.backend, plotattributes)
|
extra_kwargs = warn_on_unsupported_args(plt.backend, plotattributes)
|
||||||
|
if (kw = plt[:extra_kwargs]) isa AbstractDict
|
||||||
|
plt[:extra_plot_kwargs] = get(kw, :plot, KW())
|
||||||
|
sp[:extra_kwargs] = get(kw, :subplot, KW())
|
||||||
|
plotattributes[:extra_kwargs] = get(kw, :series, KW())
|
||||||
|
elseif plt[:extra_kwargs] == :plot
|
||||||
|
plt[:extra_plot_kwargs] = extra_kwargs
|
||||||
|
elseif plt[:extra_kwargs] == :subplot
|
||||||
|
sp[:extra_kwargs] = extra_kwargs
|
||||||
|
elseif plt[:extra_kwargs] == :series
|
||||||
|
plotattributes[:extra_kwargs] = extra_kwargs
|
||||||
|
else
|
||||||
|
ArgumentError("Unsupported type for extra keyword arguments")
|
||||||
|
end
|
||||||
warn_on_unsupported(plt.backend, plotattributes)
|
warn_on_unsupported(plt.backend, plotattributes)
|
||||||
series = Series(plotattributes)
|
series = Series(plotattributes)
|
||||||
push!(plt.series_list, series)
|
push!(plt.series_list, series)
|
||||||
push!(sp.series_list, series)
|
z_order = plotattributes[:z_order]
|
||||||
|
if z_order == :front
|
||||||
|
push!(sp.series_list, series)
|
||||||
|
elseif z_order == :back
|
||||||
|
pushfirst!(sp.series_list, series)
|
||||||
|
elseif z_order isa Integer
|
||||||
|
insert!(sp.series_list, z_order, series)
|
||||||
|
else
|
||||||
|
@error "Wrong type $(typeof(z_order)) for attribute z_order"
|
||||||
|
end
|
||||||
_series_added(plt, series)
|
_series_added(plt, series)
|
||||||
|
_update_subplot_colorbars(sp)
|
||||||
end
|
end
|
||||||
|
|||||||
101
src/plot.jl
101
src/plot.jl
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
mutable struct CurrentPlot
|
mutable struct CurrentPlot
|
||||||
nullableplot::Union{AbstractPlot, Nothing}
|
nullableplot::Union{AbstractPlot,Nothing}
|
||||||
end
|
end
|
||||||
const CURRENT_PLOT = CurrentPlot(nothing)
|
const CURRENT_PLOT = CurrentPlot(nothing)
|
||||||
|
|
||||||
@ -20,10 +20,44 @@ current(plot::AbstractPlot) = (CURRENT_PLOT.nullableplot = plot)
|
|||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
Base.string(plt::Plot) = "Plot{$(plt.backend) n=$(plt.n)}"
|
Base.string(plt::Plot) = "Plot{$(plt.backend) n=$(plt.n)}"
|
||||||
Base.print(io::IO, plt::Plot) = print(io, string(plt))
|
Base.print(io::IO, plt::Plot) = print(io, string(plt))
|
||||||
Base.show(io::IO, plt::Plot) = print(io, string(plt))
|
function Base.show(io::IO, plt::Plot)
|
||||||
|
print(io, string(plt))
|
||||||
|
sp_ekwargs = getindex.(plt.subplots, :extra_kwargs)
|
||||||
|
s_ekwargs = getindex.(plt.series_list, :extra_kwargs)
|
||||||
|
if (
|
||||||
|
isempty(plt[:extra_plot_kwargs]) &&
|
||||||
|
all(isempty, sp_ekwargs) &&
|
||||||
|
all(isempty, s_ekwargs)
|
||||||
|
)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
print(io, "\nCaptured extra kwargs:\n")
|
||||||
|
do_show = true
|
||||||
|
for (key, value) in plt[:extra_plot_kwargs]
|
||||||
|
do_show && println(io, " Plot:")
|
||||||
|
println(io, " "^4, key, ": ", value)
|
||||||
|
do_show = false
|
||||||
|
end
|
||||||
|
do_show = true
|
||||||
|
for (i, ekwargs) in enumerate(sp_ekwargs)
|
||||||
|
for (key, value) in ekwargs
|
||||||
|
do_show && println(io, " SubplotPlot{$i}:")
|
||||||
|
println(io, " "^4, key, ": ", value)
|
||||||
|
do_show = false
|
||||||
|
end
|
||||||
|
do_show = true
|
||||||
|
end
|
||||||
|
for (i, ekwargs) in enumerate(s_ekwargs)
|
||||||
|
for (key, value) in ekwargs
|
||||||
|
do_show && println(io, " Series{$i}:")
|
||||||
|
println(io, " "^4, key, ": ", value)
|
||||||
|
do_show = false
|
||||||
|
end
|
||||||
|
do_show = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
getplot(plt::Plot) = plt
|
getplot(plt::Plot) = plt
|
||||||
getattr(plt::Plot, idx::Int = 1) = plt.attr
|
getattr(plt::Plot, idx::Int = 1) = plt.attr
|
||||||
@ -31,7 +65,6 @@ convertSeriesIndex(plt::Plot, n::Int) = n
|
|||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
The main plot command. Use `plot` to create a new plot object, and `plot!` to add to an existing one:
|
The main plot command. Use `plot` to create a new plot object, and `plot!` to add to an existing one:
|
||||||
|
|
||||||
@ -42,11 +75,12 @@ The main plot command. Use `plot` to create a new plot object, and `plot!` to ad
|
|||||||
```
|
```
|
||||||
|
|
||||||
There are lots of ways to pass in data, and lots of keyword arguments... just try it and it will likely work as expected.
|
There are lots of ways to pass in data, and lots of keyword arguments... just try it and it will likely work as expected.
|
||||||
When you pass in matrices, it splits by columns. To see the list of available attributes, use the `plotattr([attr])`
|
When you pass in matrices, it splits by columns. To see the list of available attributes, use the `plotattr(attr)`
|
||||||
function, where `attr` is the symbol `:Series:`, `:Subplot:`, `:Plot` or `:Axis`. Pass any attribute to `plotattr`
|
function, where `attr` is the symbol `:Series`, `:Subplot`, `:Plot`, or `:Axis`. Pass any attribute to `plotattr`
|
||||||
as a String to look up its docstring; e.g. `plotattr("seriestype")`.
|
as a String to look up its docstring, e.g., `plotattr("seriestype")`.
|
||||||
"""
|
"""
|
||||||
function plot(args...; kw...)
|
function plot(args...; kw...)
|
||||||
|
@nospecialize
|
||||||
# this creates a new plot with args/kw and sets it to be the current plot
|
# this creates a new plot with args/kw and sets it to be the current plot
|
||||||
plotattributes = KW(kw)
|
plotattributes = KW(kw)
|
||||||
RecipesPipeline.preprocess_attributes!(plotattributes)
|
RecipesPipeline.preprocess_attributes!(plotattributes)
|
||||||
@ -58,17 +92,21 @@ function plot(args...; kw...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# build a new plot from existing plots
|
# build a new plot from existing plots
|
||||||
# note: we split into plt1 and plts_tail so we can dispatch correctly
|
# note: we split into plt1, plt2 and plts_tail so we can dispatch correctly
|
||||||
function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
plot(plt1::Plot, plt2::Plot, plts_tail::Plot...; kw...) =
|
||||||
|
plot!(deepcopy(plt1), deepcopy(plt2), deepcopy.(plts_tail)...; kw...)
|
||||||
|
function plot!(plt1::Plot, plt2::Plot, plts_tail::Plot...; kw...)
|
||||||
|
@nospecialize
|
||||||
plotattributes = KW(kw)
|
plotattributes = KW(kw)
|
||||||
RecipesPipeline.preprocess_attributes!(plotattributes)
|
RecipesPipeline.preprocess_attributes!(plotattributes)
|
||||||
|
|
||||||
# build our plot vector from the args
|
# build our plot vector from the args
|
||||||
n = length(plts_tail) + 1
|
n = length(plts_tail) + 2
|
||||||
plts = Array{Plot}(undef, n)
|
plts = Array{Plot}(undef, n)
|
||||||
plts[1] = plt1
|
plts[1] = plt1
|
||||||
for (i,plt) in enumerate(plts_tail)
|
plts[2] = plt2
|
||||||
plts[i+1] = plt
|
for (i, plt) in enumerate(plts_tail)
|
||||||
|
plts[i + 2] = plt
|
||||||
end
|
end
|
||||||
|
|
||||||
# compute the layout
|
# compute the layout
|
||||||
@ -95,9 +133,9 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
|||||||
plt.init = true
|
plt.init = true
|
||||||
|
|
||||||
series_attr = KW()
|
series_attr = KW()
|
||||||
for (k,v) in plotattributes
|
for (k, v) in plotattributes
|
||||||
if is_series_attr(k)
|
if is_series_attr(k)
|
||||||
series_attr[k] = pop!(plotattributes,k)
|
series_attr[k] = pop!(plotattributes, k)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -125,10 +163,11 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
|||||||
cmdidx += 1
|
cmdidx += 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
ttl_idx = _add_plot_title!(plt)
|
||||||
|
|
||||||
# first apply any args for the subplots
|
# first apply any args for the subplots
|
||||||
for (idx,sp) in enumerate(plt.subplots)
|
for (idx, sp) in enumerate(plt.subplots)
|
||||||
_update_subplot_args(plt, sp, plotattributes, idx, false)
|
_update_subplot_args(plt, sp, idx == ttl_idx ? KW() : plotattributes, idx, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
# finish up
|
# finish up
|
||||||
@ -137,10 +176,9 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
|||||||
plt
|
plt
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# this adds to the current plot, or creates a new plot if none are current
|
# this adds to the current plot, or creates a new plot if none are current
|
||||||
function plot!(args...; kw...)
|
function plot!(args...; kw...)
|
||||||
|
@nospecialize
|
||||||
local plt
|
local plt
|
||||||
try
|
try
|
||||||
plt = current()
|
plt = current()
|
||||||
@ -151,7 +189,9 @@ function plot!(args...; kw...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# this adds to a specific plot... most plot commands will flow through here
|
# this adds to a specific plot... most plot commands will flow through here
|
||||||
|
plot(plt::Plot, args...; kw...) = plot!(deepcopy(plt), args...; kw...)
|
||||||
function plot!(plt::Plot, args...; kw...)
|
function plot!(plt::Plot, args...; kw...)
|
||||||
|
@nospecialize
|
||||||
plotattributes = KW(kw)
|
plotattributes = KW(kw)
|
||||||
RecipesPipeline.preprocess_attributes!(plotattributes)
|
RecipesPipeline.preprocess_attributes!(plotattributes)
|
||||||
# merge!(plt.user_attr, plotattributes)
|
# merge!(plt.user_attr, plotattributes)
|
||||||
@ -164,20 +204,20 @@ end
|
|||||||
# a list of series KW dicts.
|
# a list of series KW dicts.
|
||||||
# note: at entry, we only have those preprocessed args which were passed in... no default values yet
|
# note: at entry, we only have those preprocessed args which were passed in... no default values yet
|
||||||
function _plot!(plt::Plot, plotattributes, args)
|
function _plot!(plt::Plot, plotattributes, args)
|
||||||
|
@nospecialize
|
||||||
RecipesPipeline.recipe_pipeline!(plt, plotattributes, args)
|
RecipesPipeline.recipe_pipeline!(plt, plotattributes, args)
|
||||||
current(plt)
|
current(plt)
|
||||||
_do_plot_show(plt, plt[:show])
|
_do_plot_show(plt, plt[:show])
|
||||||
return plt
|
return plt
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# we're getting ready to display/output. prep for layout calcs, then update
|
# we're getting ready to display/output. prep for layout calcs, then update
|
||||||
# the plot object after
|
# the plot object after
|
||||||
function prepare_output(plt::Plot)
|
function prepare_output(plt::Plot)
|
||||||
_before_layout_calcs(plt)
|
_before_layout_calcs(plt)
|
||||||
|
|
||||||
w, h = plt.attr[:size]
|
w, h = plt.attr[:size]
|
||||||
plt.layout.bbox = BoundingBox(0mm, 0mm, w*px, h*px)
|
plt.layout.bbox = BoundingBox(0mm, 0mm, w * px, h * px)
|
||||||
|
|
||||||
# One pass down and back up the tree to compute the minimum padding
|
# One pass down and back up the tree to compute the minimum padding
|
||||||
# of the children on the perimeter. This is an backend callback.
|
# of the children on the perimeter. This is an backend callback.
|
||||||
@ -186,6 +226,17 @@ function prepare_output(plt::Plot)
|
|||||||
_update_min_padding!(sp)
|
_update_min_padding!(sp)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# spedific to :plot_title see _add_plot_title!
|
||||||
|
force_minpad = get(plt, :force_minpad, ())
|
||||||
|
if !isempty(force_minpad)
|
||||||
|
for i in eachindex(plt.layout.grid)
|
||||||
|
plt.layout.grid[i].minpad = Tuple(
|
||||||
|
i === nothing ? j : i for
|
||||||
|
(i, j) in zip(force_minpad, plt.layout.grid[i].minpad)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# now another pass down, to update the bounding boxes
|
# now another pass down, to update the bounding boxes
|
||||||
update_child_bboxes!(plt.layout)
|
update_child_bboxes!(plt.layout)
|
||||||
|
|
||||||
@ -196,6 +247,12 @@ function prepare_output(plt::Plot)
|
|||||||
_update_plot_object(plt)
|
_update_plot_object(plt)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
backend_object(plot)
|
||||||
|
|
||||||
|
Returns the backend representation of a Plot object.
|
||||||
|
Returns `nothing` if the backend does not support this.
|
||||||
|
"""
|
||||||
function backend_object(plt::Plot)
|
function backend_object(plt::Plot)
|
||||||
prepare_output(plt)
|
prepare_output(plt)
|
||||||
plt.o
|
plt.o
|
||||||
@ -205,10 +262,12 @@ end
|
|||||||
# plot to a Subplot
|
# plot to a Subplot
|
||||||
|
|
||||||
function plot(sp::Subplot, args...; kw...)
|
function plot(sp::Subplot, args...; kw...)
|
||||||
|
@nospecialize
|
||||||
plt = sp.plt
|
plt = sp.plt
|
||||||
plot(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots))
|
plot(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots))
|
||||||
end
|
end
|
||||||
function plot!(sp::Subplot, args...; kw...)
|
function plot!(sp::Subplot, args...; kw...)
|
||||||
|
@nospecialize
|
||||||
plt = sp.plt
|
plt = sp.plt
|
||||||
plot!(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots))
|
plot!(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots))
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
|
|
||||||
const _attribute_defaults = Dict(:Series => _series_defaults,
|
const _attribute_defaults = Dict(
|
||||||
:Subplot => _subplot_defaults,
|
:Series => _series_defaults,
|
||||||
:Plot => _plot_defaults,
|
:Subplot => _subplot_defaults,
|
||||||
:Axis => _axis_defaults)
|
:Plot => _plot_defaults,
|
||||||
|
:Axis => _axis_defaults,
|
||||||
|
)
|
||||||
|
|
||||||
attrtypes() = join(keys(_attribute_defaults), ", ")
|
attrtypes() = join(keys(_attribute_defaults), ", ")
|
||||||
attributes(attrtype::Symbol) = sort(collect(keys(_attribute_defaults[attrtype])))
|
attributes(attrtype::Symbol) = sort(collect(keys(_attribute_defaults[attrtype])))
|
||||||
@ -21,7 +23,9 @@ Look up the properties of a Plots attribute, or specify an attribute type. Call
|
|||||||
The information is the same as that given on https://docs.juliaplots.org/latest/attributes/.
|
The information is the same as that given on https://docs.juliaplots.org/latest/attributes/.
|
||||||
"""
|
"""
|
||||||
function plotattr()
|
function plotattr()
|
||||||
println("Specify an attribute type to get a list of supported attributes. Options are $(attrtypes())")
|
println(
|
||||||
|
"Specify an attribute type to get a list of supported attributes. Options are $(attrtypes())",
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
function plotattr(attrtype::Symbol)
|
function plotattr(attrtype::Symbol)
|
||||||
@ -44,27 +48,32 @@ printnothing(x) = x
|
|||||||
printnothing(x::Nothing) = "nothing"
|
printnothing(x::Nothing) = "nothing"
|
||||||
|
|
||||||
function plotattr(attrtype::Symbol, attribute::AbstractString)
|
function plotattr(attrtype::Symbol, attribute::AbstractString)
|
||||||
in(attrtype, keys(_attribute_defaults)) || ArgumentError("`attrtype` must match one of $(attrtypes())")
|
in(attrtype, keys(_attribute_defaults)) ||
|
||||||
|
ArgumentError("`attrtype` must match one of $(attrtypes())")
|
||||||
|
|
||||||
attribute = Symbol(lookup_aliases(attrtype, attribute))
|
attribute = Symbol(lookup_aliases(attrtype, attribute))
|
||||||
|
|
||||||
desc = get(_arg_desc, attribute, "")
|
desc = get(_arg_desc, attribute, "")
|
||||||
first_period_idx = findfirst(isequal('.'), desc)
|
first_period_idx = findfirst(isequal('.'), desc)
|
||||||
if isnothing(first_period_idx)
|
if isnothing(first_period_idx)
|
||||||
typedesc = ""
|
typedesc = ""
|
||||||
desc = strip(desc)
|
desc = strip(desc)
|
||||||
else
|
else
|
||||||
typedesc = desc[1:first_period_idx-1]
|
typedesc = desc[1:(first_period_idx - 1)]
|
||||||
desc = strip(desc[first_period_idx+1:end])
|
desc = strip(desc[(first_period_idx + 1):end])
|
||||||
end
|
end
|
||||||
als = keys(filter(x->x[2]==attribute, _keyAliases)) |> collect |> sort
|
als = keys(filter(x -> x[2] == attribute, _keyAliases)) |> collect |> sort
|
||||||
als = join(map(string,als), ", ")
|
als = join(map(string, als), ", ")
|
||||||
def = _attribute_defaults[attrtype][attribute]
|
def = _attribute_defaults[attrtype][attribute]
|
||||||
|
|
||||||
|
|
||||||
# Looks up the different elements and plots them
|
# Looks up the different elements and plots them
|
||||||
println("$(printnothing(attribute)) ", typedesc == "" ? "" : "{$(printnothing(typedesc))}", "\n",
|
println(
|
||||||
|
"$(printnothing(attribute)) ",
|
||||||
|
typedesc == "" ? "" : "{$(printnothing(typedesc))}",
|
||||||
|
"\n",
|
||||||
als == "" ? "" : "$(printnothing(als))\n",
|
als == "" ? "" : "$(printnothing(als))\n",
|
||||||
"\n$(printnothing(desc))\n",
|
"\n$(printnothing(desc))\n",
|
||||||
"$(printnothing(attrtype)) attribute, ", def == "" ? "" : " default: $(printnothing(def))")
|
"$(printnothing(attrtype)) attribute, ",
|
||||||
|
def == "" ? "" : " default: $(printnothing(def))",
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,740 +0,0 @@
|
|||||||
function _precompile_()
|
|
||||||
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
|
|
||||||
isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr})
|
|
||||||
isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol})
|
|
||||||
isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64})
|
|
||||||
isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}})
|
|
||||||
isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:formatter,), Tuple{typeof(RecipesPipeline.datetimeformatter)}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:gridlinewidth, :grid, :gridalpha, :gridstyle, :foreground_color_grid), Tuple{Int64, Bool, Float64, Symbol, ColorTypes.RGBA{Float64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis})
|
|
||||||
isdefined(Plots, Symbol("#contour##kw")) && precompile(Tuple{getfield(Plots, Symbol("#contour##kw")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int})
|
|
||||||
isdefined(Plots, Symbol("#default##kw")) && precompile(Tuple{getfield(Plots, Symbol("#default##kw")), NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}}, typeof(Plots.default)})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.StepRange{Int64, Int64}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Base.UnitRange{Int64}})
|
|
||||||
isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font})
|
|
||||||
isdefined(Plots, Symbol("#heatmap##kw")) && precompile(Tuple{getfield(Plots, Symbol("#heatmap##kw")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int})
|
|
||||||
isdefined(Plots, Symbol("#histogram##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram##kw")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}})
|
|
||||||
isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#hline!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#hline!##kw")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}})
|
|
||||||
isdefined(Plots, Symbol("#lens!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#lens!##kw")), NamedTuple{(:inset,), Tuple{Tuple{Int64, Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}}}}, typeof(Plots.lens!), Array{Int64, 1}, Int})
|
|
||||||
isdefined(Plots, Symbol("#pie##kw")) && precompile(Tuple{getfield(Plots, Symbol("#pie##kw")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int})
|
|
||||||
isdefined(Plots, Symbol("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Float64, Float64, String})
|
|
||||||
isdefined(Plots, Symbol("#portfoliocomposition##kw")) && precompile(Tuple{getfield(Plots, Symbol("#portfoliocomposition##kw")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int})
|
|
||||||
isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int})
|
|
||||||
isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}})
|
|
||||||
isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int})
|
|
||||||
isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:marker_z, :color, :legend), Tuple{typeof(Base.:+), Symbol, Bool}}, typeof(Plots.scatter), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
isdefined(Plots, Symbol("#standalone_html##kw")) && precompile(Tuple{getfield(Plots, Symbol("#standalone_html##kw")), NamedTuple{(:title,), Tuple{String}}, typeof(Plots.standalone_html), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
isdefined(Plots, Symbol("#test_examples##kw")) && precompile(Tuple{getfield(Plots, Symbol("#test_examples##kw")), NamedTuple{(:skip,), Tuple{Array{Int64, 1}}}, typeof(Plots.test_examples), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.__init__)})
|
|
||||||
precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._backend_instance), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String})
|
|
||||||
precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String})
|
|
||||||
precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String})
|
|
||||||
precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String})
|
|
||||||
precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String})
|
|
||||||
precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Base.OneTo{Int64}, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Float64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Nothing, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Nothing, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Nothing, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Plots.Subplot{Plots.GRBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Plots.Subplot{Plots.PlotlyBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.PlotlyBackend}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._initialize_backend), Plots.PlotlyBackend})
|
|
||||||
precompile(Tuple{typeof(Plots._override_seriestype_check), RecipesPipeline.DefaultsDict, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._pick_default_backend)})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Dates.DateTime, 1}, Base.UnitRange{Int64}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Tuple{Int64, Real}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Dates.DateTime, 1}, Base.UnitRange{Int64}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Tuple{Int64, Real}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Tuple{}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._plotly_framestyle), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._plots_defaults)})
|
|
||||||
precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._preprocess_barlike), RecipesPipeline.DefaultsDict, Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._preprocess_barlike), RecipesPipeline.DefaultsDict, Array{Int64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._preprocess_barlike), RecipesPipeline.DefaultsDict, Base.OneTo{Int64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._preprocess_binlike), RecipesPipeline.DefaultsDict, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._replace_linewidth), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}})
|
|
||||||
precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._series_index), RecipesPipeline.DefaultsDict, Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._series_index), RecipesPipeline.DefaultsDict, Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._slice_series_args!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._slice_series_args!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._slice_series_args!), RecipesPipeline.DefaultsDict, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._slice_series_args!), RecipesPipeline.DefaultsDict, Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots._transform_ticks), Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots._transform_ticks), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, RecipesPipeline.DefaultsDict, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.PlotlyBackend}, Plots.Axis, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout})
|
|
||||||
precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots._update_series_attributes!), RecipesPipeline.DefaultsDict, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_series_attributes!), RecipesPipeline.DefaultsDict, Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, Base.Dict{Symbol, Any}, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.PlotlyBackend}, Array{Any, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.addExtension), String, String})
|
|
||||||
precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.aliasesAndAutopick), RecipesPipeline.DefaultsDict, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.allAlphas), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.allStyles), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.allStyles), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.arrow), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_drawing_info_3d), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.PlotlyBackend}, Symbol, Bool, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.PlotlyBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.backend), Plots.GRBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.backend), Plots.PlotlyBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.backend), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.backend)})
|
|
||||||
precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.PlotlyBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox), Float64, Float64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox), Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox_to_pcts), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.bbox_to_pcts), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.build_layout), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout})
|
|
||||||
precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout})
|
|
||||||
precompile(Tuple{typeof(Plots.color_or_nothing!), RecipesPipeline.DefaultsDict, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.concatenate_fillrange), Base.UnitRange{Int64}, Tuple{Array{Float64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.convertLegendValue), Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.convertLegendValue), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.convert_sci_unicode), String})
|
|
||||||
precompile(Tuple{typeof(Plots.convert_to_polar), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}, Tuple{Int64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.copy_series!), Plots.Series, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.create_grid), Expr})
|
|
||||||
precompile(Tuple{typeof(Plots.create_grid), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.create_grid_curly), Expr})
|
|
||||||
precompile(Tuple{typeof(Plots.create_grid_vcat), Expr})
|
|
||||||
precompile(Tuple{typeof(Plots.default), Symbol, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.default), Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.default), Symbol, String})
|
|
||||||
precompile(Tuple{typeof(Plots.default), Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.default), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing})
|
|
||||||
precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char})
|
|
||||||
precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String})
|
|
||||||
precompile(Tuple{typeof(Plots.ensure_gradient!), RecipesPipeline.DefaultsDict, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.error_coords), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.error_coords), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.error_style!), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.error_zipit), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, RecipesPipeline.Surface{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.extend_by_data!), Array{Float64, 1}, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.extend_series_data!), Plots.Series, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.fakedata), Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.fg_color), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.font), Int64, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.font), String, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.font), Symbol, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.frame), Plots.Animation})
|
|
||||||
precompile(Tuple{typeof(Plots.get_aspect_ratio), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_aspect_ratio), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.PlotlyBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_clims), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.PlotlyBackend}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_markerstrokewidth), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Int64, 1}, Array{String, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_axis_height), Plots.Subplot{Plots.GRBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_axis_width), Plots.Subplot{Plots.GRBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_color), ColorTypes.RGBA{Float64}, Type{ColorTypes.RGB{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64, Int64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Float64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Int64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Int64, Tuple{Float64, Float64}, Int64, Int64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Int64, Tuple{Float64, Float64}, Int64, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Int64, 1}, Array{String, 1}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_bordercolor), ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_transparency), Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_viewport_polar)})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_text_size), String, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_text_size), String})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_tick_label), Plots.Axis, String})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_w3tondc), Float64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_w3tondc), Int64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.guide_padding), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.guidefont), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap), Array{Dates.DateTime, 1}, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Base.UnitRange{Int64}, Symbol, Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Base.UnitRange{Int64}, Symbol, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.heatmap_edges), Base.UnitRange{Int64}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.intersection_point), Float64, Float64, Float64, Float64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.is_axis_attr), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_axis_attr_noletter), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_default_attribute), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.PlotlyBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke})
|
|
||||||
precompile(Tuple{typeof(Plots.is_marker_supported), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_scale_supported), Plots.PlotlyBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_series_attr), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.PlotlyBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_style_supported), Plots.PlotlyBackend, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_subplot_attr), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.is_uniformly_spaced), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iscontour), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.isijulia)})
|
|
||||||
precompile(Tuple{typeof(Plots.ispolar), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots.isvertical), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Base.OneTo{Int64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Base.OneTo{Int64}, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Base.StepRange{Int64, Int64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.iter_segments), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.PlotlyBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Int64, Plots.GridLayout})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Int64, Tuple{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout})
|
|
||||||
precompile(Tuple{typeof(Plots.layout_args), RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.left), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.left), Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.like_histogram), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.PlotlyBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText})
|
|
||||||
precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Base.LinRange{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.make_steps), Base.OneTo{Int64}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.parse_axis_kw), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.PlotlyBackend}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.PlotlyBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotarea), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotarea), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_annotation_dict), Float64, Float64, Plots.PlotText})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_apply_aspect_ratio), Plots.Subplot{Plots.PlotlyBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_axis), Plots.Plot{Plots.PlotlyBackend}, Plots.Axis, Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_colorbar_hack), Plots.Series, Base.Dict{Symbol, Any}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ColorGradient, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Array{String, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Array{String, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_data), Plots.Series, Symbol, RecipesPipeline.Surface{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_domain), Plots.Subplot{Plots.PlotlyBackend}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_font), Plots.Font, ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_font), Plots.Font})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_hover!), Base.Dict{Symbol, Any}, Array{Nothing, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_hover!), Base.Dict{Symbol, Any}, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_html_body), Plots.Plot{Plots.PlotlyBackend}, Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_html_head), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_layout), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_legend_pos), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_link_indicies), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Array{Float64, 2}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Array{String, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Base.OneTo{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Base.StepRange{Int64, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, Base.UnitRange{Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_native_data), Plots.Axis, RecipesPipeline.Surface{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_polar!), Base.Dict{Symbol, Any}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_polaraxis), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series), Plots.Plot{Plots.PlotlyBackend}, Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Int64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Base.OneTo{Int64}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Base.OneTo{Int64}, Base.UnitRange{Int64}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_segments), Plots.Series, Base.Dict{Symbol, Any}, Nothing, Nothing, Nothing, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_series_shapes), Plots.Plot{Plots.PlotlyBackend}, Plots.Series, Tuple{Float64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_surface_data), Plots.Series, RecipesPipeline.Surface{Array{Float64, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String})
|
|
||||||
precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processFontArg!), Base.Dict{Symbol, Any}, Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.processFontArg!), Base.Dict{Symbol, Any}, Symbol, String})
|
|
||||||
precompile(Tuple{typeof(Plots.processFontArg!), Base.Dict{Symbol, Any}, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processGridArg!), RecipesPipeline.DefaultsDict, Bool, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}})
|
|
||||||
precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke})
|
|
||||||
precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.processMinorGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font})
|
|
||||||
precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText})
|
|
||||||
precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.PlotlyBackend}, Int64, Float64, Plots.PlotText, Plots.Font})
|
|
||||||
precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.PlotlyBackend}, Int64, Float64, Plots.PlotText})
|
|
||||||
precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.replaceAlias!), RecipesPipeline.DefaultsDict, Symbol, Base.Dict{Symbol, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.replaceAliases!), RecipesPipeline.DefaultsDict, Base.Dict{Symbol, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.reset_axis_defaults_byletter!)})
|
|
||||||
precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.rowsize), Expr})
|
|
||||||
precompile(Tuple{typeof(Plots.rowsize), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations})
|
|
||||||
precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.series_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series})
|
|
||||||
precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.shrink_by), Float64, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, RecipesPipeline.DefaultsDict, Symbol, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg!), RecipesPipeline.DefaultsDict, RecipesPipeline.DefaultsDict, Symbol, Int64, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Array{Float64, 2}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), String, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Tuple{Float64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.slice_arg), typeof(identity), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.stroke), Int64, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_markers), Plots.PlotlyBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_markers)})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_styles), Plots.PlotlyBackend})
|
|
||||||
precompile(Tuple{typeof(Plots.supported_styles)})
|
|
||||||
precompile(Tuple{typeof(Plots.test_examples), Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.text), String, Plots.Font})
|
|
||||||
precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.text), String, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.text_size), Int64, Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.tick_padding), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.tickfont), Plots.Axis})
|
|
||||||
precompile(Tuple{typeof(Plots.title!), String})
|
|
||||||
precompile(Tuple{typeof(Plots.title_padding), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.top), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}})
|
|
||||||
precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout})
|
|
||||||
precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.PlotlyBackend}, Array{Measures.Length{:mm, Float64}, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported), Plots.GRBackend, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported), Plots.PlotlyBackend, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported_args), Plots.GRBackend, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported_args), Plots.PlotlyBackend, RecipesPipeline.DefaultsDict})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots.warn_on_unsupported_scales), Plots.PlotlyBackend, Base.Dict{Symbol, Any}})
|
|
||||||
precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Bool})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Nothing})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, String}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.wraptuple), Tuple{}})
|
|
||||||
precompile(Tuple{typeof(Plots.write_temp_html), Plots.Plot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.PlotlyBackend}, Symbol, Int})
|
|
||||||
precompile(Tuple{typeof(Plots.xlims), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.xy_mm_to_pcts), Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}})
|
|
||||||
precompile(Tuple{typeof(Plots.yaxis!), String, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.ylims), Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}})
|
|
||||||
precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.PlotlyBackend}})
|
|
||||||
end
|
|
||||||
40
src/precompile_includer.jl
Normal file
40
src/precompile_includer.jl
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#! format: off
|
||||||
|
should_precompile = true
|
||||||
|
|
||||||
|
|
||||||
|
# Don't edit the following! Instead change the script for `snoop_bot`.
|
||||||
|
ismultios = false
|
||||||
|
ismultiversion = true
|
||||||
|
# precompile_enclosure
|
||||||
|
@static if !should_precompile
|
||||||
|
# nothing
|
||||||
|
elseif !ismultios && !ismultiversion
|
||||||
|
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile/precompile_Plots.jl"))
|
||||||
|
include("../deps/SnoopCompile/precompile/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@static if v"1.6.0-DEV" <= VERSION <= v"1.6.9"
|
||||||
|
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.6/precompile_Plots.jl"))
|
||||||
|
include("../deps/SnoopCompile/precompile//1.6/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
elseif v"1.7.0-DEV" <= VERSION <= v"1.7.9"
|
||||||
|
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.7/precompile_Plots.jl"))
|
||||||
|
include("../deps/SnoopCompile/precompile//1.7/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
elseif v"1.8.0-DEV" <= VERSION <= v"1.8.9"
|
||||||
|
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.8/precompile_Plots.jl"))
|
||||||
|
include("../deps/SnoopCompile/precompile//1.8/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
elseif v"1.9.0-DEV" <= VERSION <= v"1.9.9"
|
||||||
|
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.9/precompile_Plots.jl"))
|
||||||
|
include("../deps/SnoopCompile/precompile//1.9/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
end
|
||||||
|
|
||||||
|
end # precompile_enclosure
|
||||||
633
src/recipes.jl
633
src/recipes.jl
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,5 @@
|
|||||||
|
@nospecialize
|
||||||
|
|
||||||
"""
|
"""
|
||||||
scatter(x,y)
|
scatter(x,y)
|
||||||
scatter!(x,y)
|
scatter!(x,y)
|
||||||
@ -55,6 +57,7 @@ Plot a histogram.
|
|||||||
# Example
|
# Example
|
||||||
```julia-repl
|
```julia-repl
|
||||||
julia> histogram([1,2,1,1,4,3,8],bins=0:8)
|
julia> histogram([1,2,1,1,4,3,8],bins=0:8)
|
||||||
|
julia> histogram([1,2,1,1,4,3,8],bins=0:8,weights=weights([4,7,3,9,12,2,6]))
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
@shorthands histogram
|
@shorthands histogram
|
||||||
@ -69,7 +72,7 @@ Make a histogram bar plot. See `histogram`.
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
stephist(x)
|
stephist(x)
|
||||||
stephist(x)
|
stephist!(x)
|
||||||
|
|
||||||
Make a histogram step plot (bin counts are represented using horizontal lines
|
Make a histogram step plot (bin counts are represented using horizontal lines
|
||||||
instead of bars). See `histogram`.
|
instead of bars). See `histogram`.
|
||||||
@ -238,7 +241,6 @@ julia> ohlc(y)
|
|||||||
"""
|
"""
|
||||||
@shorthands ohlc
|
@shorthands ohlc
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
contour(x,y,z)
|
contour(x,y,z)
|
||||||
contour!(x,y,z)
|
contour!(x,y,z)
|
||||||
@ -251,7 +253,7 @@ Draw contour lines of the `Surface` z.
|
|||||||
|
|
||||||
# Example
|
# Example
|
||||||
```julia-repl
|
```julia-repl
|
||||||
julia> x = y = range(-20, 20, length = 100)
|
julia> x = y = range(-20, stop = 20, length = 100)
|
||||||
julia> contour(x, y, (x, y) -> x^2 + y^2)
|
julia> contour(x, y, (x, y) -> x^2 + y^2)
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
@ -260,7 +262,6 @@ julia> contour(x, y, (x, y) -> x^2 + y^2)
|
|||||||
"An alias for `contour` with fill = true."
|
"An alias for `contour` with fill = true."
|
||||||
@shorthands contourf
|
@shorthands contourf
|
||||||
|
|
||||||
|
|
||||||
@shorthands contour3d
|
@shorthands contour3d
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -272,7 +273,7 @@ Draw a 3D surface plot.
|
|||||||
# Example
|
# Example
|
||||||
```julia-repl
|
```julia-repl
|
||||||
julia> using LinearAlgebra
|
julia> using LinearAlgebra
|
||||||
julia> x = y = range(-3, 3, length = 100)
|
julia> x = y = range(-3, stop = 3, length = 100)
|
||||||
julia> surface(x, y, (x, y) -> sinc(norm([x, y])))
|
julia> surface(x, y, (x, y) -> sinc(norm([x, y])))
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
@ -318,6 +319,27 @@ julia> scatter3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
|
|||||||
"""
|
"""
|
||||||
@shorthands scatter3d
|
@shorthands scatter3d
|
||||||
|
|
||||||
|
"""
|
||||||
|
mesh3d(x,y,z)
|
||||||
|
mesh3d(x,y,z; connections)
|
||||||
|
|
||||||
|
Plot a 3d mesh. On Plotly the triangles can be specified using the connections argument.
|
||||||
|
|
||||||
|
# Example
|
||||||
|
```Julia
|
||||||
|
x=[0, 1, 2, 0]
|
||||||
|
y=[0, 0, 1, 2]
|
||||||
|
z=[0, 2, 0, 1]
|
||||||
|
|
||||||
|
i=[0, 0, 0, 1]
|
||||||
|
j=[1, 2, 3, 2]
|
||||||
|
k=[2, 3, 1, 3]
|
||||||
|
|
||||||
|
plot(x,y,z,seriestype=:mesh3d;connections=(i,j,k))
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
@shorthands mesh3d
|
||||||
|
|
||||||
"""
|
"""
|
||||||
boxplot(x, y)
|
boxplot(x, y)
|
||||||
boxplot!(x, y)
|
boxplot!(x, y)
|
||||||
@ -326,10 +348,10 @@ Make a box and whisker plot.
|
|||||||
|
|
||||||
# Keyword arguments
|
# Keyword arguments
|
||||||
- `notch`: Bool. Notch the box plot? (false)
|
- `notch`: Bool. Notch the box plot? (false)
|
||||||
- `range`: Real. Values more than range*IQR below the first quartile
|
- `whisker_range`: Real. Whiskers extend `whisker_range`*IQR below the first quartile
|
||||||
or above the third quartile are shown as outliers (1.5)
|
and above the third quartile. Values outside this range are shown as outliers (1.5)
|
||||||
- `outliers`: Bool. Show outliers? (true)
|
- `outliers`: Bool. Show outliers? (true)
|
||||||
- `whisker_width`: Real or Symbol. Length of whiskers (:match)
|
- `whisker_width`: Real or Symbol. Length of whiskers; the options are `:match` to match the box width, `:half`, or a number to indicate the total length. (:half)
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
```julia-repl
|
```julia-repl
|
||||||
@ -381,46 +403,44 @@ julia> curves([1,2,3,4],[1,1,2,4])
|
|||||||
@shorthands curves
|
@shorthands curves
|
||||||
|
|
||||||
"Plot a pie diagram"
|
"Plot a pie diagram"
|
||||||
pie(args...; kw...) = plot(args...; kw..., seriestype = :pie, aspect_ratio = :equal, grid=false, xticks=nothing, yticks=nothing)
|
@shorthands pie
|
||||||
pie!(args...; kw...) = plot!(args...; kw..., seriestype = :pie, aspect_ratio = :equal, grid=false, xticks=nothing, yticks=nothing)
|
|
||||||
|
|
||||||
"Plot with seriestype :path3d"
|
"Plot with seriestype :path3d"
|
||||||
plot3d(args...; kw...) = plot(args...; kw..., seriestype = :path3d)
|
plot3d(args...; kw...) = plot(args...; kw..., seriestype = :path3d)
|
||||||
plot3d!(args...; kw...) = plot!(args...; kw..., seriestype = :path3d)
|
plot3d!(args...; kw...) = plot!(args...; kw..., seriestype = :path3d)
|
||||||
|
|
||||||
"Add title to an existing plot"
|
"Add title to an existing plot"
|
||||||
title!(s::AbstractString; kw...) = plot!(; title = s, kw...)
|
title!(s::AbstractString; kw...) = plot!(; title = s, kw...)
|
||||||
|
|
||||||
"Add xlabel to an existing plot"
|
"Add xlabel to an existing plot"
|
||||||
xlabel!(s::AbstractString; kw...) = plot!(; xlabel = s, kw...)
|
xlabel!(s::AbstractString; kw...) = plot!(; xlabel = s, kw...)
|
||||||
|
|
||||||
"Add ylabel to an existing plot"
|
"Add ylabel to an existing plot"
|
||||||
ylabel!(s::AbstractString; kw...) = plot!(; ylabel = s, kw...)
|
ylabel!(s::AbstractString; kw...) = plot!(; ylabel = s, kw...)
|
||||||
|
|
||||||
"Set xlims for an existing plot"
|
"Set xlims for an existing plot"
|
||||||
xlims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; xlims = lims, kw...)
|
xlims!(lims::Tuple; kw...) = plot!(; xlims = lims, kw...)
|
||||||
|
|
||||||
"Set ylims for an existing plot"
|
"Set ylims for an existing plot"
|
||||||
ylims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; ylims = lims, kw...)
|
ylims!(lims::Tuple; kw...) = plot!(; ylims = lims, kw...)
|
||||||
|
|
||||||
"Set zlims for an existing plot"
|
"Set zlims for an existing plot"
|
||||||
zlims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; zlims = lims, kw...)
|
zlims!(lims::Tuple; kw...) = plot!(; zlims = lims, kw...)
|
||||||
|
|
||||||
xlims!(xmin::Real, xmax::Real; kw...) = plot!(; xlims = (xmin,xmax), kw...)
|
|
||||||
ylims!(ymin::Real, ymax::Real; kw...) = plot!(; ylims = (ymin,ymax), kw...)
|
|
||||||
zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmin,zmax), kw...)
|
|
||||||
|
|
||||||
|
xlims!(xmin::Real, xmax::Real; kw...) = plot!(; xlims = (xmin, xmax), kw...)
|
||||||
|
ylims!(ymin::Real, ymax::Real; kw...) = plot!(; ylims = (ymin, ymax), kw...)
|
||||||
|
zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmin, zmax), kw...)
|
||||||
|
|
||||||
"Set xticks for an existing plot"
|
"Set xticks for an existing plot"
|
||||||
xticks!(v::TicksArgs; kw...) where {T<:Real} = plot!(; xticks = v, kw...)
|
xticks!(v::TicksArgs; kw...) = plot!(; xticks = v, kw...)
|
||||||
|
|
||||||
"Set yticks for an existing plot"
|
"Set yticks for an existing plot"
|
||||||
yticks!(v::TicksArgs; kw...) where {T<:Real} = plot!(; yticks = v, kw...)
|
yticks!(v::TicksArgs; kw...) = plot!(; yticks = v, kw...)
|
||||||
|
|
||||||
xticks!(
|
xticks!(ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} =
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; xticks = (ticks,labels), kw...)
|
plot!(; xticks = (ticks, labels), kw...)
|
||||||
yticks!(
|
yticks!(ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} =
|
||||||
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; yticks = (ticks,labels), kw...)
|
plot!(; yticks = (ticks, labels), kw...)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
annotate!(anns...)
|
annotate!(anns...)
|
||||||
@ -430,28 +450,55 @@ Add annotations to an existing plot.
|
|||||||
# Arguments
|
# Arguments
|
||||||
|
|
||||||
- `anns`: An `AbstractVector` of tuples of the form `(x,y,text)`. The `text` object
|
- `anns`: An `AbstractVector` of tuples of the form `(x,y,text)`. The `text` object
|
||||||
can be a `String` or `PlotText`.
|
can be a `String`, `PlotText` PlotText (created with `text(args...)`),
|
||||||
|
or a tuple of arguments to `text` (e.g., `("Label", 8, :red, :top)`).
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
```julia-repl
|
```julia-repl
|
||||||
julia> plot(1:10)
|
julia> plot(1:10)
|
||||||
julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))])
|
julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))])
|
||||||
|
julia> annotate!([(4, 4, ("More text", 8, 45.0, :bottom, :red))])
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
annotate!(anns...; kw...) = plot!(; annotation = anns, kw...)
|
annotate!(anns...; kw...) = plot!(; annotation = anns, kw...)
|
||||||
annotate!(anns::Tuple...; kw...) = plot!(; annotation = collect(anns), kw...)
|
annotate!(anns::Tuple...; kw...) = plot!(; annotation = collect(anns), kw...)
|
||||||
annotate!(anns::AVec{<:Tuple}; kw...) = plot!(; annotation = anns, kw...)
|
annotate!(anns::AVec{<:Tuple}; kw...) = plot!(; annotation = anns, kw...)
|
||||||
|
|
||||||
"Flip the current plots' x axis"
|
"Flip the current plots' x axis"
|
||||||
xflip!(flip::Bool = true; kw...) = plot!(; xflip = flip, kw...)
|
xflip!(flip::Bool = true; kw...) = plot!(; xflip = flip, kw...)
|
||||||
|
|
||||||
"Flip the current plots' y axis"
|
"Flip the current plots' y axis"
|
||||||
yflip!(flip::Bool = true; kw...) = plot!(; yflip = flip, kw...)
|
yflip!(flip::Bool = true; kw...) = plot!(; yflip = flip, kw...)
|
||||||
|
|
||||||
"Specify x axis attributes for an existing plot"
|
"Specify x axis attributes for an existing plot"
|
||||||
xaxis!(args...; kw...) = plot!(; xaxis = args, kw...)
|
xaxis!(args...; kw...) = plot!(; xaxis = args, kw...)
|
||||||
|
xgrid!(args...; kw...) = plot!(; xgrid = args, kw...)
|
||||||
|
|
||||||
"Specify y axis attributes for an existing plot"
|
"Specify y axis attributes for an existing plot"
|
||||||
yaxis!(args...; kw...) = plot!(; yaxis = args, kw...)
|
yaxis!(args...; kw...) = plot!(; yaxis = args, kw...)
|
||||||
xgrid!(args...; kw...) = plot!(; xgrid = args, kw...)
|
ygrid!(args...; kw...) = plot!(; ygrid = args, kw...)
|
||||||
ygrid!(args...; kw...) = plot!(; ygrid = args, kw...)
|
|
||||||
|
@doc """
|
||||||
|
abline!([plot,] a, b; kwargs...)
|
||||||
|
|
||||||
|
Adds ax+b... straight line over the current plot, without changing the axis limits
|
||||||
|
""" abline!
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
areaplot([x,] y)
|
||||||
|
areaplot!([x,] y)
|
||||||
|
|
||||||
|
Draw a stacked area plot of the matrix y.
|
||||||
|
# Examples
|
||||||
|
```julia-repl
|
||||||
|
julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], fillalpha = [0.2 0.3 0.4])
|
||||||
|
```
|
||||||
|
""" areaplot
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
lens!([plot,] x, y, inset = (sp_index, bbox(x1, x2, y1, y2)))
|
||||||
|
|
||||||
|
Magnify a region of a plot given by `x` and `y`.
|
||||||
|
`sp_index` is the index of the subplot and `x1`, `x2`, `y1` and `y2` should be between `0` and `1`.
|
||||||
|
""" lens!
|
||||||
|
@specialize
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
|
function Subplot(::T; parent = RootLayout()) where {T<:AbstractBackend}
|
||||||
function Subplot(::T; parent = RootLayout()) where T<:AbstractBackend
|
|
||||||
Subplot{T}(
|
Subplot{T}(
|
||||||
parent,
|
parent,
|
||||||
Series[],
|
Series[],
|
||||||
@ -9,7 +8,7 @@ function Subplot(::T; parent = RootLayout()) where T<:AbstractBackend
|
|||||||
defaultbox,
|
defaultbox,
|
||||||
DefaultsDict(KW(), _subplot_defaults),
|
DefaultsDict(KW(), _subplot_defaults),
|
||||||
nothing,
|
nothing,
|
||||||
nothing
|
nothing,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -21,8 +20,7 @@ Return the bounding box of a subplot
|
|||||||
plotarea(sp::Subplot) = sp.plotarea
|
plotarea(sp::Subplot) = sp.plotarea
|
||||||
plotarea!(sp::Subplot, bbox::BoundingBox) = (sp.plotarea = bbox)
|
plotarea!(sp::Subplot, bbox::BoundingBox) = (sp.plotarea = bbox)
|
||||||
|
|
||||||
|
Base.size(sp::Subplot) = (1, 1)
|
||||||
Base.size(sp::Subplot) = (1,1)
|
|
||||||
Base.length(sp::Subplot) = 1
|
Base.length(sp::Subplot) = 1
|
||||||
Base.getindex(sp::Subplot, r::Int, c::Int) = sp
|
Base.getindex(sp::Subplot, r::Int, c::Int) = sp
|
||||||
|
|
||||||
@ -42,12 +40,24 @@ get_subplot_index(plt::Plot, sp::Subplot) = findfirst(x -> x === sp, plt.subplot
|
|||||||
series_list(sp::Subplot) = sp.series_list # filter(series -> series.plotattributes[:subplot] === sp, sp.plt.series_list)
|
series_list(sp::Subplot) = sp.series_list # filter(series -> series.plotattributes[:subplot] === sp, sp.plt.series_list)
|
||||||
|
|
||||||
function should_add_to_legend(series::Series)
|
function should_add_to_legend(series::Series)
|
||||||
series.plotattributes[:primary] && series.plotattributes[:label] != "" &&
|
series.plotattributes[:primary] &&
|
||||||
!(series.plotattributes[:seriestype] in (
|
series.plotattributes[:label] != "" &&
|
||||||
:hexbin,:bins2d,:histogram2d,:hline,:vline,
|
!(
|
||||||
:contour,:contourf,:contour3d,:surface,:wireframe,
|
series.plotattributes[:seriestype] in (
|
||||||
:heatmap, :pie, :image
|
:hexbin,
|
||||||
))
|
:bins2d,
|
||||||
|
:histogram2d,
|
||||||
|
:hline,
|
||||||
|
:vline,
|
||||||
|
:contour,
|
||||||
|
:contourf,
|
||||||
|
:contour3d,
|
||||||
|
:surface,
|
||||||
|
:wireframe,
|
||||||
|
:heatmap,
|
||||||
|
:image,
|
||||||
|
)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|||||||
@ -14,25 +14,15 @@ function _theme(s::Symbol, defaults::AKW; kw...)
|
|||||||
|
|
||||||
# Set the theme's gradient as default
|
# Set the theme's gradient as default
|
||||||
if haskey(defaults, :colorgradient)
|
if haskey(defaults, :colorgradient)
|
||||||
PlotUtils.clibrary(:misc)
|
PlotUtils.default_cgrad(pop!(defaults, :colorgradient))
|
||||||
PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s))
|
|
||||||
pop!(defaults, :colorgradient)
|
|
||||||
else
|
else
|
||||||
PlotUtils.clibrary(:Plots)
|
PlotUtils.default_cgrad(:default)
|
||||||
PlotUtils.default_cgrad(default = :sequential, sequential = :inferno)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# maybe overwrite the theme's gradient
|
# maybe overwrite the theme's gradient
|
||||||
kw = KW(kw)
|
kw = KW(kw)
|
||||||
if haskey(kw, :colorgradient)
|
if haskey(kw, :colorgradient)
|
||||||
kwgrad = pop!(kw, :colorgradient)
|
PlotUtils.default_cgrad(pop!(kw, :colorgradient))
|
||||||
for clib in clibraries()
|
|
||||||
if kwgrad in cgradients(clib)
|
|
||||||
PlotUtils.clibrary(clib)
|
|
||||||
PlotUtils.default_cgrad(default = :sequential, sequential = kwgrad)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Set the theme's defaults
|
# Set the theme's defaults
|
||||||
@ -44,11 +34,8 @@ end
|
|||||||
|
|
||||||
@userplot ShowTheme
|
@userplot ShowTheme
|
||||||
|
|
||||||
_color_functions = KW(
|
_color_functions =
|
||||||
:protanopic => protanopic,
|
KW(:protanopic => protanopic, :deuteranopic => deuteranopic, :tritanopic => tritanopic)
|
||||||
:deuteranopic => deuteranopic,
|
|
||||||
:tritanopic => tritanopic,
|
|
||||||
)
|
|
||||||
_get_showtheme_args(thm::Symbol) = thm, identity
|
_get_showtheme_args(thm::Symbol) = thm, identity
|
||||||
_get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func, identity)
|
_get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func, identity)
|
||||||
|
|
||||||
@ -57,12 +44,12 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
defaults = PlotThemes._themes[thm].defaults
|
defaults = PlotThemes._themes[thm].defaults
|
||||||
|
|
||||||
# get the gradient
|
# get the gradient
|
||||||
gradient_colors = get(defaults, :colorgradient, cgrad(:inferno).colors)
|
gradient_colors = color_list(cgrad(get(defaults, :colorgradient, :default)))
|
||||||
colorgradient = cgrad(cfunc.(RGB.(gradient_colors)))
|
colorgradient = cgrad(cfunc.(RGB.(gradient_colors)))
|
||||||
|
|
||||||
# get the palette
|
# get the palette
|
||||||
palette = get(defaults, :palette, get_color_palette(:auto, plot_color(:white), 17))
|
cp = color_list(palette(get(defaults, :palette, :default)))
|
||||||
palette = cfunc.(RGB.(palette))
|
cp = cfunc.(RGB.(cp))
|
||||||
|
|
||||||
# apply the theme
|
# apply the theme
|
||||||
for k in keys(defaults)
|
for k in keys(defaults)
|
||||||
@ -89,7 +76,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
for j in 1:4
|
for j in 1:4
|
||||||
@series begin
|
@series begin
|
||||||
subplot := 1
|
subplot := 1
|
||||||
palette := palette
|
color_palette := cp
|
||||||
seriestype := :path
|
seriestype := :path
|
||||||
cumsum(randn(50))
|
cumsum(randn(50))
|
||||||
end
|
end
|
||||||
@ -97,7 +84,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
@series begin
|
@series begin
|
||||||
subplot := 2
|
subplot := 2
|
||||||
seriestype := :scatter
|
seriestype := :scatter
|
||||||
palette := palette
|
color_palette := cp
|
||||||
marker := (:circle, :diamond, :star5, :square)[j]
|
marker := (:circle, :diamond, :star5, :square)[j]
|
||||||
randn(10), randn(10)
|
randn(10), randn(10)
|
||||||
end
|
end
|
||||||
@ -106,7 +93,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
@series begin
|
@series begin
|
||||||
subplot := 3
|
subplot := 3
|
||||||
seriestype := :histogram
|
seriestype := :histogram
|
||||||
palette := palette
|
color_palette := cp
|
||||||
randn(1000) .+ (0:2:4)'
|
randn(1000) .+ (0:2:4)'
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -120,8 +107,8 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
subplot := 4
|
subplot := 4
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
seriescolor := colorgradient
|
seriescolor := colorgradient
|
||||||
xticks := (-2π:2π:2π, string.(-2:2:2, "π"))
|
xticks := ((-2π):(2π):(2π), string.(-2:2:2, "π"))
|
||||||
yticks := (-2π:2π:2π, string.(-2:2:2, "π"))
|
yticks := ((-2π):(2π):(2π), string.(-2:2:2, "π"))
|
||||||
x, y, z
|
x, y, z
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -129,8 +116,8 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
subplot := 5
|
subplot := 5
|
||||||
seriestype := :surface
|
seriestype := :surface
|
||||||
seriescolor := colorgradient
|
seriescolor := colorgradient
|
||||||
xticks := (-2π:2π:2π, string.(-2:2:2, "π"))
|
xticks := ((-2π):(2π):(2π), string.(-2:2:2, "π"))
|
||||||
yticks := (-2π:2π:2π, string.(-2:2:2, "π"))
|
yticks := ((-2π):(2π):(2π), string.(-2:2:2, "π"))
|
||||||
x, y, z
|
x, y, z
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -147,5 +134,4 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
|
|||||||
line_z := z
|
line_z := z
|
||||||
x, y, z
|
x, y, z
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
23
src/types.jl
23
src/types.jl
@ -6,7 +6,8 @@ const AVec = AbstractVector
|
|||||||
const AMat = AbstractMatrix
|
const AMat = AbstractMatrix
|
||||||
const KW = Dict{Symbol,Any}
|
const KW = Dict{Symbol,Any}
|
||||||
const AKW = AbstractDict{Symbol,Any}
|
const AKW = AbstractDict{Symbol,Any}
|
||||||
const TicksArgs = Union{AVec{T}, Tuple{AVec{T}, AVec{S}}, Symbol} where {T<:Real, S<:AbstractString}
|
const TicksArgs =
|
||||||
|
Union{AVec{T},Tuple{AVec{T},AVec{S}},Symbol} where {T<:Real,S<:AbstractString}
|
||||||
|
|
||||||
struct PlotsDisplay <: AbstractDisplay end
|
struct PlotsDisplay <: AbstractDisplay end
|
||||||
|
|
||||||
@ -59,11 +60,10 @@ Extrema() = Extrema(Inf, -Inf)
|
|||||||
|
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
|
|
||||||
const SubplotMap = Dict{Any, Subplot}
|
const SubplotMap = Dict{Any,Subplot}
|
||||||
|
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T}
|
mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T}
|
||||||
backend::T # the backend type
|
backend::T # the backend type
|
||||||
n::Int # number of series
|
n::Int # number of series
|
||||||
@ -78,9 +78,18 @@ mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T}
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Plot()
|
function Plot()
|
||||||
Plot(backend(), 0, DefaultsDict(KW(), _plot_defaults), Series[], nothing,
|
Plot(
|
||||||
Subplot[], SubplotMap(), EmptyLayout(),
|
backend(),
|
||||||
Subplot[], false)
|
0,
|
||||||
|
DefaultsDict(KW(), _plot_defaults),
|
||||||
|
Series[],
|
||||||
|
nothing,
|
||||||
|
Subplot[],
|
||||||
|
SubplotMap(),
|
||||||
|
EmptyLayout(),
|
||||||
|
Subplot[],
|
||||||
|
false,
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
@ -89,7 +98,7 @@ Base.getindex(plt::Plot, i::Integer) = plt.subplots[i]
|
|||||||
Base.length(plt::Plot) = length(plt.subplots)
|
Base.length(plt::Plot) = length(plt.subplots)
|
||||||
Base.lastindex(plt::Plot) = length(plt)
|
Base.lastindex(plt::Plot) = length(plt)
|
||||||
|
|
||||||
Base.getindex(plt::Plot, r::Integer, c::Integer) = plt.layout[r,c]
|
Base.getindex(plt::Plot, r::Integer, c::Integer) = plt.layout[r, c]
|
||||||
Base.size(plt::Plot) = size(plt.layout)
|
Base.size(plt::Plot) = size(plt.layout)
|
||||||
Base.size(plt::Plot, i::Integer) = size(plt.layout)[i]
|
Base.size(plt::Plot, i::Integer) = size(plt.layout)[i]
|
||||||
Base.ndims(plt::Plot) = 2
|
Base.ndims(plt::Plot) = 2
|
||||||
|
|||||||
863
src/utils.jl
863
src/utils.jl
File diff suppressed because it is too large
Load Diff
@ -1,43 +1,71 @@
|
|||||||
import Plots._current_plots_version
|
import Plots._current_plots_version
|
||||||
|
|
||||||
function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = !is_ci(), sigma = [1,1], tol = 1e-2)
|
# replace `f(args...)` with `f(rng, args...)` for `f ∈ (rand, randn)`
|
||||||
|
function replace_rand!(ex) end
|
||||||
|
function replace_rand!(ex::Expr)
|
||||||
|
for arg in ex.args
|
||||||
|
replace_rand!(arg)
|
||||||
|
end
|
||||||
|
if ex.head === :call && ex.args[1] ∈ (:rand, :randn, :(Plots.fakedata))
|
||||||
|
pushfirst!(ex.args, ex.args[1])
|
||||||
|
ex.args[2] = :rng
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function fix_rand!(ex)
|
||||||
|
replace_rand!(ex)
|
||||||
|
end
|
||||||
|
|
||||||
|
function image_comparison_tests(
|
||||||
|
pkg::Symbol,
|
||||||
|
idx::Int;
|
||||||
|
debug = false,
|
||||||
|
popup = !is_ci(),
|
||||||
|
sigma = [1, 1],
|
||||||
|
tol = 1e-2,
|
||||||
|
)
|
||||||
Plots._debugMode.on = debug
|
Plots._debugMode.on = debug
|
||||||
example = Plots._examples[idx]
|
example = Plots._examples[idx]
|
||||||
Plots.theme(:default)
|
Plots.theme(:default)
|
||||||
@info("Testing plot: $pkg:$idx:$(example.header)")
|
@info("Testing plot: $pkg:$idx:$(example.header)")
|
||||||
backend(pkg)
|
backend(pkg)
|
||||||
backend()
|
backend()
|
||||||
default(size=(500,300))
|
default(size = (500, 300))
|
||||||
# ensure consistent results
|
|
||||||
Random.seed!(1234)
|
|
||||||
|
|
||||||
fn = "ref$idx.png"
|
fn = "ref$idx.png"
|
||||||
reffn = reference_file(pkg, idx, _current_plots_version)
|
reffn = reference_file(pkg, idx, _current_plots_version)
|
||||||
newfn = joinpath(reference_path(pkg, _current_plots_version), fn)
|
newfn = joinpath(reference_path(pkg, _current_plots_version), fn)
|
||||||
|
@debug example.exprs
|
||||||
|
|
||||||
# test function
|
# test function
|
||||||
func = (fn, idx) -> begin
|
func = (fn, idx) -> begin
|
||||||
expr = Expr(:block)
|
eval(:(rng = StableRNG(PLOTS_SEED)))
|
||||||
append!(expr.args, example.exprs)
|
for the_expr in example.exprs
|
||||||
eval(expr)
|
expr = Expr(:block)
|
||||||
|
push!(expr.args, the_expr)
|
||||||
|
fix_rand!(expr)
|
||||||
|
eval(expr)
|
||||||
|
end
|
||||||
png(fn)
|
png(fn)
|
||||||
end
|
end
|
||||||
|
|
||||||
# the test
|
# the test
|
||||||
vtest = VisualTest(func, reffn, idx)
|
vtest = VisualTest(func, reffn, idx)
|
||||||
test_images(vtest, popup=popup, sigma=sigma, tol=tol, newfn = newfn)
|
test_images(vtest, popup = popup, sigma = sigma, tol = tol, newfn = newfn)
|
||||||
end
|
end
|
||||||
|
|
||||||
function image_comparison_facts(pkg::Symbol;
|
function image_comparison_facts(
|
||||||
skip = [], # skip these examples (int index)
|
pkg::Symbol;
|
||||||
only = nothing, # limit to these examples (int index)
|
skip = [], # skip these examples (int index)
|
||||||
debug = false, # print debug information?
|
only = nothing, # limit to these examples (int index)
|
||||||
sigma = [1,1], # number of pixels to "blur"
|
debug = false, # print debug information?
|
||||||
tol = 1e-2) # acceptable error (percent)
|
sigma = [1, 1], # number of pixels to "blur"
|
||||||
for i in 1:length(Plots._examples)
|
tol = 1e-2,
|
||||||
i in skip && continue
|
) # acceptable error (percent)
|
||||||
if only === nothing || i in only
|
for i in 1:length(Plots._examples)
|
||||||
@test image_comparison_tests(pkg, i, debug=debug, sigma=sigma, tol=tol) |> success == true
|
i in skip && continue
|
||||||
|
if only === nothing || i in only
|
||||||
|
@test image_comparison_tests(pkg, i, debug = debug, sigma = sigma, tol = tol) |>
|
||||||
|
success == true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
60
test/integration_dates.jl
Normal file
60
test/integration_dates.jl
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using Plots, Test, Dates
|
||||||
|
|
||||||
|
@testset "Limits" begin
|
||||||
|
y = [1.0 * i * i for i in 1:10]
|
||||||
|
x = [Date(2019, 11, i) for i in 1:10]
|
||||||
|
|
||||||
|
rx = [x[3], x[5]]
|
||||||
|
|
||||||
|
p = plot(x, y, widen = false)
|
||||||
|
vspan!(p, rx, label = "", alpha = 0.2)
|
||||||
|
|
||||||
|
ref_ylims = (y[1], y[end])
|
||||||
|
ref_xlims = (x[1].instant.periods.value, x[end].instant.periods.value)
|
||||||
|
@test Plots.ylims(p) == ref_ylims
|
||||||
|
@test Plots.xlims(p) == ref_xlims
|
||||||
|
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
|
||||||
|
@static if haskey(ENV, "APPVEYOR")
|
||||||
|
@info "Skipping display tests on AppVeyor"
|
||||||
|
else
|
||||||
|
@test isa(display(p), Nothing) == true
|
||||||
|
closeall()
|
||||||
|
end
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "Date xlims" begin
|
||||||
|
y = [1.0 * i * i for i in 1:10]
|
||||||
|
x = [Date(2019, 11, i) for i in 1:10]
|
||||||
|
span = (Date(2019, 10, 31), Date(2019, 11, 11))
|
||||||
|
|
||||||
|
ref_xlims = map(date -> date.instant.periods.value, span)
|
||||||
|
|
||||||
|
p = plot(x, y, xlims = span, widen = false)
|
||||||
|
|
||||||
|
@test Plots.xlims(p) == ref_xlims
|
||||||
|
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
|
||||||
|
@static if haskey(ENV, "APPVEYOR")
|
||||||
|
@info "Skipping display tests on AppVeyor"
|
||||||
|
else
|
||||||
|
@test isa(display(p), Nothing) == true
|
||||||
|
closeall()
|
||||||
|
end
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "DateTime xlims" begin
|
||||||
|
y = [1.0 * i * i for i in 1:10]
|
||||||
|
x = [DateTime(2019, 11, i, 11) for i in 1:10]
|
||||||
|
span = (DateTime(2019, 10, 31, 11, 59, 59), DateTime(2019, 11, 11, 12, 01, 15))
|
||||||
|
|
||||||
|
ref_xlims = map(date -> date.instant.periods.value, span)
|
||||||
|
|
||||||
|
p = plot(x, y, xlims = span, widen = false)
|
||||||
|
@test Plots.xlims(p) == ref_xlims
|
||||||
|
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
|
||||||
|
@static if haskey(ENV, "APPVEYOR")
|
||||||
|
@info "Skipping display tests on AppVeyor"
|
||||||
|
else
|
||||||
|
@test isa(display(p), Nothing) == true
|
||||||
|
closeall()
|
||||||
|
end
|
||||||
|
end # testset
|
||||||
557
test/runtests.jl
557
test/runtests.jl
@ -1,24 +1,341 @@
|
|||||||
import ImageMagick
|
using Plots: guidefont, series_annotations, PLOTS_SEED
|
||||||
|
|
||||||
using VisualRegressionTests
|
using VisualRegressionTests
|
||||||
using Plots
|
using RecipesBase
|
||||||
using Random
|
using StableRNGs
|
||||||
using Test
|
using TestImages
|
||||||
using FileIO
|
|
||||||
using Gtk
|
|
||||||
using LibGit2
|
using LibGit2
|
||||||
using GeometryTypes
|
using Random
|
||||||
|
using FileIO
|
||||||
|
using Plots
|
||||||
using Dates
|
using Dates
|
||||||
|
using JSON
|
||||||
|
using Test
|
||||||
|
using Gtk
|
||||||
|
|
||||||
include("test_hdf5plots.jl")
|
import GeometryBasics
|
||||||
include("test_pgfplotsx.jl")
|
import ImageMagick
|
||||||
|
|
||||||
reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
|
@testset "Infrastructure" begin
|
||||||
|
@test_nowarn JSON.Parser.parse(
|
||||||
|
String(read(joinpath(dirname(pathof(Plots)), "..", ".zenodo.json"))),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Plotly standalone" begin
|
||||||
|
@test_nowarn Plots._init_ijulia_plotting()
|
||||||
|
@test Plots.plotly_local_file_path[] === nothing
|
||||||
|
temp = Plots.use_local_dependencies[]
|
||||||
|
withenv("PLOTS_HOST_DEPENDENCY_LOCAL" => true) do
|
||||||
|
Plots.__init__()
|
||||||
|
@test Plots.plotly_local_file_path[] isa String
|
||||||
|
@test isfile(Plots.plotly_local_file_path[])
|
||||||
|
@test Plots.use_local_dependencies[] = true
|
||||||
|
@test_nowarn Plots._init_ijulia_plotting()
|
||||||
|
end
|
||||||
|
Plots.plotly_local_file_path[] = nothing
|
||||||
|
Plots.use_local_dependencies[] = temp
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Utils" begin
|
||||||
|
zipped = (
|
||||||
|
[(1, 2)],
|
||||||
|
[("a", "b")],
|
||||||
|
[(1, "a"), (2, "b")],
|
||||||
|
[(1, 2), (3, 4)],
|
||||||
|
[(1, 2, 3), (3, 4, 5)],
|
||||||
|
[(1, 2, 3, 4), (3, 4, 5, 6)],
|
||||||
|
[(1, 2.0), (missing, missing)],
|
||||||
|
[(1, missing), (missing, "a")],
|
||||||
|
[(missing, missing)],
|
||||||
|
[(missing, missing, missing), ("a", "b", "c")],
|
||||||
|
)
|
||||||
|
for z in zipped
|
||||||
|
@test isequal(collect(zip(Plots.RecipesPipeline.unzip(z)...)), z)
|
||||||
|
@test isequal(
|
||||||
|
collect(zip(Plots.RecipesPipeline.unzip(GeometryBasics.Point.(z))...)),
|
||||||
|
z,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
op1 = Plots.process_clims((1.0, 2.0))
|
||||||
|
op2 = Plots.process_clims((1, 2.0))
|
||||||
|
data = randn(100, 100)
|
||||||
|
@test op1(data) == op2(data)
|
||||||
|
@test Plots.process_clims(nothing) ==
|
||||||
|
Plots.process_clims(missing) ==
|
||||||
|
Plots.process_clims(:auto)
|
||||||
|
|
||||||
|
@test (==)(
|
||||||
|
Plots.texmath2unicode(
|
||||||
|
raw"Equation $y = \alpha \cdot x + \beta$ and eqn $y = \sin(x)^2$",
|
||||||
|
),
|
||||||
|
raw"Equation y = α ⋅ x + β and eqn y = sin(x)²",
|
||||||
|
)
|
||||||
|
|
||||||
|
@test Plots.isvector([1, 2])
|
||||||
|
@test !Plots.isvector(nothing)
|
||||||
|
@test Plots.ismatrix([1 2; 3 4])
|
||||||
|
@test !Plots.ismatrix(nothing)
|
||||||
|
@test Plots.isscalar(1.0)
|
||||||
|
@test !Plots.isscalar(nothing)
|
||||||
|
@test Plots.tovec([]) isa AbstractVector
|
||||||
|
@test Plots.tovec(nothing) isa AbstractVector
|
||||||
|
@test Plots.anynan(1, 3, (1, NaN, 3))
|
||||||
|
@test Plots.allnan(1, 2, (NaN, NaN, 1))
|
||||||
|
@test Plots.makevec([]) isa AbstractVector
|
||||||
|
@test Plots.makevec(1) isa AbstractVector
|
||||||
|
@test Plots.maketuple(1) == (1, 1)
|
||||||
|
@test Plots.maketuple((1, 1)) == (1, 1)
|
||||||
|
@test Plots.ok(1, 2)
|
||||||
|
@test !Plots.ok(1, 2, NaN)
|
||||||
|
@test Plots.ok((1, 2, 3))
|
||||||
|
@test !Plots.ok((1, 2, NaN))
|
||||||
|
@test Plots.nansplit([1, 2, NaN, 3, 4]) == [[1.0, 2.0], [3.0, 4.0]]
|
||||||
|
@test Plots.nanvcat([1, NaN]) |> length == 4
|
||||||
|
|
||||||
|
@test Plots.nop() === nothing
|
||||||
|
@test_throws ErrorException Plots.notimpl()
|
||||||
|
|
||||||
|
@test Plots.inch2px(1) isa AbstractFloat
|
||||||
|
@test Plots.px2inch(1) isa AbstractFloat
|
||||||
|
@test Plots.inch2mm(1) isa AbstractFloat
|
||||||
|
@test Plots.mm2inch(1) isa AbstractFloat
|
||||||
|
@test Plots.px2mm(1) isa AbstractFloat
|
||||||
|
@test Plots.mm2px(1) isa AbstractFloat
|
||||||
|
|
||||||
|
p = plot()
|
||||||
|
@test xlims() isa Tuple
|
||||||
|
@test ylims() isa Tuple
|
||||||
|
@test zlims() isa Tuple
|
||||||
|
|
||||||
|
Plots.makekw(foo = 1, bar = 2) isa Dict
|
||||||
|
|
||||||
|
@test_throws ErrorException Plots.inline()
|
||||||
|
@test_throws ErrorException Plots._do_plot_show(plot(), :inline)
|
||||||
|
@test_throws ErrorException Plots.dumpcallstack()
|
||||||
|
|
||||||
|
Plots.debugplots(true)
|
||||||
|
Plots.debugplots(false)
|
||||||
|
Plots.debugshow(devnull, nothing)
|
||||||
|
Plots.debugshow(devnull, [1])
|
||||||
|
|
||||||
|
p = plot(1)
|
||||||
|
push!(p, 1.5)
|
||||||
|
push!(p, 1, 1.5)
|
||||||
|
# append!(p, [1., 2.])
|
||||||
|
append!(p, 1, 2.5, 2.5)
|
||||||
|
push!(p, (1.5, 2.5))
|
||||||
|
push!(p, 1, (1.5, 2.5))
|
||||||
|
append!(p, (1.5, 2.5))
|
||||||
|
append!(p, 1, (1.5, 2.5))
|
||||||
|
|
||||||
|
p = plot([1, 2, 3], [4, 5, 6])
|
||||||
|
@test Plots.xmin(p) == 1
|
||||||
|
@test Plots.xmax(p) == 3
|
||||||
|
@test Plots.ignorenan_extrema(p) == (1, 3)
|
||||||
|
|
||||||
|
@test Plots.get_attr_symbol(:x, "lims") == :xlims
|
||||||
|
@test Plots.get_attr_symbol(:x, :lims) == :xlims
|
||||||
|
|
||||||
|
@testset "NaN-separated Segments" begin
|
||||||
|
segments(args...) = collect(iter_segments(args...))
|
||||||
|
|
||||||
|
nan10 = fill(NaN, 10)
|
||||||
|
@test segments(11:20) == [1:10]
|
||||||
|
@test segments([NaN]) == []
|
||||||
|
@test segments(nan10) == []
|
||||||
|
@test segments([nan10; 1:5]) == [11:15]
|
||||||
|
@test segments([1:5; nan10]) == [1:5]
|
||||||
|
@test segments([nan10; 1:5; nan10; 1:5; nan10]) == [11:15, 26:30]
|
||||||
|
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
|
||||||
|
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Axes" begin
|
||||||
|
p = plot()
|
||||||
|
axis = p.subplots[1][:xaxis]
|
||||||
|
@test typeof(axis) == Plots.Axis
|
||||||
|
@test Plots.discrete_value!(axis, "HI") == (0.5, 1)
|
||||||
|
@test Plots.discrete_value!(axis, :yo) == (1.5, 2)
|
||||||
|
@test Plots.ignorenan_extrema(axis) == (0.5, 1.5)
|
||||||
|
@test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1)
|
||||||
|
|
||||||
|
Plots.discrete_value!(axis, ["x$i" for i in 1:5])
|
||||||
|
Plots.discrete_value!(axis, ["x$i" for i in 0:2])
|
||||||
|
@test Plots.ignorenan_extrema(axis) == (0.5, 7.5)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "NoFail" begin
|
||||||
|
# ensure backend with tested display
|
||||||
|
@test unicodeplots() == Plots.UnicodePlotsBackend()
|
||||||
|
@test backend() == Plots.UnicodePlotsBackend()
|
||||||
|
|
||||||
|
dsp = TextDisplay(IOContext(IOBuffer(), :color => true))
|
||||||
|
|
||||||
|
@testset "plot" begin
|
||||||
|
for plt in [
|
||||||
|
histogram([1, 0, 0, 0, 0, 0]),
|
||||||
|
plot([missing]),
|
||||||
|
plot([missing, missing]),
|
||||||
|
plot(fill(missing, 10)),
|
||||||
|
plot([missing; 1:4]),
|
||||||
|
plot([fill(missing, 10); 1:4]),
|
||||||
|
plot([1 1; 1 missing]),
|
||||||
|
plot(["a" "b"; missing "d"], [1 2; 3 4]),
|
||||||
|
]
|
||||||
|
display(dsp, plt)
|
||||||
|
end
|
||||||
|
@test_nowarn plot(x -> x^2, 0, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "bar" begin
|
||||||
|
p = bar([3, 2, 1], [1, 2, 3])
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test display(dsp, p) isa Nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "gui" begin
|
||||||
|
open(tempname(), "w") do io
|
||||||
|
redirect_stdout(io) do
|
||||||
|
gui(plot())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Coverage" begin
|
||||||
|
@testset "themes" begin
|
||||||
|
p = showtheme(:dark)
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "plotattr" begin
|
||||||
|
tmp = tempname()
|
||||||
|
open(tmp, "w") do io
|
||||||
|
redirect_stdout(io) do
|
||||||
|
plotattr("seriestype")
|
||||||
|
plotattr(:Plot)
|
||||||
|
plotattr()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
str = join(readlines(tmp), "")
|
||||||
|
@test occursin("seriestype", str)
|
||||||
|
@test occursin("Plot attributes", str)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "legend" begin
|
||||||
|
@test isa(
|
||||||
|
Plots.legend_pos_from_angle(20, 0.0, 0.5, 1.0, 0.0, 0.5, 1.0),
|
||||||
|
NTuple{2,<:AbstractFloat},
|
||||||
|
)
|
||||||
|
@test Plots.legend_anchor_index(-1) == 1
|
||||||
|
@test Plots.legend_anchor_index(+0) == 2
|
||||||
|
@test Plots.legend_anchor_index(+1) == 3
|
||||||
|
|
||||||
|
@test Plots.legend_angle(:foo_bar) == (45, :inner)
|
||||||
|
@test Plots.legend_angle(20.0) ==
|
||||||
|
Plots.legend_angle((20.0, :inner)) ==
|
||||||
|
(20.0, :inner)
|
||||||
|
@test Plots.legend_angle((20.0, 10.0)) == (20.0, 10.0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Output" begin
|
||||||
|
@test Plots.defaultOutputFormat(plot()) == "png"
|
||||||
|
@test Plots.addExtension("foo", "bar") == "foo.bar"
|
||||||
|
|
||||||
|
fn = tempname()
|
||||||
|
gr()
|
||||||
|
let p = plot()
|
||||||
|
Plots.png(p, fn)
|
||||||
|
Plots.png(fn)
|
||||||
|
savefig(p, "$fn.png")
|
||||||
|
savefig("$fn.png")
|
||||||
|
|
||||||
|
Plots.pdf(p, fn)
|
||||||
|
Plots.pdf(fn)
|
||||||
|
savefig(p, "$fn.pdf")
|
||||||
|
savefig("$fn.pdf")
|
||||||
|
|
||||||
|
Plots.ps(p, fn)
|
||||||
|
Plots.ps(fn)
|
||||||
|
savefig(p, "$fn.ps")
|
||||||
|
savefig("$fn.ps")
|
||||||
|
|
||||||
|
Plots.svg(p, fn)
|
||||||
|
Plots.svg(fn)
|
||||||
|
savefig(p, "$fn.svg")
|
||||||
|
savefig("$fn.svg")
|
||||||
|
end
|
||||||
|
|
||||||
|
if Sys.islinux()
|
||||||
|
pgfplotsx()
|
||||||
|
let p = plot()
|
||||||
|
Plots.tex(p, fn)
|
||||||
|
Plots.tex(fn)
|
||||||
|
savefig(p, "$fn.tex")
|
||||||
|
savefig("$fn.tex")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unicodeplots()
|
||||||
|
let p = plot()
|
||||||
|
Plots.txt(p, fn)
|
||||||
|
Plots.txt(fn)
|
||||||
|
savefig(p, "$fn.txt")
|
||||||
|
savefig("$fn.txt")
|
||||||
|
end
|
||||||
|
|
||||||
|
plotlyjs()
|
||||||
|
let p = plot()
|
||||||
|
Plots.html(p, fn)
|
||||||
|
Plots.html(fn)
|
||||||
|
savefig(p, "$fn.html")
|
||||||
|
savefig("$fn.html")
|
||||||
|
|
||||||
|
if Sys.islinux()
|
||||||
|
Plots.eps(p, fn)
|
||||||
|
Plots.eps(fn)
|
||||||
|
savefig(p, "$fn.eps")
|
||||||
|
savefig("$fn.eps")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@test_throws ErrorException savefig("$fn.foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
gr() # reset to default backend
|
||||||
|
|
||||||
|
for fn in (
|
||||||
|
"test_args.jl",
|
||||||
|
"test_defaults.jl",
|
||||||
|
"test_pipeline.jl",
|
||||||
|
"test_axes.jl",
|
||||||
|
"test_layouts.jl",
|
||||||
|
"test_contours.jl",
|
||||||
|
"test_axis_letter.jl",
|
||||||
|
"test_components.jl",
|
||||||
|
"test_shorthands.jl",
|
||||||
|
"integration_dates.jl",
|
||||||
|
"test_recipes.jl",
|
||||||
|
"test_hdf5plots.jl",
|
||||||
|
"test_pgfplotsx.jl",
|
||||||
|
"test_plotly.jl",
|
||||||
|
"test_animations.jl",
|
||||||
|
)
|
||||||
|
@testset "$fn" begin
|
||||||
|
include(fn)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
reference_dir(args...) =
|
||||||
|
joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
|
||||||
|
|
||||||
function reference_file(backend, i, version)
|
function reference_file(backend, i, version)
|
||||||
refdir = reference_dir("Plots", string(backend))
|
refdir = reference_dir("Plots", string(backend))
|
||||||
fn = "ref$i.png"
|
fn = "ref$i.png"
|
||||||
versions = sort(VersionNumber.(readdir(refdir)), rev = true)
|
versions = sort(VersionNumber.(readdir(refdir)), rev = true)
|
||||||
|
|
||||||
reffn = joinpath(refdir, string(version), fn)
|
reffn = joinpath(refdir, string(version), fn)
|
||||||
for v in versions
|
for v in versions
|
||||||
tmpfn = joinpath(refdir, string(v), fn)
|
tmpfn = joinpath(refdir, string(v), fn)
|
||||||
@ -27,7 +344,6 @@ function reference_file(backend, i, version)
|
|||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return reffn
|
return reffn
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -35,41 +351,109 @@ reference_path(backend, version) = reference_dir("Plots", string(backend), strin
|
|||||||
|
|
||||||
if !isdir(reference_dir())
|
if !isdir(reference_dir())
|
||||||
mkpath(reference_dir())
|
mkpath(reference_dir())
|
||||||
LibGit2.clone("https://github.com/JuliaPlots/PlotReferenceImages.jl.git", reference_dir())
|
LibGit2.clone(
|
||||||
|
"https://github.com/JuliaPlots/PlotReferenceImages.jl.git",
|
||||||
|
reference_dir(),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
include("imgcomp.jl")
|
include("imgcomp.jl")
|
||||||
# don't actually show the plots
|
Random.seed!(PLOTS_SEED)
|
||||||
Random.seed!(1234)
|
|
||||||
default(show=false, reuse=true)
|
default(show = false, reuse = true) # don't actually show the plots
|
||||||
|
|
||||||
is_ci() = get(ENV, "CI", "false") == "true"
|
is_ci() = get(ENV, "CI", "false") == "true"
|
||||||
img_tol = is_ci() ? 1e-2 : Sys.islinux() ? 1e-3 : 0.1
|
const PLOTS_IMG_TOL = parse(
|
||||||
|
Float64,
|
||||||
|
get(ENV, "PLOTS_IMG_TOL", is_ci() ? Sys.iswindows() ? "2e-4" : "1e-4" : "1e-5"),
|
||||||
|
)
|
||||||
|
|
||||||
## Uncomment the following lines to update reference images for different backends
|
## Uncomment the following lines to update reference images for different backends
|
||||||
|
|
||||||
#=
|
# @testset "GR" begin
|
||||||
@testset "GR" begin
|
# image_comparison_facts(:gr, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:gr])
|
||||||
image_comparison_facts(:gr, tol=img_tol, skip = Plots._backend_skips[:gr])
|
# end
|
||||||
end
|
#
|
||||||
|
# plotly()
|
||||||
|
# @testset "Plotly" begin
|
||||||
|
# image_comparison_facts(:plotly, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:plotlyjs])
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# pyplot()
|
||||||
|
# @testset "PyPlot" begin
|
||||||
|
# image_comparison_facts(:pyplot, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pyplot])
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# pgfplotsx()
|
||||||
|
# @testset "PGFPlotsX" begin
|
||||||
|
# image_comparison_facts(:pgfplotsx, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pgfplotsx])
|
||||||
|
# end
|
||||||
|
|
||||||
plotly()
|
|
||||||
@testset "Plotly" begin
|
|
||||||
image_comparison_facts(:plotly, tol=img_tol, skip = Plots._backend_skips[:plotlyjs])
|
|
||||||
end
|
|
||||||
|
|
||||||
pyplot()
|
|
||||||
@testset "PyPlot" begin
|
|
||||||
image_comparison_facts(:pyplot, tol=img_tol, skip = Plots._backend_skips[:pyplot])
|
|
||||||
end
|
|
||||||
|
|
||||||
pgfplotsx()
|
|
||||||
@testset "PGFPlotsX" begin
|
|
||||||
image_comparison_facts(:pgfplotsx, tol=img_tol, skip = Plots._backend_skips[:pgfplotsx])
|
|
||||||
end
|
|
||||||
=#
|
|
||||||
##
|
##
|
||||||
|
|
||||||
|
@testset "Examples" begin
|
||||||
|
if Sys.islinux()
|
||||||
|
backends = (
|
||||||
|
:unicodeplots,
|
||||||
|
:pgfplotsx,
|
||||||
|
:inspectdr,
|
||||||
|
:plotlyjs,
|
||||||
|
:gaston,
|
||||||
|
# :pyplot, # FIXME: fails with system matplotlib
|
||||||
|
)
|
||||||
|
only = setdiff(
|
||||||
|
1:length(Plots._examples),
|
||||||
|
(Plots._backend_skips[be] for be in backends)...,
|
||||||
|
)
|
||||||
|
for be in backends
|
||||||
|
@info be
|
||||||
|
for (i, p) in Plots.test_examples(be, only = only, disp = false)
|
||||||
|
fn = tempname() * ".png"
|
||||||
|
png(p, fn)
|
||||||
|
@test filesize(fn) > 1_000
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@testset "Backends" begin
|
@testset "Backends" begin
|
||||||
|
@testset "UnicodePlots" begin
|
||||||
|
@test unicodeplots() == Plots.UnicodePlotsBackend()
|
||||||
|
@test backend() == Plots.UnicodePlotsBackend()
|
||||||
|
|
||||||
|
io = IOContext(IOBuffer(), :color => true)
|
||||||
|
|
||||||
|
# lets just make sure it runs without error
|
||||||
|
p = plot(rand(10))
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
|
||||||
|
p = bar(randn(10))
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
|
||||||
|
p = plot([1, 2], [3, 4])
|
||||||
|
annotate!(p, [(1.5, 3.2, Plots.text("Test", :red, :center))])
|
||||||
|
hline!(p, [3.1])
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
|
||||||
|
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
|
||||||
|
hline!(p, [3.1])
|
||||||
|
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
|
||||||
|
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
|
||||||
|
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, :auto)])
|
||||||
|
hline!(p, [3.1])
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
|
||||||
|
p = plot((plot(i) for i in 1:4)..., layout = (2, 2))
|
||||||
|
@test p isa Plots.Plot
|
||||||
|
@test show(io, p) isa Nothing
|
||||||
|
end
|
||||||
|
|
||||||
@testset "GR" begin
|
@testset "GR" begin
|
||||||
ENV["PLOTS_TEST"] = "true"
|
ENV["PLOTS_TEST"] = "true"
|
||||||
@ -80,101 +464,20 @@ end
|
|||||||
@static if haskey(ENV, "APPVEYOR")
|
@static if haskey(ENV, "APPVEYOR")
|
||||||
@info "Skipping GR image comparison tests on AppVeyor"
|
@info "Skipping GR image comparison tests on AppVeyor"
|
||||||
else
|
else
|
||||||
image_comparison_facts(:gr, tol=img_tol, skip = Plots._backend_skips[:gr])
|
image_comparison_facts(
|
||||||
|
:gr,
|
||||||
|
tol = PLOTS_IMG_TOL,
|
||||||
|
skip = Plots._backend_skips[:gr],
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@testset "UnicodePlots" begin
|
@testset "PlotlyJS" begin
|
||||||
@test unicodeplots() == Plots.UnicodePlotsBackend()
|
@test plotlyjs() == Plots.PlotlyJSBackend()
|
||||||
@test backend() == Plots.UnicodePlotsBackend()
|
@test backend() == Plots.PlotlyJSBackend()
|
||||||
|
|
||||||
# lets just make sure it runs without error
|
|
||||||
p = plot(rand(10))
|
p = plot(rand(10))
|
||||||
@test isa(p, Plots.Plot) == true
|
@test p isa Plots.Plot
|
||||||
@test isa(display(p), Nothing) == true
|
@test_broken display(p) isa Nothing
|
||||||
p = bar(randn(10))
|
|
||||||
@test isa(p, Plots.Plot) == true
|
|
||||||
@test isa(display(p), Nothing) == true
|
|
||||||
p = plot([1, 2], [3, 4])
|
|
||||||
annotate!(p, [(1.5, 3.2, Plots.text("Test", :red, :center))])
|
|
||||||
hline!(p, [3.1])
|
|
||||||
@test isa(p, Plots.Plot) == true
|
|
||||||
@test isa(display(p), Nothing) == true
|
|
||||||
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
|
|
||||||
hline!(p, [3.1])
|
|
||||||
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
|
|
||||||
@test isa(p, Plots.Plot) == true
|
|
||||||
@test isa(display(p), Nothing) == true
|
|
||||||
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
|
|
||||||
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
|
|
||||||
hline!(p, [3.1])
|
|
||||||
@test isa(p, Plots.Plot) == true
|
|
||||||
@test isa(display(p), Nothing) == true
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
@testset "Axes" begin
|
|
||||||
p = plot()
|
|
||||||
axis = p.subplots[1][:xaxis]
|
|
||||||
@test typeof(axis) == Plots.Axis
|
|
||||||
@test Plots.discrete_value!(axis, "HI") == (0.5, 1)
|
|
||||||
@test Plots.discrete_value!(axis, :yo) == (1.5, 2)
|
|
||||||
@test Plots.ignorenan_extrema(axis) == (0.5,1.5)
|
|
||||||
@test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1)
|
|
||||||
|
|
||||||
Plots.discrete_value!(axis, ["x$i" for i=1:5])
|
|
||||||
Plots.discrete_value!(axis, ["x$i" for i=0:2])
|
|
||||||
@test Plots.ignorenan_extrema(axis) == (0.5, 7.5)
|
|
||||||
end
|
|
||||||
|
|
||||||
@testset "NoFail" begin
|
|
||||||
plots = [histogram([1, 0, 0, 0, 0, 0]),
|
|
||||||
plot([missing]),
|
|
||||||
plot([missing; 1:4]),
|
|
||||||
plot([fill(missing,10); 1:4]),
|
|
||||||
plot([1 1; 1 missing]),
|
|
||||||
plot(["a" "b"; missing "d"], [1 2; 3 4])]
|
|
||||||
for plt in plots
|
|
||||||
display(plt)
|
|
||||||
end
|
|
||||||
@test_nowarn plot(x->x^2,0,2)
|
|
||||||
end
|
|
||||||
|
|
||||||
@testset "EmptyAnim" begin
|
|
||||||
anim = @animate for i in []
|
|
||||||
end
|
|
||||||
|
|
||||||
@test_throws ArgumentError gif(anim)
|
|
||||||
end
|
|
||||||
|
|
||||||
@testset "Segments" begin
|
|
||||||
function segments(args...)
|
|
||||||
segs = UnitRange{Int}[]
|
|
||||||
for seg in iter_segments(args...)
|
|
||||||
push!(segs,seg)
|
|
||||||
end
|
|
||||||
segs
|
|
||||||
end
|
|
||||||
|
|
||||||
nan10 = fill(NaN,10)
|
|
||||||
@test segments(11:20) == [1:10]
|
|
||||||
@test segments([NaN]) == []
|
|
||||||
@test segments(nan10) == []
|
|
||||||
@test segments([nan10; 1:5]) == [11:15]
|
|
||||||
@test segments([1:5;nan10]) == [1:5]
|
|
||||||
@test segments([nan10; 1:5; nan10; 1:5; nan10]) == [11:15, 26:30]
|
|
||||||
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
|
|
||||||
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
|
|
||||||
end
|
|
||||||
|
|
||||||
@testset "Utils" begin
|
|
||||||
zipped = ([(1,2)], [("a","b")], [(1,"a"),(2,"b")],
|
|
||||||
[(1,2),(3,4)], [(1,2,3),(3,4,5)], [(1,2,3,4),(3,4,5,6)],
|
|
||||||
[(1,2.0),(missing,missing)], [(1,missing),(missing,"a")],
|
|
||||||
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
|
|
||||||
for z in zipped
|
|
||||||
@test isequal(collect(zip(Plots.unzip(z)...)), z)
|
|
||||||
@test isequal(collect(zip(Plots.unzip(GeometryTypes.Point.(z))...)), z)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
61
test/test_animations.jl
Normal file
61
test/test_animations.jl
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
@testset "Empty anim" begin
|
||||||
|
anim = @animate for i in []
|
||||||
|
end
|
||||||
|
@test_throws ArgumentError gif(anim)
|
||||||
|
end
|
||||||
|
|
||||||
|
@userplot CirclePlot
|
||||||
|
@recipe function f(cp::CirclePlot)
|
||||||
|
x, y, i = cp.args
|
||||||
|
n = length(x)
|
||||||
|
inds = circshift(1:n, 1 - i)
|
||||||
|
linewidth --> range(0, 10, length = n)
|
||||||
|
seriesalpha --> range(0, 1, length = n)
|
||||||
|
aspect_ratio --> 1
|
||||||
|
label --> false
|
||||||
|
x[inds], y[inds]
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Circle plot" begin
|
||||||
|
n = 10
|
||||||
|
t = range(0, 2π, length = n)
|
||||||
|
x = sin.(t)
|
||||||
|
y = cos.(t)
|
||||||
|
|
||||||
|
anim = @animate for i in 1:n
|
||||||
|
circleplot(x, y, i)
|
||||||
|
end
|
||||||
|
@test filesize(gif(anim).filename) > 10_000
|
||||||
|
@test filesize(mov(anim).filename) > 10_000
|
||||||
|
@test filesize(mp4(anim).filename) > 10_000
|
||||||
|
@test filesize(webm(anim).filename) > 10_000
|
||||||
|
|
||||||
|
@gif for i in 1:n
|
||||||
|
circleplot(x, y, i, line_z = 1:n, cbar = false, framestyle = :zerolines)
|
||||||
|
end every 5
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "html" begin
|
||||||
|
p = plot([sin, cos], zeros(0), leg = false, xlims = (0, 2π), ylims = (-1, 1))
|
||||||
|
anim = Animation()
|
||||||
|
for x in range(0, stop = 2π, length = 10)
|
||||||
|
push!(p, x, Float64[sin(x), cos(x)])
|
||||||
|
frame(anim)
|
||||||
|
end
|
||||||
|
|
||||||
|
agif = gif(anim)
|
||||||
|
html = tempname() * ".html"
|
||||||
|
open(html, "w") do io
|
||||||
|
show(io, MIME("text/html"), agif)
|
||||||
|
end
|
||||||
|
@test filesize(html) > 10_000
|
||||||
|
@test showable(MIME("image/gif"), agif)
|
||||||
|
|
||||||
|
agif = mp4(anim)
|
||||||
|
html = tempname() * ".html"
|
||||||
|
open(html, "w") do io
|
||||||
|
show(io, MIME("text/html"), agif)
|
||||||
|
end
|
||||||
|
@test filesize(html) > 10_000
|
||||||
|
end
|
||||||
27
test/test_args.jl
Normal file
27
test/test_args.jl
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Series Attributes" begin
|
||||||
|
pl = plot([[1, 2, 3], [2, 3, 4]], lw = 5)
|
||||||
|
@test hline!(deepcopy(pl), [1.75])[1].series_list[3][:label] ==
|
||||||
|
hline!(deepcopy(pl), [1.75], z_order = :front)[1].series_list[3][:label] ==
|
||||||
|
"y3"
|
||||||
|
@test hline!(deepcopy(pl), [1.75], z_order = :back)[1].series_list[1][:label] == "y3"
|
||||||
|
@test hline!(deepcopy(pl), [1.75], z_order = 2)[1].series_list[2][:label] == "y3"
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Axis Attributes" begin
|
||||||
|
pl = @test_nowarn plot(; tickfont = font(10, "Times"))
|
||||||
|
for axis in (:xaxis, :yaxis, :zaxis)
|
||||||
|
@test pl[1][axis][:tickfontsize] == 10
|
||||||
|
@test pl[1][axis][:tickfontfamily] == "Times"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Permute recipes" begin
|
||||||
|
pl = bar(["a", "b", "c"], [1, 2, 3])
|
||||||
|
ppl = bar(["a", "b", "c"], [1, 2, 3], permute = (:x, :y))
|
||||||
|
@test xticks(ppl) == yticks(pl)
|
||||||
|
@test yticks(ppl) == xticks(pl)
|
||||||
|
@test filter(isfinite, pl[1][1][:x]) == filter(isfinite, ppl[1][1][:y])
|
||||||
|
@test filter(isfinite, pl[1][1][:y]) == filter(isfinite, ppl[1][1][:x])
|
||||||
|
end
|
||||||
122
test/test_axes.jl
Normal file
122
test/test_axes.jl
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Showaxis" begin
|
||||||
|
for value in Plots._allShowaxisArgs
|
||||||
|
@test plot(1:5, showaxis = value)[1][:yaxis][:showaxis] isa Bool
|
||||||
|
end
|
||||||
|
@test plot(1:5, showaxis = :y)[1][:yaxis][:showaxis] == true
|
||||||
|
@test plot(1:5, showaxis = :y)[1][:xaxis][:showaxis] == false
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Magic axis" begin
|
||||||
|
@test plot(1, axis = nothing)[1][:xaxis][:ticks] == []
|
||||||
|
@test plot(1, axis = nothing)[1][:yaxis][:ticks] == []
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "Categorical ticks" begin
|
||||||
|
p1 = plot('A':'M', 1:13)
|
||||||
|
p2 = plot('A':'Z', 1:26)
|
||||||
|
p3 = plot('A':'Z', 1:26, ticks = :all)
|
||||||
|
@test Plots.get_ticks(p1[1], p1[1][:xaxis])[2] == string.('A':'M')
|
||||||
|
@test Plots.get_ticks(p2[1], p2[1][:xaxis])[2] == string.('C':3:'Z')
|
||||||
|
@test Plots.get_ticks(p3[1], p3[1][:xaxis])[2] == string.('A':'Z')
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Ticks getter functions" begin
|
||||||
|
ticks1 = ([1, 2, 3], ("a", "b", "c"))
|
||||||
|
ticks2 = ([4, 5], ("e", "f"))
|
||||||
|
p1 = plot(1:5, 1:5, 1:5, xticks = ticks1, yticks = ticks1, zticks = ticks1)
|
||||||
|
p2 = plot(1:5, 1:5, 1:5, xticks = ticks2, yticks = ticks2, zticks = ticks2)
|
||||||
|
p = plot(p1, p2)
|
||||||
|
@test xticks(p) == yticks(p) == zticks(p) == [ticks1, ticks2]
|
||||||
|
@test xticks(p[1]) == yticks(p[1]) == zticks(p[1]) == ticks1
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Axis limits" begin
|
||||||
|
pl = plot(1:5, xlims = :symmetric, widen = false)
|
||||||
|
@test Plots.xlims(pl) == (-5, 5)
|
||||||
|
|
||||||
|
pl = plot(1:3)
|
||||||
|
@test Plots.xlims(pl) == Plots.widen(1, 3)
|
||||||
|
|
||||||
|
pl = plot([1.05, 2.0, 2.95], ylims = :round)
|
||||||
|
@test Plots.ylims(pl) == (1, 3)
|
||||||
|
|
||||||
|
pl = plot(1:3, xlims = (1, 5))
|
||||||
|
@test Plots.xlims(pl) == (1, 5)
|
||||||
|
|
||||||
|
pl = plot(1:3, xlims = (1, 5), widen = true)
|
||||||
|
@test Plots.xlims(pl) == Plots.widen(1, 5)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "3D Axis" begin
|
||||||
|
ql = quiver([1, 2], [2, 1], [3, 4], quiver = ([1, -1], [0, 0], [1, -0.5]), arrow = true)
|
||||||
|
@test ql[1][:projection] == "3d"
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "twinx" begin
|
||||||
|
pl = plot(1:10, margin = 2Plots.cm)
|
||||||
|
twpl = twinx(pl)
|
||||||
|
pl! = plot!(twinx(), -(1:10))
|
||||||
|
@test twpl[:right_margin] == 2Plots.cm
|
||||||
|
@test twpl[:left_margin] == 2Plots.cm
|
||||||
|
@test twpl[:top_margin] == 2Plots.cm
|
||||||
|
@test twpl[:bottom_margin] == 2Plots.cm
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "axis-aliases" begin
|
||||||
|
@test haskey(Plots._keyAliases, :xguideposition)
|
||||||
|
@test haskey(Plots._keyAliases, :x_guide_position)
|
||||||
|
@test !haskey(Plots._keyAliases, :xguide_position)
|
||||||
|
p = plot(1:2, xl = "x label")
|
||||||
|
@test p[1][:xaxis][:guide] === "x label"
|
||||||
|
p = plot(1:2, xrange = (0, 3))
|
||||||
|
@test xlims(p) === (0, 3)
|
||||||
|
p = plot(1:2, xtick = [1.25, 1.5, 1.75])
|
||||||
|
@test p[1][:xaxis][:ticks] == [1.25, 1.5, 1.75]
|
||||||
|
p = plot(1:2, xlabelfontsize = 4)
|
||||||
|
@test p[1][:xaxis][:guidefontsize] == 4
|
||||||
|
p = plot(1:2, xgα = 0.07)
|
||||||
|
@test p[1][:xaxis][:gridalpha] ≈ 0.07
|
||||||
|
p = plot(1:2, xgridls = :dashdot)
|
||||||
|
@test p[1][:xaxis][:gridstyle] === :dashdot
|
||||||
|
p = plot(1:2, xgridcolor = :red)
|
||||||
|
@test p[1][:xaxis][:foreground_color_grid] === RGBA{Float64}(1.0, 0.0, 0.0, 1.0)
|
||||||
|
p = plot(1:2, xminorgridcolor = :red)
|
||||||
|
@test p[1][:xaxis][:foreground_color_minor_grid] === RGBA{Float64}(1.0, 0.0, 0.0, 1.0)
|
||||||
|
p = plot(1:2, xgrid_lw = 0.01)
|
||||||
|
@test p[1][:xaxis][:gridlinewidth] ≈ 0.01
|
||||||
|
p = plot(1:2, xminorgrid_lw = 0.01)
|
||||||
|
@test p[1][:xaxis][:minorgridlinewidth] ≈ 0.01
|
||||||
|
p = plot(1:2, xtickor = :out)
|
||||||
|
@test p[1][:xaxis][:tick_direction] === :out
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "aliases" begin
|
||||||
|
compare(p::Plots.Plot, s::Symbol, val, op) =
|
||||||
|
op(p[1][:xaxis][s], val) && op(p[1][:yaxis][s], val) && op(p[1][:zaxis][s], val)
|
||||||
|
p = plot(1:2, guide = "all labels")
|
||||||
|
@test compare(p, :guide, "all labels", ===)
|
||||||
|
p = plot(1:2, label = "test")
|
||||||
|
@test compare(p, :guide, "", ===)
|
||||||
|
p = plot(1:2, lim = (0, 3))
|
||||||
|
@test xlims(p) === ylims(p) === zlims(p) === (0, 3)
|
||||||
|
p = plot(1:2, tick = [1.25, 1.5, 1.75])
|
||||||
|
@test compare(p, :ticks, [1.25, 1.5, 1.75], ==)
|
||||||
|
p = plot(1:2, labelfontsize = 4)
|
||||||
|
@test compare(p, :guidefontsize, 4, ==)
|
||||||
|
p = plot(1:2, gα = 0.07)
|
||||||
|
@test compare(p, :gridalpha, 0.07, ≈)
|
||||||
|
p = plot(1:2, gridls = :dashdot)
|
||||||
|
@test compare(p, :gridstyle, :dashdot, ===)
|
||||||
|
p = plot(1:2, gridcolor = :red)
|
||||||
|
@test compare(p, :foreground_color_grid, RGBA{Float64}(1.0, 0.0, 0.0, 1.0), ===)
|
||||||
|
p = plot(1:2, minorgridcolor = :red)
|
||||||
|
@test compare(p, :foreground_color_minor_grid, RGBA{Float64}(1.0, 0.0, 0.0, 1.0), ===)
|
||||||
|
p = plot(1:2, grid_lw = 0.01)
|
||||||
|
@test compare(p, :gridlinewidth, 0.01, ≈)
|
||||||
|
p = plot(1:2, minorgrid_lw = 0.01)
|
||||||
|
@test compare(p, :minorgridlinewidth, 0.01, ≈)
|
||||||
|
p = plot(1:2, tickor = :out)
|
||||||
|
@test compare(p, :tick_direction, :out, ===)
|
||||||
|
end
|
||||||
28
test/test_axis_letter.jl
Normal file
28
test/test_axis_letter.jl
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "axis letter" begin
|
||||||
|
using Plots, RecipesBase
|
||||||
|
# a custom type for dispacthing the axis-letter-testing recipe
|
||||||
|
struct MyType <: Number
|
||||||
|
val::Float64
|
||||||
|
end
|
||||||
|
value(m::MyType) = m.val
|
||||||
|
data = MyType.(sort(randn(20)))
|
||||||
|
# A recipe that puts the axis letter in the title
|
||||||
|
@recipe function f(::Type{T}, m::T) where {T<:AbstractArray{<:MyType}}
|
||||||
|
title --> string(plotattributes[:letter])
|
||||||
|
value.(m)
|
||||||
|
end
|
||||||
|
@testset "$f (orientation = $o)" for f in [histogram, barhist, stephist, scatterhist],
|
||||||
|
o in [:vertical, :horizontal]
|
||||||
|
|
||||||
|
@test f(data, orientation = o).subplots[1].attr[:title] ==
|
||||||
|
(o == :vertical ? "x" : "y")
|
||||||
|
end
|
||||||
|
@testset "$f" for f in [hline, hspan]
|
||||||
|
@test f(data).subplots[1].attr[:title] == "y"
|
||||||
|
end
|
||||||
|
@testset "$f" for f in [vline, vspan]
|
||||||
|
@test f(data).subplots[1].attr[:title] == "x"
|
||||||
|
end
|
||||||
|
end
|
||||||
221
test/test_components.jl
Normal file
221
test/test_components.jl
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Shapes" begin
|
||||||
|
@testset "Type" begin
|
||||||
|
square = Shape([(0, 0.0), (1, 0.0), (1, 1.0), (0, 1.0)])
|
||||||
|
@test Plots.get_xs(square) == [0, 1, 1, 0]
|
||||||
|
@test Plots.get_ys(square) == [0, 0, 1, 1]
|
||||||
|
@test Plots.vertices(square) == [(0, 0), (1, 0), (1, 1), (0, 1)]
|
||||||
|
@test isa(square, Shape{Int64,Float64})
|
||||||
|
@test coords(square) isa Tuple{Vector{S},Vector{T}} where {T,S}
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Copy" begin
|
||||||
|
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
|
||||||
|
square2 = Shape(square)
|
||||||
|
@test square2.x == square.x
|
||||||
|
@test square2.y == square.y
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Center" begin
|
||||||
|
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
|
||||||
|
@test Plots.center(square) == (0.5, 0.5)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Translate" begin
|
||||||
|
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
|
||||||
|
squareUp = Shape([(0, 1), (1, 1), (1, 2), (0, 2)])
|
||||||
|
squareUpRight = Shape([(1, 1), (2, 1), (2, 2), (1, 2)])
|
||||||
|
|
||||||
|
@test Plots.translate(square, 0, 1).x == squareUp.x
|
||||||
|
@test Plots.translate(square, 0, 1).y == squareUp.y
|
||||||
|
|
||||||
|
@test Plots.center(translate!(square, 1)) == (1.5, 1.5)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Rotate" begin
|
||||||
|
# 2 radians rotation matrix
|
||||||
|
R2 = [cos(2) sin(2); -sin(2) cos(2)]
|
||||||
|
coords = [0 0; 1 0; 1 1; 0 1]'
|
||||||
|
coordsRotated2 = R2 * (coords .- 0.5) .+ 0.5
|
||||||
|
|
||||||
|
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
|
||||||
|
|
||||||
|
# make a new, rotated square
|
||||||
|
square2 = Plots.rotate(square, -2)
|
||||||
|
@test square2.x ≈ coordsRotated2[1, :]
|
||||||
|
@test square2.y ≈ coordsRotated2[2, :]
|
||||||
|
|
||||||
|
# unrotate the new square in place
|
||||||
|
rotate!(square2, 2)
|
||||||
|
@test square2.x ≈ coords[1, :]
|
||||||
|
@test square2.y ≈ coords[2, :]
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Plot" begin
|
||||||
|
ang = range(0, 2π, length = 60)
|
||||||
|
ellipse(x, y, w, h) = Shape(w * sin.(ang) .+ x, h * cos.(ang) .+ y)
|
||||||
|
myshapes = [ellipse(x, rand(), rand(), rand()) for x in 1:4]
|
||||||
|
@test coords(myshapes) isa Tuple{Vector{Vector{S}},Vector{Vector{T}}} where {T,S}
|
||||||
|
local p
|
||||||
|
@test_nowarn p = plot(myshapes)
|
||||||
|
@test p[1][1][:seriestype] == :shape
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Misc" begin
|
||||||
|
@test Plots.weave([1, 3], [2, 4]) == collect(1:4)
|
||||||
|
@test Plots.makeshape(3) isa Plots.Shape
|
||||||
|
@test Plots.makestar(3) isa Plots.Shape
|
||||||
|
@test Plots.makecross() isa Plots.Shape
|
||||||
|
@test Plots.makearrowhead(10.0) isa Plots.Shape
|
||||||
|
|
||||||
|
@test Plots.rotate(1.0, 2.0, 5.0, (0, 0)) isa Tuple
|
||||||
|
|
||||||
|
star = Plots.makestar(3)
|
||||||
|
star_scaled = Plots.scale(star, 0.5)
|
||||||
|
|
||||||
|
Plots.scale!(star, 0.5)
|
||||||
|
@test Plots.get_xs(star) == Plots.get_xs(star_scaled)
|
||||||
|
@test Plots.get_ys(star) == Plots.get_ys(star_scaled)
|
||||||
|
|
||||||
|
@test Plots.extrema_plus_buffer([1, 2], 0.1) == (0.9, 2.1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Brush" begin
|
||||||
|
@testset "Colors" begin
|
||||||
|
baseline = brush(1, RGB(0, 0, 0))
|
||||||
|
@test brush(:black) == baseline
|
||||||
|
@test brush("black") == baseline
|
||||||
|
end
|
||||||
|
@testset "Weight" begin
|
||||||
|
@test brush(10).size == 10
|
||||||
|
@test brush(0.1).size == 1
|
||||||
|
end
|
||||||
|
@testset "Alpha" begin
|
||||||
|
@test brush(0.4).alpha == 0.4
|
||||||
|
@test brush(20).alpha == nothing
|
||||||
|
end
|
||||||
|
@testset "Bad Argument" begin
|
||||||
|
# using test_logs because test_warn seems to not work anymore
|
||||||
|
@test_logs (:warn, "Unused brush arg: nothing (Nothing)") begin
|
||||||
|
brush(nothing)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Text" begin
|
||||||
|
t = Plots.PlotText("foo")
|
||||||
|
f = Plots.font()
|
||||||
|
|
||||||
|
@test Plots.PlotText(nothing).str == "nothing"
|
||||||
|
@test length(t) == 3
|
||||||
|
@test text(t).str == "foo"
|
||||||
|
@test text(t, f).str == "foo"
|
||||||
|
@test text("bar", f).str == "bar"
|
||||||
|
@test text(true).str == "true"
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Annotations" begin
|
||||||
|
ann = Plots.series_annotations(missing)
|
||||||
|
|
||||||
|
@test Plots.series_annotations(["1" "2"; "3" "4"]) isa AbstractMatrix
|
||||||
|
@test Plots.series_annotations(10).strs[1].str == "10"
|
||||||
|
@test Plots.series_annotations(nothing) === nothing
|
||||||
|
@test Plots.series_annotations(ann) == ann
|
||||||
|
|
||||||
|
@test Plots.annotations(["1" "2"; "3" "4"]) isa AbstractMatrix
|
||||||
|
@test Plots.annotations(ann) == ann
|
||||||
|
@test Plots.annotations([ann]) == [ann]
|
||||||
|
@test Plots.annotations(nothing) == []
|
||||||
|
|
||||||
|
t = Plots.text("foo")
|
||||||
|
sp = plot(1)[1]
|
||||||
|
@test Plots.locate_annotation(sp, 1, 2, t) == (1, 2, t)
|
||||||
|
@test Plots.locate_annotation(sp, 1, 2, 3, t) == (1, 2, 3, t)
|
||||||
|
@test Plots.locate_annotation(sp, (0.1, 0.2), t) isa Tuple
|
||||||
|
@test Plots.locate_annotation(sp, (0.1, 0.2, 0.3), t) isa Tuple
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Fonts" begin
|
||||||
|
@testset "Scaling" begin
|
||||||
|
sizesToCheck = [
|
||||||
|
:titlefontsize,
|
||||||
|
:legendfontsize,
|
||||||
|
:legendtitlefontsize,
|
||||||
|
:xtickfontsize,
|
||||||
|
:ytickfontsize,
|
||||||
|
:ztickfontsize,
|
||||||
|
:xguidefontsize,
|
||||||
|
:yguidefontsize,
|
||||||
|
:zguidefontsize,
|
||||||
|
]
|
||||||
|
# get inital font sizes
|
||||||
|
initialSizes = [Plots.default(s) for s in sizesToCheck]
|
||||||
|
|
||||||
|
#scale up font sizes
|
||||||
|
scalefontsizes(2)
|
||||||
|
|
||||||
|
# get inital font sizes
|
||||||
|
doubledSizes = [Plots.default(s) for s in sizesToCheck]
|
||||||
|
|
||||||
|
@test doubledSizes == initialSizes * 2
|
||||||
|
|
||||||
|
# reset font sizes
|
||||||
|
resetfontsizes()
|
||||||
|
|
||||||
|
finalSizes = [Plots.default(s) for s in sizesToCheck]
|
||||||
|
|
||||||
|
@test finalSizes == initialSizes
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Series Annotations" begin
|
||||||
|
square = Shape([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)])
|
||||||
|
@test_logs (:warn, "Unused SeriesAnnotations arg: triangle (Symbol)") begin
|
||||||
|
p = plot(
|
||||||
|
[1, 2, 3],
|
||||||
|
series_annotations = (
|
||||||
|
["a"],
|
||||||
|
2, # pass a scale factor
|
||||||
|
(1, 4), # pass two scale factors (overwrites first one)
|
||||||
|
square, # pass a shape
|
||||||
|
font(:courier), # pass an annotation font
|
||||||
|
:triangle, # pass an incorrect argument
|
||||||
|
),
|
||||||
|
)
|
||||||
|
sa = p.series_list[1].plotattributes[:series_annotations]
|
||||||
|
@test only(sa.strs).str == "a"
|
||||||
|
@test sa.font.family == "courier"
|
||||||
|
@test sa.baseshape == square
|
||||||
|
@test sa.scalefactor == (1, 4)
|
||||||
|
end
|
||||||
|
spl = scatter(
|
||||||
|
4.53 .* [1 / 1 1 / 2 1 / 3 1 / 4 1 / 5],
|
||||||
|
[0 0 0 0 0],
|
||||||
|
layout = (5, 1),
|
||||||
|
ylims = (-1.1, 1.1),
|
||||||
|
xlims = (0, 5),
|
||||||
|
series_annotations = permutedims([["1/1"], ["1/2"], ["1/3"], ["1/4"], ["1/5"]]),
|
||||||
|
)
|
||||||
|
for i in 1:5
|
||||||
|
@test only(spl.series_list[i].plotattributes[:series_annotations].strs).str ==
|
||||||
|
"1/$i"
|
||||||
|
end
|
||||||
|
|
||||||
|
p = plot([1, 2], annotations = (1.5, 2, text("foo", :left)))
|
||||||
|
x, y, txt = only(p.subplots[end][:annotations])
|
||||||
|
@test (x, y) == (1.5, 2)
|
||||||
|
@test txt.str == "foo"
|
||||||
|
|
||||||
|
p = plot([1, 2], annotations = ((0.1, 0.5), :auto))
|
||||||
|
pos, txt = only(p.subplots[end][:annotations])
|
||||||
|
@test pos == (0.1, 0.5)
|
||||||
|
@test txt.str == "(a)"
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Bezier" begin
|
||||||
|
curve = Plots.BezierCurve([Plots.P2(0.0, 0.0), Plots.P2(0.5, 1.0), Plots.P2(1.0, 0.0)])
|
||||||
|
@test curve(0.75) == Plots.P2(0.75, 0.375)
|
||||||
|
@test length(coords(curve, 10)) == 10
|
||||||
|
end
|
||||||
68
test/test_contours.jl
Normal file
68
test/test_contours.jl
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
using Plots, Test
|
||||||
|
import RecipesPipeline
|
||||||
|
|
||||||
|
@testset "Contours" begin
|
||||||
|
@testset "check_contour_levels" begin
|
||||||
|
@test Plots.check_contour_levels(2) === nothing
|
||||||
|
@test Plots.check_contour_levels(-1.0:0.2:10.0) === nothing
|
||||||
|
@test Plots.check_contour_levels([-100, -2, -1, 0, 1, 2, 100]) === nothing
|
||||||
|
@test_throws ArgumentError Plots.check_contour_levels(1.0)
|
||||||
|
@test_throws ArgumentError Plots.check_contour_levels((1, 2, 3))
|
||||||
|
@test_throws ArgumentError Plots.check_contour_levels(-3)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "RecipesPipeline.preprocess_attributes!" begin
|
||||||
|
function equal_after_pipeline(kw)
|
||||||
|
kw′ = deepcopy(kw)
|
||||||
|
RecipesPipeline.preprocess_attributes!(kw′)
|
||||||
|
kw == kw′
|
||||||
|
end
|
||||||
|
|
||||||
|
@test equal_after_pipeline(KW(:levels => 1))
|
||||||
|
@test equal_after_pipeline(KW(:levels => 1:10))
|
||||||
|
@test equal_after_pipeline(KW(:levels => [1.0, 3.0, 5.0]))
|
||||||
|
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(
|
||||||
|
KW(:levels => 1.0),
|
||||||
|
)
|
||||||
|
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(
|
||||||
|
KW(:levels => (1, 2, 3)),
|
||||||
|
)
|
||||||
|
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(KW(:levels => -3))
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "contour[f]" begin
|
||||||
|
x = (-2π):0.1:(2π)
|
||||||
|
y = (-π):0.1:π
|
||||||
|
z = cos.(y) .* sin.(x')
|
||||||
|
|
||||||
|
@testset "Incorrect input" begin
|
||||||
|
@test_throws ArgumentError contour(x, y, z, levels = 1.0)
|
||||||
|
@test_throws ArgumentError contour(x, y, z, levels = (1, 2, 3))
|
||||||
|
@test_throws ArgumentError contour(x, y, z, levels = -3)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Default number" begin
|
||||||
|
@test contour(x, y, z)[1][1].plotattributes[:levels] ==
|
||||||
|
Plots._series_defaults[:levels]
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Number" begin
|
||||||
|
@testset "$n contours" for n in (2, 5, 100)
|
||||||
|
p = contour(x, y, z, levels = n)
|
||||||
|
attr = p[1][1].plotattributes
|
||||||
|
@test attr[:seriestype] == :contour
|
||||||
|
@test attr[:levels] == n
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Range" begin
|
||||||
|
levels = -1:0.5:1
|
||||||
|
@test contour(x, y, z, levels = levels)[1][1].plotattributes[:levels] == levels
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Set of levels" begin
|
||||||
|
levels = [-1, 0.25, 0, 0.25, 1]
|
||||||
|
@test contour(x, y, z, levels = levels)[1][1].plotattributes[:levels] == levels
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
101
test/test_defaults.jl
Normal file
101
test/test_defaults.jl
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
using Plots, Test, Plots.Colors
|
||||||
|
|
||||||
|
const PLOTS_DEFAULTS = Dict(:theme => :wong2, :fontfamily => :palantino)
|
||||||
|
Plots.__init__()
|
||||||
|
|
||||||
|
@testset "Loading theme" begin
|
||||||
|
pl = plot(1:5)
|
||||||
|
@test pl[1][1][:seriescolor] == RGBA(colorant"black")
|
||||||
|
@test Plots.guidefont(pl[1][:xaxis]).family == "palantino"
|
||||||
|
end
|
||||||
|
|
||||||
|
empty!(PLOTS_DEFAULTS)
|
||||||
|
Plots.__init__()
|
||||||
|
|
||||||
|
@testset "default" begin
|
||||||
|
default(fillrange = 0)
|
||||||
|
@test Plots._series_defaults[:fillrange] == 0
|
||||||
|
pl = plot(1:5)
|
||||||
|
@test pl[1][1][:fillrange] == 0
|
||||||
|
default()
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Legend defaults" begin
|
||||||
|
p = plot()
|
||||||
|
@test p[1][:legend_font_family] == "sans-serif"
|
||||||
|
@test p[1][:legend_font_pointsize] == 8
|
||||||
|
@test p[1][:legend_font_halign] == :hcenter
|
||||||
|
@test p[1][:legend_font_valign] == :vcenter
|
||||||
|
@test p[1][:legend_font_rotation] == 0.0
|
||||||
|
@test p[1][:legend_font_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
|
||||||
|
@test p[1][:legend_position] == :best
|
||||||
|
@test p[1][:legend_title] == nothing
|
||||||
|
@test p[1][:legend_title_font_family] == "sans-serif"
|
||||||
|
@test p[1][:legend_title_font_pointsize] == 11
|
||||||
|
@test p[1][:legend_title_font_halign] == :hcenter
|
||||||
|
@test p[1][:legend_title_font_valign] == :vcenter
|
||||||
|
@test p[1][:legend_title_font_rotation] == 0.0
|
||||||
|
@test p[1][:legend_title_font_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
|
||||||
|
@test p[1][:legend_background_color] == RGBA{Float64}(1.0, 1.0, 1.0, 1.0)
|
||||||
|
@test p[1][:legend_foreground_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "Legend API" begin
|
||||||
|
p = plot(;
|
||||||
|
legendfontfamily = "serif",
|
||||||
|
legendfontsize = 12,
|
||||||
|
legendfonthalign = :left,
|
||||||
|
legendfontvalign = :top,
|
||||||
|
legendfontrotation = 1,
|
||||||
|
legendfontcolor = :red,
|
||||||
|
legend = :outertopleft,
|
||||||
|
legendtitle = "The legend",
|
||||||
|
legendtitlefontfamily = "helvetica",
|
||||||
|
legendtitlefontsize = 3,
|
||||||
|
legendtitlefonthalign = :right,
|
||||||
|
legendtitlefontvalign = :bottom,
|
||||||
|
legendtitlefontrotation = -5.2,
|
||||||
|
legendtitlefontcolor = :blue,
|
||||||
|
background_color_legend = :cyan,
|
||||||
|
foreground_color_legend = :green,
|
||||||
|
)
|
||||||
|
@test p[1][:legend_font_family] == "serif"
|
||||||
|
@test p[1][:legend_font_pointsize] == 12
|
||||||
|
@test p[1][:legend_font_halign] == :left
|
||||||
|
@test p[1][:legend_font_valign] == :top
|
||||||
|
@test p[1][:legend_font_rotation] == 1.0
|
||||||
|
@test p[1][:legend_font_color] == :red
|
||||||
|
@test p[1][:legend_position] == :outertopleft
|
||||||
|
@test p[1][:legend_title] == "The legend"
|
||||||
|
@test p[1][:legend_title_font_family] == "helvetica"
|
||||||
|
@test p[1][:legend_title_font_pointsize] == 3
|
||||||
|
@test p[1][:legend_title_font_halign] == :right
|
||||||
|
@test p[1][:legend_title_font_valign] == :bottom
|
||||||
|
@test p[1][:legend_title_font_rotation] == -5.2
|
||||||
|
@test p[1][:legend_title_font_color] == :blue
|
||||||
|
@test p[1][:legend_background_color] == RGBA{Float64}(0.0, 1.0, 1.0, 1.0)
|
||||||
|
@test p[1][:legend_foreground_color] == RGBA{Float64}(0.0, 0.5019607843137255, 0.0, 1.0)
|
||||||
|
|
||||||
|
#remember settings
|
||||||
|
plot(legend_font_pointsize = 20)
|
||||||
|
sp = plot!(label = "R")[1]
|
||||||
|
@test Plots.legendfont(sp).pointsize == 20
|
||||||
|
|
||||||
|
#setting whole font
|
||||||
|
sp = plot(
|
||||||
|
1:5,
|
||||||
|
legendfont = font(12),
|
||||||
|
legend_font_halign = :left,
|
||||||
|
foreground_color_subplot = :red,
|
||||||
|
)[1]
|
||||||
|
@test Plots.legendfont(sp).pointsize == 12
|
||||||
|
@test Plots.legendfont(sp).halign == :left
|
||||||
|
# match mechanism
|
||||||
|
@test sp[:legend_font_color] == sp[:foreground_color_subplot]
|
||||||
|
@test Plots.legendfont(sp).color == sp[:foreground_color_subplot]
|
||||||
|
|
||||||
|
# magic invocation
|
||||||
|
@test_nowarn sp = plot(; legendfont = 12)[1]
|
||||||
|
@test sp[:legend_font_pointsize] == 12
|
||||||
|
@test Plots.legendfont(sp).pointsize == 12
|
||||||
|
end # testset
|
||||||
@ -1,21 +1,20 @@
|
|||||||
using Plots, HDF5
|
using Plots, HDF5
|
||||||
|
|
||||||
|
|
||||||
@testset "HDF5_Plots" begin
|
@testset "HDF5_Plots" begin
|
||||||
fname = "tmpplotsave.hdf5"
|
fname = "tmpplotsave.hdf5"
|
||||||
hdf5()
|
hdf5()
|
||||||
|
|
||||||
x = 1:10
|
x = 1:10
|
||||||
psrc=plot(x, x.*x); #Create some plot
|
psrc = plot(x, x .* x) #Create some plot
|
||||||
Plots.hdf5plot_write(psrc, fname)
|
Plots.hdf5plot_write(psrc, fname)
|
||||||
|
|
||||||
#Read back file:
|
#Read back file:
|
||||||
gr() #Choose some fast backend likely to work in test environment.
|
gr() #Choose some fast backend likely to work in test environment.
|
||||||
pread = Plots.hdf5plot_read(fname)
|
pread = Plots.hdf5plot_read(fname)
|
||||||
|
|
||||||
#Make sure data made it through:
|
#Make sure data made it through:
|
||||||
@test psrc.subplots[1].series_list[1][:x] == pread.subplots[1].series_list[1][:x]
|
@test psrc.subplots[1].series_list[1][:x] == pread.subplots[1].series_list[1][:x]
|
||||||
@test psrc.subplots[1].series_list[1][:y] == pread.subplots[1].series_list[1][:y]
|
@test psrc.subplots[1].series_list[1][:y] == pread.subplots[1].series_list[1][:y]
|
||||||
|
|
||||||
#display(pread) #Don't display. Regression env might not support
|
#display(pread) #Don't display. Regression env might not support
|
||||||
end #testset
|
end #testset
|
||||||
|
|||||||
98
test/test_layouts.jl
Normal file
98
test/test_layouts.jl
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Subplot sclicing" begin
|
||||||
|
pl = @test_nowarn plot(
|
||||||
|
rand(4, 8),
|
||||||
|
layout = 4,
|
||||||
|
yscale = [:identity :identity :log10 :log10],
|
||||||
|
)
|
||||||
|
@test pl[1][:yaxis][:scale] == :identity
|
||||||
|
@test pl[2][:yaxis][:scale] == :identity
|
||||||
|
@test pl[3][:yaxis][:scale] == :log10
|
||||||
|
@test pl[4][:yaxis][:scale] == :log10
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Plot title" begin
|
||||||
|
pl = plot(rand(4, 8), layout = 4, plot_title = "My title")
|
||||||
|
@test pl[:plot_title] == "My title"
|
||||||
|
@test pl[:plot_titleindex] == 5
|
||||||
|
|
||||||
|
plot!(pl)
|
||||||
|
@test pl[:plot_title] == "My title"
|
||||||
|
@test pl[:plot_titleindex] == 5
|
||||||
|
|
||||||
|
plot!(pl, plot_title = "My new title")
|
||||||
|
@test pl[:plot_title] == "My new title"
|
||||||
|
@test pl[:plot_titleindex] == 5
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Plots.jl/issues/4083" begin
|
||||||
|
p = plot(plot(1:2), plot(1:2); border = :grid, plot_title = "abc")
|
||||||
|
@test p[1][:framestyle] === :grid
|
||||||
|
@test p[2][:framestyle] === :grid
|
||||||
|
@test p[3][:framestyle] === :none
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Coverage" begin
|
||||||
|
p = plot((plot(i) for i in 1:4)..., layout = (2, 2))
|
||||||
|
|
||||||
|
sp = p[end]
|
||||||
|
@test sp isa Plots.Subplot
|
||||||
|
@test size(sp) == (1, 1)
|
||||||
|
@test length(sp) == 1
|
||||||
|
@test sp[1, 1] == sp
|
||||||
|
@test Plots.get_subplot(p, UInt32(4)) == sp
|
||||||
|
@test Plots.series_list(sp) |> first |> Plots.get_subplot isa Plots.Subplot
|
||||||
|
@test Plots.get_subplot(p, keys(p.spmap) |> first) isa Plots.Subplot
|
||||||
|
|
||||||
|
gl = p[2, 2]
|
||||||
|
@test gl isa Plots.GridLayout
|
||||||
|
@test length(gl) == 1
|
||||||
|
@test size(gl) == (1, 1)
|
||||||
|
@test Plots.layout_args(gl) == (gl, 1)
|
||||||
|
|
||||||
|
@test size(p, 1) == 2
|
||||||
|
@test size(p, 2) == 2
|
||||||
|
@test size(p) === (2, 2)
|
||||||
|
@test ndims(p) == 2
|
||||||
|
|
||||||
|
@test p[1][end] isa Plots.Series
|
||||||
|
show(devnull, p[1])
|
||||||
|
|
||||||
|
@test Plots.getplot(p) == p
|
||||||
|
@test Plots.getattr(p) == p.attr
|
||||||
|
@test Plots.backend_object(p) == p.o
|
||||||
|
@test occursin("Plot", string(p))
|
||||||
|
print(devnull, p)
|
||||||
|
|
||||||
|
@test Plots.to_pixels(1Plots.mm) isa AbstractFloat
|
||||||
|
@test Plots.ispositive(1Plots.mm)
|
||||||
|
@test size(Plots.defaultbox) == (0Plots.mm, 0Plots.mm)
|
||||||
|
show(devnull, Plots.defaultbox)
|
||||||
|
show(devnull, p.layout)
|
||||||
|
|
||||||
|
@test Plots.make_measure_hor(1Plots.mm) == 1Plots.mm
|
||||||
|
@test Plots.make_measure_vert(1Plots.mm) == 1Plots.mm
|
||||||
|
|
||||||
|
@test Plots.parent(p.layout) isa Plots.RootLayout
|
||||||
|
show(devnull, Plots.parent_bbox(p.layout))
|
||||||
|
|
||||||
|
rl = Plots.RootLayout()
|
||||||
|
show(devnull, rl)
|
||||||
|
@test parent(rl) === nothing
|
||||||
|
@test Plots.parent_bbox(rl) == Plots.defaultbox
|
||||||
|
@test Plots.bbox(rl) == Plots.defaultbox
|
||||||
|
|
||||||
|
el = Plots.EmptyLayout()
|
||||||
|
@test Plots.update_position!(el) === nothing
|
||||||
|
@test size(el) == (0, 0)
|
||||||
|
@test length(el) == 0
|
||||||
|
@test el[1, 1] === nothing
|
||||||
|
|
||||||
|
@test Plots.left(el) == 0Plots.mm
|
||||||
|
@test Plots.top(el) == 0Plots.mm
|
||||||
|
@test Plots.right(el) == 0Plots.mm
|
||||||
|
@test Plots.bottom(el) == 0Plots.mm
|
||||||
|
|
||||||
|
@test_throws ErrorException Plots.layout_args(nothing)
|
||||||
|
end
|
||||||
@ -2,327 +2,410 @@ using Plots, Test
|
|||||||
pgfplotsx()
|
pgfplotsx()
|
||||||
|
|
||||||
function create_plot(args...; kwargs...)
|
function create_plot(args...; kwargs...)
|
||||||
pgfx_plot = plot(args...; kwargs...)
|
pgfx_plot = plot(args...; kwargs...)
|
||||||
return pgfx_plot, repr("application/x-tex", pgfx_plot)
|
return pgfx_plot, repr("application/x-tex", pgfx_plot)
|
||||||
end
|
end
|
||||||
|
|
||||||
function create_plot!(args...; kwargs...)
|
function create_plot!(args...; kwargs...)
|
||||||
pgfx_plot = plot!(args...; kwargs...)
|
pgfx_plot = plot!(args...; kwargs...)
|
||||||
return pgfx_plot, repr("application/x-tex", pgfx_plot)
|
return pgfx_plot, repr("application/x-tex", pgfx_plot)
|
||||||
end
|
end
|
||||||
|
|
||||||
@testset "PGFPlotsX" begin
|
@testset "PGFPlotsX" begin
|
||||||
pgfx_plot = plot(1:5)
|
pgfx_plot = plot(1:5)
|
||||||
Plots._update_plot_object(pgfx_plot)
|
Plots._update_plot_object(pgfx_plot)
|
||||||
@test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument
|
@test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument
|
||||||
@test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing
|
@test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing
|
||||||
axis = Plots.pgfx_axes(pgfx_plot.o)[1]
|
axis = Plots.pgfx_axes(pgfx_plot.o)[1]
|
||||||
@test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 1
|
@test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 1
|
||||||
@test !haskey(axis.contents[1].options.dict, "fill")
|
@test !haskey(axis.contents[1].options.dict, "fill")
|
||||||
|
|
||||||
@testset "Legends" begin
|
@testset "Legends" begin
|
||||||
legends_plot = plot( rand(5,2), lab = ["1" ""] )
|
legends_plot = plot(rand(5, 2), lab = ["1" ""], arrow = true)
|
||||||
scatter!(legends_plot, rand(5) )
|
scatter!(legends_plot, rand(5))
|
||||||
Plots._update_plot_object(legends_plot)
|
Plots._update_plot_object(legends_plot)
|
||||||
axis_contents = Plots.pgfx_axes(legends_plot.o)[1].contents
|
axis_contents = Plots.pgfx_axes(legends_plot.o)[1].contents
|
||||||
leg_entries = filter( x -> x isa PGFPlotsX.LegendEntry, axis_contents )
|
leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents)
|
||||||
series = filter( x -> x isa PGFPlotsX.Plot, axis_contents )
|
series = filter(x -> x isa PGFPlotsX.Plot, axis_contents)
|
||||||
@test length(leg_entries) == 2
|
@test length(leg_entries) == 2
|
||||||
@test !haskey(series[1].options.dict, "forget plot")
|
@test length(series) == 5
|
||||||
@test haskey(series[2].options.dict, "forget plot")
|
@test !haskey(series[1].options.dict, "forget plot")
|
||||||
@test !haskey(series[3].options.dict, "forget plot")
|
@test haskey(series[2].options.dict, "forget plot")
|
||||||
end # testset
|
@test haskey(series[3].options.dict, "forget plot")
|
||||||
|
@test haskey(series[4].options.dict, "forget plot")
|
||||||
|
@test !haskey(series[5].options.dict, "forget plot")
|
||||||
|
end # testset
|
||||||
|
|
||||||
@testset "3D docs example" begin
|
@testset "3D docs example" begin
|
||||||
n = 100
|
n = 100
|
||||||
ts = range(0, stop = 8π, length = n)
|
ts = range(0, stop = 8π, length = n)
|
||||||
x = ts .* map(cos, ts)
|
x = ts .* map(cos, ts)
|
||||||
y = (0.1ts) .* map(sin, ts)
|
y = (0.1ts) .* map(sin, ts)
|
||||||
z = 1:n
|
z = 1:n
|
||||||
pl = plot(
|
pl = plot(
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
z,
|
z,
|
||||||
zcolor = reverse(z),
|
zcolor = reverse(z),
|
||||||
m = (10, 0.8, :blues, Plots.stroke(0)),
|
m = (10, 0.8, :blues, Plots.stroke(0)),
|
||||||
leg = false,
|
leg = false,
|
||||||
cbar = true,
|
cbar = true,
|
||||||
w = 5,
|
w = 5,
|
||||||
)
|
)
|
||||||
pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w = 10)
|
pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w = 10)
|
||||||
Plots._update_plot_object(pgfx_plot)
|
Plots._update_plot_object(pgfx_plot)
|
||||||
if @test_nowarn(
|
if @test_nowarn(
|
||||||
haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true
|
haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true
|
||||||
)
|
)
|
||||||
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing
|
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing
|
||||||
end
|
end
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Color docs example" begin
|
@testset "Color docs example" begin
|
||||||
y = rand(100)
|
y = rand(100)
|
||||||
plot(
|
plot(
|
||||||
0:10:100,
|
0:10:100,
|
||||||
rand(11, 4),
|
rand(11, 4),
|
||||||
lab = "lines",
|
lab = "lines",
|
||||||
w = 3,
|
w = 3,
|
||||||
palette = :grays,
|
palette = :grays,
|
||||||
fill = 0,
|
fill = 0,
|
||||||
α = 0.6,
|
α = 0.6,
|
||||||
)
|
)
|
||||||
pl = scatter!(
|
pl = scatter!(
|
||||||
y,
|
y,
|
||||||
zcolor = abs.(y .- 0.5),
|
zcolor = abs.(y .- 0.5),
|
||||||
m = (:heat, 0.8, Plots.stroke(1, :green)),
|
m = (:hot, 0.8, Plots.stroke(1, :green)),
|
||||||
ms = 10 * abs.(y .- 0.5) .+ 4,
|
ms = 10 * abs.(y .- 0.5) .+ 4,
|
||||||
lab = ["grad", "", "ient"],
|
lab = ["grad", "", "ient"],
|
||||||
)
|
)
|
||||||
Plots._update_plot_object(pl)
|
Plots._update_plot_object(pl)
|
||||||
axis = Plots.pgfx_axes(pl.o)[1]
|
axis = Plots.pgfx_axes(pl.o)[1]
|
||||||
@test count(x -> x isa PGFPlotsX.LegendEntry, axis.contents) == 6
|
@test count(x -> x isa PGFPlotsX.LegendEntry, axis.contents) == 6
|
||||||
@test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 108 # each marker is its own plot, fillranges create 2 plot-objects
|
@test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 108 # each marker is its own plot, fillranges create 2 plot-objects
|
||||||
marker = axis.contents[15]
|
marker = axis.contents[15]
|
||||||
@test marker isa PGFPlotsX.Plot
|
@test marker isa PGFPlotsX.Plot
|
||||||
@test marker.options["mark"] == "*"
|
@test marker.options["mark"] == "*"
|
||||||
@test marker.options["mark options"]["color"] ==
|
@test marker.options["mark options"]["color"] == RGBA{Float64}(colorant"green", 0.8)
|
||||||
RGBA{Float64}(colorant"green", 0.8)
|
@test marker.options["mark options"]["line width"] == 0.75 # 1px is 0.75pt
|
||||||
@test marker.options["mark options"]["line width"] == 0.75 # 1px is 0.75pt
|
end # testset
|
||||||
end # testset
|
@testset "Plot in pieces" begin
|
||||||
@testset "Plot in pieces" begin
|
pic = plot(rand(100) / 3, reg = true, fill = (0, :green))
|
||||||
pic = plot(rand(100) / 3, reg = true, fill = (0, :green))
|
scatter!(pic, rand(100), markersize = 6, c = :orange)
|
||||||
scatter!(pic, rand(100), markersize = 6, c = :orange)
|
Plots._update_plot_object(pic)
|
||||||
Plots._update_plot_object(pic)
|
axis_contents = Plots.pgfx_axes(pic.o)[1].contents
|
||||||
axis_contents = Plots.pgfx_axes(pic.o)[1].contents
|
leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents)
|
||||||
leg_entries = filter( x -> x isa PGFPlotsX.LegendEntry, axis_contents )
|
series = filter(x -> x isa PGFPlotsX.Plot, axis_contents)
|
||||||
series = filter( x -> x isa PGFPlotsX.Plot, axis_contents )
|
@test length(leg_entries) == 2
|
||||||
@test length(leg_entries) == 2
|
@test length(series) == 4
|
||||||
@test length(series) == 4
|
@test haskey(series[1].options.dict, "forget plot")
|
||||||
@test haskey(series[1].options.dict, "forget plot")
|
@test !haskey(series[2].options.dict, "forget plot")
|
||||||
@test !haskey(series[2].options.dict, "forget plot")
|
@test haskey(series[3].options.dict, "forget plot")
|
||||||
@test haskey(series[3].options.dict, "forget plot")
|
@test !haskey(series[4].options.dict, "forget plot")
|
||||||
@test !haskey(series[4].options.dict, "forget plot")
|
end # testset
|
||||||
end # testset
|
@testset "Marker types" begin
|
||||||
@testset "Marker types" begin
|
markers = filter((m -> begin
|
||||||
markers = filter((m -> begin
|
m in Plots.supported_markers()
|
||||||
m in Plots.supported_markers()
|
end), Plots._shape_keys)
|
||||||
end), Plots._shape_keys)
|
markers = reshape(markers, 1, length(markers))
|
||||||
markers = reshape(markers, 1, length(markers))
|
n = length(markers)
|
||||||
n = length(markers)
|
x = (range(0, stop = 10, length = n + 2))[2:(end - 1)]
|
||||||
x = (range(0, stop = 10, length = n + 2))[2:(end - 1)]
|
y = repeat(reshape(reverse(x), 1, :), n, 1)
|
||||||
y = repeat(reshape(reverse(x), 1, :), n, 1)
|
scatter(
|
||||||
scatter(
|
x,
|
||||||
x,
|
y,
|
||||||
y,
|
m = (8, :auto),
|
||||||
m = (8, :auto),
|
lab = map(string, markers),
|
||||||
lab = map(string, markers),
|
bg = :linen,
|
||||||
bg = :linen,
|
xlim = (0, 10),
|
||||||
xlim = (0, 10),
|
ylim = (0, 10),
|
||||||
ylim = (0, 10),
|
)
|
||||||
)
|
end # testset
|
||||||
end # testset
|
@testset "Layout" begin
|
||||||
@testset "Layout" begin
|
plot(
|
||||||
plot(
|
Plots.fakedata(100, 10),
|
||||||
Plots.fakedata(100, 10),
|
layout = 4,
|
||||||
layout = 4,
|
palette = [:grays :blues :hot :rainbow],
|
||||||
palette = [:grays :blues :heat :lightrainbow],
|
bg_inside = [:orange :pink :darkblue :black],
|
||||||
bg_inside = [:orange :pink :darkblue :black],
|
)
|
||||||
)
|
end # testset
|
||||||
end # testset
|
@testset "Polar plots" begin
|
||||||
@testset "Polar plots" begin
|
Θ = range(0, stop = 1.5π, length = 100)
|
||||||
Θ = range(0, stop = 1.5π, length = 100)
|
r = abs.(0.1 * randn(100) + sin.(3Θ))
|
||||||
r = abs.(0.1 * randn(100) + sin.(3Θ))
|
plot(Θ, r, proj = :polar, m = 2)
|
||||||
plot(Θ, r, proj = :polar, m = 2)
|
end # testset
|
||||||
end # testset
|
@testset "Drawing shapes" begin
|
||||||
@testset "Drawing shapes" begin
|
verts = [
|
||||||
verts = [
|
(-1.0, 1.0),
|
||||||
(-1.0, 1.0),
|
(-1.28, 0.6),
|
||||||
(-1.28, 0.6),
|
(-0.2, -1.4),
|
||||||
(-0.2, -1.4),
|
(0.2, -1.4),
|
||||||
(0.2, -1.4),
|
(1.28, 0.6),
|
||||||
(1.28, 0.6),
|
(1.0, 1.0),
|
||||||
(1.0, 1.0),
|
(-1.0, 1.0),
|
||||||
(-1.0, 1.0),
|
(-0.2, -0.6),
|
||||||
(-0.2, -0.6),
|
(0.0, -0.2),
|
||||||
(0.0, -0.2),
|
(-0.4, 0.6),
|
||||||
(-0.4, 0.6),
|
(1.28, 0.6),
|
||||||
(1.28, 0.6),
|
(0.2, -1.4),
|
||||||
(0.2, -1.4),
|
(-0.2, -1.4),
|
||||||
(-0.2, -1.4),
|
(0.6, 0.2),
|
||||||
(0.6, 0.2),
|
(-0.2, 0.2),
|
||||||
(-0.2, 0.2),
|
(0.0, -0.2),
|
||||||
(0.0, -0.2),
|
(0.2, 0.2),
|
||||||
(0.2, 0.2),
|
(-0.2, -0.6),
|
||||||
(-0.2, -0.6),
|
]
|
||||||
]
|
x = 0.1:0.2:0.9
|
||||||
x = 0.1:0.2:0.9
|
y = 0.7 * rand(5) .+ 0.15
|
||||||
y = 0.7 * rand(5) .+ 0.15
|
plot(
|
||||||
plot(
|
x,
|
||||||
x,
|
y,
|
||||||
y,
|
line = (3, :dash, :lightblue),
|
||||||
line = (3, :dash, :lightblue),
|
marker = (Shape(verts), 30, RGBA(0, 0, 0, 0.2)),
|
||||||
marker = (Shape(verts), 30, RGBA(0, 0, 0, 0.2)),
|
bg = :pink,
|
||||||
bg = :pink,
|
fg = :darkblue,
|
||||||
fg = :darkblue,
|
xlim = (0, 1),
|
||||||
xlim = (0, 1),
|
ylim = (0, 1),
|
||||||
ylim = (0, 1),
|
leg = false,
|
||||||
leg = false,
|
)
|
||||||
)
|
end # testset
|
||||||
end # testset
|
@testset "Histogram 2D" begin
|
||||||
@testset "Histogram 2D" begin
|
histogram2d(randn(10000), randn(10000), nbins = 20)
|
||||||
histogram2d(randn(10000), randn(10000), nbins = 20)
|
end # testset
|
||||||
end # testset
|
@testset "Heatmap-like" begin
|
||||||
@testset "Heatmap-like" begin
|
xs = [string("x", i) for i in 1:10]
|
||||||
xs = [string("x", i) for i = 1:10]
|
ys = [string("y", i) for i in 1:4]
|
||||||
ys = [string("y", i) for i = 1:4]
|
z = float((1:4) * reshape(1:10, 1, :))
|
||||||
z = float((1:4) * reshape(1:10, 1, :))
|
pgfx_plot = heatmap(xs, ys, z, aspect_ratio = 1)
|
||||||
pgfx_plot = heatmap(xs, ys, z, aspect_ratio = 1)
|
Plots._update_plot_object(pgfx_plot)
|
||||||
Plots._update_plot_object(pgfx_plot)
|
if @test_nowarn(
|
||||||
if @test_nowarn(
|
haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true
|
||||||
haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true
|
)
|
||||||
)
|
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing
|
||||||
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing
|
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1"
|
||||||
@test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1"
|
end
|
||||||
end
|
|
||||||
|
|
||||||
pgfx_plot = wireframe(xs, ys, z, aspect_ratio = 1)
|
pgfx_plot = wireframe(xs, ys, z, aspect_ratio = 1)
|
||||||
# TODO: clims are wrong
|
# TODO: clims are wrong
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Contours" begin
|
@testset "Contours" begin
|
||||||
x = 1:0.5:20
|
x = 1:0.5:20
|
||||||
y = 1:0.5:10
|
y = 1:0.5:10
|
||||||
f(x, y) = begin
|
f(x, y) = begin
|
||||||
(3x + y^2) * abs(sin(x) + cos(y))
|
(3x + y^2) * abs(sin(x) + cos(y))
|
||||||
end
|
end
|
||||||
X = repeat(reshape(x, 1, :), length(y), 1)
|
X = repeat(reshape(x, 1, :), length(y), 1)
|
||||||
Y = repeat(y, 1, length(x))
|
Y = repeat(y, 1, length(x))
|
||||||
Z = map(f, X, Y)
|
Z = map(f, X, Y)
|
||||||
p2 = contour(x, y, Z)
|
p2 = contour(x, y, Z)
|
||||||
p1 = contour(x, y, f, fill = true)
|
p1 = contour(x, y, f, fill = true)
|
||||||
plot(p1, p2)
|
plot(p1, p2)
|
||||||
# TODO: colorbar for filled contours
|
# TODO: colorbar for filled contours
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Varying colors" begin
|
@testset "Varying colors" begin
|
||||||
t = range(0, stop = 1, length = 100)
|
t = range(0, stop = 1, length = 100)
|
||||||
θ = (6π) .* t
|
θ = (6π) .* t
|
||||||
x = t .* cos.(θ)
|
x = t .* cos.(θ)
|
||||||
y = t .* sin.(θ)
|
y = t .* sin.(θ)
|
||||||
p1 = plot(x, y, line_z = t, linewidth = 3, legend = false)
|
p1 = plot(x, y, line_z = t, linewidth = 3, legend = false)
|
||||||
p2 = scatter(
|
p2 = scatter(x, y, marker_z = ((x, y) -> begin
|
||||||
x,
|
|
||||||
y,
|
|
||||||
marker_z = ((x, y) -> begin
|
|
||||||
x + y
|
x + y
|
||||||
end),
|
end), color = :bwr, legend = false)
|
||||||
color = :bluesreds,
|
plot(p1, p2)
|
||||||
legend = false,
|
end # testset
|
||||||
)
|
@testset "Framestyles" begin
|
||||||
plot(p1, p2)
|
scatter(
|
||||||
end # testset
|
fill(randn(10), 6),
|
||||||
@testset "Framestyles" begin
|
fill(randn(10), 6),
|
||||||
scatter(
|
framestyle = [:box :semi :origin :zerolines :grid :none],
|
||||||
fill(randn(10), 6),
|
title = [":box" ":semi" ":origin" ":zerolines" ":grid" ":none"],
|
||||||
fill(randn(10), 6),
|
color = permutedims(1:6),
|
||||||
framestyle = [:box :semi :origin :zerolines :grid :none],
|
layout = 6,
|
||||||
title = [":box" ":semi" ":origin" ":zerolines" ":grid" ":none"],
|
label = "",
|
||||||
color = permutedims(1:6),
|
markerstrokewidth = 0,
|
||||||
layout = 6,
|
ticks = -2:2,
|
||||||
label = "",
|
)
|
||||||
markerstrokewidth = 0,
|
# TODO: support :semi
|
||||||
ticks = -2:2,
|
end # testset
|
||||||
)
|
@testset "Quiver" begin
|
||||||
# TODO: support :semi
|
x = (-2pi):0.2:(2 * pi)
|
||||||
end # testset
|
y = sin.(x)
|
||||||
@testset "Quiver" begin
|
|
||||||
x = (-2pi):0.2:(2 * pi)
|
|
||||||
y = sin.(x)
|
|
||||||
|
|
||||||
u = ones(length(x))
|
u = ones(length(x))
|
||||||
v = cos.(x)
|
v = cos.(x)
|
||||||
arrow_plot = plot(x, y, quiver = (u, v), arrow = true)
|
arrow_plot = plot(x, y, quiver = (u, v), arrow = true)
|
||||||
# TODO: could adjust limits to fit arrows if too long, but how?
|
# TODO: could adjust limits to fit arrows if too long, but how?
|
||||||
# TODO: get latex available on CI
|
# TODO: get latex available on CI
|
||||||
# mktempdir() do path
|
# mktempdir() do path
|
||||||
# @test_nowarn savefig(arrow_plot, path*"arrow.pdf")
|
# @test_nowarn savefig(arrow_plot, path*"arrow.pdf")
|
||||||
# end
|
# end
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Annotations" begin
|
@testset "Annotations" begin
|
||||||
y = rand(10)
|
y = rand(10)
|
||||||
pgfx_plot = plot(
|
pgfx_plot =
|
||||||
y,
|
plot(y, annotations = (3, y[3], Plots.text("this is \\#3", :left)), leg = false)
|
||||||
annotations = (3, y[3], Plots.text("this is \\#3", :left)),
|
Plots._update_plot_object(pgfx_plot)
|
||||||
leg = false,
|
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
||||||
)
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
Plots._update_plot_object(pgfx_plot)
|
@test length(nodes) == 1
|
||||||
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
mktempdir() do path
|
||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test length(nodes) == 1
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
mktempdir() do path
|
open(file_path) do io
|
||||||
file_path =joinpath(path,"annotations.tex")
|
lines = readlines(io)
|
||||||
@test_nowarn savefig(pgfx_plot, file_path)
|
@test count(s -> occursin("node", s), lines) == 1
|
||||||
open(file_path) do io
|
end
|
||||||
lines = readlines(io)
|
end
|
||||||
@test count(s -> occursin("node", s), lines) == 1
|
annotate!([
|
||||||
end
|
(5, y[5], Plots.text("this is \\#5", 16, :red, :center)),
|
||||||
end
|
(10, y[10], Plots.text("this is \\#10", :right, 20, "courier")),
|
||||||
annotate!([
|
])
|
||||||
(5, y[5], Plots.text("this is \\#5", 16, :red, :center)),
|
Plots._update_plot_object(pgfx_plot)
|
||||||
(10, y[10], Plots.text("this is \\#10", :right, 20, "courier")),
|
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
||||||
])
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
Plots._update_plot_object(pgfx_plot)
|
@test length(nodes) == 3
|
||||||
axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents
|
mktempdir() do path
|
||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test length(nodes) == 3
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
mktempdir() do path
|
open(file_path) do io
|
||||||
file_path =joinpath(path,"annotations.tex")
|
lines = readlines(io)
|
||||||
@test_nowarn savefig(pgfx_plot, file_path)
|
@test count(s -> occursin("node", s), lines) == 3
|
||||||
open(file_path) do io
|
end
|
||||||
lines = readlines(io)
|
end
|
||||||
@test count(s -> occursin("node", s), lines) == 3
|
annotation_plot = scatter!(
|
||||||
end
|
range(2, stop = 8, length = 6),
|
||||||
end
|
rand(6),
|
||||||
annotation_plot = scatter!(
|
marker = (50, 0.2, :orange),
|
||||||
range(2, stop = 8, length = 6),
|
series_annotations = [
|
||||||
rand(6),
|
"series",
|
||||||
marker = (50, 0.2, :orange),
|
"annotations",
|
||||||
series_annotations = [
|
"map",
|
||||||
"series",
|
"to",
|
||||||
"annotations",
|
"series",
|
||||||
"map",
|
Plots.text("data", :green),
|
||||||
"to",
|
],
|
||||||
"series",
|
)
|
||||||
Plots.text("data", :green),
|
Plots._update_plot_object(annotation_plot)
|
||||||
],
|
axis_content = Plots.pgfx_axes(annotation_plot.o)[1].contents
|
||||||
)
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
Plots._update_plot_object(annotation_plot)
|
@test length(nodes) == 9
|
||||||
axis_content = Plots.pgfx_axes(annotation_plot.o)[1].contents
|
mktempdir() do path
|
||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test length(nodes) == 9
|
@test_nowarn savefig(annotation_plot, file_path)
|
||||||
mktempdir() do path
|
open(file_path) do io
|
||||||
file_path =joinpath(path,"annotations.tex")
|
lines = readlines(io)
|
||||||
@test_nowarn savefig(annotation_plot, file_path)
|
@test count(s -> occursin("node", s), lines) == 9
|
||||||
open(file_path) do io
|
end
|
||||||
lines = readlines(io)
|
# test .tikz extension
|
||||||
@test count(s -> occursin("node", s), lines) == 9
|
file_path = joinpath(path, "annotations.tikz")
|
||||||
end
|
@test_nowarn savefig(annotation_plot, file_path)
|
||||||
end
|
@test_nowarn open(file_path) do io
|
||||||
end # testset
|
end
|
||||||
@testset "Ribbon" begin
|
end
|
||||||
aa = rand(10)
|
end # testset
|
||||||
bb = rand(10)
|
@testset "Ribbon" begin
|
||||||
cc = rand(10)
|
aa = rand(10)
|
||||||
conf = [aa - cc bb - cc]
|
bb = rand(10)
|
||||||
ribbon_plot =
|
cc = rand(10)
|
||||||
plot(collect(1:10), fill(1, 10), ribbon = (conf[:, 1], conf[:, 2]))
|
conf = [aa - cc bb - cc]
|
||||||
Plots._update_plot_object(ribbon_plot)
|
ribbon_plot = plot(collect(1:10), fill(1, 10), ribbon = (conf[:, 1], conf[:, 2]))
|
||||||
axis = Plots.pgfx_axes(ribbon_plot.o)[1]
|
Plots._update_plot_object(ribbon_plot)
|
||||||
plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents)
|
axis = Plots.pgfx_axes(ribbon_plot.o)[1]
|
||||||
@test length(plots) == 4
|
plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents)
|
||||||
@test !haskey(plots[1].options.dict, "fill")
|
@test length(plots) == 3
|
||||||
@test !haskey(plots[2].options.dict, "fill")
|
@test haskey(plots[1].options.dict, "fill")
|
||||||
@test !haskey(plots[3].options.dict, "fill")
|
@test haskey(plots[2].options.dict, "fill")
|
||||||
@test haskey(plots[4].options.dict, "fill")
|
@test !haskey(plots[3].options.dict, "fill")
|
||||||
@test ribbon_plot.o !== nothing
|
@test ribbon_plot.o !== nothing
|
||||||
@test ribbon_plot.o.the_plot !== nothing
|
@test ribbon_plot.o.the_plot !== nothing
|
||||||
# mktempdir() do path
|
end # testset
|
||||||
# @test_nowarn savefig(ribbon_plot, path*"ribbon.svg")
|
@testset "Markers and Paths" begin
|
||||||
# end
|
pl = plot(
|
||||||
end # testset
|
5 .- ones(9),
|
||||||
|
markershape = [:utriangle, :rect],
|
||||||
|
markersize = 8,
|
||||||
|
color = [:red, :black],
|
||||||
|
)
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
axis = Plots.pgfx_axes(pl.o)[1]
|
||||||
|
plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents)
|
||||||
|
@test length(plots) == 9
|
||||||
|
end # testset
|
||||||
|
@testset "Groups and Subplots" begin
|
||||||
|
group = rand(map((i -> begin
|
||||||
|
"group $(i)"
|
||||||
|
end), 1:4), 100)
|
||||||
|
pl = plot(
|
||||||
|
rand(100),
|
||||||
|
layout = @layout([a b; c]),
|
||||||
|
group = group,
|
||||||
|
linetype = [:bar :scatter :steppre],
|
||||||
|
linecolor = :match,
|
||||||
|
)
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
axis = Plots.pgfx_axes(pl.o)[1]
|
||||||
|
legend_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis.contents)
|
||||||
|
@test length(legend_entries) == 2
|
||||||
|
end
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "Extra kwargs" begin
|
||||||
|
pl = plot(1:5, test = "me")
|
||||||
|
@test pl[1][1].plotattributes[:extra_kwargs][:test] == "me"
|
||||||
|
pl = plot(1:5, test = "me", extra_kwargs = :subplot)
|
||||||
|
@test pl[1].attr[:extra_kwargs][:test] == "me"
|
||||||
|
pl = plot(1:5, test = "me", extra_kwargs = :plot)
|
||||||
|
@test pl.attr[:extra_plot_kwargs][:test] == "me"
|
||||||
|
pl = plot(
|
||||||
|
1:5,
|
||||||
|
extra_kwargs = Dict(
|
||||||
|
:plot => Dict(:test => "me"),
|
||||||
|
:series => Dict(:and => "me too"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
@test pl.attr[:extra_plot_kwargs][:test] == "me"
|
||||||
|
@test pl[1][1].plotattributes[:extra_kwargs][:and] == "me too"
|
||||||
|
pl = plot(
|
||||||
|
plot(1:5, title = "Line"),
|
||||||
|
scatter(
|
||||||
|
1:5,
|
||||||
|
title = "Scatter",
|
||||||
|
extra_kwargs = Dict(:subplot => Dict("axis line shift" => "10pt")),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
axes = Plots.pgfx_axes(pl.o)
|
||||||
|
@test !haskey(axes[1].options.dict, "axis line shift")
|
||||||
|
@test haskey(axes[2].options.dict, "axis line shift")
|
||||||
|
pl =
|
||||||
|
plot(x -> x, -1:1; add = raw"\node at (0,0.5) {\huge hi};", extra_kwargs = :subplot)
|
||||||
|
@test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};")
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
axes = Plots.pgfx_axes(pl.o)
|
||||||
|
@test filter(x -> x isa String, axes[1].contents)[1] ==
|
||||||
|
raw"\node at (0,0.5) {\huge hi};"
|
||||||
|
plot!(pl)
|
||||||
|
@test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};")
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
axes = Plots.pgfx_axes(pl.o)
|
||||||
|
@test filter(x -> x isa String, axes[1].contents)[1] ==
|
||||||
|
raw"\node at (0,0.5) {\huge hi};"
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "Titlefonts" begin
|
||||||
|
pl = plot(1:5, title = "Test me", titlefont = (2, :left))
|
||||||
|
@test pl[1][:title] == "Test me"
|
||||||
|
@test pl[1][:titlefontsize] == 2
|
||||||
|
@test pl[1][:titlefonthalign] == :left
|
||||||
|
Plots._update_plot_object(pl)
|
||||||
|
ax_opt = Plots.pgfx_axes(pl.o)[1].options
|
||||||
|
@test ax_opt["title"] == "Test me"
|
||||||
|
@test(haskey(ax_opt.dict, "title style")) isa Test.Pass
|
||||||
|
pl = plot(1:5, plot_title = "Test me", plot_titlefont = (2, :left))
|
||||||
|
@test pl[:plot_title] == "Test me"
|
||||||
|
@test pl[:plot_titlefontsize] == 2
|
||||||
|
@test pl[:plot_titlefonthalign] == :left
|
||||||
|
pl = heatmap(rand(3, 3), colorbar_title = "Test me", colorbar_titlefont = (12, :right))
|
||||||
|
@test pl[1][:colorbar_title] == "Test me"
|
||||||
|
@test pl[1][:colorbar_titlefontsize] == 12
|
||||||
|
@test pl[1][:colorbar_titlefonthalign] == :right
|
||||||
end # testset
|
end # testset
|
||||||
|
|||||||
38
test/test_pipeline.jl
Normal file
38
test/test_pipeline.jl
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using Plots, Test
|
||||||
|
using RecipesPipeline
|
||||||
|
|
||||||
|
@testset "plot" begin
|
||||||
|
pl = plot(1:5)
|
||||||
|
pl2 = plot(pl, tex_output_standalone = true)
|
||||||
|
@test pl[:tex_output_standalone] == false
|
||||||
|
@test pl2[:tex_output_standalone] == true
|
||||||
|
plot!(pl, tex_output_standalone = true)
|
||||||
|
@test pl[:tex_output_standalone] == true
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "get_axis_limits" begin
|
||||||
|
x = [0.1, 5]
|
||||||
|
p1 = plot(x, [5, 0.1], yscale = :log10)
|
||||||
|
p2 = plot!(identity)
|
||||||
|
@test all(RecipesPipeline.get_axis_limits(p1, :x) .== x)
|
||||||
|
@test all(RecipesPipeline.get_axis_limits(p2, :x) .== x)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Slicing" begin
|
||||||
|
@test plot(1:5, fillrange = 0)[1][1][:fillrange] == 0
|
||||||
|
data4 = rand(4, 4)
|
||||||
|
mat = reshape(1:8, 2, 4)
|
||||||
|
for i in axes(data4, 1)
|
||||||
|
for attribute in (:fillrange, :ribbon)
|
||||||
|
@test plot(data4; NamedTuple{tuple(attribute)}(0)...)[1][i][attribute] == 0
|
||||||
|
@test plot(data4; NamedTuple{tuple(attribute)}(Ref([1, 2]))...)[1][i][attribute] ==
|
||||||
|
[1.0, 2.0]
|
||||||
|
@test plot(data4; NamedTuple{tuple(attribute)}(Ref([1 2]))...)[1][i][attribute] ==
|
||||||
|
(iseven(i) ? 2 : 1)
|
||||||
|
@test plot(data4; NamedTuple{tuple(attribute)}(Ref(mat))...)[1][i][attribute] ==
|
||||||
|
[2(i - 1) + 1, 2i]
|
||||||
|
end
|
||||||
|
@test plot(data4, ribbon = (mat, mat))[1][i][:ribbon] ==
|
||||||
|
([2(i - 1) + 1, 2i], [2(i - 1) + 1, 2i])
|
||||||
|
end
|
||||||
|
end
|
||||||
64
test/test_plotly.jl
Normal file
64
test/test_plotly.jl
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Plotly" begin
|
||||||
|
@testset "Basic" begin
|
||||||
|
@test plotly() == Plots.PlotlyBackend()
|
||||||
|
@test backend() == Plots.PlotlyBackend()
|
||||||
|
|
||||||
|
p = plot(rand(10))
|
||||||
|
@test isa(p, Plots.Plot) == true
|
||||||
|
@test_nowarn Plots.plotly_series(plot())
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Contours" begin
|
||||||
|
x = (-2π):0.1:(2π)
|
||||||
|
y = (-π):0.1:π
|
||||||
|
z = cos.(y) .* sin.(x')
|
||||||
|
|
||||||
|
@testset "Contour numbers" begin
|
||||||
|
@testset "Default" begin
|
||||||
|
@test Plots.plotly_series(contour(x, y, z))[1][:ncontours] ==
|
||||||
|
Plots._series_defaults[:levels] + 2
|
||||||
|
end
|
||||||
|
@testset "Specified number" begin
|
||||||
|
@test Plots.plotly_series(contour(x, y, z, levels = 10))[1][:ncontours] ==
|
||||||
|
12
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Contour values" begin
|
||||||
|
@testset "Range" begin
|
||||||
|
levels = -1:0.5:1
|
||||||
|
p = contour(x, y, z, levels = levels)
|
||||||
|
@test p[1][1].plotattributes[:levels] == levels
|
||||||
|
@test Plots.plotly_series(p)[1][:contours][:start] == first(levels)
|
||||||
|
@test Plots.plotly_series(p)[1][:contours][:end] == last(levels)
|
||||||
|
@test Plots.plotly_series(p)[1][:contours][:size] == step(levels)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Set of contours" begin
|
||||||
|
levels = [-1, -0.25, 0, 0.25, 1]
|
||||||
|
levels_range =
|
||||||
|
range(first(levels), stop = last(levels), length = length(levels))
|
||||||
|
p = contour(x, y, z, levels = levels)
|
||||||
|
@test p[1][1].plotattributes[:levels] == levels
|
||||||
|
series_dict = @test_logs (
|
||||||
|
:warn,
|
||||||
|
"setting arbitrary contour levels with Plotly backend " *
|
||||||
|
"is not supported; use a range to set equally-spaced contours or an " *
|
||||||
|
"integer to set the approximate number of contours with the keyword " *
|
||||||
|
"`levels`. Setting levels to -1.0:0.5:1.0",
|
||||||
|
) Plots.plotly_series(p)
|
||||||
|
@test series_dict[1][:contours][:start] == first(levels_range)
|
||||||
|
@test series_dict[1][:contours][:end] == last(levels_range)
|
||||||
|
@test series_dict[1][:contours][:size] == step(levels_range)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@testset "Extra kwargs" begin
|
||||||
|
pl = plot(1:5, test = "me")
|
||||||
|
@test Plots.plotly_series(pl)[1][:test] == "me"
|
||||||
|
pl = plot(1:5, test = "me", extra_kwargs = :plot)
|
||||||
|
@test Plots.plotly_layout(pl)[:test] == "me"
|
||||||
|
end
|
||||||
|
end
|
||||||
61
test/test_recipes.jl
Normal file
61
test/test_recipes.jl
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
using Plots, Test
|
||||||
|
using OffsetArrays
|
||||||
|
|
||||||
|
@testset "User recipes" begin
|
||||||
|
struct LegendPlot end
|
||||||
|
@recipe function f(plot::LegendPlot)
|
||||||
|
legend --> :topleft
|
||||||
|
(1:3, 1:3)
|
||||||
|
end
|
||||||
|
pl = plot(LegendPlot(); legend = :right)
|
||||||
|
@test pl[1][:legend_position] == :right
|
||||||
|
pl = plot(LegendPlot())
|
||||||
|
@test pl[1][:legend_position] == :topleft
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "lens!" begin
|
||||||
|
pl = plot(1:5)
|
||||||
|
lens!(pl, [1, 2], [1, 2], inset = (1, bbox(0.0, 0.0, 0.2, 0.2)), colorbar = false)
|
||||||
|
@test length(pl.series_list) == 4
|
||||||
|
@test pl[2][:colorbar] == :none
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "vline, vspan" begin
|
||||||
|
vl = vline([1], widen = false)
|
||||||
|
@test Plots.xlims(vl) == (1, 2)
|
||||||
|
@test Plots.ylims(vl) == (1, 2)
|
||||||
|
vl = vline([1], xlims = (0, 2), widen = false)
|
||||||
|
@test Plots.xlims(vl) == (0, 2)
|
||||||
|
vl = vline([1], ylims = (-3, 5), widen = false)
|
||||||
|
@test Plots.ylims(vl) == (-3, 5)
|
||||||
|
|
||||||
|
vsp = vspan([1, 3], widen = false)
|
||||||
|
@test Plots.xlims(vsp) == (1, 3)
|
||||||
|
@test Plots.ylims(vsp) == (0, 1) # TODO: might be problematic on log-scales
|
||||||
|
vsp = vspan([1, 3], xlims = (-2, 5), widen = false)
|
||||||
|
@test Plots.xlims(vsp) == (-2, 5)
|
||||||
|
vsp = vspan([1, 3], ylims = (-2, 5), widen = false)
|
||||||
|
@test Plots.ylims(vsp) == (-2, 5)
|
||||||
|
end # testset
|
||||||
|
|
||||||
|
@testset "offset axes" begin
|
||||||
|
tri = OffsetVector(vcat(1:5, 4:-1:1), 11:19)
|
||||||
|
sticks = plot(tri, seriestype = :sticks)
|
||||||
|
@test length(sticks) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "framestyle axes" begin
|
||||||
|
pl = plot(-1:1, -1:1, -1:1)
|
||||||
|
sp = pl.subplots[1]
|
||||||
|
defaultret = Plots.axis_drawing_info_3d(sp, :x)
|
||||||
|
for letter in [:x, :y, :z]
|
||||||
|
for fr in [:box :semi :origin :zerolines :grid :none]
|
||||||
|
prevha = UInt64(0)
|
||||||
|
push!(sp.attr, :framestyle => fr)
|
||||||
|
ret = Plots.axis_drawing_info_3d(sp, letter)
|
||||||
|
ha = hash(string(ret))
|
||||||
|
@test ha != prevha
|
||||||
|
prevha = ha
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
138
test/test_shorthands.jl
Normal file
138
test/test_shorthands.jl
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
@testset "Shorthands" begin
|
||||||
|
@testset "Set Lims" begin
|
||||||
|
p = plot(rand(10))
|
||||||
|
|
||||||
|
xlims!((1, 20))
|
||||||
|
@test xlims(p) == (1, 20)
|
||||||
|
|
||||||
|
xlims!(p, (1, 21))
|
||||||
|
@test xlims(p) == (1, 21)
|
||||||
|
|
||||||
|
ylims!((-1, 1))
|
||||||
|
@test ylims(p) == (-1, 1)
|
||||||
|
|
||||||
|
ylims!(p, (-2, 2))
|
||||||
|
@test ylims(p) == (-2, 2)
|
||||||
|
|
||||||
|
zlims!((-1, 1))
|
||||||
|
@test zlims(p) == (-1, 1)
|
||||||
|
|
||||||
|
zlims!(p, (-2, 2))
|
||||||
|
@test zlims(p) == (-2, 2)
|
||||||
|
|
||||||
|
xlims!(-1, 11)
|
||||||
|
@test xlims(p) == (-1, 11)
|
||||||
|
|
||||||
|
xlims!(p, -2, 12)
|
||||||
|
@test xlims(p) == (-2, 12)
|
||||||
|
|
||||||
|
ylims!((-10, 10))
|
||||||
|
@test ylims(p) == (-10, 10)
|
||||||
|
|
||||||
|
ylims!(p, (-11, 9))
|
||||||
|
@test ylims(p) == (-11, 9)
|
||||||
|
|
||||||
|
zlims!((-10, 10))
|
||||||
|
@test zlims(p) == (-10, 10)
|
||||||
|
|
||||||
|
zlims!(p, (-9, 8))
|
||||||
|
@test zlims(p) == (-9, 8)
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Set Title / Labels" begin
|
||||||
|
p = plot()
|
||||||
|
title!(p, "Foo")
|
||||||
|
sp = p[1]
|
||||||
|
@test sp[:title] == "Foo"
|
||||||
|
xlabel!(p, "xlabel")
|
||||||
|
@test sp[:xaxis][:guide] == "xlabel"
|
||||||
|
ylabel!(p, "ylabel")
|
||||||
|
@test sp[:yaxis][:guide] == "ylabel"
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Misc" begin
|
||||||
|
p = plot()
|
||||||
|
sp = p[1]
|
||||||
|
|
||||||
|
xflip!(p)
|
||||||
|
@test sp[:xaxis][:flip]
|
||||||
|
|
||||||
|
yflip!(p)
|
||||||
|
@test sp[:yaxis][:flip]
|
||||||
|
|
||||||
|
xgrid!(p, true)
|
||||||
|
@test sp[:xaxis][:grid]
|
||||||
|
|
||||||
|
xgrid!(p, false)
|
||||||
|
@test !sp[:xaxis][:grid]
|
||||||
|
|
||||||
|
ygrid!(p, true)
|
||||||
|
@test sp[:yaxis][:grid]
|
||||||
|
|
||||||
|
ygrid!(p, false)
|
||||||
|
@test !sp[:yaxis][:grid]
|
||||||
|
|
||||||
|
ann = [(7, 3, "(7,3)"), (3, 7, text("hey", 14, :left, :top, :green))]
|
||||||
|
annotate!(p, ann)
|
||||||
|
annotate!(p, ann...)
|
||||||
|
|
||||||
|
xaxis!(p, true)
|
||||||
|
@test sp[:xaxis][:showaxis]
|
||||||
|
|
||||||
|
xaxis!(p, false)
|
||||||
|
@test !sp[:xaxis][:showaxis]
|
||||||
|
|
||||||
|
yaxis!(p, true)
|
||||||
|
@test sp[:yaxis][:showaxis]
|
||||||
|
|
||||||
|
yaxis!(p, false)
|
||||||
|
@test !sp[:yaxis][:showaxis]
|
||||||
|
|
||||||
|
p = plot3d([1, 2], [1, 2], [1, 2])
|
||||||
|
plot3d!(p, [3, 4], [3, 4], [3, 4])
|
||||||
|
@test Plots.series_list(p[1])[1][:seriestype] == :path3d
|
||||||
|
end
|
||||||
|
|
||||||
|
@testset "Set Ticks" begin
|
||||||
|
p = plot([0, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
||||||
|
sp = p[1]
|
||||||
|
|
||||||
|
xticks = 2:6
|
||||||
|
xticks!(xticks)
|
||||||
|
@test sp.attr[:xaxis][:ticks] == xticks
|
||||||
|
|
||||||
|
xticks = 1:5
|
||||||
|
xticks!(p, xticks)
|
||||||
|
@test sp.attr[:xaxis][:ticks] == xticks
|
||||||
|
|
||||||
|
yticks = 0.2:0.1:0.7
|
||||||
|
yticks!(yticks)
|
||||||
|
@test sp.attr[:yaxis][:ticks] == yticks
|
||||||
|
|
||||||
|
yticks = 0.1:0.5
|
||||||
|
yticks!(p, yticks)
|
||||||
|
@test sp.attr[:yaxis][:ticks] == yticks
|
||||||
|
|
||||||
|
xticks = [5, 6, 7.5]
|
||||||
|
xlabels = ["a", "b", "c"]
|
||||||
|
xticks!(xticks, xlabels)
|
||||||
|
@test sp.attr[:xaxis][:ticks] == (xticks, xlabels)
|
||||||
|
|
||||||
|
xticks = [5, 2]
|
||||||
|
xlabels = ["b", "a"]
|
||||||
|
xticks!(p, xticks, xlabels)
|
||||||
|
@test sp.attr[:xaxis][:ticks] == (xticks, xlabels)
|
||||||
|
|
||||||
|
yticks = [0.5, 0.6, 0.75]
|
||||||
|
ylabels = ["z", "y", "x"]
|
||||||
|
yticks!(yticks, ylabels)
|
||||||
|
@test sp.attr[:yaxis][:ticks] == (yticks, ylabels)
|
||||||
|
|
||||||
|
yticks = [0.5, 0.1]
|
||||||
|
ylabels = ["z", "y"]
|
||||||
|
yticks!(p, yticks, ylabels)
|
||||||
|
@test sp.attr[:yaxis][:ticks] == (yticks, ylabels)
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user