Compare commits
386
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43adbdbc79 | ||
|
|
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 |
@@ -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
|
||||||
@@ -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()'
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
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: "100"
|
||||||
|
PLOTS_TEST: "true"
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
version: # NOTE: the versions below should match those in your botconfig
|
||||||
|
- '1.5'
|
||||||
|
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: Install dependencies
|
||||||
|
run: |
|
||||||
|
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 ::set-env name=TESTCMD::"julia"
|
||||||
|
- name: Ubuntu TESTCMD
|
||||||
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
|
run: echo ::set-env name=TESTCMD::"xvfb-run --auto-servernum julia"
|
||||||
|
|
||||||
|
# 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: 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
|
||||||
|
title: "[AUTO] Update precompiles"
|
||||||
|
labels: SnoopCompile
|
||||||
|
branch: "SnoopCompile_AutoPR"
|
||||||
|
|
||||||
|
|
||||||
|
Skip:
|
||||||
|
if: "contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Skip CI 🚫
|
||||||
|
run: echo skip ci
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
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
|
||||||
|
|||||||
+16
-17
@@ -11,68 +11,67 @@ defaults:
|
|||||||
jobs:
|
jobs:
|
||||||
CI:
|
CI:
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
GKS_ENCODING: "utf8"
|
GKS_ENCODING: "utf8"
|
||||||
|
|
||||||
|
name: Julia ${{ matrix.version }} - ${{ matrix.os }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
continue-on-error: ${{ matrix.version == 'nightly' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
julia_version:
|
version:
|
||||||
- 'nightly'
|
|
||||||
- '1'
|
- '1'
|
||||||
- '1.0'
|
- 'nightly'
|
||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- windows-latest
|
- windows-latest
|
||||||
- macos-latest
|
- macos-latest
|
||||||
arch:
|
arch:
|
||||||
- x64
|
- x64
|
||||||
# - x32
|
# - x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
# Setup environment
|
# Setup environment
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: julia-actions/setup-julia@latest
|
- uses: julia-actions/setup-julia@latest
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia_version }}
|
version: ${{ matrix.version }}
|
||||||
- name: Cache artifacts
|
- name: Cache artifacts
|
||||||
uses: actions/cache@v1
|
uses: actions/cache@v1
|
||||||
env:
|
env:
|
||||||
cache-name: cache-artifacts
|
cache-name: cache-artifacts
|
||||||
with:
|
with:
|
||||||
path: ~/.julia/artifacts
|
path: ~/.julia/artifacts
|
||||||
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
|
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-test-${{ env.cache-name }}-
|
${{ runner.os }}-test-${{ env.cache-name }}-
|
||||||
${{ runner.os }}-test-
|
${{ runner.os }}-test-
|
||||||
${{ runner.os }}-
|
${{ runner.os }}-
|
||||||
|
|
||||||
# OS Dependencies
|
## maybe required if we ever want to run graphical tests for plotly
|
||||||
|
# OS Dependencies
|
||||||
# - name: Ubuntu OS dependencies
|
# - name: Ubuntu OS dependencies
|
||||||
# if: startsWith(matrix.os,'ubuntu')
|
# if: startsWith(matrix.os,'ubuntu')
|
||||||
# run: |
|
# run: |
|
||||||
# ./test/install_wkhtmltoimage.sh
|
# ./test/install_wkhtmltoimage.sh
|
||||||
|
|
||||||
# at-spi2-core, libgtk-3-dev, libgtk-3-0, and xvfb are already installed: https://github.com/actions/virtual-environments/blob/master/images/linux/scripts/installers/basic.sh
|
|
||||||
|
|
||||||
|
|
||||||
# TESTCMD
|
# TESTCMD
|
||||||
- name: Default TESTCMD
|
- name: Default TESTCMD
|
||||||
run: echo ::set-env name=TESTCMD::"julia"
|
run: echo ::set-env name=TESTCMD::"julia"
|
||||||
- name: Ubuntu TESTCMD
|
- name: Ubuntu TESTCMD
|
||||||
if: startsWith(matrix.os,'ubuntu')
|
if: startsWith(matrix.os,'ubuntu')
|
||||||
run: echo ::set-env name=TESTCMD::"xvfb-run julia"
|
run: echo ::set-env name=TESTCMD::"xvfb-run --auto-servernum julia"
|
||||||
|
|
||||||
# Julia Deoendencies
|
# Julia Dependencies
|
||||||
- name: Install Julia dependencies
|
- name: Install Julia dependencies
|
||||||
uses: julia-actions/julia-buildpkg@latest
|
uses: julia-actions/julia-buildpkg@latest
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
- name: Run Graphical test
|
- name: Run Graphical test
|
||||||
run: $TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true);'
|
run: $TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true);'
|
||||||
|
|
||||||
- name: Codecov
|
- name: Codecov
|
||||||
uses: julia-actions/julia-uploadcodecov@latest
|
uses: julia-actions/julia-uploadcodecov@latest
|
||||||
env:
|
env:
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
.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
|
||||||
|
|||||||
+16
-11
@@ -1,7 +1,7 @@
|
|||||||
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.3.7"
|
version = "1.9.0"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
|
||||||
@@ -10,12 +10,12 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
|||||||
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"
|
||||||
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
|
|
||||||
PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
|
PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
|
||||||
PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043"
|
PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043"
|
||||||
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
||||||
@@ -25,6 +25,7 @@ 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"
|
||||||
@@ -33,25 +34,27 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
|
|||||||
|
|
||||||
[compat]
|
[compat]
|
||||||
Contour = "0.5"
|
Contour = "0.5"
|
||||||
FFMPEG = "0.2, 0.3"
|
FFMPEG = "0.2, 0.3, 0.4"
|
||||||
FixedPointNumbers = "0.6, 0.7, 0.8"
|
FixedPointNumbers = "0.6, 0.7, 0.8"
|
||||||
GR = "0.46, 0.47, 0.48, 0.49, 0.50"
|
GR = "0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53"
|
||||||
GeometryTypes = "0.7, 0.8"
|
GeometryBasics = "0.2, 0.3.1"
|
||||||
JSON = "0.21"
|
JSON = "0.21, 1"
|
||||||
|
Latexify = "0.14"
|
||||||
Measures = "0.3"
|
Measures = "0.3"
|
||||||
NaNMath = "0.3"
|
NaNMath = "0.3"
|
||||||
PGFPlotsX = "1.2.0"
|
|
||||||
PlotThemes = "2"
|
PlotThemes = "2"
|
||||||
PlotUtils = "1"
|
PlotUtils = "1"
|
||||||
RecipesBase = "1"
|
RecipesBase = "1"
|
||||||
RecipesPipeline = "0.1.7"
|
RecipesPipeline = "0.2"
|
||||||
Reexport = "0.2"
|
Reexport = "0.2"
|
||||||
Requires = "1"
|
Requires = "1"
|
||||||
|
Scratch = "1"
|
||||||
Showoff = "0.3.1"
|
Showoff = "0.3.1"
|
||||||
StatsBase = "0.32, 0.33"
|
StatsBase = "0.32, 0.33"
|
||||||
julia = "1"
|
julia = "1.5"
|
||||||
|
|
||||||
[extras]
|
[extras]
|
||||||
|
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
|
||||||
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
|
||||||
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
|
||||||
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
||||||
@@ -61,11 +64,13 @@ 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"
|
||||||
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
|
||||||
|
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", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "HDF5", "RDatasets", "StaticArrays", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"]
|
test = ["Distributions", "FileIO", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "HDF5", "RDatasets", "StableRNGs", "StaticArrays", "StatsPlots", "Test", "TestImages", "UnicodePlots", "VisualRegressionTests"]
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
# Plots
|
# Plots
|
||||||
|
|
||||||

|
[gh-ci-img]: https://github.com/JuliaPlots/Plots.jl/workflows/ci/badge.svg?branch=master
|
||||||
|
[gh-ci-url]: https://github.com/JuliaPlots/Plots.jl/actions?query=workflow%3Aci
|
||||||
[travis-img]: https://img.shields.io/travis/JuliaPlots/Plots.jl?logo=travis
|
|
||||||
[travis-url]: https://travis-ci.org/JuliaPlots/Plots.jl
|
|
||||||
|
|
||||||
[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
|
||||||
@@ -17,8 +12,7 @@
|
|||||||
[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]: http://docs.juliaplots.org/latest/
|
||||||
|
|
||||||
[![][travis-img]][travis-url]
|
[![][gh-ci-img]][gh-ci-url]
|
||||||
[![][appveyor-img]][appveyor-url]
|
|
||||||
[![][pkgeval-img]][pkgeval-url]
|
[![][pkgeval-img]][pkgeval-url]
|
||||||
[](https://julialang.zulipchat.com/#narrow/stream/236493-plots)
|
[](https://julialang.zulipchat.com/#narrow/stream/236493-plots)
|
||||||
[![][docs-img]][docs-url]
|
[![][docs-img]][docs-url]
|
||||||
|
|||||||
@@ -0,0 +1,390 @@
|
|||||||
|
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(Plots.Type)),NamedTuple{(:label, :blank),Tuple{Symbol,Bool}},Type{Plots.EmptyLayout}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.Type)),NamedTuple{(:label, :width, :height),Tuple{Symbol,Symbol,Measures.Length{:pct,Float64}}},Type{Plots.EmptyLayout}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.Type)),NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.GRBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.Type)),NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.Type)),NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.GRBackend}}},Type{Plots.Subplot},Plots.GRBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.Type)),NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.PlotlyBackend}}},Type{Plots.Subplot},Plots.PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots._make_hist)),NamedTuple{(:normed, :weights),Tuple{Bool,Array{Int64,1}}},typeof(Plots._make_hist),Tuple{Array{Float64,1}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots._make_hist)),NamedTuple{(:normed, :weights),Tuple{Bool,Nothing}},typeof(Plots._make_hist),Tuple{Array{Float64,1},Array{Float64,1}},Int64})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots._make_hist)),NamedTuple{(:normed, :weights),Tuple{Bool,Nothing}},typeof(Plots._make_hist),Tuple{Array{Float64,1}},Symbol})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:flip,),Tuple{Bool}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:formatter,),Tuple{typeof(RecipesPipeline.datetimeformatter)}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:grid, :lims),Tuple{Bool,Tuple{Int64,Int64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:grid, :lims, :flip),Tuple{Bool,Tuple{Int64,Int64},Bool}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:grid,),Tuple{Bool}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:gridlinewidth, :grid, :gridalpha, :gridstyle, :foreground_color_grid),Tuple{Int64,Bool,Float64,Symbol,RGBA{Float64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:guide,),Tuple{String}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:lims, :flip, :ticks, :guide),Tuple{Tuple{Int64,Int64},Bool,StepRange{Int64,Int64},String}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:lims,),Tuple{Tuple{Float64,Float64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:lims,),Tuple{Tuple{Int64,Float64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:lims,),Tuple{Tuple{Int64,Int64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:rotation,),Tuple{Int64}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:scale, :guide),Tuple{Symbol,String}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.attr!)),NamedTuple{(:ticks,),Tuple{UnitRange{Int64}}},typeof(attr!),Plots.Axis})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.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(Plots.gr_polyline)),NamedTuple{(:arrowside, :arrowstyle),Tuple{Symbol,Symbol}},typeof(Plots.gr_polyline),Array{Int64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.gr_polyline)),NamedTuple{(:arrowside, :arrowstyle),Tuple{Symbol,Symbol}},typeof(Plots.gr_polyline),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.gr_polyline)),NamedTuple{(:arrowside, :arrowstyle),Tuple{Symbol,Symbol}},typeof(Plots.gr_polyline),StepRange{Int64,Int64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.gr_polyline)),NamedTuple{(:arrowside, :arrowstyle),Tuple{Symbol,Symbol}},typeof(Plots.gr_polyline),UnitRange{Int64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.gr_polyline)),NamedTuple{(:arrowside, :arrowstyle),Tuple{Symbol,Symbol}},typeof(Plots.gr_polyline),UnitRange{Int64},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.heatmap)),Any,typeof(heatmap),Any,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),Any,typeof(histogram),Any})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),Any,typeof(hline!),Any})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),Any,typeof(lens!),Any,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}},typeof(plot!),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:lw, :color),Tuple{Int64,Symbol}},typeof(plot!),Function,Float64,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:lw, :color),Tuple{Int64,Symbol}},typeof(plot!),Plots.Plot{Plots.GRBackend},Function,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}},typeof(plot!),Plots.Plot{Plots.GRBackend},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}},typeof(plot!),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:seriestype, :inset),Tuple{Symbol,Tuple{Int64,Measures.BoundingBox{Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}},Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}}}}}},typeof(plot!),Array{Int64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:seriestype, :inset),Tuple{Symbol,Tuple{Int64,Measures.BoundingBox{Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}},Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}}}}}},typeof(plot!),Plots.Plot{Plots.GRBackend},Array{Int64,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:seriestype, :inset),Tuple{Symbol,Tuple{Int64,Measures.BoundingBox{Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}},Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}}}}}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:seriestype,),Tuple{Symbol}},typeof(plot!),Array{Int64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:title,),Tuple{String}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Plots.Plot{Plots.GRBackend},Array{Float64,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:xgrid,),Tuple{Tuple{Symbol,Symbol,Int64,Symbol,Float64}}},typeof(plot!),Plots.Plot{Plots.GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}},typeof(plot!)})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String,Symbol}},typeof(plot!),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String,Symbol}},typeof(plot!),Plots.Plot{Plots.GRBackend},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String,Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:annotations, :leg),Tuple{Tuple{Int64,Float64,Plots.PlotText},Bool}},typeof(plot),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:aspect_ratio, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{String,1},Array{String,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:bins, :weights, :seriestype),Tuple{Symbol,Array{Int64,1},Symbol}},typeof(plot),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:color, :line, :marker),Tuple{Array{Symbol,2},Tuple{Symbol,Int64},Tuple{Array{Symbol,2},Int64,Float64,Plots.Stroke}}},typeof(plot),Array{Array{T,1} where T,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:connections, :seriestype),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}},Symbol}},typeof(plot),Array{Int64,1},Array{Int64,1},Vararg{Array{Int64,1},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.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}},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64},Symbol}},typeof(plot),Array{Array{Float64,1},1},Array{Array{Float64,1},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:grid, :title),Tuple{Tuple{Symbol,Symbol,Symbol,Int64,Float64},String}},typeof(plot),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}},typeof(plot),StepRange{Int64,Int64},Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend),Tuple{Array{String,2},String,String,Int64,Symbol}},typeof(plot),Array{Function,1},Float64,Vararg{Float64,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:label,),Tuple{Array{String,2}}},typeof(plot),Array{AbstractArray{Float64,1},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :group, :linetype, :linecolor),Tuple{Plots.GridLayout,Array{String,1},Array{Symbol,2},Symbol}},typeof(plot),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha),Tuple{Tuple{Int64,Int64},String,Int64,Float64}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha),Tuple{Tuple{Int64,Int64},String,Int64,Float64}},typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :link),Tuple{Int64,Symbol}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :link),Tuple{Int64,Symbol}},typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :palette, :bg_inside),Tuple{Int64,Array{PlotUtils.ContinuousColorGradient,2},Array{Symbol,2}}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border),Tuple{Plots.GridLayout,Array{Symbol,2},Bool,Nothing,Symbol}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation),Tuple{Plots.GridLayout,Array{String,2},Symbol,Array{Measures.Length{:mm,Float64},2},Measures.Length{:mm,Float64},Int64}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:layout, :xlims),Tuple{Plots.GridLayout,Tuple{Int64,Float64}}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:legend,),Tuple{Bool}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:legend,),Tuple{Bool}},typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:legend,),Tuple{Symbol}},typeof(plot),Array{Tuple{Int64,Real},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:legend,),Tuple{Symbol}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:legend,),Tuple{Symbol}},typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}},typeof(plot),Array{Array{T,1} where T,1},Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:line, :label, :legendtitle),Tuple{Tuple{Int64,Array{Symbol,2}},Array{String,2},String}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}},typeof(plot),Function,Function,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg),Tuple{Tuple{Int64,Symbol,Symbol},Tuple{Shape,Int64,RGBA{Float64}},Symbol,Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64},Bool}},typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:line_z, :linewidth, :legend),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Int64,Bool}},typeof(plot),Array{Float64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim, :seriestype),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64},Symbol}},typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:marker,),Tuple{Bool}},typeof(plot),Array{Union{Missing, Int64},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype),Tuple{typeof(+),Symbol,Bool,Symbol}},typeof(plot),Array{Float64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64,Symbol}},typeof(plot),Array{Complex{Float64},1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:proj, :m),Tuple{Symbol,Int64}},typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:projection, :seriestype),Tuple{Symbol,Symbol}},typeof(plot),Array{Int64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:quiver, :seriestype),Tuple{Tuple{Array{Float64,1},Array{Float64,1},Array{Float64,1}},Symbol}},typeof(plot),Array{Float64,1},Array{Float64,1},Vararg{Array{Float64,1},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Tuple{LinRange{Float64},LinRange{Float64}}}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color),Tuple{Array{Symbol,2},Array{Symbol,1},Int64,Array{Symbol,1}}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:seriestype,),Tuple{Symbol}},typeof(plot),Array{Dates.DateTime,1},UnitRange{Int64},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:seriestype,),Tuple{Symbol}},typeof(plot),Array{OHLC,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel),Tuple{Symbol,String,String,String}},typeof(plot),Array{Float64,1},Array{Float64,1},Vararg{Array{Float64,1},N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:title, :l, :seriestype),Tuple{String,Float64,Symbol}},typeof(plot),Array{String,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:title,),Tuple{Array{String,2}}},typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:title,),Tuple{Array{String,2}}},typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:title,),Tuple{String}},typeof(plot),Plots.Plot{Plots.GRBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:title,),Tuple{String}},typeof(plot),Plots.Plot{Plots.PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:xaxis, :background_color, :leg),Tuple{Tuple{String,Tuple{Int64,Int64},StepRange{Int64,Int64},Symbol},RGB{Float64},Bool}},typeof(plot),Array{Float64,2}})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:yflip, :aspect_ratio),Tuple{Bool,Symbol}},typeof(plot),Array{Float64,1},Array{Int64,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}},typeof(plot),Array{Float64,1},Array{Float64,1},Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),Any,typeof(scatter!),Any,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),Any,typeof(scatter!),Any})
|
||||||
|
Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol})
|
||||||
|
Base.precompile(Tuple{Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N})
|
||||||
|
Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}})
|
||||||
|
Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.contour_levels),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}},Base.RefValue{Tuple{Float64,Float64}}}},Base.OneTo{Int64},Int64,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Base.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.contour_levels),Tuple{Array{Any,1},Base.RefValue{Tuple{Float64,Float64}}}}})
|
||||||
|
Base.precompile(Tuple{typeof(Base.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_linecolor),Tuple{Array{Any,1},Base.RefValue{Tuple{Float64,Float64}}}}})
|
||||||
|
Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.leftpad)}})
|
||||||
|
Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,2},Base.Generator{Array{AbstractLayout,2},typeof(Plots._update_min_padding!)}})
|
||||||
|
Base.precompile(Tuple{typeof(Base.vect),Tuple{Int64,Float64,Plots.PlotText},Vararg{Tuple{Int64,Float64,Plots.PlotText},N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._bin_centers),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cbar_unique),Array{Int64,1},String})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cbar_unique),Array{Nothing,1},String})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cbar_unique),Array{PlotUtils.ContinuousColorGradient,1},String})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cbar_unique),Array{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},1},String})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cbar_unique),Array{Symbol,1},String})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cycle),Array{Float64,1},Array{Int64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cycle),Array{Float64,1},StepRange{Int64,Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cycle),Array{Float64,1},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cycle),Base.OneTo{Int64},Array{Int64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._cycle),StepRange{Int64,Int64},Array{Int64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._do_plot_show),Plots.Plot{Plots.GRBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._do_plot_show),Plots.Plot{Plots.PlotlyBackend},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._heatmap_edges),Array{Float64,1},Bool})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._preprocess_barlike),RecipesPipeline.DefaultsDict,Base.OneTo{Int64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._preprocess_binlike),RecipesPipeline.DefaultsDict,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._replace_markershape),Array{Symbol,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._update_min_padding!),Plots.GridLayout})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._update_subplot_args),Plots.Plot{Plots.GRBackend},Plots.Subplot{Plots.GRBackend},Dict{Symbol,Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._update_subplot_args),Plots.Plot{Plots.PlotlyBackend},Plots.Subplot{Plots.PlotlyBackend},Dict{Symbol,Any},Int64,Bool})
|
||||||
|
Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.build_layout),Plots.GridLayout,Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.convert_to_polar),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Tuple{Int64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.create_grid),Expr})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.error_coords),Array{Float64,1},Array{Float64,1},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.error_zipit),Tuple{Array{Float64,1},Array{Float64,1},Array{Float64,1}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.fakedata),Int64,Vararg{Int64,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_clims),Plots.Subplot{Plots.GRBackend},Plots.Series,Function})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_minor_ticks),Plots.Subplot{Plots.GRBackend},Plots.Axis,Tuple{Array{Float64,1},Array{String,1}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_minor_ticks),Plots.Subplot{Plots.GRBackend},Plots.Axis,Tuple{Array{Int64,1},Array{String,1}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_series_color),Array{Symbol,1},Plots.Subplot{Plots.GRBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_series_color),Array{Symbol,1},Plots.Subplot{Plots.PlotlyBackend},Int64,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.get_xy),Array{OHLC,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_add_legend),Plots.Subplot{Plots.GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor),NTuple{9,Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_add_legend),Plots.Subplot{Plots.GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor),Tuple{Int64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64}},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_display),Plots.Subplot{Plots.GRBackend},Measures.Length{:mm,Float64},Measures.Length{:mm,Float64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_colorbar),Plots.GRColorbar,Plots.Subplot{Plots.GRBackend},Tuple{Float64,Float64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_contour),Plots.Series,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_grid),Plots.Subplot{Plots.GRBackend},Plots.Axis,Segments{Tuple{Float64,Float64}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_heatmap),Plots.Series,Array{Float64,1},Array{Float64,1},Array{Float64,2},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_heatmap),Plots.Series,Base.OneTo{Int64},Base.OneTo{Int64},Array{Float64,2},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_markers),Plots.Series,Array{Int64,1},Array{Float64,1},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_markers),Plots.Series,Base.OneTo{Int64},Array{Float64,1},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_markers),Plots.Series,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Array{Float64,1},Array{Float64,1},Int64,Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Base.OneTo{Int64},Array{Float64,1},Nothing,Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,StepRange{Int64,Int64},Array{Float64,1},Int64,Tuple{Float64,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_get_ticks_size),Tuple{Array{Float64,1},Array{Any,1}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_get_ticks_size),Tuple{Array{Float64,1},Array{String,1}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_get_ticks_size),Tuple{Array{Int64,1},Array{String,1}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_label_ticks),Plots.Subplot{Plots.GRBackend},Symbol,Tuple{Array{Float64,1},Array{String,1}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_label_ticks_3d),Plots.Subplot{Plots.GRBackend},Symbol,Tuple{Array{Float64,1},Array{String,1}}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.gr_set_gradient),PlotUtils.ContinuousColorGradient})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.heatmap_edges),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.heatmap_edges),UnitRange{Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.ignorenan_extrema),StepRange{Int64,Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.ignorenan_minimum),Array{Int64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.is_marker_supported),Plots.PlotlyBackend,Array{Symbol,1}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.layout_args),Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.make_fillrange_side),UnitRange{Int64},LinRange{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.optimal_ticks_and_labels),Plots.Subplot{Plots.GRBackend},Plots.Axis,StepRange{Int64,Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.optimal_ticks_and_labels),Plots.Subplot{Plots.GRBackend},Plots.Axis,UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processFontArg!),Dict{Symbol,Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processGridArg!),Dict{Symbol,Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processGridArg!),RecipesPipeline.DefaultsDict,Bool,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processLineArg),Dict{Symbol,Any},Array{Symbol,2}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processLineArg),Dict{Symbol,Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Array{Symbol,2}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Plots.Stroke})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},RGBA{Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Shape})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.process_annotation),Plots.Subplot{Plots.GRBackend},Int64,Float64,Plots.PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.process_annotation),Plots.Subplot{Plots.PlotlyBackend},Int64,Float64,Plots.PlotText})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.process_axis_arg!),Dict{Symbol,Any},StepRange{Int64,Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.process_axis_arg!),Dict{Symbol,Any},Symbol,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.process_axis_arg!),Dict{Symbol,Any},Tuple{Int64,Int64},Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.quiver_using_arrows),RecipesPipeline.DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.quiver_using_hack),RecipesPipeline.DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.reset_axis_defaults_byletter!)})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Array{Measures.Length{:mm,Float64},2},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Array{PlotUtils.ContinuousColorGradient,2},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Array{RGBA{Float64},2},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Array{String,2},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Array{Symbol,2},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.slice_arg),Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(Plots.straightline_data),Tuple{Float64,Float64},Tuple{Float64,Float64},Array{Float64,1},Array{Float64,1},Int64})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol,Any},AbstractArray{OHLC,1}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol,Any},Array{Complex{Float64},1}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol,Any},Plots.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{: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{: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{:sticks}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol,Any},Type{Val{:xerror}},Any,Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline._finish_userrecipe!),Plots.Plot{Plots.GRBackend},Array{Dict{Symbol,Any},1},RecipeData})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline._finish_userrecipe!),Plots.Plot{Plots.PlotlyBackend},Array{Dict{Symbol,Any},1},RecipeData})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Array{Dict{Symbol,Any},1}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Array{Dict{Symbol,Any},1}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plots.Plot{Plots.GRBackend},Array{Dict{Symbol,Any},1},Dict{Symbol,Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plots.Plot{Plots.PlotlyBackend},Array{Dict{Symbol,Any},1},Dict{Symbol,Any}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Array{GeometryBasics.Point{2,Float64},1}})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,String})
|
||||||
|
Base.precompile(Tuple{typeof(backend),Plots.PlotlyBackend})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
|
||||||
|
Base.precompile(Tuple{typeof(bbox),Measures.Length{:mm,Float64},Measures.Length{:mm,Float64},Measures.Length{:mm,Float64},Measures.Length{:mm,Float64}})
|
||||||
|
Base.precompile(Tuple{typeof(contour),Any,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Array{Any,1}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_linealpha),Tuple{Array{Any,1}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_linestyle),Tuple{Array{Any,1}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_linewidth),Tuple{Array{Any,1}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{2},Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},2}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.Style{Tuple},Nothing,typeof(string),Tuple{Base.Broadcast.Broadcasted{Base.Broadcast.Style{Tuple},Nothing,typeof(typeof),Tuple{Tuple{Plots.PortfolioComposition}}}}}})
|
||||||
|
Base.precompile(Tuple{typeof(copy),Base.Broadcast.Broadcasted{Base.Broadcast.Style{Tuple},Nothing,typeof(string),Tuple{Base.Broadcast.Broadcasted{Base.Broadcast.Style{Tuple},Nothing,typeof(typeof),Tuple{Tuple{Plots.Spy}}}}}})
|
||||||
|
Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}})
|
||||||
|
Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(iter_segments),Array{Float64,1},Array{Float64,1},UnitRange{Int64}})
|
||||||
|
Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(merge),NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}})
|
||||||
|
Base.precompile(Tuple{typeof(merge),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},NamedTuple{(:seriestype,),Tuple{Symbol}}})
|
||||||
|
Base.precompile(Tuple{typeof(pairs),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}}})
|
||||||
|
Base.precompile(Tuple{typeof(plot!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Any,Any})
|
||||||
|
Base.precompile(Tuple{typeof(plot),Any})
|
||||||
|
Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}})
|
||||||
|
Base.precompile(Tuple{typeof(spy),Any})
|
||||||
|
Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(text),String,Int64,Symbol,Vararg{Symbol,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(text),String,Symbol,Int64,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(text),String,Symbol})
|
||||||
|
Base.precompile(Tuple{typeof(title!),AbstractString})
|
||||||
|
Base.precompile(Tuple{typeof(vcat),Array{Any,1},Array{Tuple{Int64,Float64,Plots.PlotText},1}})
|
||||||
|
Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}})
|
||||||
|
Base.precompile(Tuple{typeof(vline!),Any})
|
||||||
|
Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N})
|
||||||
|
Base.precompile(Tuple{typeof(yaxis!),Any,Any})
|
||||||
|
let fbody = try __lookup_kwbody__(which(Plots.text, (String,Int64,Vararg{Any,N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(text),String,Int64,Vararg{Any,N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(Plots.text, (String,Symbol,Vararg{Any,N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(text),String,Symbol,Vararg{Any,N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(Plots.title!, (AbstractString,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(title!),AbstractString,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(Plots.vline!, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(vline!),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(Plots.yaxis!, (Any,Vararg{Any,N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(yaxis!),Any,Vararg{Any,N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot!),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.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(RecipesBase.plot, (Any,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Any,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.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(RecipesBase.plot, (Plots.Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Plots.Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Plots.Plot,Plots.Plot,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Plots.Plot,Plots.Plot,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Plots.Plot,Plots.Plot,Vararg{Plots.Plot,N} where N,))) catch missing end
|
||||||
|
if !ismissing(fbody)
|
||||||
|
precompile(fbody, (Any,typeof(plot),Plots.Plot,Plots.Plot,Vararg{Plots.Plot,N} where N,))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
+4
@@ -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)
|
||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
using CompileBot
|
||||||
|
|
||||||
|
snoop_bench(
|
||||||
|
BotConfig(
|
||||||
|
"Plots",
|
||||||
|
yml_path= "SnoopCompile.yml",
|
||||||
|
else_os = "linux",
|
||||||
|
else_version = "1.5",
|
||||||
|
),
|
||||||
|
joinpath(@__DIR__, "precompile_script.jl"),
|
||||||
|
)
|
||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
using CompileBot
|
||||||
|
|
||||||
|
snoop_bot(
|
||||||
|
BotConfig(
|
||||||
|
"Plots",
|
||||||
|
yml_path= "SnoopCompile.yml",
|
||||||
|
else_os = "linux",
|
||||||
|
else_version = "1.5",
|
||||||
|
),
|
||||||
|
joinpath(@__DIR__, "precompile_script.jl"),
|
||||||
|
)
|
||||||
Vendored
-18
@@ -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
|
|
||||||
Vendored
-55
@@ -1,55 +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",
|
|
||||||
"OffsetArrays",
|
|
||||||
"SparseArrays",
|
|
||||||
"StaticArrays",
|
|
||||||
r"#{1,2}[^\"#]+#{1,2}\d+",
|
|
||||||
]
|
|
||||||
|
|
||||||
data = SnoopCompile.read(log_path)
|
|
||||||
pc = SnoopCompile.parcel(reverse!(data[2]), blacklist=blacklist)
|
|
||||||
SnoopCompile.write(precompiles_path, pc)
|
|
||||||
+17
-19
@@ -8,9 +8,9 @@ const _current_plots_version = VersionNumber(split(first(filter(line -> occursin
|
|||||||
|
|
||||||
using Reexport
|
using Reexport
|
||||||
|
|
||||||
import GeometryTypes
|
import GeometryBasics
|
||||||
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
|
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
|
||||||
import SparseArrays: AbstractSparseMatrix, findnz
|
using SparseArrays
|
||||||
|
|
||||||
using FFMPEG
|
using FFMPEG
|
||||||
|
|
||||||
@@ -25,17 +25,6 @@ import JSON
|
|||||||
|
|
||||||
using Requires
|
using Requires
|
||||||
|
|
||||||
if isfile(joinpath(@__DIR__, "..", "deps", "deps.jl"))
|
|
||||||
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,
|
||||||
@@ -124,7 +113,11 @@ export
|
|||||||
center,
|
center,
|
||||||
BezierCurve,
|
BezierCurve,
|
||||||
|
|
||||||
plotattr
|
plotattr,
|
||||||
|
scalefontsize,
|
||||||
|
scalefontsizes,
|
||||||
|
resetfontsizes
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
@@ -161,6 +154,12 @@ 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.:*(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
|
||||||
|
|
||||||
@@ -190,9 +189,9 @@ import RecipesPipeline: SliceIt,
|
|||||||
|
|
||||||
include("types.jl")
|
include("types.jl")
|
||||||
include("utils.jl")
|
include("utils.jl")
|
||||||
include("components.jl")
|
|
||||||
include("axes.jl")
|
include("axes.jl")
|
||||||
include("args.jl")
|
include("args.jl")
|
||||||
|
include("components.jl")
|
||||||
include("themes.jl")
|
include("themes.jl")
|
||||||
include("plot.jl")
|
include("plot.jl")
|
||||||
include("pipeline.jl")
|
include("pipeline.jl")
|
||||||
@@ -225,8 +224,8 @@ let PlotOrSubplot = Union{Plot, Subplot}
|
|||||||
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,
|
global yticks!(plt::PlotOrSubplot,
|
||||||
@@ -246,7 +245,6 @@ end
|
|||||||
|
|
||||||
const CURRENT_BACKEND = CurrentBackend(:none)
|
const CURRENT_BACKEND = CurrentBackend(:none)
|
||||||
|
|
||||||
include("precompile.jl")
|
include("precompile_includer.jl")
|
||||||
_precompile_()
|
|
||||||
|
|
||||||
end # module
|
end # module
|
||||||
|
|||||||
+3
-3
@@ -90,15 +90,15 @@ function buildanimation(anim::Animation, fn::AbstractString,
|
|||||||
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 -loop $loop -y $fn`)
|
||||||
end
|
end
|
||||||
|
|
||||||
show_msg && @info("Saved animation to ", fn)
|
show_msg && @info("Saved animation to ", fn)
|
||||||
|
|||||||
+3
-3
@@ -59,7 +59,7 @@ const _arg_desc = KW(
|
|||||||
:foreground_color => "Color Type. Base color for all foregrounds.",
|
:foreground_color => "Color Type. Base color for all foregrounds.",
|
||||||
:size => "NTuple{2,Int}. (width_px, height_px) of the whole Plot",
|
:size => "NTuple{2,Int}. (width_px, height_px) of the whole Plot",
|
||||||
:pos => "NTuple{2,Int}. (left_px, top_px) position of the GUI window (note: currently unimplemented)",
|
:pos => "NTuple{2,Int}. (left_px, top_px) position of the GUI window (note: currently unimplemented)",
|
||||||
:window_title => "String. Title of the window.",
|
:window_title => "String. Title of the standalone gui-window.",
|
||||||
:show => "Bool. Should this command open/refresh a GUI/display? This allows displaying in scripts or functions without explicitly calling `display`",
|
:show => "Bool. Should this command open/refresh a GUI/display? This allows displaying in scripts or functions without explicitly calling `display`",
|
||||||
: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.",
|
: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.",
|
||||||
: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).",
|
: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).",
|
||||||
@@ -90,7 +90,7 @@ const _arg_desc = KW(
|
|||||||
:foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
|
:foreground_color_legend => "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 => "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`; `: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.",
|
:legendfontfamily => "String or Symbol. Font family of legend entries.",
|
||||||
:legendfontsize => "Integer. Font pointsize of legend entries.",
|
:legendfontsize => "Integer. Font pointsize of legend entries.",
|
||||||
:legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
|
:legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
|
||||||
@@ -110,7 +110,7 @@ const _arg_desc = KW(
|
|||||||
:legendtitlefont => "Font. Font of the legend title.",
|
:legendtitlefont => "Font. Font of the legend title.",
|
||||||
: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.",
|
: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.",
|
||||||
:projection => "Symbol or String. '3d' or 'polar'",
|
:projection => "Symbol or String. '3d' or 'polar'",
|
||||||
:aspect_ratio => "Symbol (:equal) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units.",
|
: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.",
|
: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.",
|
: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.",
|
:top_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the top of the subplot.",
|
||||||
|
|||||||
+194
-32
@@ -1,26 +1,46 @@
|
|||||||
|
function makeplural(s::Symbol)
|
||||||
|
str = string(s)
|
||||||
|
if last(str) != 's'
|
||||||
|
return Symbol(string(s,"s"))
|
||||||
|
end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
|
function make_non_underscore(s::Symbol)
|
||||||
|
str = string(s)
|
||||||
|
str = replace(str, "_" => "")
|
||||||
|
return Symbol(str)
|
||||||
|
end
|
||||||
|
|
||||||
const _keyAliases = Dict{Symbol,Symbol}()
|
const _keyAliases = Dict{Symbol,Symbol}()
|
||||||
|
|
||||||
function add_aliases(sym::Symbol, aliases::Symbol...)
|
function add_aliases(sym::Symbol, aliases::Symbol...)
|
||||||
for alias in aliases
|
for alias in aliases
|
||||||
if haskey(_keyAliases, alias)
|
if haskey(_keyAliases, alias) || alias === sym
|
||||||
error("Already an alias $alias => $(_keyAliases[alias])... can't also alias $sym")
|
return nothing
|
||||||
end
|
end
|
||||||
_keyAliases[alias] = sym
|
_keyAliases[alias] = sym
|
||||||
end
|
end
|
||||||
|
return nothing
|
||||||
end
|
end
|
||||||
|
|
||||||
function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol})
|
function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol})
|
||||||
for (k,v) in aliases
|
for (k,v) in aliases
|
||||||
s = string(k)
|
s = string(k)
|
||||||
if '_' in s
|
if '_' in s
|
||||||
aliases[Symbol(replace(s, "_" => ""))] = v
|
aliases[make_non_underscore(k)] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol}, args::Vector{Symbol})
|
||||||
|
for arg in args
|
||||||
|
s = string(arg)
|
||||||
|
if '_' in s
|
||||||
|
aliases[make_non_underscore(arg)] = arg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
const _allAxes = [:auto, :left, :right]
|
const _allAxes = [:auto, :left, :right]
|
||||||
@@ -31,7 +51,7 @@ const _axesAliases = Dict{Symbol,Symbol}(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const _3dTypes = [
|
const _3dTypes = [
|
||||||
:path3d, :scatter3d, :surface, :wireframe, :contour3d, :volume
|
:path3d, :scatter3d, :surface, :wireframe, :contour3d, :volume, :mesh3d
|
||||||
]
|
]
|
||||||
const _allTypes = vcat([
|
const _allTypes = vcat([
|
||||||
:none, :line, :path, :steppre, :steppost, :sticks, :scatter,
|
:none, :line, :path, :steppre, :steppost, :sticks, :scatter,
|
||||||
@@ -104,6 +124,31 @@ const _styleAliases = Dict{Symbol,Symbol}(
|
|||||||
:ddd => :dashdotdot,
|
:ddd => :dashdotdot,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const _shape_keys = Symbol[
|
||||||
|
:circle,
|
||||||
|
:rect,
|
||||||
|
:star5,
|
||||||
|
:diamond,
|
||||||
|
:hexagon,
|
||||||
|
:cross,
|
||||||
|
:xcross,
|
||||||
|
:utriangle,
|
||||||
|
:dtriangle,
|
||||||
|
:rtriangle,
|
||||||
|
:ltriangle,
|
||||||
|
:pentagon,
|
||||||
|
:heptagon,
|
||||||
|
:octagon,
|
||||||
|
:star4,
|
||||||
|
:star6,
|
||||||
|
:star7,
|
||||||
|
:star8,
|
||||||
|
:vline,
|
||||||
|
:hline,
|
||||||
|
:+,
|
||||||
|
:x,
|
||||||
|
]
|
||||||
|
|
||||||
const _allMarkers = vcat(:none, :auto, _shape_keys) #sort(collect(keys(_shapes))))
|
const _allMarkers = vcat(:none, :auto, _shape_keys) #sort(collect(keys(_shapes))))
|
||||||
const _markerAliases = Dict{Symbol,Symbol}(
|
const _markerAliases = Dict{Symbol,Symbol}(
|
||||||
:n => :none,
|
:n => :none,
|
||||||
@@ -228,7 +273,7 @@ const _bar_width = 0.8
|
|||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
const _series_defaults = KW(
|
const _series_defaults = KW(
|
||||||
:label => "AUTO",
|
:label => :auto,
|
||||||
:colorbar_entry => true,
|
:colorbar_entry => true,
|
||||||
:seriescolor => :auto,
|
:seriescolor => :auto,
|
||||||
:seriesalpha => nothing,
|
:seriesalpha => nothing,
|
||||||
@@ -273,20 +318,26 @@ const _series_defaults = KW(
|
|||||||
:show_empty_bins => false, # should empty bins in 2D histogram be colored as zero (otherwise they are transparent)
|
:show_empty_bins => false, # should empty bins in 2D histogram be colored as zero (otherwise they are transparent)
|
||||||
:contours => false, # add contours to 3d surface and wireframe plots
|
:contours => false, # add contours to 3d surface and wireframe plots
|
||||||
:contour_labels => false,
|
:contour_labels => false,
|
||||||
:match_dimensions => false, # do rows match x (true) or y (false) for heatmap/image/spy? see issue 196
|
|
||||||
# this ONLY effects whether or not the z-matrix is transposed for a heatmap display!
|
|
||||||
:subplot => :auto, # which subplot(s) does this series belong to?
|
:subplot => :auto, # which subplot(s) does this series belong to?
|
||||||
:series_annotations => nothing, # a list of annotations which apply to the coordinates of this series
|
:series_annotations => nothing, # a list of annotations which apply to the coordinates of this series
|
||||||
:primary => true, # when true, this "counts" as a series for color selection, etc. the main use is to allow
|
:primary => true, # when true, this "counts" as a series for color selection, etc. the main use is to allow
|
||||||
# one logical series to be broken up (path and markers, for example)
|
# one logical series to be broken up (path and markers, for example)
|
||||||
:hover => nothing, # text to display when hovering over the data points
|
:hover => nothing, # text to display when hovering over the data points
|
||||||
:stride => (1,1), # array stride for wireframe/surface, the first element is the row stride and the second is the column stride.
|
:stride => (1,1), # array stride for wireframe/surface, the first element is the row stride and the second is the column stride.
|
||||||
|
:connections => nothing, # tuple of arrays to specifiy connectivity of a 3d mesh
|
||||||
:extra_kwargs => Dict()
|
:extra_kwargs => Dict()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
const _plot_defaults = KW(
|
const _plot_defaults = KW(
|
||||||
:plot_title => "",
|
:plot_title => "",
|
||||||
|
:plot_titlefontsize => 16,
|
||||||
|
:plot_title_location => :center, # also :left or :right
|
||||||
|
:plot_titlefontfamily => :match,
|
||||||
|
:plot_titlefonthalign => :hcenter,
|
||||||
|
:plot_titlefontvalign => :vcenter,
|
||||||
|
:plot_titlefontrotation => 0.0,
|
||||||
|
:plot_titlefontcolor => :match,
|
||||||
:background_color => colorant"white", # default for all backgrounds,
|
:background_color => colorant"white", # default for all backgrounds,
|
||||||
:background_color_outside => :match, # background outside grid,
|
:background_color_outside => :match, # background outside grid,
|
||||||
:foreground_color => :auto, # default for all foregrounds, and title color,
|
:foreground_color => :auto, # default for all foregrounds, and title color,
|
||||||
@@ -353,10 +404,18 @@ const _subplot_defaults = KW(
|
|||||||
:right_margin => :match,
|
:right_margin => :match,
|
||||||
:bottom_margin => :match,
|
:bottom_margin => :match,
|
||||||
:subplot_index => -1,
|
:subplot_index => -1,
|
||||||
:colorbar_title => "",
|
:colorbar_title => "",
|
||||||
:framestyle => :axes,
|
:colorbar_titlefontsize => 10,
|
||||||
:camera => (30,30),
|
:colorbar_title_location => :center, # also :left or :right
|
||||||
:extra_kwargs => Dict()
|
:colorbar_fontfamily => :match,
|
||||||
|
:colorbar_titlefontfamily => :match,
|
||||||
|
:colorbar_titlefonthalign => :hcenter,
|
||||||
|
:colorbar_titlefontvalign => :vcenter,
|
||||||
|
:colorbar_titlefontrotation => 0.0,
|
||||||
|
:colorbar_titlefontcolor => :match,
|
||||||
|
:framestyle => :axes,
|
||||||
|
:camera => (30,30),
|
||||||
|
:extra_kwargs => Dict()
|
||||||
)
|
)
|
||||||
|
|
||||||
const _axis_defaults = KW(
|
const _axis_defaults = KW(
|
||||||
@@ -461,7 +520,7 @@ const _subplot_args = sort(union(collect(keys(_subplot_defaults))))
|
|||||||
const _plot_args = sort(union(collect(keys(_plot_defaults))))
|
const _plot_args = sort(union(collect(keys(_plot_defaults))))
|
||||||
|
|
||||||
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
|
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
|
||||||
const _magic_subplot_args = [:titlefont, :legendfont, :legendtitlefont, ]
|
const _magic_subplot_args = [:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont]
|
||||||
const _magic_series_args = [:line, :marker, :fill]
|
const _magic_series_args = [:line, :marker, :fill]
|
||||||
|
|
||||||
const _all_axis_args = sort(union([_axis_args; _magic_axis_args]))
|
const _all_axis_args = sort(union([_axis_args; _magic_axis_args]))
|
||||||
@@ -470,7 +529,7 @@ const _all_series_args = sort(union([_series_args; _magic_series_args]))
|
|||||||
const _all_plot_args = _plot_args
|
const _all_plot_args = _plot_args
|
||||||
|
|
||||||
const _all_args =
|
const _all_args =
|
||||||
sort([_all_axis_args; _all_subplot_args; _all_series_args; _all_plot_args])
|
sort(union([_all_axis_args; _all_subplot_args; _all_series_args; _all_plot_args]))
|
||||||
|
|
||||||
is_subplot_attr(k) = k in _all_subplot_args
|
is_subplot_attr(k) = k in _all_subplot_args
|
||||||
is_series_attr(k) = k in _all_series_args
|
is_series_attr(k) = k in _all_series_args
|
||||||
@@ -481,9 +540,6 @@ RecipesBase.is_key_supported(k::Symbol) = is_attr_supported(k)
|
|||||||
is_default_attribute(k) = k in _internal_args || k in _all_args || is_axis_attr_noletter(k)
|
is_default_attribute(k) = k in _internal_args || k in _all_args || is_axis_attr_noletter(k)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
makeplural(s::Symbol) = Symbol(string(s,"s"))
|
|
||||||
|
|
||||||
autopick_ignore_none_auto(arr::AVec, idx::Integer) = _cycle(setdiff(arr, [:none, :auto]), idx)
|
autopick_ignore_none_auto(arr::AVec, idx::Integer) = _cycle(setdiff(arr, [:none, :auto]), idx)
|
||||||
autopick_ignore_none_auto(notarr, idx::Integer) = notarr
|
autopick_ignore_none_auto(notarr, idx::Integer) = notarr
|
||||||
|
|
||||||
@@ -502,6 +558,13 @@ end
|
|||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# margin
|
||||||
|
add_aliases(:left_margin , :leftmargin )
|
||||||
|
add_aliases(:top_margin , :topmargin)
|
||||||
|
add_aliases(:bottom_margin , :bottommargin)
|
||||||
|
add_aliases(:right_margin ,:rightmargin)
|
||||||
|
|
||||||
|
|
||||||
# colors
|
# colors
|
||||||
add_aliases(:seriescolor, :c, :color, :colour)
|
add_aliases(:seriescolor, :c, :color, :colour)
|
||||||
add_aliases(:linecolor, :lc, :lcolor, :lcolour, :linecolour)
|
add_aliases(:linecolor, :lc, :lcolor, :lcolour, :linecolour)
|
||||||
@@ -599,7 +662,6 @@ add_aliases(:quiver, :velocity, :quiver2d, :gradient, :vectorfield)
|
|||||||
add_aliases(:normalize, :norm, :normed, :normalized)
|
add_aliases(:normalize, :norm, :normed, :normalized)
|
||||||
add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty)
|
add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty)
|
||||||
add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio)
|
add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio)
|
||||||
add_aliases(:match_dimensions, :transpose, :transpose_z)
|
|
||||||
add_aliases(:subplot, :sp, :subplt, :splt)
|
add_aliases(:subplot, :sp, :subplt, :splt)
|
||||||
add_aliases(:projection, :proj)
|
add_aliases(:projection, :proj)
|
||||||
add_aliases(:titlelocation, :title_location, :title_loc, :titleloc, :title_position, :title_pos, :titlepos, :titleposition, :title_align, :title_alignment)
|
add_aliases(:titlelocation, :title_location, :title_loc, :titleloc, :title_position, :title_pos, :titlepos, :titleposition, :title_align, :title_alignment)
|
||||||
@@ -619,11 +681,11 @@ add_aliases(:contour_labels, :contourlabels, :clabels, :clabs)
|
|||||||
add_aliases(:warn_on_unsupported, :warn)
|
add_aliases(:warn_on_unsupported, :warn)
|
||||||
|
|
||||||
# add all pluralized forms to the _keyAliases dict
|
# add all pluralized forms to the _keyAliases dict
|
||||||
for arg in keys(_series_defaults)
|
for arg in _all_args
|
||||||
_keyAliases[makeplural(arg)] = arg
|
add_aliases(arg, makeplural(arg))
|
||||||
end
|
end
|
||||||
|
# add all non_underscored forms to the _keyAliases
|
||||||
|
add_non_underscore_aliases!(_keyAliases)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -963,9 +1025,9 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# vline accesses the y argument but actually maps it to the x axis.
|
# vline and others accesses the y argument but actually maps it to the x axis.
|
||||||
# Hence, we have to swap formatters
|
# Hence, we have to swap formatters
|
||||||
if get(plotattributes, :seriestype, :path) == :vline
|
if treats_y_as_x(get(plotattributes, :seriestype, :path))
|
||||||
xformatter = get(plotattributes, :xformatter, :auto)
|
xformatter = get(plotattributes, :xformatter, :auto)
|
||||||
yformatter = get(plotattributes, :yformatter, :auto)
|
yformatter = get(plotattributes, :yformatter, :auto)
|
||||||
plotattributes[:xformatter] = yformatter
|
plotattributes[:xformatter] = yformatter
|
||||||
@@ -1034,7 +1096,7 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# fonts
|
# fonts
|
||||||
for fontname in (:titlefont, :legendfont, :legendtitlefont)
|
for fontname in (:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont)
|
||||||
args = RecipesPipeline.pop_kw!(plotattributes, fontname, ())
|
args = RecipesPipeline.pop_kw!(plotattributes, fontname, ())
|
||||||
for arg in wraptuple(args)
|
for arg in wraptuple(args)
|
||||||
processFontArg!(plotattributes, fontname, arg)
|
processFontArg!(plotattributes, fontname, arg)
|
||||||
@@ -1115,7 +1177,6 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW)
|
|||||||
if st in (:boxplot, :violin, :density) && !isdefined(Main, :StatsPlots)
|
if st in (:boxplot, :violin, :density) && !isdefined(Main, :StatsPlots)
|
||||||
@warn("seriestype $st has been moved to StatsPlots. To use: \`Pkg.add(\"StatsPlots\"); using StatsPlots\`")
|
@warn("seriestype $st has been moved to StatsPlots. To use: \`Pkg.add(\"StatsPlots\"); using StatsPlots\`")
|
||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1271,11 +1332,16 @@ const _match_map = KW(
|
|||||||
:right_margin => :margin,
|
:right_margin => :margin,
|
||||||
:bottom_margin => :margin,
|
:bottom_margin => :margin,
|
||||||
:titlefontfamily => :fontfamily_subplot,
|
:titlefontfamily => :fontfamily_subplot,
|
||||||
:legendfontfamily => :fontfamily_subplot,
|
|
||||||
:legendtitlefontfamily => :fontfamily_subplot,
|
|
||||||
:titlefontcolor => :foreground_color_subplot,
|
:titlefontcolor => :foreground_color_subplot,
|
||||||
|
:legendfontfamily => :fontfamily_subplot,
|
||||||
:legendfontcolor => :foreground_color_subplot,
|
:legendfontcolor => :foreground_color_subplot,
|
||||||
|
:legendtitlefontfamily => :fontfamily_subplot,
|
||||||
:legendtitlefontcolor => :foreground_color_subplot,
|
:legendtitlefontcolor => :foreground_color_subplot,
|
||||||
|
:colorbar_fontfamily => :fontfamily_subplot,
|
||||||
|
:colorbar_titlefontfamily => :fontfamily_subplot,
|
||||||
|
:colorbar_titlefontcolor => :foreground_color_subplot,
|
||||||
|
:plot_titlefontfamily => :fontfamily,
|
||||||
|
:plot_titlefontcolor => :foreground_color,
|
||||||
:tickfontcolor => :foreground_color_text,
|
:tickfontcolor => :foreground_color_text,
|
||||||
:guidefontcolor => :foreground_color_guide,
|
:guidefontcolor => :foreground_color_guide,
|
||||||
)
|
)
|
||||||
@@ -1501,8 +1567,16 @@ function _update_subplot_args(plt::Plot, sp::Subplot, plotattributes_in, subplot
|
|||||||
_update_subplot_periphery(sp, anns)
|
_update_subplot_periphery(sp, anns)
|
||||||
_update_subplot_colors(sp)
|
_update_subplot_colors(sp)
|
||||||
|
|
||||||
|
lims_warned = false
|
||||||
for letter in (:x, :y, :z)
|
for letter in (:x, :y, :z)
|
||||||
_update_axis(plt, sp, plotattributes_in, letter, subplot_index)
|
_update_axis(plt, sp, plotattributes_in, letter, subplot_index)
|
||||||
|
lk = Symbol(letter, :lims)
|
||||||
|
|
||||||
|
# warn against using `Range` in x,y,z lims
|
||||||
|
if !lims_warned && haskey(plotattributes_in, lk) && plotattributes_in[lk] isa AbstractRange
|
||||||
|
@warn("lims should be a Tuple, not $(typeof(plotattributes_in[lk])).")
|
||||||
|
lims_warned = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1555,6 +1629,20 @@ function _slice_series_args!(plotattributes::AKW, plt::Plot, sp::Subplot, comman
|
|||||||
return plotattributes
|
return plotattributes
|
||||||
end
|
end
|
||||||
|
|
||||||
|
label_to_string(label::Bool, series_plotindex) = label ? label_to_string(:auto, series_plotindex) : ""
|
||||||
|
label_to_string(label::Nothing, series_plotindex) = ""
|
||||||
|
label_to_string(label::Missing, series_plotindex) = ""
|
||||||
|
function label_to_string(label::Symbol, series_plotindex)
|
||||||
|
if label==:auto
|
||||||
|
return string("y", series_plotindex)
|
||||||
|
elseif label==:none
|
||||||
|
return ""
|
||||||
|
else
|
||||||
|
throw(ArgumentError("unsupported symbol $(label) passed to `label`"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
label_to_string(label, series_plotindex) = string(label) # Fallback to string promotion
|
||||||
|
|
||||||
function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot)
|
function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot)
|
||||||
pkg = plt.backend
|
pkg = plt.backend
|
||||||
globalIndex = plotattributes[:series_plotindex]
|
globalIndex = plotattributes[:series_plotindex]
|
||||||
@@ -1623,10 +1711,7 @@ function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# set label
|
# set label
|
||||||
label = plotattributes[:label]
|
plotattributes[:label] = label_to_string.(plotattributes[:label], globalIndex)
|
||||||
label = (label == "AUTO" ? "y$globalIndex" : label)
|
|
||||||
label = label in (:none, nothing, false) ? "" : label
|
|
||||||
plotattributes[:label] = label
|
|
||||||
|
|
||||||
_replace_linewidth(plotattributes)
|
_replace_linewidth(plotattributes)
|
||||||
plotattributes
|
plotattributes
|
||||||
@@ -1647,3 +1732,80 @@ function _series_index(plotattributes, sp)
|
|||||||
end
|
end
|
||||||
return idx
|
return idx
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#--------------------------------------------------
|
||||||
|
## inspired by Base.@kwdef
|
||||||
|
macro add_attributes( level, expr )
|
||||||
|
expr = macroexpand(__module__, expr) # to expand @static
|
||||||
|
expr isa Expr && expr.head === :struct || error("Invalid usage of @add_attributes")
|
||||||
|
T = expr.args[2]
|
||||||
|
if T isa Expr && T.head === :<:
|
||||||
|
T = T.args[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
key_args = Any[]
|
||||||
|
value_args = Any[]
|
||||||
|
|
||||||
|
_splitdef!(expr.args[3], value_args, key_args)
|
||||||
|
|
||||||
|
insert_block = Expr(:block)
|
||||||
|
for (key, value) in zip(key_args, value_args)
|
||||||
|
# e.g. _series_defualts[key] = value
|
||||||
|
exp_key = Symbol(lowercase(string(T)), "_", key)
|
||||||
|
pl_key = makeplural(exp_key)
|
||||||
|
push!(insert_block.args, Expr(
|
||||||
|
:(=), Expr(:ref, Symbol("_", level, "_defaults"), QuoteNode(exp_key)), value
|
||||||
|
))
|
||||||
|
push!(insert_block.args, :(
|
||||||
|
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(pl_key)))
|
||||||
|
))
|
||||||
|
push!(insert_block.args, :(
|
||||||
|
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(make_non_underscore(exp_key))))
|
||||||
|
))
|
||||||
|
push!(insert_block.args, :(
|
||||||
|
add_aliases($(QuoteNode(exp_key)), $(QuoteNode(make_non_underscore(pl_key))))
|
||||||
|
))
|
||||||
|
end
|
||||||
|
return quote
|
||||||
|
$expr
|
||||||
|
$insert_block
|
||||||
|
end |> esc
|
||||||
|
end
|
||||||
|
|
||||||
|
function _splitdef!(blk, value_args, key_args)
|
||||||
|
for i in eachindex(blk.args)
|
||||||
|
ei = blk.args[i]
|
||||||
|
if ei isa Symbol
|
||||||
|
# var
|
||||||
|
continue
|
||||||
|
elseif ei isa Expr
|
||||||
|
if ei.head === :(=)
|
||||||
|
lhs = ei.args[1]
|
||||||
|
if lhs isa Symbol
|
||||||
|
# var = defexpr
|
||||||
|
var = lhs
|
||||||
|
elseif lhs isa Expr && lhs.head === :(::) && lhs.args[1] isa Symbol
|
||||||
|
# var::T = defexpr
|
||||||
|
var = lhs.args[1]
|
||||||
|
else
|
||||||
|
# something else, e.g. inline inner constructor
|
||||||
|
# F(...) = ...
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
defexpr = ei.args[2] # defexpr
|
||||||
|
push!(value_args, defexpr)
|
||||||
|
push!(key_args, var)
|
||||||
|
blk.args[i] = lhs
|
||||||
|
elseif ei.head === :(::) && ei.args[1] isa Symbol
|
||||||
|
# var::Typ
|
||||||
|
var = ei.args[1]
|
||||||
|
push!(value_args, var)
|
||||||
|
push!(key_args, var)
|
||||||
|
elseif ei.head === :block
|
||||||
|
# can arise with use of @static inside type decl
|
||||||
|
_kwdef!(ei, value_args, key_args)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
blk
|
||||||
|
end
|
||||||
|
|||||||
+290
-406
@@ -123,6 +123,14 @@ const _label_func = Dict{Symbol,Function}(
|
|||||||
)
|
)
|
||||||
labelfunc(scale::Symbol, backend::AbstractBackend) = get(_label_func, scale, string)
|
labelfunc(scale::Symbol, backend::AbstractBackend) = get(_label_func, scale, string)
|
||||||
|
|
||||||
|
const _label_func_tex = Dict{Symbol,Function}(
|
||||||
|
:log10 => x -> "10^{$x}",
|
||||||
|
:log2 => x -> "2^{$x}",
|
||||||
|
:ln => x -> "e^{$x}",
|
||||||
|
)
|
||||||
|
labelfunc_tex(scale::Symbol) = get(_label_func_tex, scale, convert_sci_unicode)
|
||||||
|
|
||||||
|
|
||||||
function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing)
|
function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing)
|
||||||
amin, amax = axis_limits(sp, axis[:letter])
|
amin, amax = axis_limits(sp, axis[:letter])
|
||||||
|
|
||||||
@@ -181,16 +189,10 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing)
|
|||||||
|
|
||||||
labels = if any(isfinite, unscaled_ticks)
|
labels = if any(isfinite, unscaled_ticks)
|
||||||
formatter = axis[:formatter]
|
formatter = axis[:formatter]
|
||||||
if formatter == :auto
|
if formatter in (:auto, :plain, :scientific, :engineering)
|
||||||
# the default behavior is to make strings of the scaled values and then apply the labelfunc
|
map(labelfunc(scale, backend()), Showoff.showoff(scaled_ticks, formatter))
|
||||||
map(labelfunc(scale, backend()), Showoff.showoff(scaled_ticks, :auto))
|
elseif formatter == :latex
|
||||||
elseif formatter == :plain
|
map(x -> string("\$", replace(convert_sci_unicode(x), '×' => "\\times"), "\$"), Showoff.showoff(unscaled_ticks, :auto))
|
||||||
# Leave the numbers in plain format
|
|
||||||
map(labelfunc(scale, backend()), Showoff.showoff(scaled_ticks, :plain))
|
|
||||||
elseif formatter == :scientific
|
|
||||||
Showoff.showoff(unscaled_ticks, :scientific)
|
|
||||||
elseif formatter == :latex
|
|
||||||
map(x -> string("\$", replace(convert_sci_unicode(x), '×' => "\\times"), "\$"), Showoff.showoff(unscaled_ticks, :auto))
|
|
||||||
else
|
else
|
||||||
# there was an override for the formatter... use that on the unscaled ticks
|
# there was an override for the formatter... use that on the unscaled ticks
|
||||||
map(formatter, unscaled_ticks)
|
map(formatter, unscaled_ticks)
|
||||||
@@ -211,48 +213,52 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# return (continuous_values, discrete_values) for the ticks on this axis
|
# return (continuous_values, discrete_values) for the ticks on this axis
|
||||||
function get_ticks(sp::Subplot, axis::Axis)
|
function get_ticks(sp::Subplot, axis::Axis; update = true)
|
||||||
ticks = _transform_ticks(axis[:ticks])
|
if update || !haskey(axis.plotattributes, :optimized_ticks)
|
||||||
ticks in (:none, nothing, false) && return nothing
|
ticks = _transform_ticks(axis[:ticks])
|
||||||
|
if ticks in (:none, nothing, false)
|
||||||
|
axis.plotattributes[:optimized_ticks] = nothing
|
||||||
|
else
|
||||||
|
# treat :native ticks as :auto
|
||||||
|
ticks = ticks == :native ? :auto : ticks
|
||||||
|
|
||||||
# treat :native ticks as :auto
|
dvals = axis[:discrete_values]
|
||||||
ticks = ticks == :native ? :auto : ticks
|
cv, dv = if typeof(ticks) <: Symbol
|
||||||
|
if !isempty(dvals)
|
||||||
dvals = axis[:discrete_values]
|
# discrete ticks...
|
||||||
cv, dv = if typeof(ticks) <: Symbol
|
n = length(dvals)
|
||||||
if !isempty(dvals)
|
rng = if ticks == :auto && n > 15
|
||||||
# discrete ticks...
|
Δ = ceil(Int, n / 10)
|
||||||
n = length(dvals)
|
Δ:Δ:n
|
||||||
rng = if ticks == :auto
|
else # if ticks == :all
|
||||||
Int[round(Int,i) for i in range(1, stop=n, length=min(n,15))]
|
1:n
|
||||||
else # if ticks == :all
|
end
|
||||||
1:n
|
axis[:continuous_values][rng], dvals[rng]
|
||||||
|
elseif ispolar(axis.sps[1]) && axis[:letter] == :x
|
||||||
|
#force theta axis to be full circle
|
||||||
|
(collect(0:pi/4:7pi/4), string.(0:45:315))
|
||||||
|
else
|
||||||
|
# compute optimal ticks and labels
|
||||||
|
optimal_ticks_and_labels(sp, axis)
|
||||||
|
end
|
||||||
|
elseif typeof(ticks) <: Union{AVec, Int}
|
||||||
|
if !isempty(dvals) && typeof(ticks) <: Int
|
||||||
|
rng = Int[round(Int,i) for i in range(1, stop=length(dvals), length=ticks)]
|
||||||
|
axis[:continuous_values][rng], dvals[rng]
|
||||||
|
else
|
||||||
|
# override ticks, but get the labels
|
||||||
|
optimal_ticks_and_labels(sp, axis, ticks)
|
||||||
|
end
|
||||||
|
elseif typeof(ticks) <: NTuple{2, Any}
|
||||||
|
# assuming we're passed (ticks, labels)
|
||||||
|
ticks
|
||||||
|
else
|
||||||
|
error("Unknown ticks type in get_ticks: $(typeof(ticks))")
|
||||||
end
|
end
|
||||||
axis[:continuous_values][rng], dvals[rng]
|
axis.plotattributes[:optimized_ticks] = (cv, dv)
|
||||||
elseif ispolar(axis.sps[1]) && axis[:letter] == :x
|
|
||||||
#force theta axis to be full circle
|
|
||||||
(collect(0:pi/4:7pi/4), string.(0:45:315))
|
|
||||||
else
|
|
||||||
# compute optimal ticks and labels
|
|
||||||
optimal_ticks_and_labels(sp, axis)
|
|
||||||
end
|
end
|
||||||
elseif typeof(ticks) <: Union{AVec, Int}
|
|
||||||
if !isempty(dvals) && typeof(ticks) <: Int
|
|
||||||
rng = Int[round(Int,i) for i in range(1, stop=length(dvals), length=ticks)]
|
|
||||||
axis[:continuous_values][rng], dvals[rng]
|
|
||||||
else
|
|
||||||
# override ticks, but get the labels
|
|
||||||
optimal_ticks_and_labels(sp, axis, ticks)
|
|
||||||
end
|
|
||||||
elseif typeof(ticks) <: NTuple{2, Any}
|
|
||||||
# assuming we're passed (ticks, labels)
|
|
||||||
ticks
|
|
||||||
else
|
|
||||||
error("Unknown ticks type in get_ticks: $(typeof(ticks))")
|
|
||||||
end
|
end
|
||||||
# @show ticks dvals cv dv
|
axis.plotattributes[:optimized_ticks]
|
||||||
|
|
||||||
return cv, dv
|
|
||||||
end
|
end
|
||||||
|
|
||||||
_transform_ticks(ticks) = ticks
|
_transform_ticks(ticks) = ticks
|
||||||
@@ -576,391 +582,269 @@ end
|
|||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
# compute the line segments which should be drawn for this axis
|
# compute the line segments which should be drawn for this axis
|
||||||
function axis_drawing_info(sp::Subplot)
|
function axis_drawing_info(sp, letter)
|
||||||
xaxis, yaxis = sp[:xaxis], sp[:yaxis]
|
# find out which axis we are dealing with
|
||||||
xmin, xmax = axis_limits(sp, :x)
|
asym = Symbol(letter, :axis)
|
||||||
ymin, ymax = axis_limits(sp, :y)
|
isy = letter === :y
|
||||||
xticks = get_ticks(sp, xaxis)
|
oletter = isy ? :x : :y
|
||||||
yticks = get_ticks(sp, yaxis)
|
oasym = Symbol(oletter, :axis)
|
||||||
xminorticks = get_minor_ticks(sp, xaxis, xticks)
|
|
||||||
yminorticks = get_minor_ticks(sp, yaxis, yticks)
|
# get axis objects, ticks and minor ticks
|
||||||
xaxis_segs = Segments(2)
|
ax, oax = sp[asym], sp[oasym]
|
||||||
yaxis_segs = Segments(2)
|
amin, amax = axis_limits(sp, letter)
|
||||||
xtick_segs = Segments(2)
|
oamin, oamax = axis_limits(sp, oletter)
|
||||||
ytick_segs = Segments(2)
|
ticks = get_ticks(sp, ax, update = false)
|
||||||
xgrid_segs = Segments(2)
|
minor_ticks = get_minor_ticks(sp, ax, ticks)
|
||||||
ygrid_segs = Segments(2)
|
|
||||||
xminorgrid_segs = Segments(2)
|
# initialize the segments
|
||||||
yminorgrid_segs = Segments(2)
|
segments = Segments(2)
|
||||||
xborder_segs = Segments(2)
|
tick_segments = Segments(2)
|
||||||
yborder_segs = Segments(2)
|
grid_segments = Segments(2)
|
||||||
|
minorgrid_segments = Segments(2)
|
||||||
|
border_segments = Segments(2)
|
||||||
|
|
||||||
if sp[:framestyle] != :none
|
if sp[:framestyle] != :none
|
||||||
# xaxis
|
oa1, oa2 = if sp[:framestyle] in (:origin, :zerolines)
|
||||||
y1, y2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
0.0, 0.0
|
||||||
else
|
else
|
||||||
xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax)
|
xor(ax[:mirror], oax[:flip]) ? (oamax, oamin) : (oamin, oamax)
|
||||||
end
|
end
|
||||||
if xaxis[:showaxis]
|
if ax[:showaxis]
|
||||||
if sp[:framestyle] != :grid
|
if sp[:framestyle] != :grid
|
||||||
push!(xaxis_segs, (xmin, y1), (xmax, y1))
|
push!(segments, reverse_if((amin, oa1), isy), reverse_if((amax, oa1), isy))
|
||||||
# don't show the 0 tick label for the origin framestyle
|
# don't show the 0 tick label for the origin framestyle
|
||||||
if sp[:framestyle] == :origin && !(xticks in (:none, nothing, false)) && length(xticks) > 1
|
if sp[:framestyle] == :origin && !(ticks in (:none, nothing, false)) && length(ticks) > 1
|
||||||
showticks = xticks[1] .!= 0
|
i = findfirst(==(0), ticks[1])
|
||||||
xticks = (xticks[1][showticks], xticks[2][showticks])
|
if i !== nothing
|
||||||
|
deleteat!(ticks[1], i)
|
||||||
|
deleteat!(ticks[2], i)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
sp[:framestyle] in (:semi, :box) && push!(xborder_segs, (xmin, y2), (xmax, y2)) # top spine
|
if sp[:framestyle] in (:semi, :box) # top spine
|
||||||
|
push!(
|
||||||
|
border_segments,
|
||||||
|
reverse_if((amin, oa2), isy),
|
||||||
|
reverse_if((amax, oa2), isy),
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if !(xaxis[:ticks] in (:none, nothing, false))
|
if !(ax[:ticks] in (:none, nothing, false))
|
||||||
f = RecipesPipeline.scale_func(yaxis[:scale])
|
f = RecipesPipeline.scale_func(oax[:scale])
|
||||||
invf = RecipesPipeline.inverse_scale_func(yaxis[:scale])
|
invf = RecipesPipeline.inverse_scale_func(oax[:scale])
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
tick_start, tick_stop = if sp[:framestyle] == :origin
|
||||||
t = invf(f(0) + 0.012 * (f(ymax) - f(ymin)))
|
t = invf(f(0) + 0.012 * (f(oamax) - f(oamin)))
|
||||||
(-t, t)
|
(-t, t)
|
||||||
else
|
else
|
||||||
ticks_in = xaxis[:tick_direction] == :out ? -1 : 1
|
ticks_in = ax[:tick_direction] == :out ? -1 : 1
|
||||||
t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in)
|
t = invf(f(oa1) + 0.012 * (f(oa2) - f(oa1)) * ticks_in)
|
||||||
(y1, t)
|
(oa1, t)
|
||||||
end
|
end
|
||||||
|
|
||||||
for xtick in xticks[1]
|
for tick in ticks[1]
|
||||||
if xaxis[:showaxis]
|
if ax[:showaxis]
|
||||||
push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick
|
push!(
|
||||||
|
tick_segments,
|
||||||
|
reverse_if((tick, tick_start), isy),
|
||||||
|
reverse_if((tick, tick_stop), isy),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
if ax[:grid]
|
||||||
|
push!(
|
||||||
|
grid_segments,
|
||||||
|
reverse_if((tick, oamin), isy),
|
||||||
|
reverse_if((tick, oamax), isy),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
xaxis[:grid] && push!(xgrid_segs, (xtick, ymin), (xtick, ymax)) # vertical grid
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid]
|
if !(ax[:minorticks] in (:none, nothing, false)) || ax[:minorgrid]
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
tick_start, tick_stop = if sp[:framestyle] == :origin
|
||||||
t = invf(f(0) + 0.006 * (f(ymax) - f(ymin)))
|
t = invf(f(0) + 0.006 * (f(oamax) - f(oamin)))
|
||||||
(-t, t)
|
(-t, t)
|
||||||
else
|
else
|
||||||
t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in)
|
t = invf(f(oa1) + 0.006 * (f(oa2) - f(oa1)) * ticks_in)
|
||||||
(y1, t)
|
(oa1, t)
|
||||||
end
|
end
|
||||||
for xtick in xminorticks
|
for tick in minor_ticks
|
||||||
if xaxis[:showaxis]
|
if ax[:showaxis]
|
||||||
push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick
|
push!(
|
||||||
|
tick_segments,
|
||||||
|
reverse_if((tick, tick_start), isy),
|
||||||
|
reverse_if((tick, tick_stop), isy),
|
||||||
|
)
|
||||||
end
|
end
|
||||||
xaxis[:minorgrid] && push!(xminorgrid_segs, (xtick, ymin), (xtick, ymax)) # vertical grid
|
if ax[:minorgrid]
|
||||||
end
|
push!(
|
||||||
end
|
minorgrid_segments,
|
||||||
end
|
reverse_if((tick, oamin), isy),
|
||||||
|
reverse_if((tick, oamax), isy),
|
||||||
|
)
|
||||||
# yaxis
|
|
||||||
x1, x2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax)
|
|
||||||
end
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
if sp[:framestyle] != :grid
|
|
||||||
push!(yaxis_segs, (x1, ymin), (x1, ymax))
|
|
||||||
# don't show the 0 tick label for the origin framestyle
|
|
||||||
if sp[:framestyle] == :origin && !(yticks in (:none, nothing,false)) && length(yticks) > 1
|
|
||||||
showticks = yticks[1] .!= 0
|
|
||||||
yticks = (yticks[1][showticks], yticks[2][showticks])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
sp[:framestyle] in (:semi, :box) && push!(yborder_segs, (x2, ymin), (x2, ymax)) # right spine
|
|
||||||
end
|
|
||||||
if !(yaxis[:ticks] in (:none, nothing, false))
|
|
||||||
f = RecipesPipeline.scale_func(xaxis[:scale])
|
|
||||||
invf = RecipesPipeline.inverse_scale_func(xaxis[:scale])
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.012 * (f(xmax) - f(xmin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
ticks_in = yaxis[:tick_direction] == :out ? -1 : 1
|
|
||||||
t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in)
|
|
||||||
(x1, t)
|
|
||||||
end
|
|
||||||
|
|
||||||
for ytick in yticks[1]
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick
|
|
||||||
end
|
|
||||||
yaxis[:grid] && push!(ygrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid
|
|
||||||
end
|
|
||||||
|
|
||||||
if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid]
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.006 * (f(xmax) - f(xmin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in)
|
|
||||||
(x1, t)
|
|
||||||
end
|
|
||||||
for ytick in yminorticks
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick
|
|
||||||
end
|
|
||||||
yaxis[:minorgrid] && push!(yminorgrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
xticks, yticks, xaxis_segs, yaxis_segs, xtick_segs, ytick_segs, xgrid_segs, ygrid_segs, xminorgrid_segs, yminorgrid_segs, xborder_segs, yborder_segs
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function axis_drawing_info_3d(sp::Subplot)
|
|
||||||
xaxis, yaxis, zaxis = sp[:xaxis], sp[:yaxis], sp[:zaxis]
|
|
||||||
xmin, xmax = axis_limits(sp, :x)
|
|
||||||
ymin, ymax = axis_limits(sp, :y)
|
|
||||||
zmin, zmax = axis_limits(sp, :z)
|
|
||||||
xticks = get_ticks(sp, xaxis)
|
|
||||||
yticks = get_ticks(sp, yaxis)
|
|
||||||
zticks = get_ticks(sp, zaxis)
|
|
||||||
xminorticks = get_minor_ticks(sp, xaxis, xticks)
|
|
||||||
yminorticks = get_minor_ticks(sp, yaxis, yticks)
|
|
||||||
zminorticks = get_minor_ticks(sp, zaxis, zticks)
|
|
||||||
xaxis_segs = Segments(3)
|
|
||||||
yaxis_segs = Segments(3)
|
|
||||||
zaxis_segs = Segments(3)
|
|
||||||
xtick_segs = Segments(3)
|
|
||||||
ytick_segs = Segments(3)
|
|
||||||
ztick_segs = Segments(3)
|
|
||||||
xgrid_segs = Segments(3)
|
|
||||||
ygrid_segs = Segments(3)
|
|
||||||
zgrid_segs = Segments(3)
|
|
||||||
xminorgrid_segs = Segments(3)
|
|
||||||
yminorgrid_segs = Segments(3)
|
|
||||||
zminorgrid_segs = Segments(3)
|
|
||||||
xborder_segs = Segments(3)
|
|
||||||
yborder_segs = Segments(3)
|
|
||||||
zborder_segs = Segments(3)
|
|
||||||
|
|
||||||
if sp[:framestyle] != :none
|
|
||||||
|
|
||||||
# xaxis
|
|
||||||
y1, y2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax)
|
|
||||||
end
|
|
||||||
z1, z2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(xaxis[:mirror], zaxis[:flip]) ? (zmax, zmin) : (zmin, zmax)
|
|
||||||
end
|
|
||||||
if xaxis[:showaxis]
|
|
||||||
if sp[:framestyle] != :grid
|
|
||||||
push!(xaxis_segs, (xmin, y1, z1), (xmax, y1, z1))
|
|
||||||
# don't show the 0 tick label for the origin framestyle
|
|
||||||
if sp[:framestyle] == :origin && !(xticks in (:none, nothing, false)) && length(xticks) > 1
|
|
||||||
showticks = xticks[1] .!= 0
|
|
||||||
xticks = (xticks[1][showticks], xticks[2][showticks])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
sp[:framestyle] in (:semi, :box) && push!(xborder_segs, (xmin, y2, z2), (xmax, y2, z2)) # top spine
|
|
||||||
end
|
|
||||||
if !(xaxis[:ticks] in (:none, nothing, false))
|
|
||||||
f = RecipesPipeline.scale_func(yaxis[:scale])
|
|
||||||
invf = RecipesPipeline.inverse_scale_func(yaxis[:scale])
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.012 * (f(ymax) - f(ymin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
ticks_in = xaxis[:tick_direction] == :out ? -1 : 1
|
|
||||||
t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in)
|
|
||||||
(y1, t)
|
|
||||||
end
|
|
||||||
|
|
||||||
for xtick in xticks[1]
|
|
||||||
if xaxis[:showaxis]
|
|
||||||
push!(xtick_segs, (xtick, tick_start, z1), (xtick, tick_stop, z1)) # bottom tick
|
|
||||||
end
|
|
||||||
if xaxis[:grid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(xgrid_segs, (xtick, ymin, 0.0), (xtick, ymax, 0.0))
|
|
||||||
push!(xgrid_segs, (xtick, 0.0, zmin), (xtick, 0.0, zmax))
|
|
||||||
else
|
|
||||||
push!(xgrid_segs, (xtick, y1, z1), (xtick, y2, z1))
|
|
||||||
push!(xgrid_segs, (xtick, y2, z1), (xtick, y2, z2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid]
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.006 * (f(ymax) - f(ymin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in)
|
|
||||||
(y1, t)
|
|
||||||
end
|
|
||||||
for xtick in xminorticks
|
|
||||||
if xaxis[:showaxis]
|
|
||||||
push!(xtick_segs, (xtick, tick_start, z1), (xtick, tick_stop, z1)) # bottom tick
|
|
||||||
end
|
|
||||||
if xaxis[:minorgrid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(xminorgrid_segs, (xtick, ymin, 0.0), (xtick, ymax, 0.0))
|
|
||||||
push!(xminorgrid_segs, (xtick, 0.0, zmin), (xtick, 0.0, zmax))
|
|
||||||
else
|
|
||||||
push!(xminorgrid_segs, (xtick, y1, z1), (xtick, y2, z1))
|
|
||||||
push!(xminorgrid_segs, (xtick, y2, z1), (xtick, y2, z2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# yaxis
|
|
||||||
x1, x2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(yaxis[:mirror], xaxis[:flip]) ? (xmin, xmax) : (xmax, xmin)
|
|
||||||
end
|
|
||||||
z1, z2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(yaxis[:mirror], zaxis[:flip]) ? (zmax, zmin) : (zmin, zmax)
|
|
||||||
end
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
if sp[:framestyle] != :grid
|
|
||||||
push!(yaxis_segs, (x1, ymin, z1), (x1, ymax, z1))
|
|
||||||
# don't show the 0 tick label for the origin framestyle
|
|
||||||
if sp[:framestyle] == :origin && !(yticks in (:none, nothing,false)) && length(yticks) > 1
|
|
||||||
showticks = yticks[1] .!= 0
|
|
||||||
yticks = (yticks[1][showticks], yticks[2][showticks])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
sp[:framestyle] in (:semi, :box) && push!(yborder_segs, (x2, ymin, z2), (x2, ymax, z2)) # right spine
|
|
||||||
end
|
|
||||||
if !(yaxis[:ticks] in (:none, nothing, false))
|
|
||||||
f = RecipesPipeline.scale_func(xaxis[:scale])
|
|
||||||
invf = RecipesPipeline.inverse_scale_func(xaxis[:scale])
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.012 * (f(xmax) - f(xmin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
ticks_in = yaxis[:tick_direction] == :out ? -1 : 1
|
|
||||||
t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in)
|
|
||||||
(x1, t)
|
|
||||||
end
|
|
||||||
|
|
||||||
for ytick in yticks[1]
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
push!(ytick_segs, (tick_start, ytick, z1), (tick_stop, ytick, z1)) # left tick
|
|
||||||
end
|
|
||||||
if yaxis[:grid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(ygrid_segs, (xmin, ytick, 0.0), (xmax, ytick, 0.0))
|
|
||||||
push!(ygrid_segs, (0.0, ytick, zmin), (0.0, ytick, zmax))
|
|
||||||
else
|
|
||||||
push!(ygrid_segs, (x1, ytick, z1), (x2, ytick, z1))
|
|
||||||
push!(ygrid_segs, (x2, ytick, z1), (x2, ytick, z2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid]
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.006 * (f(xmax) - f(xmin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in)
|
|
||||||
(x1, t)
|
|
||||||
end
|
|
||||||
for ytick in yminorticks
|
|
||||||
if yaxis[:showaxis]
|
|
||||||
push!(ytick_segs, (tick_start, ytick, z1), (tick_stop, ytick, z1)) # left tick
|
|
||||||
end
|
|
||||||
if yaxis[:minorgrid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(yminorgrid_segs, (xmin, ytick, 0.0), (xmax, ytick, 0.0))
|
|
||||||
push!(yminorgrid_segs, (0.0, ytick, zmin), (0.0, ytick, zmax))
|
|
||||||
else
|
|
||||||
push!(yminorgrid_segs, (x1, ytick, z1), (x2, ytick, z1))
|
|
||||||
push!(yminorgrid_segs, (x2, ytick, z1), (x2, ytick, z2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# zaxis
|
|
||||||
x1, x2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(zaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax)
|
|
||||||
end
|
|
||||||
y1, y2 = if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
0.0, 0.0
|
|
||||||
else
|
|
||||||
xor(zaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax)
|
|
||||||
end
|
|
||||||
if zaxis[:showaxis]
|
|
||||||
if sp[:framestyle] != :grid
|
|
||||||
push!(zaxis_segs, (x1, y1, zmin), (x1, y1, zmax))
|
|
||||||
# don't show the 0 tick label for the origin framestyle
|
|
||||||
if sp[:framestyle] == :origin && !(zticks in (:none, nothing,false)) && length(zticks) > 1
|
|
||||||
showticks = zticks[1] .!= 0
|
|
||||||
zticks = (zticks[1][showticks], zticks[2][showticks])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
sp[:framestyle] in (:semi, :box) && push!(zborder_segs, (x2, y2, zmin), (x2, y2, zmax))
|
|
||||||
end
|
|
||||||
if !(zaxis[:ticks] in (:none, nothing, false))
|
|
||||||
f = RecipesPipeline.scale_func(xaxis[:scale])
|
|
||||||
invf = RecipesPipeline.inverse_scale_func(xaxis[:scale])
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.012 * (f(ymax) - f(ymin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
ticks_in = zaxis[:tick_direction] == :out ? -1 : 1
|
|
||||||
t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in)
|
|
||||||
(y1, t)
|
|
||||||
end
|
|
||||||
|
|
||||||
for ztick in zticks[1]
|
|
||||||
if zaxis[:showaxis]
|
|
||||||
push!(ztick_segs, (x1, tick_start, ztick), (x1, tick_stop, ztick)) # left tick
|
|
||||||
end
|
|
||||||
if zaxis[:grid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(zgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick))
|
|
||||||
push!(ygrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick))
|
|
||||||
else
|
|
||||||
push!(ygrid_segs, (x1, y1, ztick), (x1, y2, ztick))
|
|
||||||
push!(ygrid_segs, (x1, y2, ztick), (x2, y2, ztick))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if !(zaxis[:minorticks] in (:none, nothing, false)) || zaxis[:minorgrid]
|
|
||||||
tick_start, tick_stop = if sp[:framestyle] == :origin
|
|
||||||
t = invf(f(0) + 0.006 * (f(ymax) - f(ymin)))
|
|
||||||
(-t, t)
|
|
||||||
else
|
|
||||||
t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in)
|
|
||||||
(y1, t)
|
|
||||||
end
|
|
||||||
for ztick in zminorticks
|
|
||||||
if zaxis[:showaxis]
|
|
||||||
push!(ztick_segs, (x1, tick_start, ztick), (x1, tick_stop, ztick)) # left tick
|
|
||||||
end
|
|
||||||
if zaxis[:minorgrid]
|
|
||||||
if sp[:framestyle] in (:origin, :zerolines)
|
|
||||||
push!(zminorgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick))
|
|
||||||
push!(zminorgrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick))
|
|
||||||
else
|
|
||||||
push!(zminorgrid_segs, (x1, y1, ztick), (x1, y2, ztick))
|
|
||||||
push!(zminorgrid_segs, (x1, y2, ztick), (x2, y2, ztick))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
xticks, yticks, zticks, xaxis_segs, yaxis_segs, zaxis_segs, xtick_segs, ytick_segs, ztick_segs, xgrid_segs, ygrid_segs, zgrid_segs, xminorgrid_segs, yminorgrid_segs, zminorgrid_segs, xborder_segs, yborder_segs, zborder_segs
|
return (
|
||||||
|
ticks = ticks,
|
||||||
|
segments = segments,
|
||||||
|
tick_segments = tick_segments,
|
||||||
|
grid_segments = grid_segments,
|
||||||
|
minorgrid_segments = minorgrid_segments,
|
||||||
|
border_segments = border_segments
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function sort_3d_axes(a, b, c, letter)
|
||||||
|
if letter === :x
|
||||||
|
a, b, c
|
||||||
|
elseif letter === :y
|
||||||
|
b, a, c
|
||||||
|
else
|
||||||
|
c, b, a
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function axis_drawing_info_3d(sp, letter)
|
||||||
|
near_letter = letter in (:x, :z) ? :y : :x
|
||||||
|
far_letter = letter in (:x, :y) ? :z : :x
|
||||||
|
|
||||||
|
ax = sp[Symbol(letter, :axis)]
|
||||||
|
nax = sp[Symbol(near_letter, :axis)]
|
||||||
|
fax = sp[Symbol(far_letter, :axis)]
|
||||||
|
|
||||||
|
amin, amax = axis_limits(sp, letter)
|
||||||
|
namin, namax = axis_limits(sp, near_letter)
|
||||||
|
famin, famax = axis_limits(sp, far_letter)
|
||||||
|
|
||||||
|
ticks = get_ticks(sp, ax, update = false)
|
||||||
|
minor_ticks = get_minor_ticks(sp, ax, ticks)
|
||||||
|
|
||||||
|
# initialize the segments
|
||||||
|
segments = Segments(3)
|
||||||
|
tick_segments = Segments(3)
|
||||||
|
grid_segments = Segments(3)
|
||||||
|
minorgrid_segments = Segments(3)
|
||||||
|
border_segments = Segments(3)
|
||||||
|
|
||||||
|
|
||||||
|
if sp[:framestyle] != :none# && letter === :x
|
||||||
|
na0, na1 = if sp[:framestyle] in (:origin, :zerolines)
|
||||||
|
0, 0
|
||||||
|
else
|
||||||
|
# reverse_if((namin, namax), xor(ax[:mirror], nax[:flip]))
|
||||||
|
reverse_if(reverse_if((namin, namax), letter === :y), xor(ax[:mirror], nax[:flip]))
|
||||||
|
end
|
||||||
|
fa0, fa1 = if sp[:framestyle] in (:origin, :zerolines)
|
||||||
|
0, 0
|
||||||
|
else
|
||||||
|
reverse_if((famin, famax), xor(ax[:mirror], fax[:flip]))
|
||||||
|
end
|
||||||
|
if ax[:showaxis]
|
||||||
|
if sp[:framestyle] != :grid
|
||||||
|
push!(
|
||||||
|
segments,
|
||||||
|
sort_3d_axes(amin, na0, fa0, letter),
|
||||||
|
sort_3d_axes(amax, na0, fa0, letter),
|
||||||
|
)
|
||||||
|
# don't show the 0 tick label for the origin framestyle
|
||||||
|
if sp[:framestyle] == :origin && !(ticks in (:none, nothing, false)) && length(ticks) > 1
|
||||||
|
i0 = findfirst(==(0), ticks[1])
|
||||||
|
if ind !== nothing
|
||||||
|
deleteat!(ticks[1], i0)
|
||||||
|
deleteat!(ticks[2], i0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if sp[:framestyle] in (:semi, :box)
|
||||||
|
push!(
|
||||||
|
border_segments,
|
||||||
|
sort_3d_axes(amin, na1, fa1, letter),
|
||||||
|
sort_3d_axes(amax, na1, fa1, letter),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# TODO this can be simplified, we do almost the same thing twice for grid and minorgrid
|
||||||
|
if !(ax[:ticks] in (:none, nothing, false))
|
||||||
|
f = RecipesPipeline.scale_func(nax[:scale])
|
||||||
|
invf = RecipesPipeline.inverse_scale_func(nax[:scale])
|
||||||
|
tick_start, tick_stop = if sp[:framestyle] == :origin
|
||||||
|
t = invf(f(0) + 0.012 * (f(namax) - f(namin)))
|
||||||
|
(-t, t)
|
||||||
|
else
|
||||||
|
ticks_in = ax[:tick_direction] == :out ? -1 : 1
|
||||||
|
t = invf(f(na0) + 0.012 * (f(na1) - f(na0)) * ticks_in)
|
||||||
|
(na0, t)
|
||||||
|
end
|
||||||
|
|
||||||
|
ga0, ga1 = sp[:framestyle] in (:origin, :zerolines) ? (namin, namax) : (na0, na1)
|
||||||
|
for tick in ticks[1]
|
||||||
|
if ax[:showaxis]
|
||||||
|
push!(
|
||||||
|
tick_segments,
|
||||||
|
sort_3d_axes(tick, tick_start, fa0, letter),
|
||||||
|
sort_3d_axes(tick, tick_stop, fa0, letter),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
if ax[:grid]
|
||||||
|
push!(
|
||||||
|
grid_segments,
|
||||||
|
sort_3d_axes(tick, ga0, fa0, letter),
|
||||||
|
sort_3d_axes(tick, ga1, fa0, letter),
|
||||||
|
)
|
||||||
|
push!(
|
||||||
|
grid_segments,
|
||||||
|
sort_3d_axes(tick, ga1, fa0, letter),
|
||||||
|
sort_3d_axes(tick, ga1, fa1, letter),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if !(ax[:minorticks] in (:none, nothing, false)) || ax[:minorgrid]
|
||||||
|
tick_start, tick_stop = if sp[:framestyle] == :origin
|
||||||
|
t = invf(f(0) + 0.006 * (f(namax) - f(namin)))
|
||||||
|
(-t, t)
|
||||||
|
else
|
||||||
|
t = invf(f(na0) + 0.006 * (f(na1) - f(na0)) * ticks_in)
|
||||||
|
(na0, t)
|
||||||
|
end
|
||||||
|
for tick in minorticks
|
||||||
|
if ax[:showaxis]
|
||||||
|
push!(
|
||||||
|
tick_segments,
|
||||||
|
sort_3d_axes(tick, tick_start, fa0, letter),
|
||||||
|
sort_3d_axes(tick, tick_stop, fa0, letter),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
if ax[:minorgrid]
|
||||||
|
push!(
|
||||||
|
minorgrid_segments,
|
||||||
|
sort_3d_axes(tick, ga0, fa0, letter),
|
||||||
|
sort_3d_axes(tick, ga1, fa0, letter),
|
||||||
|
)
|
||||||
|
push!(
|
||||||
|
minorgrid_segments,
|
||||||
|
sort_3d_axes(tick, ga1, fa0, letter),
|
||||||
|
sort_3d_axes(tick, ga1, fa1, letter),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return (
|
||||||
|
ticks = ticks,
|
||||||
|
segments = segments,
|
||||||
|
tick_segments = tick_segments,
|
||||||
|
grid_segments = grid_segments,
|
||||||
|
minorgrid_segments = minorgrid_segments,
|
||||||
|
border_segments = border_segments
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
reverse_if(x, cond) = cond ? reverse(x) : x
|
||||||
|
axis_tuple(x, y, letter) = reverse_if((x, y), letter === :y)
|
||||||
|
|
||||||
|
axes_shift(t, i) = i % 3 == 0 ? t : i % 3 == 1 ? (t[3], t[1], t[2]) : (t[2], t[3], t[1])
|
||||||
+5
-16
@@ -1,5 +1,3 @@
|
|||||||
using Pkg
|
|
||||||
|
|
||||||
struct NoBackend <: AbstractBackend end
|
struct NoBackend <: AbstractBackend end
|
||||||
|
|
||||||
const _backendType = Dict{Symbol, DataType}(:none => NoBackend)
|
const _backendType = Dict{Symbol, DataType}(:none => NoBackend)
|
||||||
@@ -318,7 +316,6 @@ const _gr_attr = merge_with_base_supported([
|
|||||||
:layout,
|
:layout,
|
||||||
:title, :window_title,
|
:title, :window_title,
|
||||||
:guide, :lims, :ticks, :scale, :flip,
|
:guide, :lims, :ticks, :scale, :flip,
|
||||||
:match_dimensions,
|
|
||||||
:titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign,
|
:titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign,
|
||||||
:titlefontrotation, :titlefontcolor,
|
:titlefontrotation, :titlefontcolor,
|
||||||
:legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign,
|
:legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign,
|
||||||
@@ -369,10 +366,10 @@ is_marker_supported(::GRBackend, shape::Shape) = true
|
|||||||
function _initialize_backend(pkg::PlotlyBackend)
|
function _initialize_backend(pkg::PlotlyBackend)
|
||||||
try
|
try
|
||||||
@eval Main begin
|
@eval Main begin
|
||||||
import ORCA
|
import PlotlyBase
|
||||||
end
|
end
|
||||||
catch
|
catch
|
||||||
@info "For saving to png with the Plotly backend ORCA has to be installed."
|
@info "For saving to png with the Plotly backend PlotlyBase has to be installed."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -431,6 +428,7 @@ const _plotly_seriestype = [
|
|||||||
:shape,
|
:shape,
|
||||||
:scattergl,
|
:scattergl,
|
||||||
:straightline,
|
:straightline,
|
||||||
|
:mesh3d
|
||||||
]
|
]
|
||||||
const _plotly_style = [:auto, :solid, :dash, :dot, :dashdot]
|
const _plotly_style = [:auto, :solid, :dash, :dot, :dashdot]
|
||||||
const _plotly_marker = [
|
const _plotly_marker = [
|
||||||
@@ -473,7 +471,6 @@ const _pgfplots_attr = merge_with_base_supported([
|
|||||||
:polar,
|
:polar,
|
||||||
# :normalize, :weights, :contours,
|
# :normalize, :weights, :contours,
|
||||||
:aspect_ratio,
|
:aspect_ratio,
|
||||||
# :match_dimensions,
|
|
||||||
:tick_direction,
|
:tick_direction,
|
||||||
:framestyle,
|
:framestyle,
|
||||||
:camera,
|
:camera,
|
||||||
@@ -489,7 +486,7 @@ const _pgfplots_scale = [:identity, :ln, :log2, :log10]
|
|||||||
|
|
||||||
function _initialize_backend(pkg::PlotlyJSBackend)
|
function _initialize_backend(pkg::PlotlyJSBackend)
|
||||||
@eval Main begin
|
@eval Main begin
|
||||||
import PlotlyJS, ORCA
|
import PlotlyJS
|
||||||
export PlotlyJS
|
export PlotlyJS
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -542,7 +539,6 @@ const _pyplot_attr = merge_with_base_supported([
|
|||||||
:polar,
|
:polar,
|
||||||
:normalize, :weights,
|
:normalize, :weights,
|
||||||
:contours, :aspect_ratio,
|
:contours, :aspect_ratio,
|
||||||
:match_dimensions,
|
|
||||||
:clims,
|
:clims,
|
||||||
:inset_subplots,
|
:inset_subplots,
|
||||||
:dpi,
|
:dpi,
|
||||||
@@ -628,7 +624,6 @@ const _hdf5_attr = merge_with_base_supported([
|
|||||||
:polar,
|
:polar,
|
||||||
:normalize, :weights,
|
:normalize, :weights,
|
||||||
:contours, :aspect_ratio,
|
:contours, :aspect_ratio,
|
||||||
:match_dimensions,
|
|
||||||
:clims,
|
:clims,
|
||||||
:inset_subplots,
|
:inset_subplots,
|
||||||
:dpi,
|
:dpi,
|
||||||
@@ -666,11 +661,6 @@ mutable struct HDF5Plot_PlotRef
|
|||||||
end
|
end
|
||||||
const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing)
|
const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing)
|
||||||
|
|
||||||
#Simple sub-structures that can just be written out using _hdf5plot_gwritefields:
|
|
||||||
const HDF5PLOT_SIMPLESUBSTRUCT = Union{Font, BoundingBox,
|
|
||||||
GridLayout, RootLayout, ColorGradient, SeriesAnnotations, PlotText,
|
|
||||||
Shape,
|
|
||||||
}
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# inspectdr
|
# inspectdr
|
||||||
@@ -706,7 +696,6 @@ const _inspectdr_attr = merge_with_base_supported([
|
|||||||
:polar,
|
:polar,
|
||||||
# :normalize, :weights,
|
# :normalize, :weights,
|
||||||
# :contours, :aspect_ratio,
|
# :contours, :aspect_ratio,
|
||||||
:match_dimensions,
|
|
||||||
# :clims,
|
# :clims,
|
||||||
# :inset_subplots,
|
# :inset_subplots,
|
||||||
:dpi,
|
:dpi,
|
||||||
@@ -767,7 +756,6 @@ const _pgfplotsx_attr = merge_with_base_supported([
|
|||||||
:ticks,
|
:ticks,
|
||||||
:scale,
|
:scale,
|
||||||
:flip,
|
:flip,
|
||||||
:match_dimensions,
|
|
||||||
:titlefontfamily,
|
:titlefontfamily,
|
||||||
:titlefontsize,
|
:titlefontsize,
|
||||||
:titlefonthalign,
|
:titlefonthalign,
|
||||||
@@ -830,6 +818,7 @@ const _pgfplotsx_seriestype = [
|
|||||||
:surface,
|
:surface,
|
||||||
:wireframe,
|
:wireframe,
|
||||||
:heatmap,
|
:heatmap,
|
||||||
|
:mesh3d,
|
||||||
:contour,
|
:contour,
|
||||||
:contour3d,
|
:contour3d,
|
||||||
:quiver,
|
:quiver,
|
||||||
|
|||||||
+882
-1010
File diff suppressed because it is too large
Load Diff
+492
-485
File diff suppressed because it is too large
Load Diff
+379
-283
@@ -1,5 +1,6 @@
|
|||||||
using Contour: Contour
|
using Contour: Contour
|
||||||
using UUIDs
|
using UUIDs
|
||||||
|
using Latexify
|
||||||
Base.@kwdef mutable struct PGFPlotsXPlot
|
Base.@kwdef mutable struct PGFPlotsXPlot
|
||||||
is_created::Bool = false
|
is_created::Bool = false
|
||||||
was_shown::Bool = false
|
was_shown::Bool = false
|
||||||
@@ -72,6 +73,9 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat,Surface})
|
|||||||
yn = Vector{eltype(y)}(undef, length(a))
|
yn = Vector{eltype(y)}(undef, length(a))
|
||||||
zn = Vector{eltype(s)}(undef, length(a))
|
zn = Vector{eltype(s)}(undef, length(a))
|
||||||
for (n, (i, j)) in enumerate(Tuple.(CartesianIndices(a)))
|
for (n, (i, j)) in enumerate(Tuple.(CartesianIndices(a)))
|
||||||
|
if length(x) == size(s)[1]
|
||||||
|
i, j = j, i
|
||||||
|
end
|
||||||
xn[n] = x[j]
|
xn[n] = x[j]
|
||||||
yn[n] = y[i]
|
yn[n] = y[i]
|
||||||
zn[n] = a[i, j]
|
zn[n] = a[i, j]
|
||||||
@@ -83,17 +87,17 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item)
|
|||||||
push!(pgfx_plot.the_plot, item)
|
push!(pgfx_plot.the_plot, item)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function pgfx_split_extra_opts(extra)
|
||||||
|
return (get(extra, :add, nothing), filter( x-> first(x) != :add, extra))
|
||||||
|
end
|
||||||
function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
||||||
if !pgfx_plot.is_created || pgfx_plot.was_shown
|
if !pgfx_plot.is_created || pgfx_plot.was_shown
|
||||||
pgfx_sanitize_plot!(plt)
|
pgfx_sanitize_plot!(plt)
|
||||||
# extract extra kwargs
|
# extract extra kwargs
|
||||||
extra_plot_opt = plt[:extra_plot_kwargs]
|
extra_plot, extra_plot_opt = pgfx_split_extra_opts(plt[:extra_plot_kwargs])
|
||||||
extra_plot = nothing
|
|
||||||
if haskey(extra_plot_opt, :add)
|
|
||||||
extra_plot = wraptuple(pop!(extra_plot_opt,:add))
|
|
||||||
end
|
|
||||||
the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options(extra_plot_opt...))
|
the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options(extra_plot_opt...))
|
||||||
if extra_plot !== nothing
|
if extra_plot !== nothing
|
||||||
|
extra_plot = wraptuple(extra_plot)
|
||||||
push!(the_plot, extra_plot...)
|
push!(the_plot, extra_plot...)
|
||||||
end
|
end
|
||||||
bgc = plt.attr[:background_color_outside] == :match ?
|
bgc = plt.attr[:background_color_outside] == :match ?
|
||||||
@@ -249,13 +253,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
else
|
else
|
||||||
PGFPlotsX.Axis
|
PGFPlotsX.Axis
|
||||||
end
|
end
|
||||||
extra_sp_opt = sp[:extra_kwargs]
|
extra_sp, extra_sp_opt = pgfx_split_extra_opts(sp[:extra_kwargs])
|
||||||
extra_sp = nothing
|
|
||||||
if haskey(extra_sp_opt, :add)
|
|
||||||
extra_sp = wraptuple(pop!(extra_sp_opt,:add))
|
|
||||||
end
|
|
||||||
axis = axisf(merge(axis_opt, PGFPlotsX.Options(extra_sp_opt...)))
|
axis = axisf(merge(axis_opt, PGFPlotsX.Options(extra_sp_opt...)))
|
||||||
if extra_sp !== nothing
|
if extra_sp !== nothing
|
||||||
|
extra_sp = wraptuple(extra_sp)
|
||||||
push!(axis, extra_sp...)
|
push!(axis, extra_sp...)
|
||||||
end
|
end
|
||||||
if sp[:legendtitle] !== nothing
|
if sp[:legendtitle] !== nothing
|
||||||
@@ -279,13 +280,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
"color" => single_color(opt[:linecolor]),
|
"color" => single_color(opt[:linecolor]),
|
||||||
"name path" => string(series_id),
|
"name path" => string(series_id),
|
||||||
)
|
)
|
||||||
extra_series_opt = series[:extra_kwargs]
|
extra_series, extra_series_opt = pgfx_split_extra_opts(series[:extra_kwargs])
|
||||||
extra_series = nothing
|
|
||||||
if haskey(extra_series_opt, :add)
|
|
||||||
extra_series = wraptuple(pop!(extra_series_opt,:add))
|
|
||||||
end
|
|
||||||
series_opt = merge(series_opt, PGFPlotsX.Options(extra_series_opt...))
|
series_opt = merge(series_opt, PGFPlotsX.Options(extra_series_opt...))
|
||||||
if RecipesPipeline.is3d(series) || st in (:heatmap, :contour)
|
if RecipesPipeline.is3d(series) || st in (:heatmap, :contour) || (st == :quiver && opt[:z] !== nothing)
|
||||||
series_func = PGFPlotsX.Plot3
|
series_func = PGFPlotsX.Plot3
|
||||||
else
|
else
|
||||||
series_func = PGFPlotsX.Plot
|
series_func = PGFPlotsX.Plot
|
||||||
@@ -294,132 +291,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
!isfilledcontour(series) && series[:ribbon] === nothing
|
!isfilledcontour(series) && series[:ribbon] === nothing
|
||||||
push!(series_opt, "area legend" => nothing)
|
push!(series_opt, "area legend" => nothing)
|
||||||
end
|
end
|
||||||
if st in (:heatmap, :contour)
|
pgfx_add_series!(Val(st), axis, series_opt, series, series_func, opt)
|
||||||
push!(axis.options, "view" => "{0}{90}")
|
if extra_series !== nothing
|
||||||
|
extra_series = wraptuple(extra_series)
|
||||||
|
push!(axis.contents[end], extra_series...)
|
||||||
end
|
end
|
||||||
# treat segments
|
|
||||||
segments =
|
|
||||||
if st in (:wireframe, :heatmap, :contour, :surface, :contour3d)
|
|
||||||
iter_segments(surface_to_vecs(
|
|
||||||
series[:x],
|
|
||||||
series[:y],
|
|
||||||
series[:z],
|
|
||||||
)...)
|
|
||||||
else
|
|
||||||
iter_segments(series)
|
|
||||||
end
|
|
||||||
for (i, rng) in enumerate(segments)
|
|
||||||
segment_opt = PGFPlotsX.Options()
|
|
||||||
segment_opt = merge(segment_opt, pgfx_linestyle(opt, i))
|
|
||||||
if opt[:markershape] != :none
|
|
||||||
marker = opt[:markershape]
|
|
||||||
if marker isa Shape
|
|
||||||
x = marker.x
|
|
||||||
y = marker.y
|
|
||||||
scale_factor = 0.00125
|
|
||||||
mark_size = opt[:markersize] * scale_factor
|
|
||||||
path = join(
|
|
||||||
[
|
|
||||||
"($(x[i] * mark_size), $(y[i] * mark_size))"
|
|
||||||
for i in eachindex(x)
|
|
||||||
],
|
|
||||||
" -- ",
|
|
||||||
)
|
|
||||||
c = get_markercolor(series, i)
|
|
||||||
a = get_markeralpha(series, i)
|
|
||||||
PGFPlotsX.push_preamble!(
|
|
||||||
pgfx_plot.the_plot,
|
|
||||||
"""
|
|
||||||
\\pgfdeclareplotmark{PlotsShape$(series_index)}{
|
|
||||||
\\filldraw
|
|
||||||
$path;
|
|
||||||
}
|
|
||||||
""",
|
|
||||||
)
|
|
||||||
end
|
|
||||||
segment_opt = merge(segment_opt, pgfx_marker(opt, i))
|
|
||||||
end
|
|
||||||
if st == :shape
|
|
||||||
segment_opt = merge(segment_opt, pgfx_fillstyle(opt, i))
|
|
||||||
end
|
|
||||||
# add fillrange
|
|
||||||
if sf !== nothing &&
|
|
||||||
!isfilledcontour(series) &&
|
|
||||||
series[:ribbon] === nothing
|
|
||||||
if sf isa Number || sf isa AVec
|
|
||||||
pgfx_fillrange_series!(
|
|
||||||
axis,
|
|
||||||
series,
|
|
||||||
series_func,
|
|
||||||
i,
|
|
||||||
_cycle(sf, rng),
|
|
||||||
rng,
|
|
||||||
)
|
|
||||||
end
|
|
||||||
if i == 1 &&
|
|
||||||
sp[:legend] != :none && pgfx_should_add_to_legend(series)
|
|
||||||
pgfx_filllegend!(series_opt, opt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
coordinates =
|
|
||||||
pgfx_series_coordinates!(sp, series, segment_opt, opt, rng)
|
|
||||||
segment_plot =
|
|
||||||
series_func(merge(series_opt, segment_opt), coordinates)
|
|
||||||
if extra_series !== nothing
|
|
||||||
push!(segment_plot, extra_series...)
|
|
||||||
end
|
|
||||||
push!(axis, segment_plot)
|
|
||||||
# fill between functions
|
|
||||||
if sf isa Tuple && series[:ribbon] === nothing
|
|
||||||
sf1, sf2 = sf
|
|
||||||
@assert sf1 == series_index "First index of the tuple has to match the current series index."
|
|
||||||
push!(
|
|
||||||
axis,
|
|
||||||
series_func(
|
|
||||||
merge(
|
|
||||||
pgfx_fillstyle(opt, series_index),
|
|
||||||
PGFPlotsX.Options("forget plot" => nothing),
|
|
||||||
),
|
|
||||||
"fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(sf2))])]",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
end
|
|
||||||
# add ribbons?
|
|
||||||
ribbon = series[:ribbon]
|
|
||||||
if ribbon !== nothing
|
|
||||||
pgfx_add_ribbons!(
|
|
||||||
axis,
|
|
||||||
series,
|
|
||||||
segment_plot,
|
|
||||||
series_func,
|
|
||||||
series_index,
|
|
||||||
)
|
|
||||||
end
|
|
||||||
# add to legend?
|
|
||||||
if sp[:legend] != :none
|
|
||||||
leg_entry = if opt[:label] isa AVec
|
|
||||||
get(opt[:label], i, "")
|
|
||||||
elseif opt[:label] isa AbstractString
|
|
||||||
if i == 1
|
|
||||||
get(opt, :label, "")
|
|
||||||
else
|
|
||||||
""
|
|
||||||
end
|
|
||||||
else
|
|
||||||
throw(ArgumentError("Malformed label. label = $(opt[:label])"))
|
|
||||||
end
|
|
||||||
if leg_entry == "" || !pgfx_should_add_to_legend(series)
|
|
||||||
push!(axis.contents[end].options, "forget plot" => nothing)
|
|
||||||
else
|
|
||||||
leg_opt = PGFPlotsX.Options()
|
|
||||||
if ribbon !== nothing
|
|
||||||
pgfx_filllegend!(axis.contents[end - 3].options, opt)
|
|
||||||
end
|
|
||||||
legend = PGFPlotsX.LegendEntry(leg_opt, leg_entry, false)
|
|
||||||
push!(axis, legend)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end # for segments
|
|
||||||
# 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])
|
||||||
@@ -453,11 +329,350 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
|
|||||||
return pgfx_plot
|
return pgfx_plot
|
||||||
end
|
end
|
||||||
## seriestype specifics
|
## seriestype specifics
|
||||||
@inline function pgfx_series_coordinates!(sp, series, segment_opt, opt, rng)
|
function pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||||
|
args = pgfx_series_arguments(series, opt)
|
||||||
|
series_plot = series_func(series_opt, PGFPlotsX.Table(args...))
|
||||||
|
push!(axis, series_plot)
|
||||||
|
pgfx_add_legend!(axis, series, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, opt)
|
||||||
|
# treat segments
|
||||||
|
segments = iter_segments(series, series[:seriestype])
|
||||||
|
sf = opt[:fillrange]
|
||||||
|
for (i, rng) in enumerate(segments)
|
||||||
|
segment_opt = PGFPlotsX.Options()
|
||||||
|
segment_opt = merge(segment_opt, pgfx_linestyle(opt, i))
|
||||||
|
if opt[:markershape] != :none
|
||||||
|
marker = _cycle(opt[:markershape], i)
|
||||||
|
if marker isa Shape
|
||||||
|
x = marker.x
|
||||||
|
y = marker.y
|
||||||
|
scale_factor = 0.00125
|
||||||
|
mark_size = opt[:markersize] * scale_factor
|
||||||
|
path = join(
|
||||||
|
[
|
||||||
|
"($(x[i] * mark_size), $(y[i] * mark_size))"
|
||||||
|
for i in eachindex(x)
|
||||||
|
],
|
||||||
|
" -- ",
|
||||||
|
)
|
||||||
|
c = get_markercolor(series, i)
|
||||||
|
a = get_markeralpha(series, i)
|
||||||
|
PGFPlotsX.push_preamble!(
|
||||||
|
series[:plot_object].o.the_plot,
|
||||||
|
"""
|
||||||
|
\\pgfdeclareplotmark{PlotsShape$(series[:series_plotindex])}{
|
||||||
|
\\filldraw
|
||||||
|
$path;
|
||||||
|
}
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
segment_opt = merge(segment_opt, pgfx_marker(opt, i))
|
||||||
|
end
|
||||||
|
# add fillrange
|
||||||
|
if sf !== nothing &&
|
||||||
|
!isfilledcontour(series)
|
||||||
|
if sf isa Number || sf isa AVec
|
||||||
|
pgfx_fillrange_series!(
|
||||||
|
axis,
|
||||||
|
series,
|
||||||
|
series_func,
|
||||||
|
i,
|
||||||
|
_cycle(sf, rng),
|
||||||
|
rng,
|
||||||
|
)
|
||||||
|
elseif sf isa Tuple && series[:ribbon] !== nothing
|
||||||
|
for sfi in sf
|
||||||
|
pgfx_fillrange_series!(
|
||||||
|
axis,
|
||||||
|
series,
|
||||||
|
series_func,
|
||||||
|
i,
|
||||||
|
_cycle(sfi, rng),
|
||||||
|
rng,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if i == 1 &&
|
||||||
|
series[:subplot][:legend] != :none && pgfx_should_add_to_legend(series)
|
||||||
|
pgfx_filllegend!(series_opt, opt)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# handle arrows
|
||||||
|
arrow = opt[:arrow]
|
||||||
|
if arrow isa Arrow
|
||||||
|
arrow_opt = merge(
|
||||||
|
segment_opt,
|
||||||
|
PGFPlotsX.Options("quiver" => PGFPlotsX.Options(
|
||||||
|
"u" => "\\thisrow{u}",
|
||||||
|
"v" => "\\thisrow{v}",
|
||||||
|
pgfx_arrow(arrow, :head) => nothing,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if arrow.side == :head
|
||||||
|
x_arrow = opt[:x][rng][end-1:end]
|
||||||
|
y_arrow = opt[:y][rng][end-1:end]
|
||||||
|
x_path = opt[:x][rng][1:end-1]
|
||||||
|
y_path = opt[:y][rng][1:end-1]
|
||||||
|
elseif arrow.side == :tail
|
||||||
|
x_arrow = opt[:x][rng][2:-1:1]
|
||||||
|
y_arrow = opt[:y][rng][2:-1:1]
|
||||||
|
x_path = opt[:x][rng][2:end]
|
||||||
|
y_path = opt[:y][rng][2:end]
|
||||||
|
elseif arrow.side == :both
|
||||||
|
x_arrow = opt[:x][rng][[2,1,end-1,end]]
|
||||||
|
y_arrow = opt[:y][rng][[2,1,end-1,end]]
|
||||||
|
x_path = opt[:x][rng][2:end-1]
|
||||||
|
y_path = opt[:y][rng][2:end-1]
|
||||||
|
end
|
||||||
|
coordinates = PGFPlotsX.Table([
|
||||||
|
:x => x_arrow[1:2:end-1],
|
||||||
|
:y => y_arrow[1:2:end-1],
|
||||||
|
:u => [x_arrow[i] - x_arrow[i-1] for i in 2:2:lastindex(x_arrow)],
|
||||||
|
:v => [y_arrow[i] - y_arrow[i-1] for i in 2:2:lastindex(y_arrow)],
|
||||||
|
])
|
||||||
|
arrow_plot =
|
||||||
|
series_func(merge(series_opt, arrow_opt), coordinates)
|
||||||
|
push!(axis, arrow_plot)
|
||||||
|
coordinates = PGFPlotsX.Table(x_path, y_path)
|
||||||
|
segment_plot =
|
||||||
|
series_func(merge(series_opt, segment_opt), coordinates)
|
||||||
|
push!(axis, segment_plot)
|
||||||
|
else
|
||||||
|
coordinates = PGFPlotsX.Table(pgfx_series_arguments(series, opt, rng)...)
|
||||||
|
segment_plot =
|
||||||
|
series_func(merge(series_opt, segment_opt), coordinates)
|
||||||
|
push!(axis, segment_plot)
|
||||||
|
end
|
||||||
|
# fill between functions
|
||||||
|
if sf isa Tuple && series[:ribbon] === nothing
|
||||||
|
sf1, sf2 = sf
|
||||||
|
@assert sf1 == series_index "First index of the tuple has to match the current series index."
|
||||||
|
push!(
|
||||||
|
axis,
|
||||||
|
series_func(
|
||||||
|
merge(
|
||||||
|
pgfx_fillstyle(opt, series_index),
|
||||||
|
PGFPlotsX.Options("forget plot" => nothing),
|
||||||
|
),
|
||||||
|
"fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(sf2))])]",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
pgfx_add_legend!(axis, series, opt, i)
|
||||||
|
end # for segments
|
||||||
|
# get that last marker
|
||||||
|
if !isnothing(opt[:y]) && !any(isnan, opt[:y]) && opt[:markershape] isa AVec
|
||||||
|
additional_plot = PGFPlotsX.PlotInc(pgfx_marker(opt, length(segments) + 1), PGFPlotsX.Coordinates(tuple((last(opt[:x]), last(opt[:y])))))
|
||||||
|
push!(axis, additional_plot)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:scatter}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "only marks" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:straightline}, axis, series_opt, series, series_func, opt)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:path3d}, axis, series_opt, series, series_func, opt)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:scatter3d}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "only marks" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:surface}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"surf" => nothing,
|
||||||
|
"mesh/rows" => length(opt[:x]),
|
||||||
|
"mesh/cols" => length(opt[:y]),
|
||||||
|
"z buffer" => "sort",
|
||||||
|
)
|
||||||
|
pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:wireframe}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "mesh" => nothing,
|
||||||
|
"mesh/rows" => length(opt[:x])
|
||||||
|
)
|
||||||
|
pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:heatmap}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(axis.options, "view" => "{0}{90}")
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"matrix plot*" => nothing,
|
||||||
|
"mesh/rows" => length(opt[:x]),
|
||||||
|
"mesh/cols" => length(opt[:y]),
|
||||||
|
"point meta" => "\\thisrow{meta}",
|
||||||
|
)
|
||||||
|
args = pgfx_series_arguments(series, opt)
|
||||||
|
meta = [any(!isfinite, r) ? NaN : r[3] for r in zip(args...)]
|
||||||
|
for arg in args
|
||||||
|
arg[(!isfinite).(arg)] .= 0
|
||||||
|
end
|
||||||
|
t = PGFPlotsX.Table(["x" => args[1], "y" => args[2], "z" => args[3], "meta" => meta])
|
||||||
|
series_plot = series_func(series_opt, t)
|
||||||
|
push!(axis, series_plot)
|
||||||
|
pgfx_add_legend!(axis, series, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:mesh3d}, axis, series_opt, series, series_func, opt)
|
||||||
|
ptable = join([ string(i, " ", j, " ", k, "\\\\") for (i, j, k) in zip(opt[:connections]...) ], "\n ")
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"patch" => nothing,
|
||||||
|
"table/row sep" => "\\\\",
|
||||||
|
"patch table" => ptable
|
||||||
|
)
|
||||||
|
pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:contour}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(axis.options, "view" => "{0}{90}")
|
||||||
|
if isfilledcontour(series)
|
||||||
|
pgfx_add_series!(Val(:filledcontour), axis, series_opt, series, series_func, opt)
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
pgfx_add_series!(Val(:contour3d), axis, series_opt, series, series_func, opt)
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:filledcontour}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"contour filled" => PGFPlotsX.Options(), # labels not supported
|
||||||
|
"patch type" => "bilinear",
|
||||||
|
"shader" => "flat",
|
||||||
|
)
|
||||||
|
if opt[:levels] isa Number
|
||||||
|
push!(series_opt["contour filled"], "number" => opt[:levels])
|
||||||
|
elseif opt[:levels] isa AVec
|
||||||
|
push!(series_opt["contour filled"], "levels" => opt[:levels])
|
||||||
|
end
|
||||||
|
pgfx_add_series!(axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:contour3d}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"contour prepared" => PGFPlotsX.Options("labels" => opt[:contour_labels]),
|
||||||
|
)
|
||||||
|
series_opt = merge( series_opt, pgfx_linestyle(opt) )
|
||||||
|
args = pgfx_series_arguments(series, opt)
|
||||||
|
series_plot = series_func(series_opt, PGFPlotsX.Table(Contour.contours(args..., opt[:levels])))
|
||||||
|
push!(axis, series_plot)
|
||||||
|
pgfx_add_legend!(axis, series, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:quiver}, axis, series_opt, series, series_func, opt)
|
||||||
|
if opt[:quiver] !== nothing
|
||||||
|
push!(
|
||||||
|
series_opt,
|
||||||
|
"quiver" => PGFPlotsX.Options(
|
||||||
|
"u" => "\\thisrow{u}",
|
||||||
|
"v" => "\\thisrow{v}",
|
||||||
|
pgfx_arrow(opt[:arrow]) => nothing,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
x = opt[:x]
|
||||||
|
y = opt[:y]
|
||||||
|
z = opt[:z]
|
||||||
|
if z !== nothing
|
||||||
|
push!(series_opt["quiver"], "w" => "\\thisrow{w}")
|
||||||
|
pgfx_axis!(axis.options, series[:subplot], :z)
|
||||||
|
table = PGFPlotsX.Table([
|
||||||
|
:x => x,
|
||||||
|
:y => y,
|
||||||
|
:z => z,
|
||||||
|
:u => opt[:quiver][1],
|
||||||
|
:v => opt[:quiver][2],
|
||||||
|
:w => opt[:quiver][3],
|
||||||
|
])
|
||||||
|
else
|
||||||
|
table = PGFPlotsX.Table([
|
||||||
|
:x => x,
|
||||||
|
:y => y,
|
||||||
|
:u => opt[:quiver][1],
|
||||||
|
:v => opt[:quiver][2],
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
series_plot = series_func(series_opt, table)
|
||||||
|
push!(axis, series_plot)
|
||||||
|
pgfx_add_legend!(axis, series, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:shape}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "area legend" => nothing)
|
||||||
|
series_opt = merge(series_opt, pgfx_fillstyle(opt))
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:steppre}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "const plot mark right" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:stepmid}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "const plot mark mid" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:steppost}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "const plot" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:ysticks}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "ycomb" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_series!(::Val{:xsticks}, axis, series_opt, series, series_func, opt)
|
||||||
|
push!(series_opt, "xcomb" => nothing)
|
||||||
|
pgfx_add_series!(Val(:path), axis, series_opt, series, series_func, opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pgfx_add_legend!(axis, series, opt, i = 1)
|
||||||
|
if series[:subplot][:legend] != :none
|
||||||
|
leg_entry = if opt[:label] isa AVec
|
||||||
|
get(opt[:label], i, "")
|
||||||
|
elseif opt[:label] isa AbstractString
|
||||||
|
if i == 1
|
||||||
|
get(opt, :label, "")
|
||||||
|
else
|
||||||
|
""
|
||||||
|
end
|
||||||
|
else
|
||||||
|
throw(ArgumentError("Malformed label. label = $(opt[:label])"))
|
||||||
|
end
|
||||||
|
if leg_entry == "" || !pgfx_should_add_to_legend(series)
|
||||||
|
push!(axis.contents[end].options, "forget plot" => nothing)
|
||||||
|
else
|
||||||
|
leg_opt = PGFPlotsX.Options()
|
||||||
|
legend = PGFPlotsX.LegendEntry(leg_opt, leg_entry, false)
|
||||||
|
push!(axis, legend)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
pgfx_series_arguments(series, opt, range) = (arg[range] for arg in pgfx_series_arguments(series, opt))
|
||||||
|
function pgfx_series_arguments(series, opt)
|
||||||
st = series[:seriestype]
|
st = series[:seriestype]
|
||||||
# function args
|
return if st in (:contour, :contour3d)
|
||||||
args = if st in (:contour, :contour3d)
|
opt[:x], opt[:y], handle_surface(opt[:z])
|
||||||
opt[:x], opt[:y], Array(opt[:z])'
|
|
||||||
elseif st in (:heatmap, :surface, :wireframe)
|
elseif st in (:heatmap, :surface, :wireframe)
|
||||||
surface_to_vecs(opt[:x], opt[:y], opt[:z])
|
surface_to_vecs(opt[:x], opt[:y], opt[:z])
|
||||||
elseif RecipesPipeline.is3d(st)
|
elseif RecipesPipeline.is3d(st)
|
||||||
@@ -466,145 +681,12 @@ end
|
|||||||
straightline_data(series)
|
straightline_data(series)
|
||||||
elseif st == :shape
|
elseif st == :shape
|
||||||
shape_data(series)
|
shape_data(series)
|
||||||
elseif ispolar(sp)
|
elseif ispolar(series)
|
||||||
theta, r = opt[:x], opt[:y]
|
theta, r = opt[:x], opt[:y]
|
||||||
rad2deg.(theta), r
|
rad2deg.(theta), r
|
||||||
else
|
else
|
||||||
opt[:x], opt[:y]
|
opt[:x], opt[:y]
|
||||||
end
|
end
|
||||||
seg_args = if st in (:contour, :contour3d)
|
|
||||||
args
|
|
||||||
else
|
|
||||||
(arg[rng] for arg in args)
|
|
||||||
end
|
|
||||||
if opt[:quiver] !== nothing
|
|
||||||
push!(
|
|
||||||
segment_opt,
|
|
||||||
"quiver" => PGFPlotsX.Options(
|
|
||||||
"u" => "\\thisrow{u}",
|
|
||||||
"v" => "\\thisrow{v}",
|
|
||||||
pgfx_arrow(opt[:arrow]) => nothing,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
x, y = collect(seg_args)
|
|
||||||
return PGFPlotsX.Table([
|
|
||||||
:x => x,
|
|
||||||
:y => y,
|
|
||||||
:u => opt[:quiver][1],
|
|
||||||
:v => opt[:quiver][2],
|
|
||||||
])
|
|
||||||
else
|
|
||||||
if isfilledcontour(series)
|
|
||||||
st = :filledcontour
|
|
||||||
end
|
|
||||||
pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(
|
|
||||||
st_val::Union{Val{:path},Val{:path3d},Val{:straightline}},
|
|
||||||
segment_opt,
|
|
||||||
opt,
|
|
||||||
args,
|
|
||||||
)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(
|
|
||||||
st_val::Union{Val{:scatter},Val{:scatter3d}},
|
|
||||||
segment_opt,
|
|
||||||
opt,
|
|
||||||
args,
|
|
||||||
)
|
|
||||||
push!(segment_opt, "only marks" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args)
|
|
||||||
push!(
|
|
||||||
segment_opt,
|
|
||||||
"matrix plot*" => nothing,
|
|
||||||
"mesh/rows" => length(opt[:x]),
|
|
||||||
"mesh/cols" => length(opt[:y]),
|
|
||||||
)
|
|
||||||
return PGFPlotsX.Table(args...)
|
|
||||||
end
|
|
||||||
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:steppre}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "const plot mark right" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:stepmid}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "const plot mark mid" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:steppost}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "const plot" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(
|
|
||||||
st_val::Union{Val{:ysticks},Val{:sticks}},
|
|
||||||
segment_opt,
|
|
||||||
opt,
|
|
||||||
args,
|
|
||||||
)
|
|
||||||
push!(segment_opt, "ycomb" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "xcomb" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args)
|
|
||||||
push!(
|
|
||||||
segment_opt,
|
|
||||||
"surf" => nothing,
|
|
||||||
"mesh/rows" => length(opt[:x]),
|
|
||||||
"mesh/cols" => length(opt[:y]),
|
|
||||||
)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "patch" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "mesh" => nothing, "mesh/rows" => length(opt[:x]))
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args)
|
|
||||||
push!(segment_opt, "area legend" => nothing)
|
|
||||||
return PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(
|
|
||||||
st_val::Union{Val{:contour},Val{:contour3d}},
|
|
||||||
segment_opt,
|
|
||||||
opt,
|
|
||||||
args,
|
|
||||||
)
|
|
||||||
push!(
|
|
||||||
segment_opt,
|
|
||||||
"contour prepared" => PGFPlotsX.Options("labels" => opt[:contour_labels]),
|
|
||||||
)
|
|
||||||
return PGFPlotsX.Table(Contour.contours(args..., opt[:levels]))
|
|
||||||
end
|
|
||||||
function pgfx_series_coordinates!(
|
|
||||||
st_val::Val{:filledcontour},
|
|
||||||
segment_opt,
|
|
||||||
opt,
|
|
||||||
args,
|
|
||||||
)
|
|
||||||
xs, ys, zs = collect(args)
|
|
||||||
push!(
|
|
||||||
segment_opt,
|
|
||||||
"contour filled" => PGFPlotsX.Options(), # labels not supported
|
|
||||||
"patch type" => "bilinear",
|
|
||||||
"shader" => "flat",
|
|
||||||
)
|
|
||||||
if opt[:levels] isa Number
|
|
||||||
push!(segment_opt["contour filled"], "number" => opt[:levels])
|
|
||||||
elseif opt[:levels] isa AVec
|
|
||||||
push!(segment_opt["contour filled"], "levels" => opt[:levels])
|
|
||||||
end
|
|
||||||
|
|
||||||
PGFPlotsX.Coordinates(args...)
|
|
||||||
end
|
end
|
||||||
##
|
##
|
||||||
pgfx_get_linestyle(k) = get(
|
pgfx_get_linestyle(k) = get(
|
||||||
@@ -716,7 +798,7 @@ end
|
|||||||
## --------------------------------------------------------------------------------------
|
## --------------------------------------------------------------------------------------
|
||||||
# Generates a colormap for pgfplots based on a ColorGradient
|
# Generates a colormap for pgfplots based on a ColorGradient
|
||||||
pgfx_arrow(::Nothing) = "every arrow/.append style={-}"
|
pgfx_arrow(::Nothing) = "every arrow/.append style={-}"
|
||||||
function pgfx_arrow(arr::Arrow)
|
function pgfx_arrow(arr::Arrow, side = arr.side)
|
||||||
components = String[]
|
components = String[]
|
||||||
head = String[]
|
head = String[]
|
||||||
push!(head, "{stealth[length = $(arr.headlength)pt, width = $(arr.headwidth)pt")
|
push!(head, "{stealth[length = $(arr.headlength)pt, width = $(arr.headwidth)pt")
|
||||||
@@ -725,11 +807,11 @@ function pgfx_arrow(arr::Arrow)
|
|||||||
end
|
end
|
||||||
push!(head, "]}")
|
push!(head, "]}")
|
||||||
head = join(head, "")
|
head = join(head, "")
|
||||||
if arr.side == :both || arr.side == :tail
|
if side == :both || side == :tail
|
||||||
push!(components, head)
|
push!(components, head)
|
||||||
end
|
end
|
||||||
push!(components, "-")
|
push!(components, "-")
|
||||||
if arr.side == :both || arr.side == :head
|
if side == :both || side == :head
|
||||||
push!(components, head)
|
push!(components, head)
|
||||||
end
|
end
|
||||||
components = join(components, "")
|
components = join(components, "")
|
||||||
@@ -805,6 +887,13 @@ function pgfx_font(fontsize, thickness_scaling = 1, font = "\\selectfont")
|
|||||||
return string("{\\fontsize{", fs, " pt}{", 1.3fs, " pt}", font, "}")
|
return string("{\\fontsize{", fs, " pt}{", 1.3fs, " pt}", font, "}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# If a particular fontsize parameter is `nothing`, produce a figure that doesn't specify the
|
||||||
|
# font size, and therefore uses whatever fontsize is utilised by the doc in which the
|
||||||
|
# figure is located.
|
||||||
|
function pgfx_font(fontsize::Nothing, thickness_scaling = 1, font = "\\selectfont")
|
||||||
|
return string("{", font, "}")
|
||||||
|
end
|
||||||
|
|
||||||
function pgfx_should_add_to_legend(series::Series)
|
function pgfx_should_add_to_legend(series::Series)
|
||||||
series.plotattributes[:primary] &&
|
series.plotattributes[:primary] &&
|
||||||
!(
|
!(
|
||||||
@@ -837,9 +926,12 @@ function pgfx_marker(plotattributes, i = 1)
|
|||||||
pgfx_thickness_scaling(plotattributes) *
|
pgfx_thickness_scaling(plotattributes) *
|
||||||
0.75 *
|
0.75 *
|
||||||
_cycle(plotattributes[:markersize], i)
|
_cycle(plotattributes[:markersize], i)
|
||||||
|
mark_freq = !any(isnan, plotattributes[:y]) && plotattributes[:markershape] isa AVec ?
|
||||||
|
length(plotattributes[:markershape]) : 1
|
||||||
return PGFPlotsX.Options(
|
return PGFPlotsX.Options(
|
||||||
"mark" => shape isa Shape ? "PlotsShape$i" : pgfx_get_marker(shape),
|
"mark" => shape isa Shape ? "PlotsShape$i" : pgfx_get_marker(shape),
|
||||||
"mark size" => "$mark_size pt",
|
"mark size" => "$mark_size pt",
|
||||||
|
"mark repeat" => mark_freq,
|
||||||
"mark options" => PGFPlotsX.Options(
|
"mark options" => PGFPlotsX.Options(
|
||||||
"color" => cstr_stroke,
|
"color" => cstr_stroke,
|
||||||
"draw opacity" => a_stroke,
|
"draw opacity" => a_stroke,
|
||||||
@@ -969,7 +1061,7 @@ function pgfx_fillrange_args(fillrange, x, y, z)
|
|||||||
x_fill = [x; x[n:-1:1]; x[1]]
|
x_fill = [x; x[n:-1:1]; x[1]]
|
||||||
y_fill = [y; y[n:-1:1]; x[1]]
|
y_fill = [y; y[n:-1:1]; x[1]]
|
||||||
z_fill = [z; _cycle(fillrange, n:-1:1); z[1]]
|
z_fill = [z; _cycle(fillrange, n:-1:1); z[1]]
|
||||||
return PGFPlotsX.Coordiantes(x_fill, y_fill, z_fill)
|
return PGFPlotsX.Coordinates(x_fill, y_fill, z_fill)
|
||||||
end
|
end
|
||||||
|
|
||||||
function pgfx_sanitize_string(p::PlotText)
|
function pgfx_sanitize_string(p::PlotText)
|
||||||
@@ -982,12 +1074,16 @@ function pgfx_sanitize_string(s::AbstractString)
|
|||||||
s = replace(s, r"\\?\&" => "\\&")
|
s = replace(s, r"\\?\&" => "\\&")
|
||||||
s = replace(s, r"\\?\{" => "\\{")
|
s = replace(s, r"\\?\{" => "\\{")
|
||||||
s = replace(s, r"\\?\}" => "\\}")
|
s = replace(s, r"\\?\}" => "\\}")
|
||||||
|
s = map(split(s, "")) do s
|
||||||
|
isascii(s) ? s : latexify(s)
|
||||||
|
end |> join
|
||||||
end
|
end
|
||||||
@require LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" begin
|
@require LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" begin
|
||||||
using .LaTeXStrings
|
using .LaTeXStrings
|
||||||
function pgfx_sanitize_string(s::LaTeXString)
|
function pgfx_sanitize_string(s::LaTeXString)
|
||||||
s = replace(s, r"\\?\#" => "\\#")
|
s = replace(s, r"\\?\#" => "\\#")
|
||||||
s = replace(s, r"\\?\%" => "\\%")
|
s = replace(s, r"\\?\%" => "\\%")
|
||||||
|
return LaTeXString(s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function pgfx_sanitize_plot!(plt)
|
function pgfx_sanitize_plot!(plt)
|
||||||
|
|||||||
+122
-63
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# https://plot.ly/javascript/getting-started
|
# https://plot.ly/javascript/getting-started
|
||||||
|
|
||||||
is_subplot_supported(::PlotlyBackend) = true
|
is_subplot_supported(::PlotlyBackend) = true
|
||||||
@@ -20,6 +19,16 @@ using UUIDs
|
|||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
|
function labelfunc(scale::Symbol, backend::PlotlyBackend)
|
||||||
|
texfunc = labelfunc_tex(scale)
|
||||||
|
function (x)
|
||||||
|
tex_x = texfunc(x)
|
||||||
|
sup_x = replace( tex_x, r"\^{(.*)}"=>s"<sup>\1</sup>" )
|
||||||
|
# replace dash with \minus (U+2212)
|
||||||
|
replace(sup_x, "-" => "−")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function plotly_font(font::Font, color = font.color)
|
function plotly_font(font::Font, color = font.color)
|
||||||
KW(
|
KW(
|
||||||
:family => font.family,
|
:family => font.family,
|
||||||
@@ -111,16 +120,17 @@ end
|
|||||||
|
|
||||||
|
|
||||||
# this method gets the start/end in percentage of the canvas for this axis direction
|
# this method gets the start/end in percentage of the canvas for this axis direction
|
||||||
function plotly_domain(sp::Subplot, letter)
|
function plotly_domain(sp::Subplot)
|
||||||
figw, figh = sp.plt[:size]
|
figw, figh = sp.plt[:size]
|
||||||
pcts = bbox_to_pcts(sp.plotarea, figw*px, figh*px)
|
pcts = bbox_to_pcts(sp.plotarea, figw*px, figh*px)
|
||||||
pcts = plotly_apply_aspect_ratio(sp, sp.plotarea, pcts)
|
pcts = plotly_apply_aspect_ratio(sp, sp.plotarea, pcts)
|
||||||
i1,i2 = (letter == :x ? (1,3) : (2,4))
|
x_domain = [pcts[1], pcts[1] + pcts[3]]
|
||||||
[pcts[i1], pcts[i1]+pcts[i2]]
|
y_domain = [pcts[2], pcts[2] + pcts[4]]
|
||||||
|
return x_domain, y_domain
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function plotly_axis(plt::Plot, axis::Axis, sp::Subplot)
|
function plotly_axis(axis, sp, anchor = nothing, domain = nothing)
|
||||||
letter = axis[:letter]
|
letter = axis[:letter]
|
||||||
framestyle = sp[:framestyle]
|
framestyle = sp[:framestyle]
|
||||||
ax = KW(
|
ax = KW(
|
||||||
@@ -137,16 +147,11 @@ function plotly_axis(plt::Plot, axis::Axis, sp::Subplot)
|
|||||||
:mirror => framestyle == :box,
|
:mirror => framestyle == :box,
|
||||||
:showticklabels => axis[:showaxis],
|
:showticklabels => axis[:showaxis],
|
||||||
)
|
)
|
||||||
|
if anchor !== nothing
|
||||||
if letter in (:x,:y)
|
ax[:anchor] = anchor
|
||||||
ax[:domain] = plotly_domain(sp, letter)
|
end
|
||||||
if RecipesPipeline.is3d(sp)
|
if domain !== nothing
|
||||||
# don't link 3d axes for synchronized interactivity
|
ax[:domain] = domain
|
||||||
x_idx = y_idx = sp[:subplot_index]
|
|
||||||
else
|
|
||||||
x_idx, y_idx = plotly_link_indicies(plt, sp)
|
|
||||||
end
|
|
||||||
ax[:anchor] = "$(letter==:x ? "y$(y_idx)" : "x$(x_idx)")"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
ax[:tickangle] = -axis[:rotation]
|
ax[:tickangle] = -axis[:rotation]
|
||||||
@@ -241,31 +246,38 @@ function plotly_layout(plt::Plot)
|
|||||||
# set to supported framestyle
|
# set to supported framestyle
|
||||||
sp[:framestyle] = _plotly_framestyle(sp[:framestyle])
|
sp[:framestyle] = _plotly_framestyle(sp[:framestyle])
|
||||||
|
|
||||||
# if any(RecipesPipeline.is3d, seriesargs)
|
if ispolar(sp)
|
||||||
if RecipesPipeline.is3d(sp)
|
|
||||||
azim = sp[:camera][1] - 90 #convert azimuthal to match GR behaviour
|
|
||||||
theta = 90 - sp[:camera][2] #spherical coordinate angle from z axis
|
|
||||||
plotattributes_out[:scene] = KW(
|
|
||||||
Symbol("xaxis$(spidx)") => plotly_axis(plt, sp[:xaxis], sp),
|
|
||||||
Symbol("yaxis$(spidx)") => plotly_axis(plt, sp[:yaxis], sp),
|
|
||||||
Symbol("zaxis$(spidx)") => plotly_axis(plt, sp[:zaxis], sp),
|
|
||||||
|
|
||||||
#2.6 multiplier set camera eye such that whole plot can be seen
|
|
||||||
:camera => KW(
|
|
||||||
:eye => KW(
|
|
||||||
:x => cosd(azim)*sind(theta)*2.6,
|
|
||||||
:y => sind(azim)*sind(theta)*2.6,
|
|
||||||
:z => cosd(theta)*2.6,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
elseif ispolar(sp)
|
|
||||||
plotattributes_out[Symbol("angularaxis$(spidx)")] = plotly_polaraxis(sp, sp[:xaxis])
|
plotattributes_out[Symbol("angularaxis$(spidx)")] = plotly_polaraxis(sp, sp[:xaxis])
|
||||||
plotattributes_out[Symbol("radialaxis$(spidx)")] = plotly_polaraxis(sp, sp[:yaxis])
|
plotattributes_out[Symbol("radialaxis$(spidx)")] = plotly_polaraxis(sp, sp[:yaxis])
|
||||||
else
|
else
|
||||||
plotattributes_out[Symbol("xaxis$(x_idx)")] = plotly_axis(plt, sp[:xaxis], sp)
|
x_domain, y_domain = plotly_domain(sp)
|
||||||
# don't allow yaxis to be reupdated/reanchored in a linked subplot
|
if RecipesPipeline.is3d(sp)
|
||||||
spidx == y_idx ? plotattributes_out[Symbol("yaxis$(y_idx)")] = plotly_axis(plt, sp[:yaxis], sp) : nothing
|
azim = sp[:camera][1] - 90 #convert azimuthal to match GR behaviour
|
||||||
|
theta = 90 - sp[:camera][2] #spherical coordinate angle from z axis
|
||||||
|
plotattributes_out[Symbol(:scene, spidx)] = KW(
|
||||||
|
:domain => KW(:x => x_domain, :y => y_domain),
|
||||||
|
Symbol("xaxis$(spidx)") => plotly_axis(sp[:xaxis], sp),
|
||||||
|
Symbol("yaxis$(spidx)") => plotly_axis(sp[:yaxis], sp),
|
||||||
|
Symbol("zaxis$(spidx)") => plotly_axis(sp[:zaxis], sp),
|
||||||
|
|
||||||
|
#2.6 multiplier set camera eye such that whole plot can be seen
|
||||||
|
:camera => KW(
|
||||||
|
:eye => KW(
|
||||||
|
:x => cosd(azim)*sind(theta)*2.6,
|
||||||
|
:y => sind(azim)*sind(theta)*2.6,
|
||||||
|
:z => cosd(theta)*2.6,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
else
|
||||||
|
plotattributes_out[Symbol("xaxis$(x_idx)")] =
|
||||||
|
plotly_axis(sp[:xaxis], sp, string("y", y_idx) , x_domain)
|
||||||
|
# don't allow yaxis to be reupdated/reanchored in a linked subplot
|
||||||
|
if spidx == y_idx
|
||||||
|
plotattributes_out[Symbol("yaxis$(y_idx)")] =
|
||||||
|
plotly_axis(sp[:yaxis], sp, string("x", x_idx), y_domain)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# legend
|
# legend
|
||||||
@@ -327,7 +339,11 @@ function plotly_add_legend!(plotattributes_out::KW, sp::Subplot)
|
|||||||
:font => plotly_font(legendfont(sp)),
|
:font => plotly_font(legendfont(sp)),
|
||||||
:tracegroupgap => 0,
|
:tracegroupgap => 0,
|
||||||
:x => legend_position.coords[1],
|
:x => legend_position.coords[1],
|
||||||
:y => legend_position.coords[2]
|
:y => legend_position.coords[2],
|
||||||
|
:title => KW(
|
||||||
|
:text => sp[:legendtitle] === nothing ? "" : string(sp[:legendtitle]),
|
||||||
|
:font => plotly_font(legendtitlefont(sp)),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -335,18 +351,32 @@ end
|
|||||||
function plotly_legend_pos(pos::Symbol)
|
function plotly_legend_pos(pos::Symbol)
|
||||||
xleft = 0.07
|
xleft = 0.07
|
||||||
ybot = 0.07
|
ybot = 0.07
|
||||||
ycenter = 0.52
|
ytop = 1.0
|
||||||
xcenter = 0.55
|
xcenter = 0.55
|
||||||
|
ycenter = 0.52
|
||||||
|
center = 0.5
|
||||||
|
youtertop = 1.1
|
||||||
|
youterbot = -0.15
|
||||||
|
xouterright = 1.05
|
||||||
|
xouterleft = -0.15
|
||||||
plotly_legend_position_mapping = (
|
plotly_legend_position_mapping = (
|
||||||
right = (coords = [1.0, ycenter], xanchor = "right", yanchor = "middle"),
|
right = (coords = [1.0, ycenter], xanchor = "right", yanchor = "middle"),
|
||||||
left = (coords = [xleft, ycenter], xanchor = "left", yanchor = "middle"),
|
left = (coords = [xleft, ycenter], xanchor = "left", yanchor = "middle"),
|
||||||
top = (coords = [xcenter, 1.0], xanchor = "center", yanchor = "top"),
|
top = (coords = [xcenter, ytop], xanchor = "center", yanchor = "top"),
|
||||||
bottom = (coords = [xcenter, ybot], xanchor = "center", yanchor = "bottom"),
|
bottom = (coords = [xcenter, ybot], xanchor = "center", yanchor = "bottom"),
|
||||||
bottomleft = (coords = [xleft, ybot], xanchor = "left", yanchor = "bottom"),
|
bottomleft = (coords = [xleft, ybot], xanchor = "left", yanchor = "bottom"),
|
||||||
bottomright = (coords = [1.0, ybot], xanchor = "right", yanchor = "bottom"),
|
bottomright = (coords = [1.0, ybot], xanchor = "right", yanchor = "bottom"),
|
||||||
topright = (coords = [1.0, 1.0], xanchor = "right", yanchor = "top"),
|
topright = (coords = [1.0, 1.0], xanchor = "right", yanchor = "top"),
|
||||||
topleft = (coords = [xleft, 1.0], xanchor = "left", yanchor = "top"),
|
topleft = (coords = [xleft, 1.0], xanchor = "left", yanchor = "top"),
|
||||||
default = (coords = [1.02, 1.0], xanchor = "auto", yanchor = "auto")
|
outertop =(coords = [center, youtertop ], xanchor = "upper", yanchor = "middle"),
|
||||||
|
outerbottom =(coords = [center, youterbot], xanchor = "lower", yanchor = "middle"),
|
||||||
|
outerleft =(coords = [xouterleft, center], xanchor = "left", yanchor = "top"),
|
||||||
|
outerright =(coords = [xouterright, center], xanchor = "right", yanchor = "top"),
|
||||||
|
outertopleft =(coords = [xouterleft, ytop], xanchor = "upper", yanchor = "left"),
|
||||||
|
outertopright = (coords = [xouterright, ytop], xanchor = "upper", yanchor = "right"),
|
||||||
|
outerbottomleft =(coords = [xouterleft, ybot], xanchor = "lower", yanchor = "left"),
|
||||||
|
outerbottomright =(coords = [xouterright, ybot], xanchor = "lower", yanchor = "right"),
|
||||||
|
default = (coords = [1.0, 1.0], xanchor = "auto", yanchor = "auto")
|
||||||
)
|
)
|
||||||
|
|
||||||
legend_position = get(plotly_legend_position_mapping, pos, plotly_legend_position_mapping.default)
|
legend_position = get(plotly_legend_position_mapping, pos, plotly_legend_position_mapping.default)
|
||||||
@@ -432,8 +462,8 @@ function plotly_data(series::Series, letter::Symbol, data)
|
|||||||
data
|
data
|
||||||
end
|
end
|
||||||
|
|
||||||
if series[:seriestype] in (:heatmap, :contour, :surface, :wireframe)
|
if series[:seriestype] in (:heatmap, :contour, :surface, :wireframe, :mesh3d)
|
||||||
plotly_surface_data(series, data)
|
handle_surface(data)
|
||||||
else
|
else
|
||||||
plotly_data(data)
|
plotly_data(data)
|
||||||
end
|
end
|
||||||
@@ -443,10 +473,6 @@ plotly_data(v::AbstractArray) = v
|
|||||||
plotly_data(surf::Surface) = surf.surf
|
plotly_data(surf::Surface) = surf.surf
|
||||||
plotly_data(v::AbstractArray{R}) where {R<:Rational} = float(v)
|
plotly_data(v::AbstractArray{R}) where {R<:Rational} = float(v)
|
||||||
|
|
||||||
plotly_surface_data(series::Series, a::AbstractVector) = a
|
|
||||||
plotly_surface_data(series::Series, a::AbstractMatrix) = transpose_z(series, a, false)
|
|
||||||
plotly_surface_data(series::Series, a::Surface) = plotly_surface_data(series, a.surf)
|
|
||||||
|
|
||||||
function plotly_native_data(axis::Axis, data::AbstractArray)
|
function plotly_native_data(axis::Axis, data::AbstractArray)
|
||||||
if !isempty(axis[:discrete_values])
|
if !isempty(axis[:discrete_values])
|
||||||
construct_categorical_data(data, axis)
|
construct_categorical_data(data, axis)
|
||||||
@@ -487,9 +513,17 @@ function plotly_series(plt::Plot, series::Series)
|
|||||||
plotattributes_out = KW()
|
plotattributes_out = KW()
|
||||||
|
|
||||||
# these are the axes that the series should be mapped to
|
# these are the axes that the series should be mapped to
|
||||||
x_idx, y_idx = plotly_link_indicies(plt, sp)
|
if RecipesPipeline.is3d(sp)
|
||||||
plotattributes_out[:xaxis] = "x$(x_idx)"
|
spidx = length(plt.subplots) > 1 ? sp[:subplot_index] : ""
|
||||||
plotattributes_out[:yaxis] = "y$(y_idx)"
|
plotattributes_out[:xaxis] = "x$spidx"
|
||||||
|
plotattributes_out[:yaxis] = "y$spidx"
|
||||||
|
plotattributes_out[:zaxis] = "z$spidx"
|
||||||
|
plotattributes_out[:scene] = "scene$spidx"
|
||||||
|
else
|
||||||
|
x_idx, y_idx = length(plt.subplots) > 1 ? plotly_link_indicies(plt, sp) : ("", "")
|
||||||
|
plotattributes_out[:xaxis] = "x$(x_idx)"
|
||||||
|
plotattributes_out[:yaxis] = "y$(y_idx)"
|
||||||
|
end
|
||||||
plotattributes_out[:showlegend] = should_add_to_legend(series)
|
plotattributes_out[:showlegend] = should_add_to_legend(series)
|
||||||
|
|
||||||
if st == :straightline
|
if st == :straightline
|
||||||
@@ -539,7 +573,7 @@ function plotly_series(plt::Plot, series::Series)
|
|||||||
plotattributes_out[:showscale] = hascolorbar(sp) && hascolorbar(series)
|
plotattributes_out[:showscale] = hascolorbar(sp) && hascolorbar(series)
|
||||||
|
|
||||||
elseif st in (:surface, :wireframe)
|
elseif st in (:surface, :wireframe)
|
||||||
plotattributes_out[:type] = "surface"
|
plotattributes_out[:type] = "surface"
|
||||||
plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z
|
plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z
|
||||||
if st == :wireframe
|
if st == :wireframe
|
||||||
plotattributes_out[:hidesurface] = true
|
plotattributes_out[:hidesurface] = true
|
||||||
@@ -554,11 +588,34 @@ function plotly_series(plt::Plot, series::Series)
|
|||||||
plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha])
|
plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha])
|
||||||
plotattributes_out[:opacity] = series[:fillalpha]
|
plotattributes_out[:opacity] = series[:fillalpha]
|
||||||
if series[:fill_z] !== nothing
|
if series[:fill_z] !== nothing
|
||||||
plotattributes_out[:surfacecolor] = plotly_surface_data(series, series[:fill_z])
|
plotattributes_out[:surfacecolor] = handle_surface(series[:fill_z])
|
||||||
end
|
end
|
||||||
plotattributes_out[:showscale] = hascolorbar(sp)
|
plotattributes_out[:showscale] = hascolorbar(sp)
|
||||||
end
|
end
|
||||||
|
elseif st == :mesh3d
|
||||||
|
plotattributes_out[:type] = "mesh3d"
|
||||||
|
plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z
|
||||||
|
|
||||||
|
if series[:connections] !== nothing
|
||||||
|
if typeof(series[:connections]) <: Tuple{Array,Array,Array}
|
||||||
|
i,j,k = series[:connections]
|
||||||
|
if !(length(i) == length(j) == length(k))
|
||||||
|
throw(ArgumentError("Argument connections must consist of equally sized arrays."))
|
||||||
|
end
|
||||||
|
plotattributes_out[:i] = i
|
||||||
|
plotattributes_out[:j] = j
|
||||||
|
plotattributes_out[:k] = k
|
||||||
|
else
|
||||||
|
throw(ArgumentError("Argument connections has to be a tuple of three arrays."))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha])
|
||||||
|
plotattributes_out[:color] = rgba_string(plot_color(series[:fillcolor], series[:fillalpha]))
|
||||||
|
plotattributes_out[:opacity] = series[:fillalpha]
|
||||||
|
if series[:fill_z] !== nothing
|
||||||
|
plotattributes_out[:surfacecolor] = handle_surface(series[:fill_z])
|
||||||
|
end
|
||||||
|
plotattributes_out[:showscale] = hascolorbar(sp)
|
||||||
else
|
else
|
||||||
@warn("Plotly: seriestype $st isn't supported.")
|
@warn("Plotly: seriestype $st isn't supported.")
|
||||||
return KW()
|
return KW()
|
||||||
@@ -648,9 +705,11 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z
|
|||||||
hasfillrange = st in (:path, :scatter, :scattergl, :straightline) &&
|
hasfillrange = st in (:path, :scatter, :scattergl, :straightline) &&
|
||||||
(isa(series[:fillrange], AbstractVector) || isa(series[:fillrange], Tuple))
|
(isa(series[:fillrange], AbstractVector) || isa(series[:fillrange], Tuple))
|
||||||
|
|
||||||
segments = iter_segments(series)
|
segments = iter_segments(series, st)
|
||||||
plotattributes_outs = fill(KW(), (hasfillrange ? 2 : 1 ) * length(segments))
|
plotattributes_outs = fill(KW(), (hasfillrange ? 2 : 1 ) * length(segments))
|
||||||
|
|
||||||
|
needs_scatter_fix = !isscatter && hasmarker && !any(isnan,y) && length(segments) > 1
|
||||||
|
|
||||||
for (i,rng) in enumerate(segments)
|
for (i,rng) in enumerate(segments)
|
||||||
plotattributes_out = deepcopy(plotattributes_base)
|
plotattributes_out = deepcopy(plotattributes_base)
|
||||||
plotattributes_out[:showlegend] = i==1 ? should_add_to_legend(series) : false
|
plotattributes_out[:showlegend] = i==1 ? should_add_to_legend(series) : false
|
||||||
@@ -687,13 +746,15 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z
|
|||||||
|
|
||||||
# add "marker"
|
# add "marker"
|
||||||
if hasmarker
|
if hasmarker
|
||||||
|
mcolor = rgba_string(plot_color(get_markercolor(series, clims, i), get_markeralpha(series, i)))
|
||||||
|
lcolor = rgba_string(plot_color(get_markerstrokecolor(series, i), get_markerstrokealpha(series, i)))
|
||||||
plotattributes_out[:marker] = KW(
|
plotattributes_out[:marker] = KW(
|
||||||
:symbol => get_plotly_marker(_cycle(series[:markershape], i), string(_cycle(series[:markershape], i))),
|
:symbol => get_plotly_marker(_cycle(series[:markershape], i), string(_cycle(series[:markershape], i))),
|
||||||
# :opacity => series[:markeralpha],
|
# :opacity => needs_scatter_fix ? [1, 0] : 1,
|
||||||
:size => 2 * _cycle(series[:markersize], i),
|
:size => 2 * _cycle(series[:markersize], i),
|
||||||
:color => rgba_string(plot_color(get_markercolor(series, clims, i), get_markeralpha(series, i))),
|
:color => needs_scatter_fix ? [mcolor, "rgba(0, 0, 0, 0.000)"] : mcolor,
|
||||||
:line => KW(
|
:line => KW(
|
||||||
:color => rgba_string(plot_color(get_markerstrokecolor(series, i), get_markerstrokealpha(series, i))),
|
:color => needs_scatter_fix ? [lcolor, "rgba(0, 0, 0, 0.000)"] : lcolor,
|
||||||
:width => _cycle(series[:markerstrokewidth], i),
|
:width => _cycle(series[:markerstrokewidth], i),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -738,8 +799,7 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z
|
|||||||
else
|
else
|
||||||
# if fillrange is a tuple with upper and lower limit, plotattributes_out_fillrange
|
# if fillrange is a tuple with upper and lower limit, plotattributes_out_fillrange
|
||||||
# is the series that will do the filling
|
# is the series that will do the filling
|
||||||
fillrng = Tuple(series[:fillrange][i][rng] for i in 1:2)
|
plotattributes_out_fillrange[:x], plotattributes_out_fillrange[:y] = concatenate_fillrange(x[rng], series[:fillrange])
|
||||||
plotattributes_out_fillrange[:x], plotattributes_out_fillrange[:y] = concatenate_fillrange(x[rng], fillrng)
|
|
||||||
plotattributes_out_fillrange[:line][:width] = 0
|
plotattributes_out_fillrange[:line][:width] = 0
|
||||||
delete!(plotattributes_out, :fill)
|
delete!(plotattributes_out, :fill)
|
||||||
delete!(plotattributes_out, :fillcolor)
|
delete!(plotattributes_out, :fillcolor)
|
||||||
@@ -775,8 +835,8 @@ function plotly_colorbar_hack(series::Series, plotattributes_base::KW, sym::Symb
|
|||||||
end
|
end
|
||||||
# zrange = zmax == zmin ? 1 : zmax - zmin # if all marker_z values are the same, plot all markers same color (avoids division by zero in next line)
|
# zrange = zmax == zmin ? 1 : zmax - zmin # if all marker_z values are the same, plot all markers same color (avoids division by zero in next line)
|
||||||
plotattributes_out[:marker] = KW(
|
plotattributes_out[:marker] = KW(
|
||||||
:size => 0,
|
:size => 1e-10,
|
||||||
:opacity => 0,
|
:opacity => 1e-10,
|
||||||
:color => [0.5],
|
:color => [0.5],
|
||||||
:cmin => cmin,
|
:cmin => cmin,
|
||||||
:cmax => cmax,
|
:cmax => cmax,
|
||||||
@@ -826,9 +886,8 @@ html_body(plt::Plot{PlotlyBackend}) = plotly_html_body(plt)
|
|||||||
const ijulia_initialized = Ref(false)
|
const ijulia_initialized = Ref(false)
|
||||||
|
|
||||||
function plotly_html_head(plt::Plot)
|
function plotly_html_head(plt::Plot)
|
||||||
local_file = ("file:///" * plotly_local_file_path)
|
|
||||||
plotly =
|
plotly =
|
||||||
use_local_dependencies[] ? local_file : "https://cdn.plot.ly/plotly-latest.min.js"
|
use_local_dependencies[] ? ("file:///" * plotly_local_file_path[]) : "https://cdn.plot.ly/plotly-1.57.1.min.js"
|
||||||
|
|
||||||
include_mathjax = get(plt[:extra_plot_kwargs], :include_mathjax, "")
|
include_mathjax = get(plt[:extra_plot_kwargs], :include_mathjax, "")
|
||||||
mathjax_file = include_mathjax != "cdn" ? ("file://" * include_mathjax) : "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"
|
mathjax_file = include_mathjax != "cdn" ? ("file://" * include_mathjax) : "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
function plotlybase_syncplot(plt::Plot)
|
function plotlybase_syncplot(plt::Plot)
|
||||||
plt.o = ORCA.PlotlyBase.Plot()
|
plt.o = PlotlyBase.Plot()
|
||||||
traces = ORCA.PlotlyBase.GenericTrace[]
|
traces = PlotlyBase.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)
|
||||||
push!(traces, ORCA.PlotlyBase.GenericTrace(plotly_type; series_dict...))
|
push!(traces, PlotlyBase.GenericTrace(plotly_type; series_dict...))
|
||||||
end
|
end
|
||||||
ORCA.PlotlyBase.addtraces!(plt.o, traces...)
|
PlotlyBase.addtraces!(plt.o, traces...)
|
||||||
layout = plotly_layout(plt)
|
layout = plotly_layout(plt)
|
||||||
w, h = plt[:size]
|
w, h = plt[:size]
|
||||||
ORCA.PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
|
PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
|
||||||
return plt.o
|
return plt.o
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -19,5 +19,5 @@ for (mime, fmt) in (
|
|||||||
"image/eps" => "eps",
|
"image/eps" => "eps",
|
||||||
)
|
)
|
||||||
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) =
|
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) =
|
||||||
ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
|
PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
|
||||||
end
|
end
|
||||||
+152
-183
@@ -23,6 +23,8 @@ pynp."seterr"(invalid="ignore")
|
|||||||
pytransforms = PyPlot.pyimport("matplotlib.transforms")
|
pytransforms = PyPlot.pyimport("matplotlib.transforms")
|
||||||
pycollections = PyPlot.pyimport("matplotlib.collections")
|
pycollections = PyPlot.pyimport("matplotlib.collections")
|
||||||
pyart3d = PyPlot.art3D
|
pyart3d = PyPlot.art3D
|
||||||
|
pyrcparams = PyPlot.PyDict(PyPlot.matplotlib."rcParams")
|
||||||
|
|
||||||
|
|
||||||
# "support" matplotlib v1.5
|
# "support" matplotlib v1.5
|
||||||
set_facecolor_sym = if PyPlot.version < v"2"
|
set_facecolor_sym = if PyPlot.version < v"2"
|
||||||
@@ -59,6 +61,9 @@ end
|
|||||||
# # anything else just gets a bluesred gradient
|
# # anything else just gets a bluesred gradient
|
||||||
# py_colormap(c, α=nothing) = py_colormap(default_gradient(), α)
|
# py_colormap(c, α=nothing) = py_colormap(default_gradient(), α)
|
||||||
|
|
||||||
|
py_handle_surface(v) = v
|
||||||
|
py_handle_surface(z::Surface) = z.surf
|
||||||
|
|
||||||
py_color(s) = py_color(parse(Colorant, string(s)))
|
py_color(s) = py_color(parse(Colorant, string(s)))
|
||||||
py_color(c::Colorant) = (red(c), green(c), blue(c), alpha(c))
|
py_color(c::Colorant) = (red(c), green(c), blue(c), alpha(c))
|
||||||
py_color(cs::AVec) = map(py_color, cs)
|
py_color(cs::AVec) = map(py_color, cs)
|
||||||
@@ -175,15 +180,7 @@ function add_pyfixedformatter(cbar, vals::AVec)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function labelfunc(scale::Symbol, backend::PyPlotBackend)
|
function labelfunc(scale::Symbol, backend::PyPlotBackend)
|
||||||
if scale == :log10
|
PyPlot.LaTeXStrings.latexstring ∘ labelfunc_tex(scale)
|
||||||
x -> PyPlot.LaTeXStrings.latexstring("10^{$x}")
|
|
||||||
elseif scale == :log2
|
|
||||||
x -> PyPlot.LaTeXStrings.latexstring("2^{$x}")
|
|
||||||
elseif scale == :ln
|
|
||||||
x -> PyPlot.LaTeXStrings.latexstring("e^{$x}")
|
|
||||||
else
|
|
||||||
string
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function py_mask_nans(z)
|
function py_mask_nans(z)
|
||||||
@@ -276,7 +273,6 @@ end
|
|||||||
function py_bbox_axis(ax, letter)
|
function py_bbox_axis(ax, letter)
|
||||||
ticks = py_bbox_ticks(ax, letter)
|
ticks = py_bbox_ticks(ax, letter)
|
||||||
labels = py_bbox_axislabel(ax, letter)
|
labels = py_bbox_axislabel(ax, letter)
|
||||||
# letter == "x" && @show ticks labels ticks+labels
|
|
||||||
ticks + labels
|
ticks + labels
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -351,7 +347,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
fix_xy_lengths!(plt, series)
|
fix_xy_lengths!(plt, series)
|
||||||
|
|
||||||
# ax = getAxis(plt, series)
|
# ax = getAxis(plt, series)
|
||||||
x, y, z = series[:x], series[:y], series[:z]
|
x, y, z = (py_handle_surface(series[letter]) for letter in (:x, :y, :z))
|
||||||
if st == :straightline
|
if st == :straightline
|
||||||
x, y = straightline_data(series)
|
x, y = straightline_data(series)
|
||||||
elseif st == :shape
|
elseif st == :shape
|
||||||
@@ -406,7 +402,6 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
# line plot
|
# line plot
|
||||||
if st in (:path, :path3d, :steppre, :steppost, :straightline)
|
if st in (:path, :path3d, :steppre, :steppost, :straightline)
|
||||||
if maximum(series[:linewidth]) > 0
|
if maximum(series[:linewidth]) > 0
|
||||||
segments = iter_segments(series)
|
|
||||||
# TODO: check LineCollection alternative for speed
|
# TODO: check LineCollection alternative for speed
|
||||||
# if length(segments) > 1 && (any(typeof(series[attr]) <: AbstractVector for attr in (:fillcolor, :fillalpha)) || series[:fill_z] !== nothing) && !(typeof(series[:linestyle]) <: AbstractVector)
|
# if length(segments) > 1 && (any(typeof(series[attr]) <: AbstractVector for attr in (:fillcolor, :fillalpha)) || series[:fill_z] !== nothing) && !(typeof(series[:linestyle]) <: AbstractVector)
|
||||||
# # multicolored line segments
|
# # multicolored line segments
|
||||||
@@ -437,18 +432,19 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
# end
|
# end
|
||||||
# push!(handles, handle)
|
# push!(handles, handle)
|
||||||
# else
|
# else
|
||||||
for (i, rng) in enumerate(iter_segments(series))
|
for (i, rng) in enumerate(iter_segments(series, st))
|
||||||
handle = ax."plot"((arg[rng] for arg in xyargs)...;
|
handle = ax."plot"((arg[rng] for arg in xyargs)...;
|
||||||
label = i == 1 ? series[:label] : "",
|
label = i == 1 ? series[:label] : "",
|
||||||
zorder = series[:series_plotindex],
|
zorder = series[:series_plotindex],
|
||||||
color = py_color(single_color(get_linecolor(series, clims, i)), get_linealpha(series, i)),
|
color = py_color(single_color(get_linecolor(series, clims, i)), get_linealpha(series, i)),
|
||||||
linewidth = py_thickness_scale(plt, get_linewidth(series, i)),
|
linewidth = py_thickness_scale(plt, get_linewidth(series, i)),
|
||||||
linestyle = py_linestyle(st, get_linestyle(series, i)),
|
linestyle = py_linestyle(st, get_linestyle(series, i)),
|
||||||
solid_capstyle = "round",
|
solid_capstyle = "butt",
|
||||||
drawstyle = py_stepstyle(st)
|
dash_capstyle = "butt",
|
||||||
)[1]
|
drawstyle = py_stepstyle(st)
|
||||||
push!(handles, handle)
|
)[1]
|
||||||
end
|
push!(handles, handle)
|
||||||
|
end
|
||||||
# end
|
# end
|
||||||
|
|
||||||
a = series[:arrow]
|
a = series[:arrow]
|
||||||
@@ -479,130 +475,32 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# add markers?
|
# add markers?
|
||||||
if series[:markershape] != :none && st in (:path, :scatter, :path3d,
|
if series[:markershape] != :none && st in (
|
||||||
:scatter3d, :steppre, :steppost,
|
:path, :scatter, :path3d, :scatter3d, :steppre, :steppost, :bar
|
||||||
:bar)
|
)
|
||||||
markercolor = if any(typeof(series[arg]) <: AVec for arg in (:markercolor, :markeralpha)) || series[:marker_z] !== nothing
|
for (i, rng) in enumerate(iter_segments(series, :scatter))
|
||||||
# py_color(plot_color.(get_markercolor.(series, clims, eachindex(x)), get_markeralpha.(series, eachindex(x))))
|
xyargs = if st == :bar && !isvertical(series)
|
||||||
[py_color(plot_color(get_markercolor(series, clims, i), get_markeralpha(series, i))) for i in eachindex(x)]
|
if RecipesPipeline.is3d(sp)
|
||||||
else
|
y[rng], x[rng], z[rng]
|
||||||
py_color(plot_color(series[:markercolor], series[:markeralpha]))
|
else
|
||||||
end
|
y[rng], x[rng]
|
||||||
extrakw[:c] = if markercolor isa Array
|
end
|
||||||
permutedims(hcat([[m...] for m in markercolor]...),[2,1])
|
else
|
||||||
elseif markercolor isa Tuple
|
if RecipesPipeline.is3d(sp)
|
||||||
reshape([markercolor...], 1, length(markercolor))
|
x[rng], y[rng], z[rng]
|
||||||
else
|
else
|
||||||
error("This case is not handled. Please file an issue.")
|
x[rng], y[rng]
|
||||||
end
|
|
||||||
xyargs = if st == :bar && !isvertical(series)
|
|
||||||
(y, x)
|
|
||||||
else
|
|
||||||
xyargs
|
|
||||||
end
|
|
||||||
|
|
||||||
if isa(series[:markershape], AbstractVector{Shape})
|
|
||||||
# this section will create one scatter per data point to accommodate the
|
|
||||||
# vector of shapes
|
|
||||||
handle = []
|
|
||||||
x,y = xyargs
|
|
||||||
shapes = series[:markershape]
|
|
||||||
msc = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series))
|
|
||||||
lw = py_thickness_scale(plt, series[:markerstrokewidth])
|
|
||||||
for i=eachindex(y)
|
|
||||||
if series[:marker_z] !== nothing
|
|
||||||
extrakw[:c] = [py_color(get_markercolor(series, i), get_markercoloralpha(series, i))]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
push!(handle, ax."scatter"(_cycle(x,i), _cycle(y,i);
|
|
||||||
label = series[:label],
|
|
||||||
zorder = series[:series_plotindex] + 0.5,
|
|
||||||
marker = py_marker(_cycle(shapes,i)),
|
|
||||||
s = py_thickness_scale(plt, _cycle(series[:markersize],i)).^ 2,
|
|
||||||
facecolors = py_color(get_markercolor(series, i), get_markercoloralpha(series, i)),
|
|
||||||
edgecolors = msc,
|
|
||||||
linewidths = lw,
|
|
||||||
extrakw...
|
|
||||||
))
|
|
||||||
end
|
|
||||||
push!(handles, handle)
|
|
||||||
elseif isa(series[:markershape], AbstractVector{Symbol})
|
|
||||||
handle = []
|
|
||||||
x,y = xyargs
|
|
||||||
shapes = series[:markershape]
|
|
||||||
|
|
||||||
prev_marker = py_marker(_cycle(shapes,1))
|
|
||||||
|
|
||||||
cur_x_list = []
|
|
||||||
cur_y_list = []
|
|
||||||
|
|
||||||
cur_color_list = []
|
|
||||||
cur_scale_list = []
|
|
||||||
|
|
||||||
delete!(extrakw, :c)
|
|
||||||
|
|
||||||
for i=eachindex(y)
|
|
||||||
cur_marker = py_marker(_cycle(shapes,i))
|
|
||||||
|
|
||||||
if ( cur_marker == prev_marker )
|
|
||||||
push!(cur_x_list, _cycle(x,i))
|
|
||||||
push!(cur_y_list, _cycle(y,i))
|
|
||||||
|
|
||||||
push!(cur_color_list, _cycle(markercolor, i))
|
|
||||||
push!(cur_scale_list, py_thickness_scale(plt, _cycle(series[:markersize],i)).^ 2)
|
|
||||||
|
|
||||||
continue
|
|
||||||
end
|
|
||||||
|
|
||||||
push!(handle, ax."scatter"(cur_x_list, cur_y_list;
|
|
||||||
label = series[:label],
|
|
||||||
zorder = series[:series_plotindex] + 0.5,
|
|
||||||
marker = prev_marker,
|
|
||||||
s = cur_scale_list,
|
|
||||||
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
|
|
||||||
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
|
|
||||||
facecolors = cur_color_list,
|
|
||||||
extrakw...
|
|
||||||
))
|
|
||||||
|
|
||||||
cur_x_list = [_cycle(x,i)]
|
|
||||||
cur_y_list = [_cycle(y,i)]
|
|
||||||
|
|
||||||
cur_color_list = [_cycle(markercolor, i)]
|
|
||||||
cur_scale_list = [py_thickness_scale(plt, _cycle(series[:markersize],i)) .^ 2]
|
|
||||||
|
|
||||||
prev_marker = cur_marker
|
|
||||||
end
|
|
||||||
|
|
||||||
if !isempty(cur_color_list)
|
|
||||||
push!(handle, ax."scatter"(cur_x_list, cur_y_list;
|
|
||||||
label = series[:label],
|
|
||||||
zorder = series[:series_plotindex] + 0.5,
|
|
||||||
marker = prev_marker,
|
|
||||||
s = cur_scale_list,
|
|
||||||
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
|
|
||||||
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
|
|
||||||
facecolors = cur_color_list,
|
|
||||||
extrakw...
|
|
||||||
))
|
|
||||||
end
|
|
||||||
|
|
||||||
push!(handles, handle)
|
|
||||||
else
|
|
||||||
# do a normal scatter plot
|
|
||||||
|
|
||||||
# Add depthshade option for 3d plots
|
|
||||||
if RecipesPipeline.is3d(sp)
|
|
||||||
extrakw[:depthshade] = get(series[:extra_kwargs], :depthshade, false)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
handle = ax."scatter"(xyargs...;
|
handle = ax."scatter"(xyargs...;
|
||||||
label = series[:label],
|
label = series[:label],
|
||||||
zorder = series[:series_plotindex] + 0.5,
|
zorder = series[:series_plotindex] + 0.5,
|
||||||
marker = py_marker(series[:markershape]),
|
marker = py_marker(_cycle(series[:markershape], i)),
|
||||||
s = py_thickness_scale(plt, series[:markersize]) .^2,
|
s = py_thickness_scale(plt, _cycle(series[:markersize], i)).^ 2,
|
||||||
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
|
facecolors = py_color(get_markercolor(series, i), get_markeralpha(series, i)),
|
||||||
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
|
edgecolors = py_color(get_markerstrokecolor(series, i), get_markerstrokealpha(series, i)),
|
||||||
|
linewidths = py_thickness_scale(plt, get_markerstrokewidth(series, i)),
|
||||||
extrakw...
|
extrakw...
|
||||||
)
|
)
|
||||||
push!(handles, handle)
|
push!(handles, handle)
|
||||||
@@ -625,16 +523,11 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if st in (:contour, :contour3d)
|
if st in (:contour, :contour3d)
|
||||||
z = transpose_z(series, z.surf)
|
|
||||||
if typeof(x)<:Plots.Surface
|
|
||||||
x = Plots.transpose_z(series, x.surf)
|
|
||||||
end
|
|
||||||
if typeof(y)<:Plots.Surface
|
|
||||||
y = Plots.transpose_z(series, y.surf)
|
|
||||||
end
|
|
||||||
|
|
||||||
if st == :contour3d
|
if st == :contour3d
|
||||||
extrakw[:extend3d] = true
|
extrakw[:extend3d] = true
|
||||||
|
if !ismatrix(x) || !ismatrix(y)
|
||||||
|
x, y = repeat(x', length(y), 1), repeat(y, 1, length(x))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if typeof(series[:linecolor]) <: AbstractArray
|
if typeof(series[:linecolor]) <: AbstractArray
|
||||||
@@ -669,17 +562,17 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if st in (:surface, :wireframe)
|
if st in (:surface, :wireframe)
|
||||||
if typeof(z) <: AbstractMatrix || typeof(z) <: Surface
|
if z isa AbstractMatrix
|
||||||
x, y, z = map(Array, (x,y,z))
|
|
||||||
if !ismatrix(x) || !ismatrix(y)
|
if !ismatrix(x) || !ismatrix(y)
|
||||||
x = repeat(x', length(y), 1)
|
x, y = repeat(x', length(y), 1), repeat(y, 1, length(x))
|
||||||
y = repeat(y, 1, length(series[:x]))
|
|
||||||
end
|
end
|
||||||
z = transpose_z(series, z)
|
|
||||||
if st == :surface
|
if st == :surface
|
||||||
if series[:fill_z] !== nothing
|
if series[:fill_z] !== nothing
|
||||||
# the surface colors are different than z-value
|
# the surface colors are different than z-value
|
||||||
extrakw[:facecolors] = py_shading(series[:fillcolor], transpose_z(series, series[:fill_z].surf))
|
extrakw[:facecolors] = py_shading(
|
||||||
|
series[:fillcolor],
|
||||||
|
py_handle_surface(series[:fill_z]),
|
||||||
|
)
|
||||||
extrakw[:shade] = false
|
extrakw[:shade] = false
|
||||||
else
|
else
|
||||||
extrakw[:cmap] = py_fillcolormap(series)
|
extrakw[:cmap] = py_fillcolormap(series)
|
||||||
@@ -727,22 +620,24 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if st == :image
|
if st == :image
|
||||||
# @show typeof(z)
|
xmin, xmax = ignorenan_extrema(series[:x])
|
||||||
xmin, xmax = ignorenan_extrema(series[:x]); ymin, ymax = ignorenan_extrema(series[:y])
|
ymin, ymax = ignorenan_extrema(series[:y])
|
||||||
img = Array(transpose_z(series, z.surf))
|
dx = (xmax - xmin) / (length(series[:x]) - 1) / 2
|
||||||
z = if eltype(img) <: Colors.AbstractGray
|
dy = (ymax - ymin) / (length(series[:y]) - 1) / 2
|
||||||
float(img)
|
z = if eltype(z) <: Colors.AbstractGray
|
||||||
elseif eltype(img) <: Colorant
|
float(z)
|
||||||
map(c -> Float64[red(c),green(c),blue(c),alpha(c)], img)
|
elseif eltype(z) <: Colorant
|
||||||
|
map(c -> Float64[red(c),green(c),blue(c),alpha(c)], z)
|
||||||
else
|
else
|
||||||
z # hopefully it's in a data format that will "just work" with imshow
|
z # hopefully it's in a data format that will "just work" with imshow
|
||||||
end
|
end
|
||||||
handle = ax."imshow"(z;
|
handle = ax."imshow"(
|
||||||
|
z;
|
||||||
zorder = series[:series_plotindex],
|
zorder = series[:series_plotindex],
|
||||||
cmap = py_colormap(cgrad(plot_color([:black, :white]))),
|
cmap = py_colormap(cgrad(plot_color([:black, :white]))),
|
||||||
vmin = 0.0,
|
vmin = 0.0,
|
||||||
vmax = 1.0,
|
vmax = 1.0,
|
||||||
extent = (xmin-0.5, xmax+0.5, ymax+0.5, ymin-0.5)
|
extent = (xmin - dx, xmax + dx, ymax + dy, ymin - dy)
|
||||||
)
|
)
|
||||||
push!(handles, handle)
|
push!(handles, handle)
|
||||||
|
|
||||||
@@ -753,7 +648,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if st == :heatmap
|
if st == :heatmap
|
||||||
x, y, z = heatmap_edges(x, sp[:xaxis][:scale]), heatmap_edges(y, sp[:yaxis][:scale]), transpose_z(series, z.surf)
|
x, y = heatmap_edges(x, sp[:xaxis][:scale], y, sp[:yaxis][:scale], size(z))
|
||||||
|
|
||||||
expand_extrema!(sp[:xaxis], x)
|
expand_extrema!(sp[:xaxis], x)
|
||||||
expand_extrema!(sp[:yaxis], y)
|
expand_extrema!(sp[:yaxis], y)
|
||||||
@@ -839,7 +734,17 @@ function py_set_lims(ax, sp::Subplot, axis::Axis)
|
|||||||
getproperty(ax, Symbol("set_", letter, "lim"))(lfrom, lto)
|
getproperty(ax, Symbol("set_", letter, "lim"))(lfrom, lto)
|
||||||
end
|
end
|
||||||
|
|
||||||
function py_set_ticks(ax, ticks, letter)
|
function py_surround_latextext(latexstring, env)
|
||||||
|
if !isempty(latexstring) && latexstring[1] == '$' && latexstring[end] == '$'
|
||||||
|
unenclosed = latexstring[2:end-1]
|
||||||
|
else
|
||||||
|
unenclosed = latexstring
|
||||||
|
end
|
||||||
|
PyPlot.LaTeXStrings.latexstring(env, "{", unenclosed, "}")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function py_set_ticks(ax, ticks, letter, env)
|
||||||
ticks == :auto && return
|
ticks == :auto && return
|
||||||
axis = getproperty(ax, Symbol(letter,"axis"))
|
axis = getproperty(ax, Symbol(letter,"axis"))
|
||||||
if ticks == :none || ticks === nothing || ticks == false
|
if ticks == :none || ticks === nothing || ticks == false
|
||||||
@@ -856,7 +761,14 @@ function py_set_ticks(ax, ticks, letter)
|
|||||||
axis."set_ticks"(ticks)
|
axis."set_ticks"(ticks)
|
||||||
elseif ttype == :ticks_and_labels
|
elseif ttype == :ticks_and_labels
|
||||||
axis."set_ticks"(ticks[1])
|
axis."set_ticks"(ticks[1])
|
||||||
axis."set_ticklabels"(ticks[2])
|
|
||||||
|
if pyrcparams["text.usetex"]
|
||||||
|
tick_labels = ticks[2]
|
||||||
|
else
|
||||||
|
tick_labels = [py_surround_latextext(ticklabel, env) for ticklabel in ticks[2]]
|
||||||
|
end
|
||||||
|
|
||||||
|
axis."set_ticklabels"(tick_labels)
|
||||||
else
|
else
|
||||||
error("Invalid input for $(letter)ticks: $ticks")
|
error("Invalid input for $(letter)ticks: $ticks")
|
||||||
end
|
end
|
||||||
@@ -1007,7 +919,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
|
|
||||||
fig = plt.o
|
fig = plt.o
|
||||||
|
|
||||||
if RecipesPipeline.is3d(sp)
|
if RecipesPipeline.is3d(sp) || ispolar(sp)
|
||||||
cbax = fig."add_axes"([0.9, 0.1, 0.03, 0.8])
|
cbax = fig."add_axes"([0.9, 0.1, 0.03, 0.8])
|
||||||
cb = fig."colorbar"(handle; cax=cbax, kw...)
|
cb = fig."colorbar"(handle; cax=cbax, kw...)
|
||||||
else
|
else
|
||||||
@@ -1016,8 +928,34 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
# width = axes_grid1.axes_size.AxesY(ax, aspect=1.0 / 3.5)
|
# width = axes_grid1.axes_size.AxesY(ax, aspect=1.0 / 3.5)
|
||||||
# pad = axes_grid1.axes_size.Fraction(0.5, width) # Colorbar is spaced 0.5 of its size away from the ax
|
# pad = axes_grid1.axes_size.Fraction(0.5, width) # Colorbar is spaced 0.5 of its size away from the ax
|
||||||
# cbax = divider.append_axes("right", size=width, pad=pad) # This approach does not work well in subplots
|
# cbax = divider.append_axes("right", size=width, pad=pad) # This approach does not work well in subplots
|
||||||
cbax = divider.append_axes("right", size="5%", pad="2.5%") # Reasonable value works most of the usecases
|
colorbar_position = "right"
|
||||||
cb = fig."colorbar"(handle; cax=cbax, kw...)
|
colorbar_pad = "2.5%"
|
||||||
|
colorbar_orientation="vertical"
|
||||||
|
|
||||||
|
if sp[:colorbar] == :left
|
||||||
|
colorbar_position = string(sp[:colorbar])
|
||||||
|
colorbar_pad = "5%"
|
||||||
|
elseif sp[:colorbar] == :top
|
||||||
|
colorbar_position = string(sp[:colorbar])
|
||||||
|
colorbar_pad = "2.5%"
|
||||||
|
colorbar_orientation="horizontal"
|
||||||
|
elseif sp[:colorbar] == :bottom
|
||||||
|
colorbar_position = string(sp[:colorbar])
|
||||||
|
colorbar_pad = "5%"
|
||||||
|
colorbar_orientation="horizontal"
|
||||||
|
end
|
||||||
|
|
||||||
|
cbax = divider.append_axes(colorbar_position, size="5%", pad=colorbar_pad) # Reasonable value works most of the usecases
|
||||||
|
cb = fig."colorbar"(handle; cax=cbax, orientation = colorbar_orientation, kw...)
|
||||||
|
|
||||||
|
if sp[:colorbar] == :left
|
||||||
|
cbax.yaxis.set_ticks_position("left")
|
||||||
|
elseif sp[:colorbar] == :top
|
||||||
|
cbax.xaxis.set_ticks_position("top")
|
||||||
|
elseif sp[:colorbar] == :bottom
|
||||||
|
cbax.xaxis.set_ticks_position("bottom")
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
cb."set_label"(sp[:colorbar_title],size=py_thickness_scale(plt, sp[:yaxis][:guidefontsize]),family=sp[:yaxis][:guidefontfamily], color = py_color(sp[:yaxis][:guidefontcolor]))
|
cb."set_label"(sp[:colorbar_title],size=py_thickness_scale(plt, sp[:yaxis][:guidefontsize]),family=sp[:yaxis][:guidefontfamily], color = py_color(sp[:yaxis][:guidefontcolor]))
|
||||||
@@ -1079,7 +1017,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
pyaxis."set_label_position"(axis[:guide_position])
|
pyaxis."set_label_position"(axis[:guide_position])
|
||||||
end
|
end
|
||||||
py_set_scale(ax, sp, axis)
|
py_set_scale(ax, sp, axis)
|
||||||
axis[:ticks] != :native ? py_set_lims(ax, sp, axis) : nothing
|
axis[:ticks] == :native ? nothing : py_set_lims(ax, sp, axis)
|
||||||
if ispolar(sp) && letter == :y
|
if ispolar(sp) && letter == :y
|
||||||
ax."set_rlabel_position"(90)
|
ax."set_rlabel_position"(90)
|
||||||
end
|
end
|
||||||
@@ -1088,10 +1026,41 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
if sp[:framestyle] == :origin && length(ticks) > 1
|
if sp[:framestyle] == :origin && length(ticks) > 1
|
||||||
ticks[2][ticks[1] .== 0] .= ""
|
ticks[2][ticks[1] .== 0] .= ""
|
||||||
end
|
end
|
||||||
axis[:ticks] != :native ? py_set_ticks(ax, ticks, letter) : nothing
|
|
||||||
|
|
||||||
|
# Set ticks
|
||||||
|
fontProperties = PyPlot.PyCall.PyDict(
|
||||||
|
Dict(
|
||||||
|
"family" => axis[:tickfontfamily],
|
||||||
|
"size" => py_thickness_scale(plt, axis[:tickfontsize]),
|
||||||
|
"rotation" => axis[:tickfontrotation],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
positions = getproperty(ax, Symbol("get_",letter,"ticks"))()
|
||||||
|
pyaxis.set_major_locator(pyticker.FixedLocator(positions))
|
||||||
|
if RecipesPipeline.is3d(sp)
|
||||||
|
getproperty(ax, Symbol("set_",letter,"ticklabels"))(
|
||||||
|
positions;
|
||||||
|
(Symbol(k) => v for (k, v) in fontProperties)...
|
||||||
|
)
|
||||||
|
else
|
||||||
|
getproperty(ax, Symbol("set_",letter,"ticklabels"))(
|
||||||
|
positions,
|
||||||
|
fontdict=fontProperties,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# workaround to set mathtext.fontspec per Text element
|
||||||
|
env = "\\mathregular" # matches the outer fonts https://matplotlib.org/tutorials/text/mathtext.html
|
||||||
|
|
||||||
|
axis[:ticks] == :native ? nothing : py_set_ticks(ax, ticks, letter, env)
|
||||||
|
# Tick marks
|
||||||
intensity = 0.5 # This value corresponds to scaling of other grid elements
|
intensity = 0.5 # This value corresponds to scaling of other grid elements
|
||||||
pyaxis."set_tick_params"(direction = axis[:tick_direction] == :out ? "out" : "in", width=py_thickness_scale(plt, intensity))
|
pyaxis."set_tick_params"(
|
||||||
|
direction = axis[:tick_direction] == :out ? "out" : "in",
|
||||||
|
width=py_thickness_scale(plt, intensity),
|
||||||
|
length= 5 * py_thickness_scale(plt, intensity)
|
||||||
|
)
|
||||||
|
|
||||||
getproperty(ax, Symbol("set_", letter, "label"))(axis[:guide])
|
getproperty(ax, Symbol("set_", letter, "label"))(axis[:guide])
|
||||||
if get(axis.plotattributes, :flip, false)
|
if get(axis.plotattributes, :flip, false)
|
||||||
@@ -1110,11 +1079,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
pyaxis."label"."set_rotation"(axis[:guidefontrotation])
|
pyaxis."label"."set_rotation"(axis[:guidefontrotation])
|
||||||
end
|
end
|
||||||
|
|
||||||
for lab in getproperty(ax, Symbol("get_", letter, "ticklabels"))()
|
|
||||||
lab."set_fontsize"(py_thickness_scale(plt, axis[:tickfontsize]))
|
|
||||||
lab."set_family"(axis[:tickfontfamily])
|
|
||||||
lab."set_rotation"(axis[:rotation])
|
|
||||||
end
|
|
||||||
if axis[:grid] && !(ticks in (:none, nothing, false))
|
if axis[:grid] && !(ticks in (:none, nothing, false))
|
||||||
fgcolor = py_color(axis[:foreground_color_grid])
|
fgcolor = py_color(axis[:foreground_color_grid])
|
||||||
pyaxis."grid"(true,
|
pyaxis."grid"(true,
|
||||||
@@ -1237,7 +1202,7 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend})
|
|||||||
# optionally add the width of colorbar labels and colorbar to rightpad
|
# optionally add the width of colorbar labels and colorbar to rightpad
|
||||||
if haskey(sp.attr, :cbar_ax)
|
if haskey(sp.attr, :cbar_ax)
|
||||||
bb = py_bbox(sp.attr[:cbar_handle]."ax"."get_yticklabels"())
|
bb = py_bbox(sp.attr[:cbar_handle]."ax"."get_yticklabels"())
|
||||||
sp.attr[:cbar_width] = _cbar_width + width(bb) + (sp[:colorbar_title] == "" ? 0px : 30px)
|
sp.attr[:cbar_width] = width(bb) + (sp[:colorbar_title] == "" ? 0px : 30px)
|
||||||
rightpad = rightpad + sp.attr[:cbar_width]
|
rightpad = rightpad + sp.attr[:cbar_width]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1334,14 +1299,17 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
|
|||||||
edgecolor = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
|
edgecolor = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
|
||||||
facecolor = py_color(single_color(get_fillcolor(series, clims)), get_fillalpha(series)),
|
facecolor = py_color(single_color(get_fillcolor(series, clims)), get_fillalpha(series)),
|
||||||
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
|
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
|
||||||
linestyle = py_linestyle(series[:seriestype], get_linestyle(series))
|
linestyle = py_linestyle(series[:seriestype], get_linestyle(series)),
|
||||||
|
capstyle = "butt"
|
||||||
)
|
)
|
||||||
elseif series[:seriestype] in (:path, :straightline, :scatter, :steppre, :steppost)
|
elseif series[:seriestype] in (:path, :straightline, :scatter, :steppre, :steppost)
|
||||||
hasline = get_linewidth(series) > 0
|
hasline = get_linewidth(series) > 0
|
||||||
PyPlot.plt."Line2D"((0,1),(0,0),
|
PyPlot.plt."Line2D"((0, 1),(0,0),
|
||||||
color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
|
color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
|
||||||
linewidth = py_thickness_scale(plt, hasline * sp[:legendfontsize] / 8),
|
linewidth = py_thickness_scale(plt, hasline * sp[:legendfontsize] / 8),
|
||||||
linestyle = py_linestyle(:path, get_linestyle(series)),
|
linestyle = py_linestyle(:path, get_linestyle(series)),
|
||||||
|
solid_capstyle = "butt", solid_joinstyle = "miter",
|
||||||
|
dash_capstyle = "butt", dash_joinstyle = "miter",
|
||||||
marker = py_marker(_cycle(series[:markershape], 1)),
|
marker = py_marker(_cycle(series[:markershape], 1)),
|
||||||
markersize = py_thickness_scale(plt, 0.8 * sp[:legendfontsize]),
|
markersize = py_thickness_scale(plt, 0.8 * sp[:legendfontsize]),
|
||||||
markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)),
|
markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)),
|
||||||
@@ -1367,7 +1335,8 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
|
|||||||
facecolor = py_color(sp[:background_color_legend]),
|
facecolor = py_color(sp[:background_color_legend]),
|
||||||
edgecolor = py_color(sp[:foreground_color_legend]),
|
edgecolor = py_color(sp[:foreground_color_legend]),
|
||||||
framealpha = alpha(plot_color(sp[:background_color_legend])),
|
framealpha = alpha(plot_color(sp[:background_color_legend])),
|
||||||
fancybox = false # makes the legend box square
|
fancybox = false, # makes the legend box square
|
||||||
|
borderpad=0.8 # to match GR legendbox
|
||||||
)
|
)
|
||||||
frame = leg."get_frame"()
|
frame = leg."get_frame"()
|
||||||
frame."set_linewidth"(py_thickness_scale(plt, 1))
|
frame."set_linewidth"(py_thickness_scale(plt, 1))
|
||||||
|
|||||||
+1
-1
@@ -45,7 +45,7 @@ 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
|
||||||
|
|||||||
+33
-41
@@ -1,7 +1,5 @@
|
|||||||
|
const P2 = GeometryBasics.Point2{Float64}
|
||||||
|
const P3 = GeometryBasics.Point3{Float64}
|
||||||
const P2 = GeometryTypes.Point2{Float64}
|
|
||||||
const P3 = GeometryTypes.Point3{Float64}
|
|
||||||
|
|
||||||
nanpush!(a::AbstractVector{P2}, b) = (push!(a, P2(NaN,NaN)); push!(a, b))
|
nanpush!(a::AbstractVector{P2}, b) = (push!(a, P2(NaN,NaN)); push!(a, b))
|
||||||
nanappend!(a::AbstractVector{P2}, b) = (push!(a, P2(NaN,NaN)); append!(a, b))
|
nanappend!(a::AbstractVector{P2}, b) = (push!(a, P2(NaN,NaN)); append!(a, b))
|
||||||
@@ -77,7 +75,6 @@ function weave(x,y; ordering = Vector[x,y])
|
|||||||
ret
|
ret
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
"create a star by weaving together points from an outer and inner circle. `n` is the number of arms"
|
"create a star by weaving together points from an outer and inner circle. `n` is the number of arms"
|
||||||
function makestar(n; offset = -0.5, radius = 1.0)
|
function makestar(n; offset = -0.5, radius = 1.0)
|
||||||
z1 = offset * π
|
z1 = offset * π
|
||||||
@@ -93,7 +90,6 @@ function makeshape(n; offset = -0.5, radius = 1.0)
|
|||||||
Shape(partialcircle(z, z + 2π, n+1, radius))
|
Shape(partialcircle(z, z + 2π, n+1, radius))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function makecross(; offset = -0.5, radius = 1.0)
|
function makecross(; offset = -0.5, radius = 1.0)
|
||||||
z2 = offset * π
|
z2 = offset * π
|
||||||
z1 = z2 - π/8
|
z1 = z2 - π/8
|
||||||
@@ -103,7 +99,6 @@ function makecross(; offset = -0.5, radius = 1.0)
|
|||||||
ordering=Vector[outercircle,innercircle,outercircle]))
|
ordering=Vector[outercircle,innercircle,outercircle]))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
from_polar(angle, dist) = P2(dist*cos(angle), dist*sin(angle))
|
from_polar(angle, dist) = P2(dist*cos(angle), dist*sin(angle))
|
||||||
|
|
||||||
function makearrowhead(angle; h = 2.0, w = 0.4)
|
function makearrowhead(angle; h = 2.0, w = 0.4)
|
||||||
@@ -112,31 +107,6 @@ function makearrowhead(angle; h = 2.0, w = 0.4)
|
|||||||
from_polar(angle + 0.5π, w) - tip, (0,0)])
|
from_polar(angle + 0.5π, w) - tip, (0,0)])
|
||||||
end
|
end
|
||||||
|
|
||||||
const _shape_keys = Symbol[
|
|
||||||
:circle,
|
|
||||||
:rect,
|
|
||||||
:star5,
|
|
||||||
:diamond,
|
|
||||||
:hexagon,
|
|
||||||
:cross,
|
|
||||||
:xcross,
|
|
||||||
:utriangle,
|
|
||||||
:dtriangle,
|
|
||||||
:rtriangle,
|
|
||||||
:ltriangle,
|
|
||||||
:pentagon,
|
|
||||||
:heptagon,
|
|
||||||
:octagon,
|
|
||||||
:star4,
|
|
||||||
:star6,
|
|
||||||
:star7,
|
|
||||||
:star8,
|
|
||||||
:vline,
|
|
||||||
:hline,
|
|
||||||
:+,
|
|
||||||
:x,
|
|
||||||
]
|
|
||||||
|
|
||||||
const _shapes = KW(
|
const _shapes = KW(
|
||||||
:circle => makeshape(20),
|
:circle => makeshape(20),
|
||||||
:rect => makeshape(4, offset=-0.25),
|
:rect => makeshape(4, offset=-0.25),
|
||||||
@@ -358,9 +328,15 @@ end
|
|||||||
Scales all **current** font sizes by `factor`. For example `scalefontsizes(1.1)` increases all current font sizes by 10%. To reset to initial sizes, use `scalefontsizes()`
|
Scales all **current** font sizes by `factor`. For example `scalefontsizes(1.1)` increases all current font sizes by 10%. To reset to initial sizes, use `scalefontsizes()`
|
||||||
"""
|
"""
|
||||||
function scalefontsizes(factor::Number)
|
function scalefontsizes(factor::Number)
|
||||||
for k in (:titlefontsize, :guidefontsize, :tickfontsize, :legendfontsize)
|
for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize)
|
||||||
scalefontsize(k, factor)
|
scalefontsize(k, factor)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
for letter in (:x,:y,:z)
|
||||||
|
for k in (:guidefontsize, :tickfontsize)
|
||||||
|
scalefontsize(Symbol(letter, k), factor)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -369,15 +345,27 @@ end
|
|||||||
Resets font sizes to initial default values.
|
Resets font sizes to initial default values.
|
||||||
"""
|
"""
|
||||||
function scalefontsizes()
|
function scalefontsizes()
|
||||||
for k in (:titlefontsize, :guidefontsize, :tickfontsize, :legendfontsize)
|
for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize)
|
||||||
f = default(k)
|
f = default(k)
|
||||||
if k in keys(_initial_fontsizes)
|
if k in keys(_initial_fontsizes)
|
||||||
factor = f / _initial_fontsizes[k]
|
factor = f / _initial_fontsizes[k]
|
||||||
scalefontsize(k, 1.0/factor)
|
scalefontsize(k, 1.0/factor)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
for letter in (:x,:y,:z)
|
||||||
|
for k in (:guidefontsize, :tickfontsize)
|
||||||
|
if k in keys(_initial_fontsizes)
|
||||||
|
f = default(Symbol(letter, k))
|
||||||
|
factor = f / _initial_fontsizes[k]
|
||||||
|
scalefontsize(Symbol(letter, k), 1.0/factor)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resetfontsizes() = scalefontsizes()
|
||||||
|
|
||||||
"Wrap a string with font info"
|
"Wrap a string with font info"
|
||||||
struct PlotText
|
struct PlotText
|
||||||
str::AbstractString
|
str::AbstractString
|
||||||
@@ -622,6 +610,9 @@ function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol},
|
|||||||
anns
|
anns
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function process_any_label(lab, font=Font())
|
||||||
|
lab isa Tuple ? text(lab...) : text( lab, font )
|
||||||
|
end
|
||||||
# Give each annotation coordinates based on specified position
|
# Give each annotation coordinates based on specified position
|
||||||
function locate_annotation(sp::Subplot, pos::Symbol, lab::PlotText)
|
function locate_annotation(sp::Subplot, pos::Symbol, lab::PlotText)
|
||||||
position_multiplier = Dict{Symbol, Tuple{Float64,Float64}}(
|
position_multiplier = Dict{Symbol, Tuple{Float64,Float64}}(
|
||||||
@@ -638,6 +629,7 @@ function locate_annotation(sp::Subplot, pos::Symbol, lab::PlotText)
|
|||||||
(x, y, lab)
|
(x, y, lab)
|
||||||
end
|
end
|
||||||
locate_annotation(sp::Subplot, x, y, label::PlotText) = (x, y, label)
|
locate_annotation(sp::Subplot, x, y, label::PlotText) = (x, y, label)
|
||||||
|
locate_annotation(sp::Subplot, x, y, z, label::PlotText) = (x, y, z, label)
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
"type which represents z-values for colors and sizes (and anything else that might come up)"
|
"type which represents z-values for colors and sizes (and anything else that might come up)"
|
||||||
@@ -737,7 +729,7 @@ end
|
|||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
"create a BezierCurve for plotting"
|
"create a BezierCurve for plotting"
|
||||||
mutable struct BezierCurve{T <: GeometryTypes.Point}
|
mutable struct BezierCurve{T <: GeometryBasics.Point}
|
||||||
control_points::Vector{T}
|
control_points::Vector{T}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+190
-73
@@ -9,7 +9,7 @@ end
|
|||||||
|
|
||||||
# the _examples we'll run for each
|
# the _examples we'll run for each
|
||||||
const _examples = PlotExample[
|
const _examples = PlotExample[
|
||||||
PlotExample(
|
PlotExample( # 1
|
||||||
"Lines",
|
"Lines",
|
||||||
"A simple line plot of the columns.",
|
"A simple line plot of the columns.",
|
||||||
[:(
|
[:(
|
||||||
@@ -18,7 +18,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 2
|
||||||
"Functions, adding data, and animations",
|
"Functions, adding data, and animations",
|
||||||
"""
|
"""
|
||||||
Plot multiple functions. You can also put the function first, or use the form `plot(f,
|
Plot multiple functions. You can also put the function first, or use the form `plot(f,
|
||||||
@@ -30,16 +30,16 @@ const _examples = PlotExample[
|
|||||||
""",
|
""",
|
||||||
[:(
|
[:(
|
||||||
begin
|
begin
|
||||||
p = plot([sin, cos], zeros(0), leg = false)
|
p = plot([sin, cos], zeros(0), leg = false, xlims = (0, 2π), ylims = (-1, 1))
|
||||||
anim = Animation()
|
anim = Animation()
|
||||||
for x in range(0, stop = 10π, length = 100)
|
for x in range(0, stop = 2π, length = 20)
|
||||||
push!(p, x, Float64[sin(x), cos(x)])
|
push!(p, x, Float64[sin(x), cos(x)])
|
||||||
frame(anim)
|
frame(anim)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 3
|
||||||
"Parametric plots",
|
"Parametric plots",
|
||||||
"Plot function pair (x(u), y(u)).",
|
"Plot function pair (x(u), y(u)).",
|
||||||
[
|
[
|
||||||
@@ -58,7 +58,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 4
|
||||||
"Colors",
|
"Colors",
|
||||||
"""
|
"""
|
||||||
Access predefined palettes (or build your own with the `colorscheme` method).
|
Access predefined palettes (or build your own with the `colorscheme` method).
|
||||||
@@ -89,7 +89,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 5
|
||||||
"Global",
|
"Global",
|
||||||
"""
|
"""
|
||||||
Change the guides/background/limits/ticks. Convenience args `xaxis` and `yaxis` allow
|
Change the guides/background/limits/ticks. Convenience args `xaxis` and `yaxis` allow
|
||||||
@@ -121,13 +121,7 @@ const _examples = PlotExample[
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
# PlotExample("Two-axis",
|
PlotExample( # 6
|
||||||
# "Use the `axis` arguments.",
|
|
||||||
# [
|
|
||||||
# :(plot(Vector[randn(100), randn(100)*100], axis = [:l :r], ylabel="LEFT", yrightlabel="RIGHT", xlabel="X", title="TITLE"))
|
|
||||||
# ]),
|
|
||||||
|
|
||||||
PlotExample(
|
|
||||||
"Images",
|
"Images",
|
||||||
"Plot an image. y-axis is set to flipped",
|
"Plot an image. y-axis is set to flipped",
|
||||||
[
|
[
|
||||||
@@ -142,7 +136,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 7
|
||||||
"Arguments",
|
"Arguments",
|
||||||
"""
|
"""
|
||||||
Plot multiple series with different numbers of points. Mix arguments that apply to all
|
Plot multiple series with different numbers of points. Mix arguments that apply to all
|
||||||
@@ -166,7 +160,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 8
|
||||||
"Build plot in pieces",
|
"Build plot in pieces",
|
||||||
"Start with a base plot...",
|
"Start with a base plot...",
|
||||||
[:(
|
[:(
|
||||||
@@ -175,7 +169,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 9
|
||||||
"",
|
"",
|
||||||
"and add to it later.",
|
"and add to it later.",
|
||||||
[:(
|
[:(
|
||||||
@@ -184,7 +178,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 10
|
||||||
"Histogram2D",
|
"Histogram2D",
|
||||||
"",
|
"",
|
||||||
[:(
|
[:(
|
||||||
@@ -193,7 +187,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 11
|
||||||
"Line types",
|
"Line types",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -214,7 +208,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 12
|
||||||
"Line styles",
|
"Line styles",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -237,7 +231,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 13
|
||||||
"Marker types",
|
"Marker types",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -264,7 +258,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 14
|
||||||
"Bar",
|
"Bar",
|
||||||
"`x` is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)",
|
"`x` is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)",
|
||||||
[:(
|
[:(
|
||||||
@@ -273,7 +267,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 15
|
||||||
"Histogram",
|
"Histogram",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -288,7 +282,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 16
|
||||||
"Subplots",
|
"Subplots",
|
||||||
"""
|
"""
|
||||||
Use the `layout` keyword, and optionally the convenient `@layout` macro to generate
|
Use the `layout` keyword, and optionally the convenient `@layout` macro to generate
|
||||||
@@ -310,7 +304,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 17
|
||||||
"Adding to subplots",
|
"Adding to subplots",
|
||||||
"""
|
"""
|
||||||
Note here the automatic grid layout, as well as the order in which new series are added
|
Note here the automatic grid layout, as well as the order in which new series are added
|
||||||
@@ -329,14 +323,20 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample("", "", [:(
|
PlotExample( # 18
|
||||||
begin
|
"",
|
||||||
using Random
|
"",
|
||||||
Random.seed!(111)
|
[
|
||||||
plot!(Plots.fakedata(100, 10))
|
:(
|
||||||
end
|
begin
|
||||||
)]),
|
using Random
|
||||||
PlotExample(
|
Random.seed!(111)
|
||||||
|
plot!(Plots.fakedata(100, 10))
|
||||||
|
end
|
||||||
|
)
|
||||||
|
]
|
||||||
|
),
|
||||||
|
PlotExample( # 19
|
||||||
"Open/High/Low/Close",
|
"Open/High/Low/Close",
|
||||||
"""
|
"""
|
||||||
Create an OHLC chart. Pass in a list of (open,high,low,close) tuples as your `y`
|
Create an OHLC chart. Pass in a list of (open,high,low,close) tuples as your `y`
|
||||||
@@ -365,7 +365,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 20
|
||||||
"Annotations",
|
"Annotations",
|
||||||
"""
|
"""
|
||||||
The `annotations` keyword is used for text annotations in data-coordinates. Pass in a
|
The `annotations` keyword is used for text annotations in data-coordinates. Pass in a
|
||||||
@@ -408,7 +408,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 21
|
||||||
"Custom Markers",
|
"Custom Markers",
|
||||||
"""A `Plots.Shape` is a light wrapper around vertices of a polygon. For supported
|
"""A `Plots.Shape` is a light wrapper around vertices of a polygon. For supported
|
||||||
backends, pass arbitrary polygons as the marker shapes. Note: The center is (0,0) and
|
backends, pass arbitrary polygons as the marker shapes. Note: The center is (0,0) and
|
||||||
@@ -454,7 +454,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 22
|
||||||
"Contours",
|
"Contours",
|
||||||
"""
|
"""
|
||||||
Any value for fill works here. We first build a filled contour from a function, then an
|
Any value for fill works here. We first build a filled contour from a function, then an
|
||||||
@@ -474,7 +474,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 23
|
||||||
"Pie",
|
"Pie",
|
||||||
"",
|
"",
|
||||||
[:(
|
[:(
|
||||||
@@ -485,7 +485,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 24
|
||||||
"3D",
|
"3D",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -511,7 +511,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 25
|
||||||
"DataFrames",
|
"DataFrames",
|
||||||
"Plot using DataFrame column symbols.",
|
"Plot using DataFrame column symbols.",
|
||||||
[
|
[
|
||||||
@@ -534,7 +534,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 26
|
||||||
"Groups and Subplots",
|
"Groups and Subplots",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -552,7 +552,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 27
|
||||||
"Polar Plots",
|
"Polar Plots",
|
||||||
"",
|
"",
|
||||||
[:(
|
[:(
|
||||||
@@ -563,7 +563,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 28
|
||||||
"Heatmap, categorical axes, and aspect_ratio",
|
"Heatmap, categorical axes, and aspect_ratio",
|
||||||
"",
|
"",
|
||||||
[:(
|
[:(
|
||||||
@@ -575,7 +575,7 @@ const _examples = PlotExample[
|
|||||||
end
|
end
|
||||||
)],
|
)],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 29
|
||||||
"Layouts, margins, label rotation, title location",
|
"Layouts, margins, label rotation, title location",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -595,7 +595,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 30
|
||||||
"Boxplot and Violin series recipes",
|
"Boxplot and Violin series recipes",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -620,7 +620,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 31
|
||||||
"Animation with subplots",
|
"Animation with subplots",
|
||||||
"The `layout` macro can be used to create an animation with subplots.",
|
"The `layout` macro can be used to create an animation with subplots.",
|
||||||
[
|
[
|
||||||
@@ -628,14 +628,15 @@ const _examples = PlotExample[
|
|||||||
begin
|
begin
|
||||||
l = @layout([[a; b] c])
|
l = @layout([[a; b] c])
|
||||||
p = plot(
|
p = plot(
|
||||||
plot([sin, cos], 1, leg = false),
|
plot([sin, cos], 1, ylims = (-1, 1), leg = false),
|
||||||
scatter([atan, cos], 1, leg = false),
|
scatter([atan, cos], 1, ylims = (-1, 1.5), leg = false),
|
||||||
plot(log, 1, xlims = (1, 10π), ylims = (0, 5), leg = false),
|
plot(log, 1, ylims = (0, 2), leg = false),
|
||||||
layout = l,
|
layout = l,
|
||||||
|
xlims = (1, 2π),
|
||||||
)
|
)
|
||||||
|
|
||||||
anim = Animation()
|
anim = Animation()
|
||||||
for x in range(1, stop = 10π, length = 100)
|
for x in range(1, stop = 2π, length = 20)
|
||||||
plot(push!(
|
plot(push!(
|
||||||
p,
|
p,
|
||||||
x,
|
x,
|
||||||
@@ -647,7 +648,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 32
|
||||||
"Spy",
|
"Spy",
|
||||||
"""
|
"""
|
||||||
For a matrix `mat` with unique nonzeros `spy(mat)` returns a colorless plot. If `mat` has
|
For a matrix `mat` with unique nonzeros `spy(mat)` returns a colorless plot. If `mat` has
|
||||||
@@ -681,7 +682,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 33
|
||||||
"Magic grid argument",
|
"Magic grid argument",
|
||||||
"""
|
"""
|
||||||
The grid lines can be modified individually for each axis with the magic `grid` argument.
|
The grid lines can be modified individually for each axis with the magic `grid` argument.
|
||||||
@@ -711,7 +712,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 34
|
||||||
"Framestyle",
|
"Framestyle",
|
||||||
"""
|
"""
|
||||||
The style of the frame/axes of a (sub)plot can be changed with the `framestyle`
|
The style of the frame/axes of a (sub)plot can be changed with the `framestyle`
|
||||||
@@ -735,7 +736,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 35
|
||||||
"Lines and markers with varying colors",
|
"Lines and markers with varying colors",
|
||||||
"""
|
"""
|
||||||
You can use the `line_z` and `marker_z` properties to associate a color with
|
You can use the `line_z` and `marker_z` properties to associate a color with
|
||||||
@@ -761,7 +762,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 36
|
||||||
"Portfolio Composition maps",
|
"Portfolio Composition maps",
|
||||||
"""
|
"""
|
||||||
see: http://stackoverflow.com/a/37732384/5075246
|
see: http://stackoverflow.com/a/37732384/5075246
|
||||||
@@ -787,7 +788,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 37
|
||||||
"Ribbons",
|
"Ribbons",
|
||||||
"""
|
"""
|
||||||
Ribbons can be added to lines via the `ribbon` keyword;
|
Ribbons can be added to lines via the `ribbon` keyword;
|
||||||
@@ -810,7 +811,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 38
|
||||||
"Histogram2D (complex values)",
|
"Histogram2D (complex values)",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -829,7 +830,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 39
|
||||||
"Unconnected lines using `missing` or `NaN`",
|
"Unconnected lines using `missing` or `NaN`",
|
||||||
"""
|
"""
|
||||||
Missing values and non-finite values, including `NaN`, are not plotted.
|
Missing values and non-finite values, including `NaN`, are not plotted.
|
||||||
@@ -853,7 +854,7 @@ const _examples = PlotExample[
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 40
|
||||||
"Lens",
|
"Lens",
|
||||||
"A lens lets you easily magnify a region of a plot. x and y coordinates refer to the to be magnified region and the via the `inset` keyword the subplot index and the bounding box (in relative coordinates) of the inset plot with the magnified plot can be specified. Additional attributes count for the inset plot.",
|
"A lens lets you easily magnify a region of a plot. x and y coordinates refer to the to be magnified region and the via the `inset` keyword the subplot index and the bounding box (in relative coordinates) of the inset plot with the magnified plot can be specified. Additional attributes count for the inset plot.",
|
||||||
[
|
[
|
||||||
@@ -875,7 +876,7 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 41
|
||||||
"Array Types",
|
"Array Types",
|
||||||
"Plots supports different `Array` types that follow the `AbstractArray` interface, like `StaticArrays` and `OffsetArrays.`",
|
"Plots supports different `Array` types that follow the `AbstractArray` interface, like `StaticArrays` and `OffsetArrays.`",
|
||||||
[
|
[
|
||||||
@@ -885,11 +886,12 @@ const _examples = PlotExample[
|
|||||||
sv = SVector{10}(rand(10))
|
sv = SVector{10}(rand(10))
|
||||||
ov = OffsetVector(rand(10), -2)
|
ov = OffsetVector(rand(10), -2)
|
||||||
plot([sv, ov], label = ["StaticArray" "OffsetArray"])
|
plot([sv, ov], label = ["StaticArray" "OffsetArray"])
|
||||||
|
plot!(3ov, ribbon=ov, label="OffsetArray ribbon")
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 42
|
||||||
"Setting defaults and font arguments",
|
"Setting defaults and font arguments",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -919,7 +921,7 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 43
|
||||||
"Heatmap with DateTime axis",
|
"Heatmap with DateTime axis",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -934,7 +936,7 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 44
|
||||||
"Linked axes",
|
"Linked axes",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -946,7 +948,7 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PlotExample(
|
PlotExample( # 45
|
||||||
"Error bars and array type recipes",
|
"Error bars and array type recipes",
|
||||||
"",
|
"",
|
||||||
[
|
[
|
||||||
@@ -973,8 +975,8 @@ const _examples = PlotExample[
|
|||||||
surf = Measurement.((1:10) .* (1:10)', rand(10,10))
|
surf = Measurement.((1:10) .* (1:10)', rand(10,10))
|
||||||
|
|
||||||
plot(
|
plot(
|
||||||
scatter(x, [x y], msw = 0),
|
scatter(x, [x y]),
|
||||||
scatter(x, y, z, msw = 0),
|
scatter(x, y, z),
|
||||||
heatmap(x, y, surf),
|
heatmap(x, y, surf),
|
||||||
wireframe(x, y, surf),
|
wireframe(x, y, surf),
|
||||||
legend = :topleft
|
legend = :topleft
|
||||||
@@ -983,26 +985,141 @@ const _examples = PlotExample[
|
|||||||
end,
|
end,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
PlotExample( # 46
|
||||||
|
"Tuples and `Point`s as data",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
using GeometryBasics
|
||||||
|
using Distributions
|
||||||
|
d = MvNormal([1.0 0.75; 0.75 2.0])
|
||||||
|
plot([(1,2),(3,2),(2,1),(2,3)])
|
||||||
|
scatter!(Point2.(eachcol(rand(d,1000))), alpha=0.25)
|
||||||
|
end]
|
||||||
|
),
|
||||||
|
PlotExample( # 47
|
||||||
|
"Mesh3d",
|
||||||
|
"""
|
||||||
|
Allows to plot arbitrary 3d meshes. If only x,y,z are given the mesh is generated automatically.
|
||||||
|
You can also specify the connections using the connections keyword.
|
||||||
|
The connections are specified using a tuple of vectors. Each vector contains the 0-based indices of one point of a triangle,
|
||||||
|
such that elements at the same position of these vectors form a triangle.
|
||||||
|
""",
|
||||||
|
[
|
||||||
|
:(
|
||||||
|
begin
|
||||||
|
# specify the vertices
|
||||||
|
x=[0, 1, 2, 0]
|
||||||
|
y=[0, 0, 1, 2]
|
||||||
|
z=[0, 2, 0, 1]
|
||||||
|
|
||||||
|
# specify the triangles
|
||||||
|
# every column is one triangle,
|
||||||
|
# where the values denote the indices of the vertices of the triangle
|
||||||
|
i=[0, 0, 0, 1]
|
||||||
|
j=[1, 2, 3, 2]
|
||||||
|
k=[2, 3, 1, 3]
|
||||||
|
|
||||||
|
# the four triangles gives above give a tetrahedron
|
||||||
|
mesh3d(x,y,z;connections=(i,j,k))
|
||||||
|
end
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
PlotExample( # 48
|
||||||
|
"Vectors of markershapes and segments",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
yv = ones(9)
|
||||||
|
ys = [1; 1; NaN; ones(6)]
|
||||||
|
plot(
|
||||||
|
5 .- [yv 2ys 3yv 4ys],
|
||||||
|
seriestype = [:path :path :scatter :scatter],
|
||||||
|
markershape = [:utriangle, :rect],
|
||||||
|
markersize = 8,
|
||||||
|
color = [:red, :black],
|
||||||
|
)
|
||||||
|
end]
|
||||||
|
),
|
||||||
|
PlotExample( # 49
|
||||||
|
"Polar heatmaps",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
z = (1:4) .+ (1:8)'
|
||||||
|
heatmap(z, projection = :polar)
|
||||||
|
end]
|
||||||
|
),
|
||||||
|
PlotExample( # 50
|
||||||
|
"3D surface with axis guides",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
f(x,a) = 1/x + a*x^2
|
||||||
|
xs = collect(0.1:0.05:2.0);
|
||||||
|
as = collect(0.2:0.1:2.0);
|
||||||
|
|
||||||
|
x_grid = [x for x in xs for y in as];
|
||||||
|
a_grid = [y for x in xs for y in as];
|
||||||
|
|
||||||
|
plot(x_grid, a_grid, f.(x_grid,a_grid),
|
||||||
|
st = :surface,
|
||||||
|
xlabel = "longer xlabel",
|
||||||
|
ylabel = "longer ylabel",
|
||||||
|
zlabel = "longer zlabel",
|
||||||
|
)
|
||||||
|
end]
|
||||||
|
),
|
||||||
|
PlotExample( # 51
|
||||||
|
"Images with custom axes",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
using Plots
|
||||||
|
using TestImages
|
||||||
|
img = testimage("lighthouse")
|
||||||
|
|
||||||
|
# plot the image reversing the first dimension and setting yflip = false
|
||||||
|
plot([-π, π], [-1, 1], reverse(img, dims=1), yflip=false, aspect_ratio=:none)
|
||||||
|
# plot other data
|
||||||
|
plot!(sin, -π, π, lw=3, color=:red)
|
||||||
|
end]
|
||||||
|
),
|
||||||
|
PlotExample(
|
||||||
|
"3d quiver",
|
||||||
|
"",
|
||||||
|
[quote
|
||||||
|
using Plots
|
||||||
|
|
||||||
|
ϕs = range(-π, π, length=50)
|
||||||
|
θs = range(0, π, length=25)
|
||||||
|
θqs = range(1, π-1, length=25)
|
||||||
|
|
||||||
|
x = vec([sin(θ) * cos(ϕ) for (ϕ, θ) in Iterators.product(ϕs, θs)])
|
||||||
|
y = vec([sin(θ) * sin(ϕ) for (ϕ, θ) in Iterators.product(ϕs, θs)])
|
||||||
|
z = vec([cos(θ) for (ϕ, θ) in Iterators.product(ϕs, θs)])
|
||||||
|
|
||||||
|
u = 0.1 * vec([sin(θ) * cos(ϕ) for (ϕ, θ) in Iterators.product(ϕs, θqs)])
|
||||||
|
v = 0.1 * vec([sin(θ) * sin(ϕ) for (ϕ, θ) in Iterators.product(ϕs, θqs)])
|
||||||
|
w = 0.1 * vec([cos(θ) for (ϕ, θ) in Iterators.product(ϕs, θqs)])
|
||||||
|
|
||||||
|
quiver(x,y,z, quiver=(u,v,w))
|
||||||
|
end]
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Some constants for PlotDocs and PlotReferenceImages
|
# Some constants for PlotDocs and PlotReferenceImages
|
||||||
_animation_examples = [2, 31]
|
_animation_examples = [2, 31]
|
||||||
_backend_skips = Dict(
|
_backend_skips = Dict(
|
||||||
:gr => [25, 30],
|
:gr => [25, 30, 47],
|
||||||
:pyplot => [2, 25, 30, 31],
|
:pyplot => [2, 25, 30, 31, 47, 49],
|
||||||
:plotlyjs => [2, 21, 24, 25, 30, 31],
|
:plotlyjs => [2, 21, 24, 25, 30, 31, 49, 51],
|
||||||
:plotly => [2, 21, 24, 25, 30, 31],
|
:plotly => [2, 21, 24, 25, 30, 31, 49, 51],
|
||||||
:pgfplots => [2, 5, 6, 10, 16, 20, 22, 23, 25, 28, 30, 31, 34, 37, 38, 39],
|
|
||||||
:pgfplotsx => [
|
:pgfplotsx => [
|
||||||
2, # animation
|
2, # animation
|
||||||
6, # images
|
6, # images
|
||||||
10, # histogram2d
|
|
||||||
16, # pgfplots thinks the upper panel is too small
|
16, # pgfplots thinks the upper panel is too small
|
||||||
25, # @df
|
|
||||||
30, # @df
|
30, # @df
|
||||||
31, # animation
|
31, # animation
|
||||||
32, # spy
|
32, # spy
|
||||||
38, # histogram2d
|
49, # polar heatmap
|
||||||
|
51, # image with custom axes
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ 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
|
||||||
|
|||||||
+16
-11
@@ -1,4 +1,7 @@
|
|||||||
using REPL
|
using REPL
|
||||||
|
using Scratch
|
||||||
|
|
||||||
|
const plotly_local_file_path = Ref{Union{Nothing, String}}(nothing)
|
||||||
|
|
||||||
|
|
||||||
function _plots_defaults()
|
function _plots_defaults()
|
||||||
@@ -13,9 +16,10 @@ 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())
|
||||||
|
|
||||||
@@ -41,8 +45,8 @@ function __init__()
|
|||||||
include(fn)
|
include(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)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -74,16 +78,17 @@ function __init__()
|
|||||||
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[] = joinpath(@get_scratch!("plotly"), "plotly-1.54.2.min.js")
|
||||||
use_local_dependencies[] = isfile(plotly_local_file_path) && use_local_plotlyjs[]
|
if !isfile(plotly_local_file_path[])
|
||||||
if use_local_plotlyjs[] && !isfile(plotly_local_file_path)
|
download("https://cdn.plot.ly/plotly-1.57.1.min.js", 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")
|
|
||||||
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)
|
||||||
|
|||||||
+5
-35
@@ -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]
|
||||||
@@ -258,7 +230,7 @@ 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...)
|
||||||
@@ -345,10 +317,8 @@ 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)
|
||||||
@@ -407,10 +377,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
|
||||||
|
|||||||
+2
-13
@@ -112,7 +112,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)
|
||||||
@@ -194,9 +194,9 @@ 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",
|
||||||
"image/png",
|
"image/png",
|
||||||
"image/eps",
|
"image/eps",
|
||||||
@@ -221,9 +221,6 @@ end
|
|||||||
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())
|
||||||
|
|
||||||
@@ -249,25 +246,17 @@ closeall() = closeall(backend())
|
|||||||
# 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
|
||||||
|
|
||||||
|
|||||||
+16
-28
@@ -4,43 +4,20 @@
|
|||||||
|
|
||||||
function RecipesPipeline.warn_on_recipe_aliases!(
|
function RecipesPipeline.warn_on_recipe_aliases!(
|
||||||
plt::Plot,
|
plt::Plot,
|
||||||
plotattributes,
|
plotattributes::AKW,
|
||||||
recipe_type,
|
recipe_type,
|
||||||
args...,
|
signature_string
|
||||||
)
|
)
|
||||||
for k in keys(plotattributes)
|
for k in keys(plotattributes)
|
||||||
if !is_default_attribute(k)
|
if !is_default_attribute(k)
|
||||||
dk = get(_keyAliases, k, k)
|
dk = get(_keyAliases, k, k)
|
||||||
if k !== dk
|
if k !== dk
|
||||||
@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`."
|
@warn "Attribute alias `$k` detected in the $recipe_type recipe defined for the signature $signature_string. To ensure expected behavior it is recommended to use the default attribute `$dk`."
|
||||||
end
|
end
|
||||||
plotattributes[dk] = RecipesPipeline.pop_kw!(plotattributes, k)
|
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,23 @@ 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
|
||||||
@@ -328,7 +316,7 @@ 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 !isa(z, Nothing) &&
|
||||||
(size(plotattributes[:x]) == size(plotattributes[:y]) == size(z))
|
(size(plotattributes[:x]) == size(plotattributes[:y]) == size(z))
|
||||||
|
|||||||
+9
-2
@@ -47,6 +47,7 @@ function, where `attr` is the symbol `:Series:`, `:Subplot:`, `:Plot` or `:Axis`
|
|||||||
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)
|
||||||
@@ -60,6 +61,7 @@ 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 and plts_tail so we can dispatch correctly
|
||||||
function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
function plot(plt1::Plot, plts_tail::Plot...; kw...)
|
||||||
|
@nospecialize
|
||||||
plotattributes = KW(kw)
|
plotattributes = KW(kw)
|
||||||
RecipesPipeline.preprocess_attributes!(plotattributes)
|
RecipesPipeline.preprocess_attributes!(plotattributes)
|
||||||
|
|
||||||
@@ -140,7 +142,8 @@ 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()
|
||||||
@@ -152,6 +155,7 @@ 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
|
||||||
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,6 +168,7 @@ 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])
|
||||||
@@ -205,10 +210,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,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,), 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("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation, :color), Tuple{Symbol, Symbol, Int64, ColorTypes.RGBA{Float64}}}, 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, Plots.PlotText})
|
|
||||||
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("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Int64, Float64, Plots.PlotText})
|
|
||||||
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), Int64, 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._as_gradient), PlotUtils.ContinuousColorGradient})
|
|
||||||
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.ContinuousColorGradient, 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), 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), PlotUtils.ColorPalette, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots._cycle), PlotUtils.ContinuousColorGradient, 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_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_colorgradient), Plots.Series})
|
|
||||||
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_gradient), PlotUtils.ContinuousColorGradient})
|
|
||||||
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_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_plotly_marker), Symbol, String})
|
|
||||||
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.ContinuousColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ContinuousColorGradient, 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, Float64, Float64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64, Float64, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Float64, Float64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Float64, Tuple{Float64, Float64}, Int64, Float64, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Int64, Tuple{Float64, Float64}, Int64, Float64, Float64, Plots.Shape})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_marker), Plots.Series, Int64, Int64, Tuple{Float64, Float64}, Int64, Float64, Float64, Symbol})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64, 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, 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, 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}, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64, 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, 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}, Float64, Float64})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}})
|
|
||||||
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_getcolorind), ColorTypes.RGBA{Float64}})
|
|
||||||
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_linetype), Symbol})
|
|
||||||
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.ContinuousColorGradient})
|
|
||||||
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.ContinuousColorGradient})
|
|
||||||
precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ContinuousColorGradient})
|
|
||||||
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_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.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.has_black_border_for_default), Symbol})
|
|
||||||
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_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_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_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.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.locate_annotation), Plots.Subplot{Plots.PlotlyBackend}, 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.partialcircle), Float64, Float64, Int64, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.partialcircle), Int64, Float64, Int64, Int64})
|
|
||||||
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.CategoricalColorGradient, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ContinuousColorGradient, Int64})
|
|
||||||
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ContinuousColorGradient, 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), 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, 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, 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{PlotUtils.ContinuousColorGradient, 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.ticksType), Tuple{Array{Float64, 1}, Array{Any, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.ticksType), Tuple{Array{Float64, 1}, Array{String, 1}}})
|
|
||||||
precompile(Tuple{typeof(Plots.ticksType), Tuple{Array{Int64, 1}, Array{String, 1}}})
|
|
||||||
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
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
should_precompile = true
|
||||||
|
|
||||||
|
|
||||||
|
# Don't edit the following! Instead change the script for `snoop_bot`.
|
||||||
|
ismultios = true
|
||||||
|
ismultiversion = true
|
||||||
|
# precompile_enclosure
|
||||||
|
@static if !should_precompile
|
||||||
|
# nothing
|
||||||
|
elseif !ismultios && !ismultiversion
|
||||||
|
include("../deps/SnoopCompile/precompile/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
else
|
||||||
|
@static if Sys.islinux()
|
||||||
|
@static if v"1.5.0-DEV" <= VERSION <= v"1.5.9"
|
||||||
|
include("../deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
else
|
||||||
|
include("../deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
@static if v"1.5.0-DEV" <= VERSION <= v"1.5.9"
|
||||||
|
include("../deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
else
|
||||||
|
include("../deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl")
|
||||||
|
_precompile_()
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end # precompile_enclosure
|
||||||
+160
-90
@@ -78,6 +78,8 @@ const POTENTIAL_VECTOR_ARGUMENTS = [
|
|||||||
:fillrange,
|
:fillrange,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:line}}, x, y, z)
|
@recipe function f(::Type{Val{:line}}, x, y, z)
|
||||||
indices = sortperm(x)
|
indices = sortperm(x)
|
||||||
x := x[indices]
|
x := x[indices]
|
||||||
@@ -124,9 +126,8 @@ end
|
|||||||
@recipe function f(::Type{Val{:vline}}, x, y, z)
|
@recipe function f(::Type{Val{:vline}}, x, y, z)
|
||||||
n = length(y)
|
n = length(y)
|
||||||
newx = vec(Float64[yi for i = 1:3, yi in y])
|
newx = vec(Float64[yi for i = 1:3, yi in y])
|
||||||
newy = repeat(Float64[1, 2, NaN], n)
|
|
||||||
x := newx
|
x := newx
|
||||||
y := newy
|
y := repeat(Float64[1, 2, NaN], n)
|
||||||
seriestype := :straightline
|
seriestype := :straightline
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
@@ -174,6 +175,8 @@ end
|
|||||||
end
|
end
|
||||||
@deps scatterpath path scatter
|
@deps scatterpath path scatter
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# steps
|
# steps
|
||||||
@@ -195,6 +198,8 @@ end
|
|||||||
make_steps(t::Tuple, st) = Tuple(make_steps(ti, st) for ti in t)
|
make_steps(t::Tuple, st) = Tuple(make_steps(ti, st) for ti in t)
|
||||||
|
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
# create a path from steps
|
# create a path from steps
|
||||||
@recipe function f(::Type{Val{:steppre}}, x, y, z)
|
@recipe function f(::Type{Val{:steppre}}, x, y, z)
|
||||||
plotattributes[:x] = make_steps(x, :post)
|
plotattributes[:x] = make_steps(x, :post)
|
||||||
@@ -263,24 +268,39 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
newx, newy = zeros(3n), zeros(3n)
|
newx, newy = zeros(3n), zeros(3n)
|
||||||
|
newz = z!== nothing ? zeros(3n) : nothing
|
||||||
for i = 1:n
|
for i = 1:n
|
||||||
rng = (3i - 2):(3i)
|
rng = (3i - 2):(3i)
|
||||||
newx[rng] = [x[i], x[i], NaN]
|
newx[rng] = [x[i], x[i], NaN]
|
||||||
newy[rng] = [_cycle(fr, i), y[i], NaN]
|
if z !== nothing
|
||||||
|
newy[rng] = [y[i], y[i], NaN]
|
||||||
|
newz[rng] = [_cycle(fr, i), z[i], NaN]
|
||||||
|
else
|
||||||
|
newy[rng] = [_cycle(fr, i), y[i], NaN]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
x := newx
|
x := newx
|
||||||
y := newy
|
y := newy
|
||||||
|
if z !== nothing
|
||||||
|
z := newz
|
||||||
|
end
|
||||||
fillrange := nothing
|
fillrange := nothing
|
||||||
seriestype := :path
|
seriestype := :path
|
||||||
|
if plotattributes[:linecolor] == :auto && plotattributes[:marker_z] !== nothing && plotattributes[:line_z] === nothing
|
||||||
|
line_z := plotattributes[:marker_z]
|
||||||
|
end
|
||||||
|
|
||||||
# create a secondary series for the markers
|
# create a primary series for the markers
|
||||||
if plotattributes[:markershape] != :none
|
if plotattributes[:markershape] != :none
|
||||||
|
primary := false
|
||||||
@series begin
|
@series begin
|
||||||
seriestype := :scatter
|
seriestype := :scatter
|
||||||
x := x
|
x := x
|
||||||
y := y
|
y := y
|
||||||
label := ""
|
if z !== nothing
|
||||||
primary := false
|
z := z
|
||||||
|
end
|
||||||
|
primary := true
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
markershape := :none
|
markershape := :none
|
||||||
@@ -289,6 +309,8 @@ end
|
|||||||
end
|
end
|
||||||
@deps sticks path scatter
|
@deps sticks path scatter
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# bezier curves
|
# bezier curves
|
||||||
@@ -303,6 +325,8 @@ function bezier_value(pts::AVec, t::Real)
|
|||||||
val
|
val
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
# create segmented bezier curves in place of line segments
|
# create segmented bezier curves in place of line segments
|
||||||
@recipe function f(::Type{Val{:curves}}, x, y, z; npoints = 30)
|
@recipe function f(::Type{Val{:curves}}, x, y, z; npoints = 30)
|
||||||
args = z !== nothing ? (x, y, z) : (x, y)
|
args = z !== nothing ? (x, y, z) : (x, y)
|
||||||
@@ -458,6 +482,9 @@ end
|
|||||||
()
|
()
|
||||||
end
|
end
|
||||||
@deps plots_heatmap shape
|
@deps plots_heatmap shape
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
is_3d(::Type{Val{:plots_heatmap}}) = true
|
is_3d(::Type{Val{:plots_heatmap}}) = true
|
||||||
RecipesPipeline.is_surface(::Type{Val{:plots_heatmap}}) = true
|
RecipesPipeline.is_surface(::Type{Val{:plots_heatmap}}) = true
|
||||||
RecipesPipeline.is_surface(::Type{Val{:hexbin}}) = true
|
RecipesPipeline.is_surface(::Type{Val{:hexbin}}) = true
|
||||||
@@ -521,6 +548,8 @@ function _preprocess_binlike(plotattributes, x, y)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:barbins}}, x, y, z)
|
@recipe function f(::Type{Val{:barbins}}, x, y, z)
|
||||||
edge, weights, xscale, yscale, baseline =
|
edge, weights, xscale, yscale, baseline =
|
||||||
_preprocess_binlike(plotattributes, x, y)
|
_preprocess_binlike(plotattributes, x, y)
|
||||||
@@ -552,6 +581,8 @@ end
|
|||||||
end
|
end
|
||||||
@deps scatterbins xerror scatter
|
@deps scatterbins xerror scatter
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
function _stepbins_path(
|
function _stepbins_path(
|
||||||
edge,
|
edge,
|
||||||
weights,
|
weights,
|
||||||
@@ -618,8 +649,8 @@ function _stepbins_path(
|
|||||||
(x, y)
|
(x, y)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:stepbins}}, x, y, z)
|
@recipe function f(::Type{Val{:stepbins}}, x, y, z)
|
||||||
|
@nospecialize
|
||||||
axis =
|
axis =
|
||||||
plotattributes[:subplot][Plots.isvertical(plotattributes) ? :xaxis : :yaxis]
|
plotattributes[:subplot][Plots.isvertical(plotattributes) ? :xaxis : :yaxis]
|
||||||
|
|
||||||
@@ -756,6 +787,7 @@ function _make_hist(
|
|||||||
normalize!(h, mode = _hist_norm_mode(normed))
|
normalize!(h, mode = _hist_norm_mode(normed))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:histogram}}, x, y, z)
|
@recipe function f(::Type{Val{:histogram}}, x, y, z)
|
||||||
seriestype := length(y) > 1e6 ? :stephist : :barhist
|
seriestype := length(y) > 1e6 ? :stephist : :barhist
|
||||||
@@ -765,7 +797,7 @@ end
|
|||||||
|
|
||||||
@recipe function f(::Type{Val{:barhist}}, x, y, z)
|
@recipe function f(::Type{Val{:barhist}}, x, y, z)
|
||||||
h = _make_hist(
|
h = _make_hist(
|
||||||
(y,),
|
tuple(y),
|
||||||
plotattributes[:bins],
|
plotattributes[:bins],
|
||||||
normed = plotattributes[:normalize],
|
normed = plotattributes[:normalize],
|
||||||
weights = plotattributes[:weights],
|
weights = plotattributes[:weights],
|
||||||
@@ -779,7 +811,7 @@ end
|
|||||||
|
|
||||||
@recipe function f(::Type{Val{:stephist}}, x, y, z)
|
@recipe function f(::Type{Val{:stephist}}, x, y, z)
|
||||||
h = _make_hist(
|
h = _make_hist(
|
||||||
(y,),
|
tuple(y),
|
||||||
plotattributes[:bins],
|
plotattributes[:bins],
|
||||||
normed = plotattributes[:normalize],
|
normed = plotattributes[:normalize],
|
||||||
weights = plotattributes[:weights],
|
weights = plotattributes[:weights],
|
||||||
@@ -793,7 +825,7 @@ end
|
|||||||
|
|
||||||
@recipe function f(::Type{Val{:scatterhist}}, x, y, z)
|
@recipe function f(::Type{Val{:scatterhist}}, x, y, z)
|
||||||
h = _make_hist(
|
h = _make_hist(
|
||||||
(y,),
|
tuple(y),
|
||||||
plotattributes[:bins],
|
plotattributes[:bins],
|
||||||
normed = plotattributes[:normalize],
|
normed = plotattributes[:normalize],
|
||||||
weights = plotattributes[:weights],
|
weights = plotattributes[:weights],
|
||||||
@@ -860,9 +892,7 @@ end
|
|||||||
|
|
||||||
x := Plots._bin_centers(edge_x)
|
x := Plots._bin_centers(edge_x)
|
||||||
y := Plots._bin_centers(edge_y)
|
y := Plots._bin_centers(edge_y)
|
||||||
z := Surface(float_weights)
|
z := Surface(permutedims(float_weights))
|
||||||
|
|
||||||
match_dimensions := true
|
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
@@ -913,6 +943,19 @@ end
|
|||||||
@deps pie shape
|
@deps pie shape
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# mesh 3d replacement for non-plotly backends
|
||||||
|
|
||||||
|
@recipe function f(::Type{Val{:mesh3d}}, x, y, z)
|
||||||
|
# As long as no i,j,k are supplied this should work with PyPlot and GR
|
||||||
|
seriestype := :surface
|
||||||
|
if plotattributes[:connections] !== nothing
|
||||||
|
throw(ArgumentError("Giving triangles using the connections argument is only supported on Plotly backend."))
|
||||||
|
end
|
||||||
|
()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# scatter 3d
|
# scatter 3d
|
||||||
|
|
||||||
@@ -928,7 +971,6 @@ end
|
|||||||
|
|
||||||
# note: don't add dependencies because this really isn't a drop-in replacement
|
# note: don't add dependencies because this really isn't a drop-in replacement
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# lens! - magnify a region of a plot
|
# lens! - magnify a region of a plot
|
||||||
lens!(args...;kwargs...) = plot!(args...; seriestype=:lens, kwargs...)
|
lens!(args...;kwargs...) = plot!(args...; seriestype=:lens, kwargs...)
|
||||||
@@ -950,8 +992,12 @@ export lens!
|
|||||||
lens_index = last(plt.subplots)[:subplot_index] + 1
|
lens_index = last(plt.subplots)[:subplot_index] + 1
|
||||||
x1, x2 = plotattributes[:x]
|
x1, x2 = plotattributes[:x]
|
||||||
y1, y2 = plotattributes[:y]
|
y1, y2 = plotattributes[:y]
|
||||||
|
backup = copy(plotattributes)
|
||||||
|
empty!(plotattributes)
|
||||||
|
|
||||||
|
series_plotindex := backup[:series_plotindex]
|
||||||
seriestype := :path
|
seriestype := :path
|
||||||
label := ""
|
primary := false
|
||||||
linecolor := :lightgray
|
linecolor := :lightgray
|
||||||
bbx_mag = (x1 + x2) / 2
|
bbx_mag = (x1 + x2) / 2
|
||||||
bby_mag = (y1 + y2) / 2
|
bby_mag = (y1 + y2) / 2
|
||||||
@@ -961,6 +1007,7 @@ export lens!
|
|||||||
if xl1 < xi_lens < xl2 &&
|
if xl1 < xi_lens < xl2 &&
|
||||||
yl1 < yi_lens < yl2
|
yl1 < yi_lens < yl2
|
||||||
@series begin
|
@series begin
|
||||||
|
primary := false
|
||||||
subplot := sp_index
|
subplot := sp_index
|
||||||
x := [xi_mag, xi_lens]
|
x := [xi_mag, xi_lens]
|
||||||
y := [yi_mag, yi_lens]
|
y := [yi_mag, yi_lens]
|
||||||
@@ -969,6 +1016,7 @@ export lens!
|
|||||||
end
|
end
|
||||||
# add magnification shape
|
# add magnification shape
|
||||||
@series begin
|
@series begin
|
||||||
|
primary := false
|
||||||
subplot := sp_index
|
subplot := sp_index
|
||||||
x := [x1, x1, x2, x2, x1]
|
x := [x1, x1, x2, x2, x1]
|
||||||
y := [y1, y2, y2, y1, y1]
|
y := [y1, y2, y2, y1, y1]
|
||||||
@@ -977,20 +1025,19 @@ export lens!
|
|||||||
# add subplot
|
# add subplot
|
||||||
for series in sp.series_list
|
for series in sp.series_list
|
||||||
@series begin
|
@series begin
|
||||||
plotattributes = merge(plotattributes, copy(series.plotattributes))
|
plotattributes = merge(backup, copy(series.plotattributes))
|
||||||
subplot := lens_index
|
subplot := lens_index
|
||||||
label := ""
|
primary := false
|
||||||
xlims := (x1, x2)
|
xlims := (x1, x2)
|
||||||
ylims := (y1, y2)
|
ylims := (y1, y2)
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
backup = copy(plotattributes)
|
nothing
|
||||||
empty!(plotattributes)
|
|
||||||
seriestype := :path
|
|
||||||
series_plotindex := backup[:series_plotindex]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
function intersection_point(xA, yA, xB, yB, h, w)
|
function intersection_point(xA, yA, xB, yB, h, w)
|
||||||
s = (yA - yB) / (xA - xB)
|
s = (yA - yB) / (xA - xB)
|
||||||
hh = h / 2
|
hh = h / 2
|
||||||
@@ -1018,6 +1065,7 @@ end
|
|||||||
# contourf - filled contours
|
# contourf - filled contours
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:contourf}}, x, y, z)
|
@recipe function f(::Type{Val{:contourf}}, x, y, z)
|
||||||
|
@nospecialize
|
||||||
fillrange := true
|
fillrange := true
|
||||||
seriestype := :contour
|
seriestype := :contour
|
||||||
()
|
()
|
||||||
@@ -1027,8 +1075,24 @@ end
|
|||||||
# Error Bars
|
# Error Bars
|
||||||
|
|
||||||
function error_style!(plotattributes::AKW)
|
function error_style!(plotattributes::AKW)
|
||||||
|
msc = plotattributes[:markerstrokecolor]
|
||||||
|
msc = if msc === :match
|
||||||
|
plotattributes[:subplot][:foreground_color_subplot]
|
||||||
|
elseif msc === :auto
|
||||||
|
get_series_color(
|
||||||
|
plotattributes[:linecolor],
|
||||||
|
plotattributes[:subplot],
|
||||||
|
plotattributes[:series_plotindex],
|
||||||
|
plotattributes[:seriestype],
|
||||||
|
)
|
||||||
|
else
|
||||||
|
msc
|
||||||
|
end
|
||||||
|
|
||||||
plotattributes[:seriestype] = :path
|
plotattributes[:seriestype] = :path
|
||||||
plotattributes[:markercolor] = plotattributes[:markerstrokecolor]
|
plotattributes[:markerstrokecolor] = msc
|
||||||
|
plotattributes[:markercolor] = msc
|
||||||
|
plotattributes[:linecolor] = msc
|
||||||
plotattributes[:linewidth] = plotattributes[:markerstrokewidth]
|
plotattributes[:linewidth] = plotattributes[:markerstrokewidth]
|
||||||
plotattributes[:label] = ""
|
plotattributes[:label] = ""
|
||||||
end
|
end
|
||||||
@@ -1059,9 +1123,17 @@ function error_coords(errorbar, errordata, otherdata...)
|
|||||||
return (ed, od...)
|
return (ed, od...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# clamp non-NaN values in an array to Base.eps(Float64) for log-scale plots
|
||||||
|
function clamp_to_eps!(ary)
|
||||||
|
replace!(x -> x <= 0.0 ? Base.eps(Float64) : x, ary)
|
||||||
|
nothing
|
||||||
|
end
|
||||||
|
|
||||||
# we will create a series of path segments, where each point represents one
|
# we will create a series of path segments, where each point represents one
|
||||||
# side of an errorbar
|
# side of an errorbar
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
@recipe function f(::Type{Val{:xerror}}, x, y, z)
|
@recipe function f(::Type{Val{:xerror}}, x, y, z)
|
||||||
error_style!(plotattributes)
|
error_style!(plotattributes)
|
||||||
markershape := :vline
|
markershape := :vline
|
||||||
@@ -1072,6 +1144,9 @@ end
|
|||||||
plotattributes[:x], plotattributes[:y], plotattributes[:z] =
|
plotattributes[:x], plotattributes[:y], plotattributes[:z] =
|
||||||
error_coords(xerr, x, y, z)
|
error_coords(xerr, x, y, z)
|
||||||
end
|
end
|
||||||
|
if :xscale ∈ keys(plotattributes) && plotattributes[:xscale] == :log10
|
||||||
|
clamp_to_eps!(plotattributes[:x])
|
||||||
|
end
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
@deps xerror path
|
@deps xerror path
|
||||||
@@ -1086,6 +1161,9 @@ end
|
|||||||
plotattributes[:y], plotattributes[:x], plotattributes[:z] =
|
plotattributes[:y], plotattributes[:x], plotattributes[:z] =
|
||||||
error_coords(yerr, y, x, z)
|
error_coords(yerr, y, x, z)
|
||||||
end
|
end
|
||||||
|
if :yscale ∈ keys(plotattributes) && plotattributes[:yscale] == :log10
|
||||||
|
clamp_to_eps!(plotattributes[:y])
|
||||||
|
end
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
@deps yerror path
|
@deps yerror path
|
||||||
@@ -1098,10 +1176,14 @@ end
|
|||||||
plotattributes[:z], plotattributes[:x], plotattributes[:y] =
|
plotattributes[:z], plotattributes[:x], plotattributes[:y] =
|
||||||
error_coords(zerr, z, x, y)
|
error_coords(zerr, z, x, y)
|
||||||
end
|
end
|
||||||
|
if :zscale ∈ keys(plotattributes) && plotattributes[:zscale] == :log10
|
||||||
|
clamp_to_eps!(plotattributes[:z])
|
||||||
|
end
|
||||||
()
|
()
|
||||||
end
|
end
|
||||||
@deps zerror path
|
@deps zerror path
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
# TODO: move quiver to PlotRecipes
|
# TODO: move quiver to PlotRecipes
|
||||||
|
|
||||||
@@ -1115,35 +1197,51 @@ function quiver_using_arrows(plotattributes::AKW)
|
|||||||
if !isa(plotattributes[:arrow], Arrow)
|
if !isa(plotattributes[:arrow], Arrow)
|
||||||
plotattributes[:arrow] = arrow()
|
plotattributes[:arrow] = arrow()
|
||||||
end
|
end
|
||||||
|
is_3d = haskey(plotattributes,:z) && !isnothing(plotattributes[:z])
|
||||||
velocity = error_zipit(plotattributes[:quiver])
|
velocity = error_zipit(plotattributes[:quiver])
|
||||||
xorig, yorig = plotattributes[:x], plotattributes[:y]
|
xorig, yorig = plotattributes[:x], plotattributes[:y]
|
||||||
|
zorig = is_3d ? plotattributes[:z] : []
|
||||||
|
|
||||||
# for each point, we create an arrow of velocity vi, translated to the x/y coordinates
|
# for each point, we create an arrow of velocity vi, translated to the x/y coordinates
|
||||||
x, y = zeros(0), zeros(0)
|
x, y = zeros(0), zeros(0)
|
||||||
for i = 1:max(length(xorig), length(yorig))
|
is_3d && ( z = zeros(0))
|
||||||
|
for i = 1:max(length(xorig), length(yorig), is_3d ? 0 : length(zorig))
|
||||||
# get the starting position
|
# get the starting position
|
||||||
xi = _cycle(xorig, i)
|
xi = _cycle(xorig, i)
|
||||||
yi = _cycle(yorig, i)
|
yi = _cycle(yorig, i)
|
||||||
|
zi = is_3d ? _cycle(zorig, i) : 0
|
||||||
# get the velocity
|
# get the velocity
|
||||||
vi = _cycle(velocity, i)
|
vi = _cycle(velocity, i)
|
||||||
vx, vy = if istuple(vi)
|
if is_3d
|
||||||
first(vi), last(vi)
|
vx, vy, vz = if istuple(vi)
|
||||||
elseif isscalar(vi)
|
vi[1], vi[2], vi[3]
|
||||||
vi, vi
|
elseif isscalar(vi)
|
||||||
elseif isa(vi, Function)
|
vi, vi, vi
|
||||||
vi(xi, yi)
|
elseif isa(vi, Function)
|
||||||
else
|
vi(xi, yi, zi)
|
||||||
error("unexpected vi type $(typeof(vi)) for quiver: $vi")
|
else
|
||||||
|
error("unexpected vi type $(typeof(vi)) for quiver: $vi")
|
||||||
|
end
|
||||||
|
else # 2D quiver
|
||||||
|
vx, vy = if istuple(vi)
|
||||||
|
first(vi), last(vi)
|
||||||
|
elseif isscalar(vi)
|
||||||
|
vi, vi
|
||||||
|
elseif isa(vi, Function)
|
||||||
|
vi(xi, yi)
|
||||||
|
else
|
||||||
|
error("unexpected vi type $(typeof(vi)) for quiver: $vi")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# add the points
|
# add the points
|
||||||
nanappend!(x, [xi, xi + vx, NaN])
|
nanappend!(x, [xi, xi + vx, NaN])
|
||||||
nanappend!(y, [yi, yi + vy, NaN])
|
nanappend!(y, [yi, yi + vy, NaN])
|
||||||
|
is_3d && nanappend!(z, [zi, zi + vz, NaN])
|
||||||
end
|
end
|
||||||
|
|
||||||
plotattributes[:x], plotattributes[:y] = x, y
|
plotattributes[:x], plotattributes[:y] = x, y
|
||||||
|
if is_3d
|
||||||
|
plotattributes[:z] = z
|
||||||
|
end
|
||||||
# KW[plotattributes]
|
# KW[plotattributes]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1198,6 +1296,7 @@ end
|
|||||||
|
|
||||||
# function apply_series_recipe(plotattributes::AKW, ::Type{Val{:quiver}})
|
# function apply_series_recipe(plotattributes::AKW, ::Type{Val{:quiver}})
|
||||||
@recipe function f(::Type{Val{:quiver}}, x, y, z)
|
@recipe function f(::Type{Val{:quiver}}, x, y, z)
|
||||||
|
@nospecialize
|
||||||
if :arrow in supported_attrs()
|
if :arrow in supported_attrs()
|
||||||
quiver_using_arrows(plotattributes)
|
quiver_using_arrows(plotattributes)
|
||||||
else
|
else
|
||||||
@@ -1230,12 +1329,14 @@ end
|
|||||||
else
|
else
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
yflip --> true
|
yflip --> true
|
||||||
cbar --> false
|
colorbar --> false
|
||||||
fillcolor --> ColorGradient([:black, :white])
|
fillcolor --> cgrad([:black, :white])
|
||||||
SliceIt, m, n, Surface(clamp!(convert(Matrix{Float64}, mat), 0.0, 1.0))
|
SliceIt, m, n, Surface(clamp!(convert(Matrix{Float64}, mat), 0.0, 1.0))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
# images - colors
|
# images - colors
|
||||||
@recipe function f(mat::AMat{T}) where {T <: Colorant}
|
@recipe function f(mat::AMat{T}) where {T <: Colorant}
|
||||||
n, m = axes(mat)
|
n, m = axes(mat)
|
||||||
@@ -1247,7 +1348,7 @@ end
|
|||||||
else
|
else
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
yflip --> true
|
yflip --> true
|
||||||
cbar --> false
|
colorbar --> false
|
||||||
aspect_ratio --> :equal
|
aspect_ratio --> :equal
|
||||||
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
|
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
|
||||||
SliceIt, m, n, Surface(z)
|
SliceIt, m, n, Surface(z)
|
||||||
@@ -1287,8 +1388,8 @@ end
|
|||||||
else
|
else
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
yflip --> true
|
yflip --> true
|
||||||
cbar --> false
|
colorbar --> false
|
||||||
fillcolor --> ColorGradient([:black, :white])
|
fillcolor --> cgrad([:black, :white])
|
||||||
SliceIt, x, y, Surface(convert(Matrix{Float64}, mat))
|
SliceIt, x, y, Surface(convert(Matrix{Float64}, mat))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1302,23 +1403,24 @@ end
|
|||||||
else
|
else
|
||||||
seriestype := :heatmap
|
seriestype := :heatmap
|
||||||
yflip --> true
|
yflip --> true
|
||||||
cbar --> false
|
colorbar --> false
|
||||||
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
|
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
|
||||||
SliceIt, x, y, Surface(z)
|
SliceIt, x, y, Surface(z)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
# Lists of tuples and GeometryTypes.Points
|
# Lists of tuples and GeometryBasics.Points
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
@recipe f(v::AVec{<:GeometryTypes.Point}) = RecipesPipeline.unzip(v)
|
@recipe f(v::AVec{<:GeometryBasics.Point}) = RecipesPipeline.unzip(v)
|
||||||
@recipe f(p::GeometryTypes.Point) = [p]
|
@recipe f(p::GeometryBasics.Point) = [p]
|
||||||
|
|
||||||
# Special case for 4-tuples in :ohlc series
|
# Special case for 4-tuples in :ohlc series
|
||||||
@recipe f(xyuv::AVec{<:Tuple{R1, R2, R3, R4}}) where {R1, R2, R3, R4} =
|
@recipe f(xyuv::AVec{<:Tuple{R1, R2, R3, R4}}) where {R1, R2, R3, R4} =
|
||||||
get(plotattributes, :seriestype, :path) == :ohlc ? OHLC[OHLC(t...) for t in xyuv] :
|
get(plotattributes, :seriestype, :path) == :ohlc ? OHLC[OHLC(t...) for t in xyuv] :
|
||||||
RecipesPipeline.unzip(xyuv)
|
RecipesPipeline.unzip(xyuv)
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
|
|
||||||
@@ -1358,6 +1460,8 @@ end
|
|||||||
# TODO: when I allow `@recipe f(::Type{T}, v::T) = ...` definitions to replace convertToAnyVector,
|
# TODO: when I allow `@recipe f(::Type{T}, v::T) = ...` definitions to replace convertToAnyVector,
|
||||||
# then I should replace these with one definition to convert to a vector of 4-tuples
|
# then I should replace these with one definition to convert to a vector of 4-tuples
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
# to squash ambiguity warnings...
|
# to squash ambiguity warnings...
|
||||||
@recipe f(x::AVec{Function}, v::AVec{OHLC}) = error()
|
@recipe f(x::AVec{Function}, v::AVec{OHLC}) = error()
|
||||||
@recipe f(
|
@recipe f(
|
||||||
@@ -1425,7 +1529,11 @@ end
|
|||||||
markersize := 1
|
markersize := 1
|
||||||
end
|
end
|
||||||
markerstrokewidth := 0
|
markerstrokewidth := 0
|
||||||
marker_z := zs
|
if length(unique(zs)) == 1
|
||||||
|
seriescolor --> :black
|
||||||
|
else
|
||||||
|
marker_z := zs
|
||||||
|
end
|
||||||
label := ""
|
label := ""
|
||||||
x := cs
|
x := cs
|
||||||
y := rs
|
y := rs
|
||||||
@@ -1435,8 +1543,10 @@ end
|
|||||||
()
|
()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@specialize
|
||||||
|
|
||||||
Plots.findnz(A::AbstractSparseMatrix) = findnz(A)
|
|
||||||
|
Plots.findnz(A::AbstractSparseMatrix) = SparseArrays.findnz(A)
|
||||||
|
|
||||||
# fallback function for finding non-zero elements of non-sparse matrices
|
# fallback function for finding non-zero elements of non-sparse matrices
|
||||||
function Plots.findnz(A::AbstractMatrix)
|
function Plots.findnz(A::AbstractMatrix)
|
||||||
@@ -1449,6 +1559,8 @@ end
|
|||||||
|
|
||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
|
|
||||||
|
@nospecialize
|
||||||
|
|
||||||
"Adds ax+b... straight line over the current plot, without changing the axis limits"
|
"Adds ax+b... straight line over the current plot, without changing the axis limits"
|
||||||
abline!(plt::Plot, a, b; kw...) =
|
abline!(plt::Plot, a, b; kw...) =
|
||||||
plot!(plt, [0, 1], [b, b + a]; seriestype = :straightline, kw...)
|
plot!(plt, [0, 1], [b, b + a]; seriestype = :straightline, kw...)
|
||||||
@@ -1474,50 +1586,6 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------------
|
|
||||||
# Color Gradients
|
|
||||||
|
|
||||||
@userplot ShowLibrary
|
|
||||||
@recipe function f(cl::ShowLibrary)
|
|
||||||
if !(length(cl.args) == 1 && isa(cl.args[1], Symbol))
|
|
||||||
error("showlibrary takes the name of a color library as a Symbol")
|
|
||||||
end
|
|
||||||
|
|
||||||
library = PlotUtils.color_libraries[cl.args[1]]
|
|
||||||
z = sqrt.((1:15) * reshape(1:20, 1, :))
|
|
||||||
|
|
||||||
seriestype := :heatmap
|
|
||||||
ticks := nothing
|
|
||||||
legend := false
|
|
||||||
|
|
||||||
layout --> length(library.lib)
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
for grad in sort(collect(keys(library.lib)))
|
|
||||||
@series begin
|
|
||||||
seriescolor := cgrad(grad, cl.args[1])
|
|
||||||
title := string(grad)
|
|
||||||
subplot := i += 1
|
|
||||||
z
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@userplot ShowGradient
|
|
||||||
@recipe function f(grad::ShowGradient)
|
|
||||||
if !(length(grad.args) == 1 && isa(grad.args[1], Symbol))
|
|
||||||
error("showgradient takes the name of a color gradient as a Symbol")
|
|
||||||
end
|
|
||||||
z = sqrt.((1:15) * reshape(1:20, 1, :))
|
|
||||||
seriestype := :heatmap
|
|
||||||
ticks := nothing
|
|
||||||
legend := false
|
|
||||||
seriescolor := grad.args[1]
|
|
||||||
title := string(grad.args[1])
|
|
||||||
z
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# Moved in from PlotRecipes - see: http://stackoverflow.com/a/37732384/5075246
|
# Moved in from PlotRecipes - see: http://stackoverflow.com/a/37732384/5075246
|
||||||
@userplot PortfolioComposition
|
@userplot PortfolioComposition
|
||||||
|
|
||||||
@@ -1562,3 +1630,5 @@ julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], f
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@specialize
|
||||||
+28
-3
@@ -1,3 +1,5 @@
|
|||||||
|
@nospecialize
|
||||||
|
|
||||||
"""
|
"""
|
||||||
scatter(x,y)
|
scatter(x,y)
|
||||||
scatter!(x,y)
|
scatter!(x,y)
|
||||||
@@ -69,7 +71,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`.
|
||||||
@@ -318,6 +320,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)
|
||||||
@@ -411,10 +434,10 @@ zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmi
|
|||||||
|
|
||||||
|
|
||||||
"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} = plot!(; xticks = (ticks,labels), kw...)
|
ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; xticks = (ticks,labels), kw...)
|
||||||
@@ -454,3 +477,5 @@ xaxis!(args...; kw...) = plot!(; xaxis = args
|
|||||||
yaxis!(args...; kw...) = plot!(; yaxis = args, kw...)
|
yaxis!(args...; kw...) = plot!(; yaxis = args, kw...)
|
||||||
xgrid!(args...; kw...) = plot!(; xgrid = args, kw...)
|
xgrid!(args...; kw...) = plot!(; xgrid = args, kw...)
|
||||||
ygrid!(args...; kw...) = plot!(; ygrid = args, kw...)
|
ygrid!(args...; kw...) = plot!(; ygrid = args, kw...)
|
||||||
|
|
||||||
|
@specialize
|
||||||
+46
-43
@@ -1,4 +1,6 @@
|
|||||||
|
function treats_y_as_x(seriestype)
|
||||||
|
return seriestype in (:vline, :vspan, :histogram, :barhist, :stephist, :scatterhist)
|
||||||
|
end
|
||||||
function replace_image_with_heatmap(z::Array{T}) where T<:Colorant
|
function replace_image_with_heatmap(z::Array{T}) where T<:Colorant
|
||||||
n, m = size(z)
|
n, m = size(z)
|
||||||
colors = palette(vec(z))
|
colors = palette(vec(z))
|
||||||
@@ -67,19 +69,17 @@ function iter_segments(args...)
|
|||||||
SegmentsIterator(tup, n1, n2)
|
SegmentsIterator(tup, n1, n2)
|
||||||
end
|
end
|
||||||
|
|
||||||
function iter_segments(series::Series)
|
function iter_segments(series::Series, seriestype::Symbol = :path)
|
||||||
x, y, z = series[:x], series[:y], series[:z]
|
x, y, z = series[:x], series[:y], series[:z]
|
||||||
if x === nothing
|
if x === nothing
|
||||||
return UnitRange{Int}[]
|
return UnitRange{Int}[]
|
||||||
elseif has_attribute_segments(series)
|
elseif has_attribute_segments(series)
|
||||||
if series[:seriestype] in (:scatter, :scatter3d)
|
if any(isnan,y)
|
||||||
|
return [iter_segments(y)...]
|
||||||
|
elseif seriestype in (:scatter, :scatter3d)
|
||||||
return [[i] for i in eachindex(y)]
|
return [[i] for i in eachindex(y)]
|
||||||
else
|
else
|
||||||
if any(isnan,y)
|
return [i:(i + 1) for i in firstindex(y):lastindex(y)-1]
|
||||||
return [iter_segments(y)...]
|
|
||||||
else
|
|
||||||
return [i:(i + 1) for i in firstindex(y):lastindex(y)-1]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
segs = UnitRange{Int}[]
|
segs = UnitRange{Int}[]
|
||||||
@@ -126,8 +126,8 @@ isnothing(x) = false
|
|||||||
_cycle(wrapper::InputWrapper, idx::Int) = wrapper.obj
|
_cycle(wrapper::InputWrapper, idx::Int) = wrapper.obj
|
||||||
_cycle(wrapper::InputWrapper, idx::AVec{Int}) = wrapper.obj
|
_cycle(wrapper::InputWrapper, idx::AVec{Int}) = wrapper.obj
|
||||||
|
|
||||||
_cycle(v::AVec, idx::Int) = v[mod1(idx, length(v))]
|
_cycle(v::AVec, idx::Int) = v[mod(idx, axes(v,1))]
|
||||||
_cycle(v::AMat, idx::Int) = size(v,1) == 1 ? v[1, mod1(idx, size(v,2))] : v[:, mod1(idx, size(v,2))]
|
_cycle(v::AMat, idx::Int) = size(v,1) == 1 ? v[end, mod(idx, axes(v,2))] : v[:, mod(idx, axes(v,2))]
|
||||||
_cycle(v, idx::Int) = v
|
_cycle(v, idx::Int) = v
|
||||||
|
|
||||||
_cycle(v::AVec, indices::AVec{Int}) = map(i -> _cycle(v,i), indices)
|
_cycle(v::AVec, indices::AVec{Int}) = map(i -> _cycle(v,i), indices)
|
||||||
@@ -151,15 +151,18 @@ maketuple(x::Tuple{T,S}) where {T,S} = x
|
|||||||
|
|
||||||
for i in 2:4
|
for i in 2:4
|
||||||
@eval begin
|
@eval begin
|
||||||
RecipesPipeline.unzip(v::Union{AVec{<:Tuple{Vararg{T,$i} where T}},
|
RecipesPipeline.unzip(
|
||||||
AVec{<:GeometryTypes.Point{$i}}}) = $(Expr(:tuple, (:([t[$j] for t in v]) for j=1:i)...))
|
v::Union{AVec{<:Tuple{Vararg{T,$i} where T}}, AVec{<:GeometryBasics.Point{$i}}},
|
||||||
|
) = $(Expr(:tuple, (:([t[$j] for t in v]) for j=1:i)...))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
RecipesPipeline.unzip(v::Union{AVec{<:GeometryTypes.Point{N}},
|
RecipesPipeline.unzip(
|
||||||
AVec{<:Tuple{Vararg{T,N} where T}}}) where N = error("$N-dimensional unzip not implemented.")
|
::Union{AVec{<:GeometryBasics.Point{N}}, AVec{<:Tuple{Vararg{T,N} where T}}}
|
||||||
RecipesPipeline.unzip(v::Union{AVec{<:GeometryTypes.Point},
|
) where N = error("$N-dimensional unzip not implemented.")
|
||||||
AVec{<:Tuple}}) = error("Can't unzip points of different dimensions.")
|
RecipesPipeline.unzip(::Union{AVec{<:GeometryBasics.Point}, AVec{<:Tuple}}) = error(
|
||||||
|
"Can't unzip points of different dimensions."
|
||||||
|
)
|
||||||
|
|
||||||
# given 2-element lims and a vector of data x, widen lims to account for the extrema of x
|
# given 2-element lims and a vector of data x, widen lims to account for the extrema of x
|
||||||
function _expand_limits(lims, x)
|
function _expand_limits(lims, x)
|
||||||
@@ -206,9 +209,6 @@ end
|
|||||||
|
|
||||||
createSegments(z) = collect(repeat(reshape(z,1,:),2,1))[2:end]
|
createSegments(z) = collect(repeat(reshape(z,1,:),2,1))[2:end]
|
||||||
|
|
||||||
Base.first(c::Colorant) = c
|
|
||||||
Base.first(x::Symbol) = x
|
|
||||||
|
|
||||||
|
|
||||||
sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes)))
|
sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes)))
|
||||||
|
|
||||||
@@ -294,13 +294,6 @@ limsType(lims::Tuple{T,S}) where {T<:Real,S<:Real} = :limits
|
|||||||
limsType(lims::Symbol) = lims == :auto ? :auto : :invalid
|
limsType(lims::Symbol) = lims == :auto ? :auto : :invalid
|
||||||
limsType(lims) = :invalid
|
limsType(lims) = :invalid
|
||||||
|
|
||||||
# axis_Symbol(letter, postfix) = Symbol(letter * postfix)
|
|
||||||
# axis_symbols(letter, postfix...) = map(s -> axis_Symbol(letter, s), postfix)
|
|
||||||
|
|
||||||
Base.convert(::Type{Vector{T}}, rng::AbstractRange{T}) where {T<:Real} = T[x for x in rng]
|
|
||||||
Base.convert(::Type{Vector{T}}, rng::AbstractRange{S}) where {T<:Real,S<:Real} = T[x for x in rng]
|
|
||||||
|
|
||||||
Base.merge(a::AbstractVector, b::AbstractVector) = sort(unique(vcat(a,b)))
|
|
||||||
|
|
||||||
# recursively merge kw-dicts, e.g. for merging extra_kwargs / extra_plot_kwargs in plotly)
|
# recursively merge kw-dicts, e.g. for merging extra_kwargs / extra_plot_kwargs in plotly)
|
||||||
recursive_merge(x::AbstractDict...) = merge(recursive_merge, x...)
|
recursive_merge(x::AbstractDict...) = merge(recursive_merge, x...)
|
||||||
@@ -343,17 +336,8 @@ function indices_and_unique_values(z::AbstractArray)
|
|||||||
newz, vals
|
newz, vals
|
||||||
end
|
end
|
||||||
|
|
||||||
# this is a helper function to determine whether we need to transpose a surface matrix.
|
handle_surface(z) = z
|
||||||
# it depends on whether the backend matches rows to x (transpose_on_match == true) or vice versa
|
handle_surface(z::Surface) = permutedims(z.surf)
|
||||||
# for example: PyPlot sends rows to y, so transpose_on_match should be true
|
|
||||||
function transpose_z(plotattributes, z, transpose_on_match::Bool = true)
|
|
||||||
if plotattributes[:match_dimensions] == transpose_on_match
|
|
||||||
# z'
|
|
||||||
permutedims(z, [2,1])
|
|
||||||
else
|
|
||||||
z
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ok(x::Number, y::Number, z::Number = 0)
|
function ok(x::Number, y::Number, z::Number = 0)
|
||||||
isfinite(x) && isfinite(y) && isfinite(z)
|
isfinite(x) && isfinite(y) && isfinite(z)
|
||||||
@@ -361,10 +345,10 @@ end
|
|||||||
ok(tup::Tuple) = ok(tup...)
|
ok(tup::Tuple) = ok(tup...)
|
||||||
|
|
||||||
# compute one side of a fill range from a ribbon
|
# compute one side of a fill range from a ribbon
|
||||||
function make_fillrange_side(y, rib)
|
function make_fillrange_side(y::AVec, rib)
|
||||||
frs = zeros(length(y))
|
frs = zeros(axes(y))
|
||||||
for (i, (yi, ri)) in enumerate(zip(y, Base.Iterators.cycle(rib)))
|
for (i, yi) in pairs(y)
|
||||||
frs[i] = yi + ri
|
frs[i] = yi + _cycle(rib,i)
|
||||||
end
|
end
|
||||||
frs
|
frs
|
||||||
end
|
end
|
||||||
@@ -616,6 +600,7 @@ function has_attribute_segments(series::Series)
|
|||||||
:markerstrokecolor,
|
:markerstrokecolor,
|
||||||
:markerstrokealpha,
|
:markerstrokealpha,
|
||||||
:markerstrokewidth,
|
:markerstrokewidth,
|
||||||
|
:markershape,
|
||||||
]
|
]
|
||||||
) || any(
|
) || any(
|
||||||
typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z)
|
typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z)
|
||||||
@@ -1003,6 +988,24 @@ ignorenan_extrema(plt::Plot) = (xmin(plt), xmax(plt))
|
|||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# get fonts from objects:
|
# get fonts from objects:
|
||||||
|
|
||||||
|
plottitlefont(p::Plot) = font(
|
||||||
|
p[:plot_titlefontfamily],
|
||||||
|
p[:plot_titlefontsize],
|
||||||
|
p[:plot_titlefontvalign],
|
||||||
|
p[:plot_titlefonthalign],
|
||||||
|
p[:plot_titlefontrotation],
|
||||||
|
p[:plot_titlefontcolor],
|
||||||
|
)
|
||||||
|
|
||||||
|
colorbartitlefont(sp::Subplot) = font(
|
||||||
|
sp[:colorbar_titlefontfamily],
|
||||||
|
sp[:colorbar_titlefontsize],
|
||||||
|
sp[:colorbar_titlefontvalign],
|
||||||
|
sp[:colorbar_titlefonthalign],
|
||||||
|
sp[:colorbar_titlefontrotation],
|
||||||
|
sp[:colorbar_titlefontcolor],
|
||||||
|
)
|
||||||
|
|
||||||
titlefont(sp::Subplot) = font(
|
titlefont(sp::Subplot) = font(
|
||||||
sp[:titlefontfamily],
|
sp[:titlefontfamily],
|
||||||
sp[:titlefontsize],
|
sp[:titlefontsize],
|
||||||
@@ -1049,8 +1052,8 @@ guidefont(ax::Axis) = font(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# converts unicode scientific notation unsupported by pgfplots and gr
|
# converts unicode scientific notation, as returned by Showoff,
|
||||||
# into a format that works
|
# to a tex-like format (supported by gr, pyplot, and pgfplots).
|
||||||
|
|
||||||
function convert_sci_unicode(label::AbstractString)
|
function convert_sci_unicode(label::AbstractString)
|
||||||
unicode_dict = Dict(
|
unicode_dict = Dict(
|
||||||
|
|||||||
+41
-16
@@ -1,15 +1,36 @@
|
|||||||
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)
|
||||||
|
pushfirst!(ex.args, ex.args[1])
|
||||||
|
ex.args[2] = :rng
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function fix_rand!(ex)
|
||||||
|
replace_rand!(ex)
|
||||||
|
pushfirst!(ex.args[1].args, :(rng = StableRNG(1234)))
|
||||||
|
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)
|
||||||
@@ -19,25 +40,29 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = !i
|
|||||||
func = (fn, idx) -> begin
|
func = (fn, idx) -> begin
|
||||||
expr = Expr(:block)
|
expr = Expr(:block)
|
||||||
append!(expr.args, example.exprs)
|
append!(expr.args, example.exprs)
|
||||||
|
fix_rand!(expr)
|
||||||
eval(expr)
|
eval(expr)
|
||||||
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 = 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
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
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
|
||||||
|
end # testset
|
||||||
+31
-8
@@ -2,16 +2,39 @@ import ImageMagick
|
|||||||
using VisualRegressionTests
|
using VisualRegressionTests
|
||||||
using Plots
|
using Plots
|
||||||
using Random
|
using Random
|
||||||
|
using StableRNGs
|
||||||
using Test
|
using Test
|
||||||
|
using TestImages
|
||||||
using FileIO
|
using FileIO
|
||||||
using Gtk
|
using Gtk
|
||||||
using LibGit2
|
using LibGit2
|
||||||
using GeometryTypes
|
import GeometryBasics
|
||||||
using Dates
|
using Dates
|
||||||
|
using RecipesBase
|
||||||
|
|
||||||
|
|
||||||
|
@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
|
||||||
|
|
||||||
|
include("test_defaults.jl")
|
||||||
include("test_axes.jl")
|
include("test_axes.jl")
|
||||||
|
include("test_axis_letter.jl")
|
||||||
|
include("test_recipes.jl")
|
||||||
include("test_hdf5plots.jl")
|
include("test_hdf5plots.jl")
|
||||||
include("test_pgfplotsx.jl")
|
include("test_pgfplotsx.jl")
|
||||||
|
include("integration_dates.jl")
|
||||||
|
|
||||||
reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
|
reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
|
||||||
|
|
||||||
@@ -44,27 +67,27 @@ include("imgcomp.jl")
|
|||||||
Random.seed!(1234)
|
Random.seed!(1234)
|
||||||
default(show=false, reuse=true)
|
default(show=false, reuse=true)
|
||||||
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 IMG_TOL = VERSION < v"1.4" && Sys.iswindows() ? 1e-1 : is_ci() ? 1e-2 : 1e-3
|
||||||
|
|
||||||
## 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=img_tol, skip = Plots._backend_skips[:gr])
|
# image_comparison_facts(:gr, tol=IMG_TOL, skip = Plots._backend_skips[:gr])
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# plotly()
|
# plotly()
|
||||||
# @testset "Plotly" begin
|
# @testset "Plotly" begin
|
||||||
# image_comparison_facts(:plotly, tol=img_tol, skip = Plots._backend_skips[:plotlyjs])
|
# image_comparison_facts(:plotly, tol=IMG_TOL, skip = Plots._backend_skips[:plotlyjs])
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# pyplot()
|
# pyplot()
|
||||||
# @testset "PyPlot" begin
|
# @testset "PyPlot" begin
|
||||||
# image_comparison_facts(:pyplot, tol=img_tol, skip = Plots._backend_skips[:pyplot])
|
# image_comparison_facts(:pyplot, tol=IMG_TOL, skip = Plots._backend_skips[:pyplot])
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# pgfplotsx()
|
# pgfplotsx()
|
||||||
# @testset "PGFPlotsX" begin
|
# @testset "PGFPlotsX" begin
|
||||||
# image_comparison_facts(:pgfplotsx, tol=img_tol, skip = Plots._backend_skips[:pgfplotsx])
|
# image_comparison_facts(:pgfplotsx, tol=IMG_TOL, skip = Plots._backend_skips[:pgfplotsx])
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# 10 Histogram2D
|
# 10 Histogram2D
|
||||||
@@ -82,7 +105,7 @@ img_tol = is_ci() ? 1e-2 : Sys.islinux() ? 1e-3 : 0.1
|
|||||||
@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=IMG_TOL, skip = Plots._backend_skips[:gr])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -177,7 +200,7 @@ end
|
|||||||
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
|
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
|
||||||
for z in zipped
|
for z in zipped
|
||||||
@test isequal(collect(zip(Plots.unzip(z)...)), z)
|
@test isequal(collect(zip(Plots.unzip(z)...)), z)
|
||||||
@test isequal(collect(zip(Plots.unzip(GeometryTypes.Point.(z))...)), z)
|
@test isequal(collect(zip(Plots.unzip(GeometryBasics.Point.(z))...)), z)
|
||||||
end
|
end
|
||||||
op1 = Plots.process_clims((1.0, 2.0))
|
op1 = Plots.process_clims((1.0, 2.0))
|
||||||
op2 = Plots.process_clims((1, 2.0))
|
op2 = Plots.process_clims((1, 2.0))
|
||||||
|
|||||||
@@ -12,3 +12,12 @@ end
|
|||||||
@test plot(1, axis=nothing)[1][:xaxis][:ticks] == []
|
@test plot(1, axis=nothing)[1][:xaxis][:ticks] == []
|
||||||
@test plot(1, axis=nothing)[1][:yaxis][:ticks] == []
|
@test plot(1, axis=nothing)[1][:yaxis][:ticks] == []
|
||||||
end # testset
|
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
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using Plots, Test
|
||||||
|
|
||||||
|
const PLOTS_DEFAULTS = Dict(:theme => :wong2)
|
||||||
|
Plots.__init__()
|
||||||
|
|
||||||
|
@testset "Loading theme" begin
|
||||||
|
@test plot(1:5)[1][1][:seriescolor] == RGBA(colorant"black")
|
||||||
|
end
|
||||||
|
|
||||||
|
empty!(PLOTS_DEFAULTS)
|
||||||
|
Plots.__init__()
|
||||||
+84
-21
@@ -21,12 +21,12 @@ end
|
|||||||
@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" ""])
|
||||||
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 !haskey(series[1].options.dict, "forget plot")
|
||||||
@test haskey(series[2].options.dict, "forget plot")
|
@test haskey(series[2].options.dict, "forget plot")
|
||||||
@@ -91,8 +91,8 @@ end
|
|||||||
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")
|
||||||
@@ -106,7 +106,7 @@ end
|
|||||||
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,
|
||||||
@@ -231,7 +231,7 @@ end
|
|||||||
# TODO: support :semi
|
# TODO: support :semi
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Quiver" begin
|
@testset "Quiver" begin
|
||||||
x = (-2pi):0.2:(2 * pi)
|
x = (-2pi):0.2:(2*pi)
|
||||||
y = sin.(x)
|
y = sin.(x)
|
||||||
|
|
||||||
u = ones(length(x))
|
u = ones(length(x))
|
||||||
@@ -255,7 +255,7 @@ end
|
|||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
@test length(nodes) == 1
|
@test length(nodes) == 1
|
||||||
mktempdir() do path
|
mktempdir() do path
|
||||||
file_path =joinpath(path,"annotations.tex")
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test_nowarn savefig(pgfx_plot, file_path)
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
open(file_path) do io
|
open(file_path) do io
|
||||||
lines = readlines(io)
|
lines = readlines(io)
|
||||||
@@ -271,7 +271,7 @@ end
|
|||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
@test length(nodes) == 3
|
@test length(nodes) == 3
|
||||||
mktempdir() do path
|
mktempdir() do path
|
||||||
file_path =joinpath(path,"annotations.tex")
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test_nowarn savefig(pgfx_plot, file_path)
|
@test_nowarn savefig(pgfx_plot, file_path)
|
||||||
open(file_path) do io
|
open(file_path) do io
|
||||||
lines = readlines(io)
|
lines = readlines(io)
|
||||||
@@ -296,12 +296,17 @@ end
|
|||||||
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content)
|
||||||
@test length(nodes) == 9
|
@test length(nodes) == 9
|
||||||
mktempdir() do path
|
mktempdir() do path
|
||||||
file_path =joinpath(path,"annotations.tex")
|
file_path = joinpath(path, "annotations.tex")
|
||||||
@test_nowarn savefig(annotation_plot, file_path)
|
@test_nowarn savefig(annotation_plot, file_path)
|
||||||
open(file_path) do io
|
open(file_path) do io
|
||||||
lines = readlines(io)
|
lines = readlines(io)
|
||||||
@test count(s -> occursin("node", s), lines) == 9
|
@test count(s -> occursin("node", s), lines) == 9
|
||||||
end
|
end
|
||||||
|
# test .tikz extension
|
||||||
|
file_path = joinpath(path, "annotations.tikz")
|
||||||
|
@test_nowarn savefig(annotation_plot, file_path)
|
||||||
|
@test_nowarn open(file_path) do io
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end # testset
|
end # testset
|
||||||
@testset "Ribbon" begin
|
@testset "Ribbon" begin
|
||||||
@@ -314,16 +319,24 @@ end
|
|||||||
Plots._update_plot_object(ribbon_plot)
|
Plots._update_plot_object(ribbon_plot)
|
||||||
axis = Plots.pgfx_axes(ribbon_plot.o)[1]
|
axis = Plots.pgfx_axes(ribbon_plot.o)[1]
|
||||||
plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents)
|
plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents)
|
||||||
@test length(plots) == 4
|
@test length(plots) == 3
|
||||||
@test !haskey(plots[1].options.dict, "fill")
|
@test haskey(plots[1].options.dict, "fill")
|
||||||
@test !haskey(plots[2].options.dict, "fill")
|
@test haskey(plots[2].options.dict, "fill")
|
||||||
@test !haskey(plots[3].options.dict, "fill")
|
@test !haskey(plots[3].options.dict, "fill")
|
||||||
@test haskey(plots[4].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(
|
||||||
|
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
|
end # testset
|
||||||
end # testset
|
end # testset
|
||||||
|
|
||||||
@@ -334,15 +347,65 @@ end # testset
|
|||||||
@test pl[1].attr[:extra_kwargs][:test] == "me"
|
@test pl[1].attr[:extra_kwargs][:test] == "me"
|
||||||
pl = plot(1:5, test = "me", extra_kwargs = :plot)
|
pl = plot(1:5, test = "me", extra_kwargs = :plot)
|
||||||
@test pl.attr[:extra_plot_kwargs][:test] == "me"
|
@test pl.attr[:extra_plot_kwargs][:test] == "me"
|
||||||
pl = plot(1:5, extra_kwargs = Dict(:plot => Dict(:test => "me"), :series => Dict(:and => "me too")))
|
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.attr[:extra_plot_kwargs][:test] == "me"
|
||||||
@test pl[1][1].plotattributes[:extra_kwargs][:and] == "me too"
|
@test pl[1][1].plotattributes[:extra_kwargs][:and] == "me too"
|
||||||
pl = plot(
|
pl = plot(
|
||||||
plot(1:5, title="Line"),
|
plot(1:5, title = "Line"),
|
||||||
scatter(1:5, title="Scatter", extra_kwargs=Dict(:subplot=>Dict("axis line shift" => "10pt")))
|
scatter(
|
||||||
|
1:5,
|
||||||
|
title = "Scatter",
|
||||||
|
extra_kwargs = Dict(:subplot => Dict("axis line shift" => "10pt")),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
Plots._update_plot_object(pl)
|
Plots._update_plot_object(pl)
|
||||||
axes = Plots.pgfx_axes(pl.o)
|
axes = Plots.pgfx_axes(pl.o)
|
||||||
@test !haskey(axes[1].options.dict, "axis line shift")
|
@test !haskey(axes[1].options.dict, "axis line shift")
|
||||||
@test haskey(axes[2].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
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
using Plots, Test
|
||||||
|
@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
|
||||||
Reference in New Issue
Block a user