diff --git a/.JuliaFormatter.toml b/.JuliaFormatter.toml new file mode 100644 index 00000000..a580c42d --- /dev/null +++ b/.JuliaFormatter.toml @@ -0,0 +1,12 @@ +always_for_in = true +import_to_using = false +align_pair_arrow = true +align_assignment = true +align_conditional = true +always_use_return = false +conditional_to_if = false +whitespace_in_kwargs = true +remove_extra_newlines = true +whitespace_ops_in_indices = true +short_to_long_function_def = false +annotate_untyped_fields_with_any = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..cf87526d --- /dev/null +++ b/.gitattributes @@ -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 diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 4d25a266..236bcb9a 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -28,5 +28,5 @@ inspectdr | | | ### Versions Plots.jl version: -Backend version (`]st -m`): +Backend version (`]st -m `): Output of `versioninfo()`: diff --git a/.github/workflows/SnoopCompile.yml b/.github/workflows/SnoopCompile.yml index a58aaa74..814d19eb 100644 --- a/.github/workflows/SnoopCompile.yml +++ b/.github/workflows/SnoopCompile.yml @@ -21,11 +21,9 @@ jobs: fail-fast: false matrix: version: # NOTE: the versions below should match those in your botconfig - - '1.5' + - '1' os: # NOTE: should match the os setting of your botconfig - ubuntu-latest - - windows-latest - - macos-latest arch: - x64 steps: @@ -43,10 +41,10 @@ jobs: # TESTCMD - name: Default TESTCMD - run: echo ::set-env name=TESTCMD::"julia" + run: echo "TESTCMD=julia" >> $GITHUB_ENV - name: Ubuntu TESTCMD if: startsWith(matrix.os,'ubuntu') - run: echo ::set-env name=TESTCMD::"xvfb-run --auto-servernum julia" + run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV # Generate precompile files - name: Generating precompile files @@ -77,10 +75,12 @@ jobs: 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" + commit-message: Update precompile_*.jl file [skip ci] + title: "[AUTO] Update precompiles [skip ci]" + labels: | + SnoopCompile + no changelog + branch: "Test_SnoopCompile_AutoPR_${{ github.ref }}" Skip: diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml index d77d3a0c..778c06fe 100644 --- a/.github/workflows/TagBot.yml +++ b/.github/workflows/TagBot.yml @@ -1,9 +1,12 @@ name: TagBot on: - schedule: - - cron: 0 * * * * + issue_comment: + types: + - created + workflow_dispatch: jobs: TagBot: + if: github.event_name == 'workflow_dispatch' || github.actor == 'JuliaTagBot' runs-on: ubuntu-latest steps: - uses: JuliaRegistries/TagBot@v1 diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml new file mode 100644 index 00000000..4062fc8a --- /dev/null +++ b/.github/workflows/benchmark.yml @@ -0,0 +1,31 @@ +name: benchmarks + +on: + pull_request: + +jobs: + Benchmark: + if: "!contains(github.event.head_commit.message, '[skip ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@latest + with: + version: 1 + + # Setup + - name: Ubuntu TESTCMD + run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV + - name: Install Plots dependencies + uses: julia-actions/julia-buildpkg@latest + - name: Install Benchmarking dependencies + run: julia -e 'using Pkg; pkg"add PkgBenchmark BenchmarkCI@0.1"' + + - name: Run benchmarks + run: $TESTCMD -e 'using BenchmarkCI; BenchmarkCI.judge()' + - name: Print judgement + run: julia -e 'using BenchmarkCI; BenchmarkCI.displayjudgement()' + - name: Post results + run: julia -e 'using BenchmarkCI; BenchmarkCI.postjudge()' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d483a8d..f43d86f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[skip ci]')" env: GKS_ENCODING: "utf8" + GKSwstype: "100" name: Julia ${{ matrix.version }} - ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -59,10 +60,10 @@ jobs: # TESTCMD - name: Default TESTCMD - run: echo ::set-env name=TESTCMD::"julia" + run: echo "TESTCMD=julia" >> $GITHUB_ENV - name: Ubuntu TESTCMD if: startsWith(matrix.os,'ubuntu') - run: echo ::set-env name=TESTCMD::"xvfb-run --auto-servernum julia" + run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV # Julia Dependencies - name: Install Julia dependencies @@ -70,12 +71,16 @@ jobs: # Run tests - name: Run Graphical test - run: $TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true);' + run: | + $TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true)' + $TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("StatsPlots"); Pkg.test("StatsPlots")' + $TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("GraphRecipes"); Pkg.test("GraphRecipes")' - - name: Codecov - uses: julia-actions/julia-uploadcodecov@latest - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + # Codecov + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v1 + with: + file: lcov.info Skip: if: "contains(github.event.head_commit.message, '[skip ci]')" diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 00000000..e00ce3d6 --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,2 @@ +github_checks: + annotations: false diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..aba47de8 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,56 @@ +name: docs + +on: + push: + branches: + - master + tags: '*' + +jobs: + Build_docs: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + with: + repository: JuliaPlots/PlotDocs.jl + - uses: julia-actions/setup-julia@v1 + - name: Cache artifacts + uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - name: Install dependencies + run: | + sudo apt-get update -y + sudo apt-get install -y qt5-default \ + ttf-mscorefonts-installer \ + poppler-utils \ + pdf2svg \ + texlive-latex-base \ + texlive-binaries \ + texlive-pictures \ + texlive-latex-extra \ + texlive-luatex \ + ghostscript-x \ + libgconf2-4 \ + gnuplot + sudo fc-cache -vr + + - name: build documentation + env: + PYTHON: "" + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} + run: | + export JULIA_DEBUG=Documenter + export PLOTDOCS_ANSICOLOR=true + export GKSwstype=nul # Plots.jl/issues/3664 + xvfb-run julia --color=yes --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.add(PackageSpec(name="Plots", rev=split(ENV["GITHUB_REF"], "/", limit=3)[3])); Pkg.instantiate()' + # xvfb-run julia --color=yes --project=docs/ -e 'using Pkg; pkg"add Documenter#master"' + xvfb-run julia --color=yes --project=docs/ -e 'using Pkg; pkg"st -m"' + xvfb-run julia --color=yes --project=docs/ -e 'withenv("GITHUB_REPOSITORY" => "JuliaPlots/PlotDocs.jl") do; include("docs/make.jl"); end' diff --git a/.github/workflows/format.yml.disabled b/.github/workflows/format.yml.disabled new file mode 100644 index 00000000..9fae7be9 --- /dev/null +++ b/.github/workflows/format.yml.disabled @@ -0,0 +1,22 @@ +name: format + +on: + pull_request: + +jobs: + JuliaFormatter: + if: "!contains(github.event.head_commit.message, '[skip ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@latest + with: + version: 1 + + # Check format + - name: Install JuliaFormatter and format + run: | + git diff --name-only --exit-code + julia -e 'using Pkg; pkg"add JuliaFormatter CSTParser#master"' + julia -e 'using JuliaFormatter; [format(["src", "test"]) for _ in 1:2]' + git diff --exit-code diff --git a/.github/workflows/format_pr.yml b/.github/workflows/format_pr.yml new file mode 100644 index 00000000..b6044f31 --- /dev/null +++ b/.github/workflows/format_pr.yml @@ -0,0 +1,35 @@ +name: format-pr + +on: + schedule: + - cron: '0 0 * * SUN' + +jobs: + build: + if: "!contains(github.event.head_commit.message, '[skip ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install JuliaFormatter and format + run: | + julia -e 'import Pkg; pkg"add JuliaFormatter CSTParser#master"' + julia -e 'using JuliaFormatter; [format(["src", "test"]) for _ in 1:2]' + git diff --exit-code + + - name: Create Pull Request + if: ${{ failure() }} + id: cpr + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Format .jl files [skip ci]" + title: 'Automatic JuliaFormatter.jl run' + branch: auto-juliaformatter-pr + delete-branch: true + labels: formatting, automated pr, no changelog + + - name: Check outputs + if: ${{ failure() }} + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" diff --git a/.gitignore b/.gitignore index c653453c..48ae0045 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ deps/deps.jl Manifest.toml dev/ test/tmpplotsave.hdf5 +/.benchmarkci +/benchmark/*.json +.vscode/ diff --git a/.zenodo.json b/.zenodo.json new file mode 100644 index 00000000..029e9329 --- /dev/null +++ b/.zenodo.json @@ -0,0 +1,698 @@ +{ + "title": "Plots.jl", + "license": "MIT", + "creators": [ + { + "affiliation": "Elemental Cognition", + "name": "Tom Breloff" + } + ], + "contributors":[ + { + "affiliation": "TU Wien", + "name": "Daniel Schwabeneder", + "orcid": "0000-0002-0412-0777", + "type": "ProjectLeader" + }, + { + "affiliation": "GLOBE Institute, University of Copenhagen", + "name": "Michael Krabbe Borregaard", + "orcid": "0000-0002-8146-8435", + "type": "ProjectLeader" + }, + { + "affiliation": "Leibniz Universit\u00e4t Hannover", + "name": "Simon Christ", + "orcid": "0000-0002-5866-1472", + "type": "ProjectLeader" + }, + { + "affiliation": "Forschungszentrum J\u00fclich", + "name": "Josef Heinen", + "orcid": "0000-0001-6509-1925", + "type": "ProjectMember" + }, + { + "name": "Yuval", + "type": "Other" + }, + { + "name": "Andrew Palugniok", + "type": "ProjectMember" + }, + { + "affiliation": "@beacon-biosignals", + "name": "Simon Danisch", + "type": "Other" + }, + { + "affiliation": "Veos Digital (https://veos.digital/)", + "name": "Pietro Vertechi", + "type": "ProjectMember" + }, + { + "affiliation": "Korea Advanced Inst. of Science and Technology (KAIST)", + "name": "Zhanibek Omarov", + "type": "ProjectMember", + "orcid": "0000-0002-8783-8791" + }, + { + "name": "Thatcher Chamberlin", + "type": "Other" + }, + { + "name": "@ma-laforge", + "type": "ProjectMember" + }, + { + "affiliation": "Massachusetts Institute of Technology", + "name": "Christopher Rackauckas", + "orcid": "0000-0001-5850-0663", + "type": "Other" + }, + { + "affiliation": "Max Planck Institute for Physics", + "name": "Oliver Schulz", + "type": "Other" + }, + { + "affiliation": "@JuliaComputing", + "name": "Sebastian Pfitzner", + "type": "Other" + }, + { + "name": "Takafumi Arakaki", + "type": "Other" + }, + { + "affiliation": "University of Manitoba", + "name": "Amin Yahyaabadi", + "type": "Other" + }, + { + "name": "Jack Devine", + "type": "Other" + }, + { + "name": "Sebastian Pech", + "type": "Other" + }, + { + "affiliation": "@JuliaComputing", + "name": "Patrick Kofod Mogensen", + "type": "Other", + "orcid": "0000-0002-4910-1932" + }, + { + "name": "Samuel S. Watson", + "type": "Other" + }, + { + "affiliation": "UC Davis", + "name": "Naoki Saito", + "orcid": "0000-0001-5234-4719", + "type": "Other" + }, + { + "affiliation": "University of Southern California (USC)", + "name": "Benoit Pasquier", + "orcid": "0000-0002-3838-5976", + "type": "Other" + }, + { + "affiliation": "NTNU Trondheim", + "name": "Ronny Bergmann", + "orcid": "0000-0001-8342-7218", + "type": "Other" + }, + { + "name": "Andy Nowacki", + "affiliation": "University of Leeds", + "orcid": "0000-0001-7669-7383", + "type": "Other" + }, + { + "name": "Ian Butterworth", + "type": "Other" + }, + { + "affiliation": "Lund University", + "name": "David Gustavsson", + "type": "Other" + }, + { + "name": "Anshul Singhvi", + "type": "Other" + }, + { + "name": "david-macmahon", + "type": "Other" + }, + { + "name": "Fredrik Ekre", + "type": "Other" + }, + { + "name": "Maaz Bin Tahir Saeed", + "type": "Other" + }, + { + "name": "Kristoffer Carlsson", + "type": "Other" + }, + { + "name": "Will Kearney", + "type": "Other" + }, + { + "name": "Niklas Korsbo", + "type": "Other" + }, + { + "name": "Miles Lucas", + "type": "Other" + }, + { + "name": "@Godisemo", + "type": "Other" + }, + { + "name": "Florian Oswald", + "type": "Other" + }, + { + "name": "Diego Javier Zea", + "type": "Other" + }, + { + "name": "@WillRam", + "type": "Other" + }, + { + "name": "Fedor Bezrukov", + "type": "Other" + }, + { + "name": "Spencer Lyon", + "type": "Other" + }, + { + "name": "Darwin Darakananda", + "type": "Other" + }, + { + "name": "Lukas Hauertmann", + "type": "Other" + }, + { + "name": "Huckleberry Febbo", + "type": "Other" + }, + { + "name": "@H-M-H", + "type": "Other" + }, + { + "name": "Josh Day", + "type": "Other" + }, + { + "name": "@wfgra", + "type": "Other" + }, + { + "name": "Sheehan Olver", + "type": "Other" + }, + { + "name": "Jerry Ling", + "type": "Other" + }, + { + "name": "Jks Liu", + "type": "Other" + }, + { + "name": "Seth Axen", + "type": "Other" + }, + { + "name": "@o01eg", + "type": "Other" + }, + { + "name": "Sebastian Micluța-Câmpeanu", + "type": "Other" + }, + { + "name": "Tim Holy", + "type": "Other" + }, + { + "name": "Tony Kelman", + "type": "Other" + }, + { + "name": "Antoine Levitt", + "type": "Other" + }, + { + "name": "Iblis Lin", + "type": "Other" + }, + { + "name": "Harry Scholes", + "type": "Other" + }, + { + "name": "@djsegal", + "type": "Other" + }, + { + "name": "Goran Nakerst", + "type": "Other" + }, + { + "name": "Felix Hagemann", + "type": "Other" + }, + { + "name": "Matthieu Gomez", + "type": "Other" + }, + { + "name": "@biggsbiggsby", + "type": "Other" + }, + { + "name": "Jonathan Anderson", + "type": "Other" + }, + { + "name": "Michael Kraus", + "type": "Other" + }, + { + "name": "Carlo Lucibello", + "type": "Other" + }, + { + "name": "Robin Deits", + "type": "Other" + }, + { + "name": "Misha Mkhasenko", + "type": "Other" + }, + { + "name": "Benoît Legat", + "type": "Other" + }, + { + "name": "Steven G. Johnson", + "type": "Other" + }, + { + "name": "John Verzani", + "type": "Other" + }, + { + "name": "Mattias Fält", + "type": "Other" + }, + { + "name": "Rashika Karki", + "type": "Other" + }, + { + "name": "Morten Piibeleht", + "type": "Other" + }, + { + "name": "Filippo Vicentini", + "type": "Other" + }, + { + "name": "David Anthoff", + "type": "Other" + }, + { + "name": "Leon Wabeke", + "type": "Other" + }, + { + "name": "Yusuke Kominami", + "type": "Other" + }, + { + "name": "Oscar Dowson", + "type": "Other" + }, + { + "name": "Max G", + "type": "Other" + }, + { + "name": "Fabian Greimel", + "type": "Other" + }, + { + "name": "Jérémy", + "type": "Other" + }, + { + "name": "Pearl Li", + "type": "Other" + }, + { + "name": "David P. Sanders", + "type": "Other" + }, + { + "name": "Asbjørn Nilsen Riseth", + "type": "Other" + }, + { + "name": "Jan Weidner", + "type": "Other" + }, + { + "name": "@jakkor2", + "type": "Other" + }, + { + "name": "Pablo Zubieta", + "type": "Other" + }, + { + "name": "Hamza Yusuf Çakır", + "type": "Other" + }, + { + "name": "John Rinehart", + "type": "Other" + }, + { + "name": "Martin Biel", + "type": "Other" + }, + { + "name": "Moritz Schauer", + "type": "Other" + }, + { + "name": "Moesè Giodano", + "type": "Other" + }, + { + "name": "@olegshtch", + "type": "Other" + }, + { + "name": "Leon Shen", + "type": "Other" + }, + { + "name": "Jeff Fessler", + "type": "Other" + }, + { + "name": "@hustf", + "type": "Other" + }, + { + "name": "Asim H Dar", + "type": "Other" + }, + { + "name": "@8uurg", + "type": "Other" + }, + { + "name": "Abel Siqueira", + "type": "Other" + }, + { + "name": "Adrian Dawid", + "type": "Other" + }, + { + "name": "Alberto Lusiani", + "type": "Other" + }, + { + "name": "Balázs Mezei", + "type": "Other" + }, + { + "name": "Ben Ide", + "type": "Other" + }, + { + "name": "Benjamin Lungwitz", + "type": "Other" + }, + { + "affiliation": "University of Graz", + "name": "Bernd Riederer", + "type": "Other", + "orcid": "0000-0001-8390-0087" + }, + { + "name": "Christina Lee", + "type": "Other" + }, + { + "name": "Christof Stocker", + "type": "Other" + }, + { + "name": "Christoph Finkensiep", + "type": "Other" + }, + { + "name": "@Cornelius-G", + "type": "Other" + }, + { + "name": "Daniel Høegh", + "type": "Other" + }, + { + "name": "Denny Biasiolli", + "type": "Other" + }, + { + "name": "Dieter Castel", + "type": "Other" + }, + { + "name": "Elliot Saba", + "type": "Other" + }, + { + "name": "Fengyang Wang", + "type": "Other" + }, + { + "name": "Fons van der Plas", + "type": "Other" + }, + { + "name": "Fredrik Bagge Carlson", + "type": "Other" + }, + { + "name": "Graham Smith", + "type": "Other" + }, + { + "name": "Hayato Ikoma", + "type": "Other" + }, + { + "name": "Hessam Mehr", + "type": "Other" + }, + { + "name": "@InfiniteChai", + "type": "Other" + }, + { + "name": "Jack Dunn", + "type": "Other" + }, + { + "name": "Jeff Bezanson", + "type": "Other" + }, + { + "name": "Jeff Eldredge", + "type": "Other" + }, + { + "name": "Jinay Jain", + "type": "Other" + }, + { + "name": "Johan Blåbäck", + "type": "Other" + }, + { + "name": "@jmert", + "type": "Other" + }, + { + "name": "Lakshya Khatri", + "type": "Other" + }, + { + "name": "Lia Siegelmann", + "type": "Other" + }, + { + "name": "@marekkukan-tw", + "type": "Other" + }, + { + "affiliation": "ETH Zurich", + "name": "Mauro Werder", + "type": "Other", + "orcid": "0000-0003-0137-9377" + }, + { + "name": "Maxim Grechkin", + "type": "Other" + }, + { + "name": "Michael Cawte", + "type": "Other" + }, + { + "name": "@milesfrain", + "type": "Other" + }, + { + "name": "Nicholas Bauer", + "type": "Other" + }, + { + "name": "Nicolau Leal Werneck", + "type": "Other" + }, + { + "name": "@nilshg", + "type": "Other" + }, + { + "name": "Oliver Evans", + "type": "Other" + }, + { + "name": "Peter Gagarinov", + "type": "Other" + }, + { + "name": "Páll Haraldsson", + "type": "Other" + }, + { + "name": "Rik Huijzer", + "type": "Other" + }, + { + "name": "Romain Franconville", + "type": "Other" + }, + { + "name": "Ronan Pigott", + "type": "Other" + }, + { + "name": "Roshan Shariff", + "type": "Other" + }, + { + "name": "Scott Thomas", + "type": "Other" + }, + { + "name": "Sebastian Rollén", + "type": "Other" + }, + { + "name": "Seth Bromberger", + "type": "Other" + }, + { + "name": "Siva Swaminathan", + "type": "Other" + }, + { + "name": "Tim DuBois", + "type": "Other" + }, + { + "name": "Travis DePrato", + "type": "Other" + }, + { + "name": "Will Thompson", + "type": "Other" + }, + { + "name": "Yakir Luc Gagnon", + "type": "Other" + }, + { + "name": "Benjamin Chislett", + "type": "Other" + }, + { + "name": "@hhaensel", + "type": "Other" + }, + { + "name": "@improbable22", + "type": "Other" + }, + { + "name": "Johannes Fleck", + "type": "Other" + }, + { + "name": "Peter Czaban", + "type": "Other" + }, + { + "name": "@innerlee", + "type": "Other" + }, + { + "name": "Mats Cronqvist", + "type": "Other" + }, + { + "name": "Shi Pengcheng", + "type": "Other" + }, + { + "name": "@wg030", + "type": "Other" + }, + { + "affiliation": "University of Cambridge", + "name": "Will Tebbutt", + "type": "Other" + }, + { + "name": "@t-bltg", + "type": "Other" + }, + { + "name": "Fred Callaway", + "type": "Other" + } + ], + "upload_type": "software" +} diff --git a/Project.toml b/Project.toml index 4c5b9871..a5d70c8f 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Plots" uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" author = ["Tom Breloff (@tbreloff)"] -version = "1.7.3" +version = "1.20.1" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -11,7 +11,6 @@ FFMPEG = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -37,23 +36,22 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" Contour = "0.5" FFMPEG = "0.2, 0.3, 0.4" FixedPointNumbers = "0.6, 0.7, 0.8" -GR = "0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52" -GeometryBasics = "0.2, 0.3.1" -GeometryTypes = "0.7, 0.8" +GR = "0.53, 0.54, 0.55, 0.57, 0.58" +GeometryBasics = "0.2, 0.3.1, 0.4" JSON = "0.21, 1" -Latexify = "0.14" +Latexify = "0.14, 0.15" Measures = "0.3" NaNMath = "0.3" -PGFPlotsX = "1.2.0" PlotThemes = "2" PlotUtils = "1" RecipesBase = "1" -RecipesPipeline = "0.1.13" -Reexport = "0.2" +RecipesPipeline = "0.3" +Reexport = "0.2, 1.0" Requires = "1" Scratch = "1" -Showoff = "0.3.1" +Showoff = "0.3.1, 1.0" StatsBase = "0.32, 0.33" +UnicodePlots = "2" julia = "1.5" [extras] @@ -66,13 +64,15 @@ Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" +PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +TestImages = "5e47fb64-e119-507b-a336-dd2b206d9990" UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" [targets] -test = ["Distributions", "FileIO", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "HDF5", "RDatasets", "StableRNGs", "StaticArrays", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] +test = ["Distributions", "FileIO", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "PlotlyJS", "HDF5", "RDatasets", "StableRNGs", "StaticArrays", "StatsPlots", "Test", "TestImages", "UnicodePlots", "VisualRegressionTests"] diff --git a/README.md b/README.md index 17fcdd99..a097683e 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ [![][docs-img]][docs-url] [![Codecov](https://codecov.io/gh/JuliaPlots/Plots.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/JuliaPlots/Plots.jl) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4725317.svg)](https://doi.org/10.5281/zenodo.4725317) +This is the DOI for all Versions, please follow the link to get the DOI for a specific version. + + #### Created by Tom Breloff (@tbreloff) #### Maintained by the [JuliaPlots members](https://github.com/orgs/JuliaPlots/people) diff --git a/benchmark/Project.toml b/benchmark/Project.toml new file mode 100644 index 00000000..d0c35ad5 --- /dev/null +++ b/benchmark/Project.toml @@ -0,0 +1,5 @@ +[deps] +BenchmarkCI = "20533458-34a3-403d-a444-e18f38190b5b" +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" diff --git a/benchmark/benchmarks.jl b/benchmark/benchmarks.jl new file mode 100644 index 00000000..ae1d09de --- /dev/null +++ b/benchmark/benchmarks.jl @@ -0,0 +1,10 @@ +using BenchmarkTools +using Plots + +const SUITE = BenchmarkGroup() +julia_cmd = split(get(ENV, "TESTCMD", Base.JLOptions().julia_bin)) + +SUITE["load_plot_display"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots; display(plot(1:0.1:10, sin.(1:0.1:10)))'`) +SUITE["load"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots'`) +SUITE["plot"] = @benchmarkable p = plot(1:0.1:10, sin.(1:0.1:10)) samples=1 evals=1 +SUITE["display"] = @benchmarkable display(p) setup=(p = plot(1:0.1:10, sin.(1:0.1:10))) samples=1 evals=1 diff --git a/deps/SnoopCompile/precompile/apple/1.3/precompile_Plots.jl b/deps/SnoopCompile/precompile/apple/1.3/precompile_Plots.jl deleted file mode 100644 index 3bf3eff9..00000000 --- a/deps/SnoopCompile/precompile/apple/1.3/precompile_Plots.jl +++ /dev/null @@ -1,344 +0,0 @@ -function _precompile_() - ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - 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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :blank),Tuple{Symbol,Bool}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :width, :height),Tuple{Symbol,Symbol,Measures.Length{:pct,Float64}}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.GRBackend}}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.PlotlyBackend}}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base._compute_eltype),Type{Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String,Symbol}}}) - Base.precompile(Tuple{typeof(Base._compute_eltype),Type{Tuple{Tuple{Int64,Float64,Plots.PlotText},Bool}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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.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},Int64}) - Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Float64}) - 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.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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:hline}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(push!),Segments{Float64},Float64,Float64,Float64,Float64,Vararg{Float64,N} where N}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Symbol,Any},Plots.GridLayout,Symbol}) - Base.precompile(Tuple{typeof(text),String,Int64,Symbol,Vararg{Symbol,N} where N}) - Base.precompile(Tuple{typeof(text),String,Symbol}) - Base.precompile(Tuple{typeof(title!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - isdefined(Plots, Symbol("##GridLayout#149")) && Base.precompile(Tuple{getfield(Plots, Symbol("##GridLayout#149")),Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N}) - isdefined(Plots, Symbol("##gr_polyline#343")) && Base.precompile(Tuple{getfield(Plots, Symbol("##gr_polyline#343")),Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1}}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N}) -end diff --git a/deps/SnoopCompile/precompile/apple/1.4/precompile_Plots.jl b/deps/SnoopCompile/precompile/apple/1.4/precompile_Plots.jl deleted file mode 100644 index bf977ad5..00000000 --- a/deps/SnoopCompile/precompile/apple/1.4/precompile_Plots.jl +++ /dev/null @@ -1,622 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.GRBackend},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},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{(: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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},Array{Float64,1},Vararg{Any,N} where N}) - 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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.copyto_nonleaf!),Array{Symbol,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_linestyle),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - Base.precompile(Tuple{typeof(Base.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(Plots.label_to_string),Tuple{Base.RefValue{Symbol},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.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - 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.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots.build_layout),Plots.GridLayout,Int64}) - Base.precompile(Tuple{typeof(Plots.convertLegendValue),Symbol}) - 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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_markers),Plots.Series,Array{Float64,1},Array{Float64,1},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,Array{Int64,1},Array{Int64,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,Array{Float64,1},Array{Float64,1},Nothing,Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Array{Int64,1},Array{Float64,1},Nothing,Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Base.OneTo{Int64},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,Base.OneTo{Int64},UnitRange{Int64},Tuple{Array{Float64,1},Array{Float64,1}},Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},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{Any,1}}}) - 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),Plots.Subplot{Plots.GRBackend},Symbol,Tuple{Array{Int64,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_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_polyline3d),Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_update_viewport_legend!),Array{Float64,1},Plots.Subplot{Plots.GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor),NTuple{9,Float64}}}) - Base.precompile(Tuple{typeof(Plots.gr_update_viewport_legend!),Array{Float64,1},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}}}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,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,String}) - 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},Int64}) - 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},Float64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesPipeline.postprocess_axis_args!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - Base.precompile(Tuple{typeof(backend),Plots.PlotlyBackend}) - Base.precompile(Tuple{typeof(bar),Array{Float64,1}}) - 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(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_fillalpha),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(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(frame),Animation,Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},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),Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Array{Int64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(push!),Segments{Float64},Float64,Int64,Int64,Float64,Vararg{Float64,N} where N}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - let fbody = try __lookup_kwbody__(which(Plots.GridLayout, (Int64,Vararg{Int64,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:ylims, :leg),Tuple{Tuple{Int64,Int64},Bool}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/precompile/apple/1.5/precompile_Plots.jl b/deps/SnoopCompile/precompile/apple/1.5/precompile_Plots.jl deleted file mode 100644 index d0231615..00000000 --- a/deps/SnoopCompile/precompile/apple/1.5/precompile_Plots.jl +++ /dev/null @@ -1,590 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.heatmap)),NamedTuple{(:projection,),Tuple{Symbol}},typeof(heatmap),Array{Int64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - 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.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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - 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,2},Base.Generator{Array{AbstractLayout,2},typeof(Plots._update_min_padding!)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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.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},Vararg{Array{Float64,1},N} where N}) - 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),OHLC{Float64},Int64,Float64}) - 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}},Function}) - 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},Int64,Int64}) - 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_polyline),Array{Float64,1},Array{Float64,1},Function}) - 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.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,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.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},Int64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:yerror}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:zerror}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:spy}},Base.OneTo{Int64},Base.OneTo{Int64},Surface{SparseArrays.SparseMatrixCSC{Float64,Int64}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Base.OneTo{Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Base.OneTo{Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},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),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},UnitRange{Int64}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Any,Any},Plots.Plot{Plots.GRBackend},Int64}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(similar),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_fillalpha),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Type{Nothing}}) - Base.precompile(Tuple{typeof(spy),SparseArrays.SparseMatrixCSC{Float64,Int64}}) - 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!),String}) - 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!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/precompile/linux/1.3/precompile_Plots.jl b/deps/SnoopCompile/precompile/linux/1.3/precompile_Plots.jl deleted file mode 100644 index 672ae6b7..00000000 --- a/deps/SnoopCompile/precompile/linux/1.3/precompile_Plots.jl +++ /dev/null @@ -1,340 +0,0 @@ -function _precompile_() - ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - 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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :blank),Tuple{Symbol,Bool}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :width, :height),Tuple{Symbol,Symbol,Measures.Length{:pct,Float64}}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.GRBackend}}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.PlotlyBackend}}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._cbar_unique),Array{Int64,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),ColorPalette,Int64}) - Base.precompile(Tuple{typeof(Plots._cycle),StepRange{Int64,Int64},Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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.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},Int64}) - Base.precompile(Tuple{typeof(Plots.processMarkerArg),Dict{Symbol,Any},Float64}) - 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.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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - isdefined(Plots, Symbol("##GridLayout#149")) && Base.precompile(Tuple{getfield(Plots, Symbol("##GridLayout#149")),Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N}) - isdefined(Plots, Symbol("##gr_polyline#343")) && Base.precompile(Tuple{getfield(Plots, Symbol("##gr_polyline#343")),Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1}}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N}) -end diff --git a/deps/SnoopCompile/precompile/linux/1.4/precompile_Plots.jl b/deps/SnoopCompile/precompile/linux/1.4/precompile_Plots.jl deleted file mode 100644 index 64f60c8c..00000000 --- a/deps/SnoopCompile/precompile/linux/1.4/precompile_Plots.jl +++ /dev/null @@ -1,580 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},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{(: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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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,Int64}) - 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},Int64}) - 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},Float64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},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),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - let fbody = try __lookup_kwbody__(which(Plots.GridLayout, (Int64,Vararg{Int64,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl b/deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl deleted file mode 100644 index 32e6a2d3..00000000 --- a/deps/SnoopCompile/precompile/linux/1.5/precompile_Plots.jl +++ /dev/null @@ -1,581 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - 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{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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.build_layout),Plots.GridLayout,Int64}) - Base.precompile(Tuple{typeof(Plots.convertLegendValue),Symbol}) - 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},Vararg{Array{Float64,1},N} where N}) - 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),OHLC{Float64},Int64,Float64}) - 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_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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_set_gradient),PlotUtils.ContinuousColorGradient}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.intersection_point),Float64,Float64,Float64,Float64,Float64,Float64}) - Base.precompile(Tuple{typeof(Plots.is_marker_supported),Shape}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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.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},Int64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:scatter}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:yerror}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:zerror}},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesPipeline.postprocess_axis_args!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.postprocess_axis_args!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},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),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - isdefined(Plots, Symbol("#150#151")) && Base.precompile(Tuple{getfield(Plots, Symbol("#150#151")),Tuple{Int64,Expr}}) - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/precompile/precompile_Plots.jl b/deps/SnoopCompile/precompile/precompile_Plots.jl new file mode 100644 index 00000000..fa83b87c --- /dev/null +++ b/deps/SnoopCompile/precompile/precompile_Plots.jl @@ -0,0 +1,392 @@ +# Use +# @warnpcfail precompile(args...) +# if you want to be warned when a precompile directive fails +macro warnpcfail(ex::Expr) + modl = __module__ + file = __source__.file === nothing ? "?" : String(__source__.file) + line = __source__.line + quote + $(esc(ex)) || @warn """precompile directive + $($(Expr(:quote, ex))) + failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line + end +end + + +const __bodyfunction__ = Dict{Method,Any}() + +# Find keyword "body functions" (the function that contains the body +# as written by the developer, called after all missing keyword-arguments +# have been assigned values), in a manner that doesn't depend on +# gensymmed names. +# `mnokw` is the method that gets called when you invoke it without +# supplying any keywords. +function __lookup_kwbody__(mnokw::Method) + function getsym(arg) + isa(arg, Symbol) && return arg + @assert isa(arg, GlobalRef) + return arg.name + end + + f = get(__bodyfunction__, mnokw, nothing) + if f === nothing + fmod = mnokw.module + # The lowered code for `mnokw` should look like + # %1 = mkw(kwvalues..., #self#, args...) + # return %1 + # where `mkw` is the name of the "active" keyword body-function. + ast = Base.uncompressed_ast(mnokw) + if isa(ast, Core.CodeInfo) && length(ast.code) >= 2 + callexpr = ast.code[end-1] + if isa(callexpr, Expr) && callexpr.head == :call + fsym = callexpr.args[1] + if isa(fsym, Symbol) + f = getfield(fmod, fsym) + elseif isa(fsym, GlobalRef) + if fsym.mod === Core && fsym.name === :_apply + f = getfield(mnokw.module, getsym(callexpr.args[2])) + elseif fsym.mod === Core && fsym.name === :_apply_iterate + f = getfield(mnokw.module, getsym(callexpr.args[3])) + else + f = getfield(fsym.mod, fsym.name) + end + else + f = missing + end + else + f = missing + end + else + f = missing + end + __bodyfunction__[mnokw] = f + end + return f +end + +function _precompile_() + ccall(:jl_generating_output, Cint, ()) == 1 || return nothing + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:label, :blank), Tuple{Symbol, Bool}},Type{EmptyLayout}}) + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:label, :width, :height), Tuple{Symbol, Symbol, Length{:pct, Float64}}},Type{EmptyLayout}}) + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},GRBackend}) + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},PlotlyBackend}) + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{GRBackend}}},Type{Subplot},GRBackend}) + Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{PlotlyBackend}}},Type{Subplot},PlotlyBackend}) + Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64}) + Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Tuple{Int64, Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol}) + Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :flip, :minorgrid, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Float64, Float64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Float64, Float64}, Bool}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :guide), Tuple{Bool, Bool, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :mirror, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid,), Tuple{Bool}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:gridlinewidth, :grid, :gridalpha, :gridstyle, :foreground_color_grid), Tuple{Int64, Bool, Float64, Symbol, RGBA{Float64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guidefonthalign, :guide_position, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, StepRange{Int64, Int64}, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid, :scale, :guide), Tuple{Bool, Symbol, String}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:rotation,), Tuple{Int64}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{UnitRange{Int64}}},typeof(attr!),Axis}) + Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:shape,), Tuple{Symbol}},typeof(default)}) + Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)}) + Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :halign, :valign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)}) + Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :valign, :halign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)}) + Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(hline!)),Any,typeof(hline!),Any}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{GridLayout, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{:π}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:xgrid,), Tuple{Tuple{Symbol, Symbol, Int64, Symbol, Float64}}},typeof(plot!),Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!)}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:annotations, :leg), Tuple{Tuple{Int64, Float64, PlotText}, Bool}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:arrow,), Tuple{Int64}},typeof(plot),Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:aspect_ratio, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{String},Vector{String},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector{T} where T}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Function}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{GridLayout, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :margin), Tuple{GridLayout, AbsoluteLength}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{GridLayout, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{GridLayout, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{GridLayout, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector{T} where T},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},UnitRange{Int64},Matrix{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Int64}},typeof(plot),UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64}, LinRange{Float64}}}},typeof(plot),UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}}) + Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}}) + Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any, N} where N}) + Base.precompile(Tuple{Core.kwftype(typeof(scatter!)),Any,typeof(scatter!),Any}) + Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol}) + Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol}) + Base.precompile(Tuple{Type{GridLayout},Int64,Vararg{Int64, N} where N}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barbins}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:steppre}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any}) + Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}}) + Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict}) + Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict}) + Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}}) + Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}}) + Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict}) + Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plot{GRBackend},Dict{Symbol, Any},Symbol}) + Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}}) + Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}}) + Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plot{GRBackend},DefaultsDict,Symbol,Any}) + Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plot{GRBackend},Dict{Symbol, Any},Symbol,Any}) + Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plot{PlotlyBackend},DefaultsDict,Symbol,Any}) + Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plot{PlotlyBackend},Dict{Symbol, Any},Symbol,Any}) + Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + Base.precompile(Tuple{typeof(_cbar_unique),Vector{Int64},String}) + Base.precompile(Tuple{typeof(_cbar_unique),Vector{Nothing},String}) + Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String}) + Base.precompile(Tuple{typeof(_cbar_unique),Vector{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}},String}) + Base.precompile(Tuple{typeof(_cbar_unique),Vector{Symbol},String}) + Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}}) + Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool}) + Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool}) + Base.precompile(Tuple{typeof(_heatmap_edges),Vector{Float64},Bool,Bool}) + Base.precompile(Tuple{typeof(_plot!),Plot,Any,Any}) + Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}}) + Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}}) + Base.precompile(Tuple{typeof(_slice_series_args!),DefaultsDict,Plot{GRBackend},Subplot{GRBackend},Int64}) + Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout}) + Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool}) + Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool}) + Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}}) + Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}}) + Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool}) + Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool}) + Base.precompile(Tuple{typeof(backend),PlotlyBackend}) + Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength}) + Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64}) + Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}}) + Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64},Tuple{Int64, Float64}}) + Base.precompile(Tuple{typeof(create_grid),Expr}) + Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}, N} where N}) + Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}}) + Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}}) + Base.precompile(Tuple{typeof(fakedata),Int64,Int64}) + Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}}) + Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}}) + Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol}) + Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}}) + Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}}) + Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}}) + Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}}) + Base.precompile(Tuple{typeof(gr_draw_colorbar),GRColorbar,Subplot{GRBackend},Tuple{Float64, Float64},Vector{Float64}}) + Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol}) + Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol}) + Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol}) + Base.precompile(Tuple{typeof(gr_draw_markers),Series,Base.OneTo{Int64},Vector{Float64},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_markers),Series,Vector{Int64},Vector{Int64},Tuple{Float64, Float64},Int64,Int64}) + Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_shapes),Series,Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}}) + Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}}) + Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64}) + Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Int64}, Vector{String}},Int64}) + Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}}) + Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}}) + Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}}) + Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient}) + Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}}) + Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}}) + Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}}) + Base.precompile(Tuple{typeof(heatmap_edges),Base.OneTo{Int64},Symbol}) + Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Symbol,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Symbol,Tuple{Int64, Int64},Bool}) + Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Symbol}) + Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol}) + Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol,UnitRange{Int64},Symbol,Tuple{Int64, Int64},Bool}) + Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol,Vector{Float64},Symbol,Tuple{Int64, Int64},Bool}) + Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol}) + Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}}) + Base.precompile(Tuple{typeof(make_fillrange_side),UnitRange{Int64},LinRange{Float64}}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol}) + Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol}) + Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64}) + Base.precompile(Tuple{typeof(plot),Any,Any}) + Base.precompile(Tuple{typeof(plot),Any}) + Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N}) + Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}}) + Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N}) + Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}}) + Base.precompile(Tuple{typeof(processGridArg!),Dict{Symbol, Any},Symbol,Symbol}) + Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}}) + Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Symbol}) + Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}}) + Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}}) + Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}}) + Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Symbol}) + Base.precompile(Tuple{typeof(processMinorGridArg!),Dict{Symbol, Any},Bool,Symbol}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}}) + Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}}) + Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol}) + Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol}) + Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}}) + Base.precompile(Tuple{typeof(resetfontsizes)}) + Base.precompile(Tuple{typeof(scalefontsizes),Float64}) + Base.precompile(Tuple{typeof(series_annotations),Vector{Any}}) + Base.precompile(Tuple{typeof(slice_arg),Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}},Int64}) + Base.precompile(Tuple{typeof(spy),Any}) + Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64}) + Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(title!),AbstractString}) + Base.precompile(Tuple{typeof(unzip),Vector{GeometryBasics.Point2{Float64}}}) + Base.precompile(Tuple{typeof(vline!),Any}) + Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any, N} where N}) + Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}}) + isdefined(Plots, Symbol("#add_major_or_minor_segments#126")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#126")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool}) + isdefined(Plots, Symbol("#add_major_or_minor_segments#127")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#127")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool}) + let fbody = try __lookup_kwbody__(which(font, (Font,Vararg{Any, N} where N,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}},typeof(font),Font,Vararg{Any, N} where N,)) + end + end + let fbody = try __lookup_kwbody__(which(plot!, (Any,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Any,typeof(plot!),Any,)) + end + end + let fbody = try __lookup_kwbody__(which(plot!, (Any,Vararg{Any, N} where N,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Any,typeof(plot!),Any,Vararg{Any, N} where N,)) + end + end + let fbody = try __lookup_kwbody__(which(plot, (Any,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Any,typeof(plot),Any,)) + end + end + let fbody = try __lookup_kwbody__(which(plot, (Any,Vararg{Any, N} where N,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Any,typeof(plot),Any,Vararg{Any, N} where N,)) + end + end + let fbody = try __lookup_kwbody__(which(title!, (AbstractString,))) catch missing end + if !ismissing(fbody) + precompile(fbody, (Any,typeof(title!),AbstractString,)) + end + end +end diff --git a/deps/SnoopCompile/precompile/windows/1.3/precompile_Plots.jl b/deps/SnoopCompile/precompile/windows/1.3/precompile_Plots.jl deleted file mode 100644 index 5dea3fdb..00000000 --- a/deps/SnoopCompile/precompile/windows/1.3/precompile_Plots.jl +++ /dev/null @@ -1,345 +0,0 @@ -function _precompile_() - ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - 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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :blank),Tuple{Symbol,Bool}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:label, :width, :height),Tuple{Symbol,Symbol,Measures.Length{:pct,Float64}}},Type{Plots.EmptyLayout}}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.GridLayout}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.GRBackend}}},Type{Plots.Subplot},Plots.GRBackend}) - Base.precompile(Tuple{Core.var"#kw#Type",NamedTuple{(:parent,),Tuple{Plots.Subplot{Plots.PlotlyBackend}}},Type{Plots.Subplot},Plots.PlotlyBackend}) - Base.precompile(Tuple{Type{Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Axes,F,Args} where Args<:Tuple where F where Axes},typeof(Plots.get_linestyle),Tuple{Array{Any,1}}}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots.build_layout),Plots.GridLayout,Int64}) - Base.precompile(Tuple{typeof(Plots.convertLegendValue),Symbol}) - 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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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.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},Int64}) - 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.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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(iter_segments),StepRange{Int64,Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Any,Plots.Subplot},Plots.Subplot{Plots.GRBackend},Symbol}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(text),String,Int64,Symbol,Vararg{Symbol,N} where N}) - Base.precompile(Tuple{typeof(text),String,Symbol}) - Base.precompile(Tuple{typeof(title!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - isdefined(Plots, Symbol("##GridLayout#149")) && Base.precompile(Tuple{getfield(Plots, Symbol("##GridLayout#149")),Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N}) - isdefined(Plots, Symbol("##gr_polyline#343")) && Base.precompile(Tuple{getfield(Plots, Symbol("##gr_polyline#343")),Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!)}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2}}) - isdefined(Plots, Symbol("##plot!#134")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot!#134")),Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1}}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - isdefined(Plots, Symbol("##plot#130")) && Base.precompile(Tuple{getfield(Plots, Symbol("##plot#130")),Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N}) -end diff --git a/deps/SnoopCompile/precompile/windows/1.4/precompile_Plots.jl b/deps/SnoopCompile/precompile/windows/1.4/precompile_Plots.jl deleted file mode 100644 index 5095dcef..00000000 --- a/deps/SnoopCompile/precompile/windows/1.4/precompile_Plots.jl +++ /dev/null @@ -1,621 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},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{(: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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},Array{Float64,1},Vararg{Any,N} where N}) - 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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.test_examples)),NamedTuple{(:skip,),Tuple{Array{Int64,1}}},typeof(test_examples),Symbol}) - Base.precompile(Tuple{Type{Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Axes,F,Args} where Args<:Tuple where F where Axes},typeof(Plots.get_linealpha),Tuple{Array{Any,1}}}) - Base.precompile(Tuple{Type{Shape},Array{Tuple{Float64,Float64},1}}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{Nothing,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_fillalpha),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - Base.precompile(Tuple{typeof(Base.Broadcast.copyto_nonleaf!),Array{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_linecolor),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.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.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.rightpad)}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - 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.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Int64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_periphery),Plots.Subplot{Plots.GRBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots._update_subplot_periphery),Plots.Subplot{Plots.PlotlyBackend},Array{Any,1}}) - Base.precompile(Tuple{typeof(Plots.build_layout),Plots.GridLayout,Int64}) - Base.precompile(Tuple{typeof(Plots.convertLegendValue),Symbol}) - 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},Vararg{Array{Float64,1},N} where N}) - 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{Any,1}}}) - 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),OHLC{Float64},Int64,Float64}) - 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_markers),Plots.Series,Array{Float64,1},Array{Float64,1},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,Array{Int64,1},Array{Int64,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,Array{Float64,1},Array{Float64,1},Nothing,Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Array{Int64,1},Array{Float64,1},Nothing,Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Array{Int64,1},Array{Int64,1},Nothing,Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,Base.OneTo{Int64},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,Base.OneTo{Int64},UnitRange{Int64},Tuple{Array{Float64,1},Array{Float64,1}},Tuple{Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots.gr_draw_segments),Plots.Series,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},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_draw_segments),Plots.Series,UnitRange{Int64},Array{Float64,1},Nothing,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_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_polyline3d),Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_update_viewport_legend!),Array{Float64,1},Plots.Subplot{Plots.GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor),NTuple{9,Float64}}}) - Base.precompile(Tuple{typeof(Plots.gr_update_viewport_legend!),Array{Float64,1},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}}}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,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,String}) - 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},Int64}) - 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},Float64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Type{Val{:mesh3d}},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:yerror}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict}) - Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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(Plots.axis_limits),Tuple{Base.RefValue{Plots.Subplot{Plots.GRBackend}},Tuple{Symbol,Symbol}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},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),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Array{Int64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},UnitRange{Int64}}) - Base.precompile(Tuple{typeof(iter_segments),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),StepRange{Int64,Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Any,Plots.Subplot},Plots.Subplot{Plots.GRBackend},Symbol}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - let fbody = try __lookup_kwbody__(which(Plots.GridLayout, (Int64,Vararg{Int64,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Plots.RootLayout,Array{Float64,1},Array{Float64,1},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Type{Plots.GridLayout},Int64,Vararg{Int64,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/precompile/windows/1.5/precompile_Plots.jl b/deps/SnoopCompile/precompile/windows/1.5/precompile_Plots.jl deleted file mode 100644 index 0c54f23c..00000000 --- a/deps/SnoopCompile/precompile/windows/1.5/precompile_Plots.jl +++ /dev/null @@ -1,579 +0,0 @@ -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{Symbol}},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{Nothing}},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.contour)),NamedTuple{(:fill,),Tuple{Bool}},typeof(contour),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - 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)),NamedTuple{(:aspect_ratio,),Tuple{Int64}},typeof(heatmap),Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram)),NamedTuple{(:bins, :weights),Tuple{Symbol,Array{Int64,1}}},typeof(histogram),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio),Tuple{Tuple{Int64,Int64},Bool,Bool,Int64}},typeof(histogram2d),Array{Complex{Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.histogram2d)),NamedTuple{(:nbins,),Tuple{Int64}},typeof(histogram2d),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.hline!)),NamedTuple{(:line,),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}}}},typeof(hline!),Array{Float64,2}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.lens!)),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(lens!),Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.mesh3d)),NamedTuple{(:connections,),Tuple{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}},typeof(mesh3d),Array{Int64,1},Vararg{Array{Int64,1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.pie)),NamedTuple{(:title, :l),Tuple{String,Float64}},typeof(pie),Array{String,1},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{(:alpha, :seriestype),Tuple{Float64,Symbol}},typeof(plot!),Plots.Plot{Plots.GRBackend},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{(: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.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{(:seriestype,),Tuple{Symbol}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend},Array{Int64,1}}) - 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{(:title,),Tuple{String}},typeof(plot!)}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot!)),NamedTuple{(:w,),Tuple{Int64}},typeof(plot!),Array{Float64,1},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{(:xgrid,),Tuple{Tuple{Symbol,Symbol,Int64,Symbol,Float64}}},typeof(plot!),Plots.Plot{Plots.PlotlyBackend}}) - 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.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{(:arrow,),Tuple{Int64}},typeof(plot),Array{Float64,1},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{(: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{(:nbins, :seriestype),Tuple{Int64,Symbol}},typeof(plot),Array{Float64,1},Array{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{(:reg, :fill),Tuple{Bool,Tuple{Int64,Symbol}}},typeof(plot),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{Int64}},typeof(plot),UnitRange{Int64}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.plot)),NamedTuple{(:ribbon,),Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}}) - 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{(: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{(: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)),NamedTuple{(:labels,),Tuple{Array{String,2}}},typeof(portfoliocomposition),Array{Float64,2},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:alpha,),Tuple{Float64}},typeof(scatter!),Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:marker, :series_annotations),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1}}},typeof(scatter!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:markersize, :c),Tuple{Int64,Symbol}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter!)),NamedTuple{(:zcolor, :m, :ms, :lab),Tuple{Array{Float64,1},Tuple{Symbol,Float64,Plots.Stroke},Array{Float64,1},String}},typeof(scatter!),Array{Float64,1}}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks),Tuple{Array{Symbol,2},Array{String,2},Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Int64,String,Int64,UnitRange{Int64}}},typeof(scatter),Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:m, :lab, :bg, :xlim, :ylim),Tuple{Tuple{Int64,Symbol},Array{String,2},Symbol,Tuple{Int64,Int64},Tuple{Int64,Int64}}},typeof(scatter),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{Core.kwftype(typeof(Plots.scatter)),NamedTuple{(:marker_z, :color, :legend),Tuple{typeof(+),Symbol,Bool}},typeof(scatter),Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - 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{PlotUtils.ContinuousColorGradient,1},Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Tuple{Base.OneTo{Int64}},typeof(Plots.get_colorgradient),Tuple{Base.Broadcast.Extruded{Array{Any,1},Tuple{Bool},Tuple{Int64}}}},Base.OneTo{Int64},Int64,Int64}) - 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.Broadcast.materialize),Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Plots.get_z_normalized),Tuple{Array{Float64,1},Float64,Float64}}}) - Base.precompile(Tuple{typeof(Base.collect_similar),Array{AbstractLayout,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.bottompad)}}) - 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,1},Base.Generator{Array{AbstractLayout,1},typeof(Plots.toppad)}}) - Base.precompile(Tuple{typeof(Base.deepcopy_internal),Array{Plots.Series,1},IdDict{Any,Any}}) - 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._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._heatmap_edges),Array{Float64,1},Bool}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1},UnitRange{Int64}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{AbstractArray{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{Float64,1},1},Array{Array{Float64,1},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Array{T,1} where T,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Complex{Float64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Dates.DateTime,1},UnitRange{Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Function,1},Float64,Float64}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{OHLC,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{String,1},Array{String,1},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Tuple{Int64,Real},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Array{Union{Missing, Int64},1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.PortfolioComposition}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{Plots.Spy}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{StepRange{Int64,Int64},Array{Float64,2}}}) - Base.precompile(Tuple{typeof(Plots._plot!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Tuple{UnitRange{Int64}}}) - 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_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},Vararg{Array{Float64,1},N} where N}) - 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),OHLC{Float64},Int64,Float64}) - 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_marker),Plots.Series,Int64,Float64,Tuple{Float64,Float64},Int64,Int64,Int64,Symbol}) - 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_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_legend_pos),Plots.Subplot{Plots.GRBackend},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(Plots.gr_polaraxes),Int64,Float64,Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},Function}) - Base.precompile(Tuple{typeof(Plots.gr_set_gradient),PlotUtils.ContinuousColorGradient}) - Base.precompile(Tuple{typeof(Plots.gr_text),Float64,Float64,String}) - Base.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}}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Array{Float64,1},Symbol}) - Base.precompile(Tuple{typeof(Plots.heatmap_edges),Base.OneTo{Int64},Symbol,Base.OneTo{Int64},Symbol,Tuple{Int64,Int64}}) - 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_minimum),Array{Int64,1}}) - Base.precompile(Tuple{typeof(Plots.is_uniformly_spaced),Array{Float64,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.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},Int64}) - 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},Float64}) - 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.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),Dict{Symbol,Any},Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),Dict{Symbol,Any},Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barbins}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:barhist}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bar}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:bins2d}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Surface{Array{Float64,2}}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:histogram2d}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:hline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:line}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:pie}},Array{String,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Array{Int64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:steppre}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:sticks}},Array{Float64,1},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:vline}},Base.OneTo{Int64},Array{Float64,1},Nothing}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),RecipesPipeline.DefaultsDict,Type{Val{:xerror}},Array{Float64,1},Array{Float64,1},Nothing}) - 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.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Int64,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.GRBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Array{RecipeData,1},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{AbstractArray{Float64,1},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Array{T,1} where T,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Complex{Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Float64,2}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{GeometryBasics.Point{2,Float64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Int64,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{OHLC,1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Array{Union{Missing, Int64},1}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.PortfolioComposition}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Plots.Spy}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Symbol}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},Dict{Symbol,Any},Symbol,UnitRange{Int64}}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{Float64,1},1},Vararg{Array{Array{Float64,1},1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Array{T,1} where T,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Float64,1},Vararg{Array{Float64,1},N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Function,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{Int64,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Array{String,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Formatted{Array{Int64,1}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Function,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Nothing,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,RecipesPipeline.GroupBy,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,StepRange{Int64,Int64},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipeData,Symbol,Type{T} where T,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(RecipesPipeline.warn_on_recipe_aliases!),Plots.Plot{Plots.PlotlyBackend},RecipesPipeline.DefaultsDict,Symbol,Symbol}) - Base.precompile(Tuple{typeof(annotate!),Array{Tuple{Int64,Float64,Plots.PlotText},1}}) - 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(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_fillalpha),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{1},Tuple{Base.OneTo{Int64}},typeof(Plots.gr_color),Tuple{Array{RGBA{Float64},1}}}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(deepcopy),Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(font),String,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(heatmap),Array{Dates.DateTime,1},Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(iter_segments),Array{Float64,1},Array{Float64,1},Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Array{Float64,1},Array{Float64,1},UnitRange{Int64}}) - Base.precompile(Tuple{typeof(iter_segments),Array{Float64,1}}) - Base.precompile(Tuple{typeof(iter_segments),Base.OneTo{Int64},Array{Float64,1}}) - Base.precompile(Tuple{typeof(ohlc),Array{OHLC,1}}) - Base.precompile(Tuple{typeof(plot!),Array{Float64,2}}) - Base.precompile(Tuple{typeof(plot!),Array{Tuple{Int64,Real},1}}) - Base.precompile(Tuple{typeof(plot),Array{Tuple{Int64,Int64},1}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend},Vararg{Plots.Plot{Plots.GRBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend},Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend},Vararg{Plots.Plot{Plots.PlotlyBackend},N} where N}) - Base.precompile(Tuple{typeof(plot),Plots.Plot{Plots.PlotlyBackend},Plots.Plot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(plot),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Function}) - Base.precompile(Tuple{typeof(push!),Plots.Plot{Plots.GRBackend},Float64,Array{Float64,1}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Any,Plots.Subplot},Plots.Subplot{Plots.GRBackend},Symbol}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Plots.Subplot,Any},Dict{Symbol,Any},Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(setindex!),Dict{Symbol,Any},Plots.Subplot{Plots.GRBackend},Symbol}) - 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!),String}) - Base.precompile(Tuple{typeof(vcat),Array{Any,1},Tuple{Int64,Float64,Plots.PlotText}}) - Base.precompile(Tuple{typeof(vline!),Array{Int64,1}}) - Base.precompile(Tuple{typeof(xgrid!),Plots.Plot{Plots.GRBackend},Symbol,Vararg{Any,N} where N}) - Base.precompile(Tuple{typeof(xlims),Plots.Subplot{Plots.PlotlyBackend}}) - Base.precompile(Tuple{typeof(yaxis!),String,Symbol}) - let fbody = try __lookup_kwbody__(which(Plots.gr_polyline, (Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Symbol,Symbol,typeof(Plots.gr_polyline),Array{Float64,1},Array{Float64,1},typeof(GR.fillarea),)) - end - end - 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(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Array{Tuple{Int64,Float64,Plots.PlotText},1},Tuple{Symbol},NamedTuple{(:annotation,),Tuple{Array{Tuple{Int64,Float64,Plots.PlotText},1}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:title,),Tuple{String}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, ())) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Tuple{String,Symbol},Tuple{Symbol},NamedTuple{(:yaxis,),Tuple{Tuple{String,Symbol}}}},typeof(plot!),)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},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},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:markersize, :c, :seriestype),Tuple{Int64,Symbol,Symbol}}},typeof(plot!),Array{Float64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:w,),Tuple{Int64}}},typeof(plot!),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:line, :seriestype),Tuple{Tuple{Int64,Symbol,Float64,Array{Symbol,2}},Symbol}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Float64,2},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Float64,2},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{GeometryBasics.Point{2,Float64},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},NamedTuple{(:alpha, :seriestype),Tuple{Float64,Symbol}}},typeof(plot!),Array{GeometryBasics.Point{2,Float64},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Symbol,Tuple{Symbol},NamedTuple{(:seriestype,),Tuple{Symbol}}},typeof(plot!),Array{Int64,1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Int64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol},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},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (Array{Tuple{Int64,Real},1},))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},typeof(plot!),Array{Tuple{Int64,Real},1},)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot!, (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:marker, :series_annotations, :seriestype),Tuple{Tuple{Int64,Float64,Symbol},Array{Any,1},Symbol}}},typeof(plot!),StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Array{T,1} where T,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :lab, :ms),Tuple{Tuple{Array{Symbol,2},Int64},Array{String,2},Int64}}},typeof(plot),Array{Array{T,1} where T,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Float64,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:zcolor, :m, :leg, :cbar, :w),Tuple{StepRange{Int64,Int64},Tuple{Int64,Float64,Symbol,Plots.Stroke},Bool,Bool,Int64}}},typeof(plot),Array{Float64,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Array{Function,1},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:leg, :xlims, :ylims),Tuple{Bool,Tuple{Int64,Float64},Tuple{Int64,Int64}}}},typeof(plot),Array{Function,1},Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (Function,Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,Tuple{Symbol,Symbol,Symbol},NamedTuple{(:line, :leg, :fill),Tuple{Int64,Bool,Tuple{Int64,Symbol}}}},typeof(plot),Function,Vararg{Any,N} where N,)) - end - end - let fbody = try __lookup_kwbody__(which(RecipesBase.plot, (StepRange{Int64,Int64},Vararg{Any,N} where N,))) catch missing end - if !ismissing(fbody) - precompile(fbody, (Base.Iterators.Pairs{Symbol,Any,NTuple{5,Symbol},NamedTuple{(:lab, :w, :palette, :fill, :α),Tuple{String,Int64,PlotUtils.ContinuousColorGradient,Int64,Float64}}},typeof(plot),StepRange{Int64,Int64},Vararg{Any,N} where N,)) - end - end -end diff --git a/deps/SnoopCompile/snoop_bench.jl b/deps/SnoopCompile/snoop_bench.jl index 12ac657e..4bb5838e 100644 --- a/deps/SnoopCompile/snoop_bench.jl +++ b/deps/SnoopCompile/snoop_bench.jl @@ -3,9 +3,6 @@ using CompileBot snoop_bench( BotConfig( "Plots", - yml_path= "SnoopCompile.yml", - else_os = "linux", - else_version = "1.4", ), joinpath(@__DIR__, "precompile_script.jl"), ) diff --git a/deps/SnoopCompile/snoop_bot.jl b/deps/SnoopCompile/snoop_bot.jl index ab83df9c..6a77f2be 100644 --- a/deps/SnoopCompile/snoop_bot.jl +++ b/deps/SnoopCompile/snoop_bot.jl @@ -3,9 +3,6 @@ using CompileBot snoop_bot( BotConfig( "Plots", - yml_path= "SnoopCompile.yml", - else_os = "linux", - else_version = "1.4", ), joinpath(@__DIR__, "precompile_script.jl"), ) diff --git a/src/Plots.jl b/src/Plots.jl index 8be711c6..bb0ea855 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -4,11 +4,21 @@ if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@optle @eval Base.Experimental.@optlevel 1 end -const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2]) +const _current_plots_version = VersionNumber( + split( + first( + filter( + line -> occursin("version", line), + readlines(normpath(@__DIR__, "..", "Project.toml")), + ), + ), + "\"", + )[2], +) using Reexport -import GeometryTypes, GeometryBasics +import GeometryBasics using Dates, Printf, Statistics, Base64, LinearAlgebra, Random using SparseArrays @@ -25,6 +35,7 @@ import JSON using Requires +#! format: off export grid, bbox, @@ -117,8 +128,7 @@ export scalefontsize, scalefontsizes, resetfontsizes - - +#! format: on # --------------------------------------------------------- import NaNMath # define functions that ignores NaNs. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563 @@ -137,7 +147,6 @@ ignorenan_extrema(x) = Base.extrema(x) # This makes it impossible to create row vectors of String and Symbol with the transpose operator. # This solves this issue, internally in Plots at least. - # commented out on the insistence of the METADATA maintainers #Base.transpose(x::Symbol) = x @@ -148,12 +157,13 @@ ignorenan_extrema(x) = Base.extrema(x) import Measures module PlotMeasures import Measures -import Measures: Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h +import Measures: + Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h const BBox = Measures.Absolute2DBox # allow pixels and percentages 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) @@ -168,7 +178,8 @@ import .PlotMeasures: Length, AbsoluteLength, Measure, width, height # --------------------------------------------------------- import RecipesPipeline -import RecipesPipeline: SliceIt, +import RecipesPipeline: + SliceIt, DefaultsDict, Formatted, AbstractSurface, @@ -187,8 +198,13 @@ import RecipesPipeline: SliceIt, datetimeformatter, timeformatter +# Use fixed version of Plotly instead of the latest one for stable dependency +# Ref: https://github.com/JuliaPlots/Plots.jl/pull/2779 +const _plotly_min_js_filename = "plotly-1.57.1.min.js" + include("types.jl") include("utils.jl") +include("colorbars.jl") include("axes.jl") include("args.jl") include("components.jl") @@ -207,6 +223,7 @@ include("output.jl") include("ijulia.jl") include("fileio.jl") include("init.jl") +include("legend.jl") include("backends/plotly.jl") include("backends/gr.jl") @@ -214,36 +231,34 @@ include("backends/web.jl") include("shorthands.jl") -let PlotOrSubplot = Union{Plot, Subplot} - global title!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; title = s, kw...) - global xlabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; xlabel = s, kw...) - global ylabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; ylabel = s, kw...) - global xlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; xlims = lims, kw...) - global ylims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; ylims = lims, kw...) - global zlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; zlims = lims, kw...) - global 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 zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin,zmax), kw...) - global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; xticks = ticks, kw...) - global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; yticks = ticks, kw...) - global xticks!(plt::PlotOrSubplot, - ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks,labels), kw...) - global yticks!(plt::PlotOrSubplot, - ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; yticks = (ticks,labels), kw...) - global xgrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xgrid = args, kw...) - global ygrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; ygrid = args, kw...) - global annotate!(plt::PlotOrSubplot, anns...; kw...) = plot!(plt; annotation = anns, kw...) - global annotate!(plt::PlotOrSubplot, anns::AVec{T}; kw...) where {T<:Tuple} = plot!(plt; annotation = anns, kw...) - global xflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; xflip = flip, kw...) - global yflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; yflip = flip, kw...) - global xaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xaxis = args, kw...) - global yaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; yaxis = args, kw...) +let PlotOrSubplot = Union{Plot,Subplot} + global title!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; title = s, kw...) + global xlabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; xlabel = s, kw...) + global ylabel!(plt::PlotOrSubplot, s::AbstractString; kw...) = plot!(plt; ylabel = s, kw...) + global xlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; xlims = lims, kw...) + global ylims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; ylims = lims, kw...) + global zlims!(plt::PlotOrSubplot, lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(plt; zlims = lims, kw...) + global 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 zlims!(plt::PlotOrSubplot, zmin::Real, zmax::Real; kw...) = plot!(plt; zlims = (zmin, zmax), kw...) + global xticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; xticks = ticks, kw...) + global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) = plot!(plt; yticks = ticks, kw...) + global xticks!(plt::PlotOrSubplot, ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; xticks = (ticks, labels), kw...) + global yticks!(plt::PlotOrSubplot, ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(plt; yticks = (ticks, labels), kw...) + global xgrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xgrid = args, kw...) + global ygrid!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; ygrid = args, kw...) + global annotate!(plt::PlotOrSubplot, anns...; kw...) = plot!(plt; annotation = anns, kw...) + global annotate!(plt::PlotOrSubplot, anns::AVec{T}; kw...) where {T<:Tuple} = plot!(plt; annotation = anns, kw...) + global xflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; xflip = flip, kw...) + global yflip!(plt::PlotOrSubplot, flip::Bool = true; kw...) = plot!(plt; yflip = flip, kw...) + global xaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; xaxis = args, kw...) + global yaxis!(plt::PlotOrSubplot, args...; kw...) = plot!(plt; yaxis = args, kw...) end - # --------------------------------------------------------- const CURRENT_BACKEND = CurrentBackend(:none) +const PLOTS_SEED = 1234 include("precompile_includer.jl") diff --git a/src/animation.jl b/src/animation.jl index b83c78cc..9021059d 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -14,24 +14,24 @@ end Add a plot (the current plot if not specified) to an existing animation """ -function frame(anim::Animation, plt::P=current()) where P<:AbstractPlot +function frame(anim::Animation, plt::P = current()) where {P<:AbstractPlot} i = length(anim.frames) + 1 filename = @sprintf("%06d.png", i) png(plt, joinpath(anim.dir, filename)) push!(anim.frames, filename) end -giffn() = (isijulia() ? "tmp.gif" : tempname()*".gif") -movfn() = (isijulia() ? "tmp.mov" : tempname()*".mov") -mp4fn() = (isijulia() ? "tmp.mp4" : tempname()*".mp4") -webmfn() = (isijulia() ? "tmp.webm" : tempname()*".webm") +giffn() = (isijulia() ? "tmp.gif" : tempname() * ".gif") +movfn() = (isijulia() ? "tmp.mov" : tempname() * ".mov") +mp4fn() = (isijulia() ? "tmp.mp4" : tempname() * ".mp4") +webmfn() = (isijulia() ? "tmp.webm" : tempname() * ".webm") mutable struct FrameIterator itr every::Int kw end -FrameIterator(itr; every=1, kw...) = FrameIterator(itr, every, kw) +FrameIterator(itr; every = 1, kw...) = FrameIterator(itr, every, kw) """ Animate from an iterator which returns the plot args each iteration. @@ -48,8 +48,8 @@ function animate(fitr::FrameIterator, fn = giffn(); kw...) end # most things will implement this -function animate(obj, fn = giffn(); every=1, fps=20, loop=0, kw...) - animate(FrameIterator(obj, every, kw), fn; fps=fps, loop=loop) +function animate(obj, fn = giffn(); every = 1, fps = 20, loop = 0, kw...) + animate(FrameIterator(obj, every, kw), fn; fps = fps, loop = loop) end # ----------------------------------------------- @@ -69,12 +69,16 @@ webm(anim::Animation, fn = webmfn(); kw...) = buildanimation(anim, fn, false; kw ffmpeg_framerate(fps) = "$fps" ffmpeg_framerate(fps::Rational) = "$(fps.num)/$(fps.den)" -function buildanimation(anim::Animation, fn::AbstractString, - is_animated_gif::Bool=true; - fps::Real = 20, loop::Integer = 0, - variable_palette::Bool=false, - verbose=false, - show_msg::Bool=true) +function buildanimation( + anim::Animation, + fn::AbstractString, + is_animated_gif::Bool = true; + fps::Real = 20, + loop::Integer = 0, + variable_palette::Bool = false, + verbose = false, + show_msg::Bool = true, +) if length(anim.frames) == 0 throw(ArgumentError("Cannot build empty animations")) end @@ -82,41 +86,49 @@ function buildanimation(anim::Animation, fn::AbstractString, fn = abspath(expanduser(fn)) animdir = anim.dir framerate = ffmpeg_framerate(fps) - verbose_level = (verbose isa Int ? verbose : - verbose ? 32 # "info" - : 16) # "error" + verbose_level = (verbose isa Int ? verbose : verbose ? 32 : 16) # "error" if is_animated_gif if variable_palette # generate a colorpalette for each frame for highest quality, but larger filesize - palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" - ffmpeg_exe(`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -lavfi "$palette" -loop $loop -y $fn`) + palette = "palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" + ffmpeg_exe( + `-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -lavfi "$palette" -loop $loop -y $fn`, + ) else # 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 - ffmpeg_exe(`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -loop $loop -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 else - ffmpeg_exe(`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -loop $loop -y $fn`) + ffmpeg_exe( + `-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -vf format=yuv420p -loop $loop -y $fn`, + ) end show_msg && @info("Saved animation to ", fn) AnimatedGif(fn) end - - # write out html to view the gif function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) ext = file_extension(agif.filename) if ext == "gif" - html = "" - elseif ext in ("mov", "mp4","webm") + html = + "" + elseif ext in ("mov", "mp4", "webm") mimetype = ext == "mov" ? "video/quicktime" : "video/$ext" - html = "" + html = + "" else error("Cannot show animation with extension $ext: $agif") end @@ -125,64 +137,67 @@ function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) return nothing end - # Only gifs can be shown via image/gif Base.showable(::MIME"image/gif", agif::AnimatedGif) = file_extension(agif.filename) == "gif" function Base.show(io::IO, ::MIME"image/gif", agif::AnimatedGif) - open(fio-> write(io, fio), agif.filename) + open(fio -> write(io, fio), agif.filename) end - # ----------------------------------------------- function _animate(forloop::Expr, args...; callgif = false) - if forloop.head != :for - error("@animate macro expects a for-block. got: $(forloop.head)") - end + if forloop.head ∉ (:for, :while) + error("@animate macro expects a for- or while-block. got: $(forloop.head)") + end - # add the call to frame to the end of each iteration - animsym = gensym("anim") - countersym = gensym("counter") - freqassert = :() - block = forloop.args[2] + # add the call to frame to the end of each iteration + animsym = gensym("anim") + countersym = gensym("counter") + freqassert = :() + block = forloop.args[2] - # create filter - n = length(args) - filterexpr = if n == 0 - # no filter... every iteration gets a frame - true + # create filter + n = length(args) + filterexpr = if n == 0 + # no filter... every iteration gets a frame + true - elseif args[1] == :every - # filter every `freq` frames (starting with the first frame) - @assert n == 2 - freq = args[2] - freqassert = :(@assert isa($freq, Integer) && $freq > 0) - :(mod1($countersym, $freq) == 1) + elseif args[1] == :every + # filter every `freq` frames (starting with the first frame) + @assert n == 2 + freq = args[2] + freqassert = :(@assert isa($freq, Integer) && $freq > 0) + :(mod1($countersym, $freq) == 1) - elseif args[1] == :when - # filter on custom expression - @assert n == 2 - args[2] + elseif args[1] == :when + # filter on custom expression + @assert n == 2 + args[2] - else - error("Unsupported animate filter: $args") - end + else + error("Unsupported animate filter: $args") + end - push!(block.args, :(if $filterexpr; Plots.frame($animsym); end)) - push!(block.args, :(global $countersym += 1)) + push!(block.args, :( + if $filterexpr + Plots.frame($animsym) + end + )) + push!(block.args, :($countersym += 1)) - # add a final call to `gif(anim)`? - retval = callgif ? :(Plots.gif($animsym)) : animsym + # add a final call to `gif(anim)`? + retval = callgif ? :(Plots.gif($animsym)) : animsym - # full expression: - esc(quote - $freqassert # if filtering, check frequency is an Integer > 0 - $animsym = Plots.Animation() # init animation object - global $countersym = 1 # init iteration counter - $forloop # for loop, saving a frame after each iteration - $retval # return the animation object, or the gif - end) + # full expression: + esc(quote + $freqassert # if filtering, check frequency is an Integer > 0 + $animsym = Plots.Animation() # init animation object + let $countersym = 1 # init iteration counter + $forloop # for loop, saving a frame after each iteration + end + $retval # return the animation object, or the gif + end) end """ diff --git a/src/arg_desc.jl b/src/arg_desc.jl index 521512dc..d38997fd 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -1,166 +1,188 @@ const _arg_desc = KW( -# series args -:label => "String type. The label for a series, which appears in a legend. If empty, no legend entry is added.", -:seriescolor => "Color Type. The base color for this series. `:auto` (the default) will select a color from the subplot's `color_palette`, based on the order it was added to the subplot", -:seriesalpha => "Number in [0,1]. The alpha/opacity override for the series. `nothing` (the default) means it will take the alpha value of the color.", -:seriestype => "Symbol. This is the identifier of the type of visualization for this series. Choose from $(_allTypes) or any series recipes which are defined.", -:linestyle => "Symbol. Style of the line (for path and bar stroke). Choose from $(_allStyles)", -:linewidth => "Number. Width of the line (in pixels)", -:linecolor => "Color Type. Color of the line (for path and bar stroke). `:match` will take the value from `:seriescolor`, (though histogram/bar types use `:black` as a default).", -:linealpha => "Number in [0,1]. The alpha/opacity override for the line. `nothing` (the default) means it will take the alpha value of linecolor.", -:fillrange => "Number or AbstractVector. Fills area between fillrange and y for line-types, sets the base for bar/stick types, and similar for other types.", -:fillcolor => "Color Type. Color of the filled area of path or bar types. `:match` will take the value from `:seriescolor`.", -:fillalpha => "Number in [0,1]. The alpha/opacity override for the fill area. `nothing` (the default) means it will take the alpha value of fillcolor.", -:fillstyle => "Symbol. Style of the fill area. `nothing` (the default) means solid fill. Choose from :/, :\\, :|, :-, :+, :x", -:markershape => "Symbol, Shape, or AbstractVector. Choose from $(_allMarkers).", -:markercolor => "Color Type. Color of the interior of the marker or shape. `:match` will take the value from `:seriescolor`.", -:markeralpha => "Number in [0,1]. The alpha/opacity override for the marker interior. `nothing` (the default) means it will take the alpha value of markercolor.", -:markersize => "Number or AbstractVector. Size (radius pixels) of the markers.", -:markerstrokestyle => "Symbol. Style of the marker stroke (border). Choose from $(_allStyles)", -:markerstrokewidth => "Number. Width of the marker stroke (border. in pixels)", -:markerstrokecolor => "Color Type. Color of the marker stroke (border). `:match` will take the value from `:foreground_color_subplot`.", -:markerstrokealpha => "Number in [0,1]. The alpha/opacity override for the marker stroke (border). `nothing` (the default) means it will take the alpha value of markerstrokecolor.", -:bins => "Integer, NTuple{2,Integer}, AbstractVector or Symbol. Default is :auto (the Freedman-Diaconis rule). For histogram-types, defines the approximate number of bins to aim for, or the auto-binning algorithm to use (:sturges, :sqrt, :rice, :scott or :fd). For fine-grained control pass a Vector of break values, e.g. `range(minimum(x), stop = maximum(x), length = 25)`", -:smooth => "Bool. Add a regression line?", -:group => "AbstractVector. Data is split into a separate series, one for each unique value in `group`.", -:x => "Various. Input data. First Dimension", -:y => "Various. Input data. Second Dimension", -:z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.", -:marker_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.", -:line_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series line segment, which correspond to the color to be used from a linecolor gradient. Note that for N points, only the first N-1 values are used (one per line-segment).", -:fill_z => "Matrix{Float64} of the same size as z matrix, which specifies the color of the 3D surface; the default value is `nothing`.", -:levels => "Integer, NTuple{2,Integer}, or AbstractVector. Levels or number of levels (or x-levels/y-levels) for a contour type.", -:orientation => "Symbol. Horizontal or vertical orientation for bar types. Values `:h`, `:hor`, `:horizontal` correspond to horizontal (sideways, anchored to y-axis), and `:v`, `:vert`, and `:vertical` correspond to vertical (the default).", -:bar_position => "Symbol. Choose from `:overlay` (default), `:stack`. (warning: May not be implemented fully)", -:bar_width => "nothing or Number. Width of bars in data coordinates. When nothing, chooses based on x (or y when `orientation = :h`).", -:bar_edges => "Bool. Align bars to edges (true), or centers (the default)?", -:xerror => "AbstractVector or 2-Tuple of Vectors. x (horizontal) error relative to x-value. If 2-tuple of vectors, the first vector corresponds to the left error (and the second to the right)", -:yerror => "AbstractVector or 2-Tuple of Vectors. y (vertical) error relative to y-value. If 2-tuple of vectors, the first vector corresponds to the bottom error (and the second to the top)", -:ribbon => "Number or AbstractVector. Creates a fillrange around the data points.", -:quiver => "AbstractVector or 2-Tuple of vectors. The directional vectors U,V which specify velocity/gradient vectors for a quiver plot.", -:arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.", -:normalize => "Bool or Symbol. Histogram normalization mode. Possible values are: false/:none (no normalization, default), true/:pdf (normalize to a discrete Probability Density Function, where the total area of the bins is 1), :probability (bin heights sum to 1) and :density (the area of each bin, rather than the height, is equal to the counts - useful for uneven bin sizes).", -:weights => "AbstractVector. Used in histogram types for weighted counts.", -:show_empty_bins => "Bool. Whether empty bins in a 2D histogram are colored as 0 (true), or transparent (the default).", -:contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.", -:contour_labels => "Bool. Show labels at the contour lines?", -:match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.", -:subplot => "Integer (subplot index) or Subplot object. The subplot that this series belongs to.", -:series_annotations => "AbstractVector of String or PlotText. These are annotations which are mapped to data points/positions.", -:primary => "Bool. Does this count as a 'real series'? For example, you could have a path (primary), and a scatter (secondary) as 2 separate series, maybe with different data (see sticks recipe for an example). The secondary series will get the same color, etc as the primary.", -:hover => "nothing or vector of strings. Text to display when hovering over each data point.", -:colorbar_entry => "Bool. Include this series in the color bar? Set to `false` to exclude.", + # series args + :label => "String type. The label for a series, which appears in a legend. If empty, no legend entry is added.", + :seriescolor => "Color Type. The base color for this series. `:auto` (the default) will select a color from the subplot's `color_palette`, based on the order it was added to the subplot", + :seriesalpha => "Number in [0,1]. The alpha/opacity override for the series. `nothing` (the default) means it will take the alpha value of the color.", + :seriestype => "Symbol. This is the identifier of the type of visualization for this series. Choose from $(_allTypes) or any series recipes which are defined.", + :linestyle => "Symbol. Style of the line (for path and bar stroke). Choose from $(_allStyles)", + :linewidth => "Number. Width of the line (in pixels)", + :linecolor => "Color Type. Color of the line (for path and bar stroke). `:match` will take the value from `:seriescolor`, (though histogram/bar types use `:black` as a default).", + :linealpha => "Number in [0,1]. The alpha/opacity override for the line. `nothing` (the default) means it will take the alpha value of linecolor.", + :fillrange => "Number or AbstractVector. Fills area between fillrange and y for line-types, sets the base for bar/stick types, and similar for other types.", + :fillcolor => "Color Type. Color of the filled area of path or bar types. `:match` will take the value from `:seriescolor`.", + :fillalpha => "Number in [0,1]. The alpha/opacity override for the fill area. `nothing` (the default) means it will take the alpha value of fillcolor.", + :markershape => "Symbol, Shape, or AbstractVector. Choose from $(_allMarkers).", + :fillstyle => "Symbol. Style of the fill area. `nothing` (the default) means solid fill. Choose from :/, :\\, :|, :-, :+, :x", + :markercolor => "Color Type. Color of the interior of the marker or shape. `:match` will take the value from `:seriescolor`.", + :markeralpha => "Number in [0,1]. The alpha/opacity override for the marker interior. `nothing` (the default) means it will take the alpha value of markercolor.", + :markersize => "Number or AbstractVector. Size (radius pixels) of the markers", + :markerstrokestyle => "Symbol. Style of the marker stroke (border). Choose from $(_allStyles)", + :markerstrokewidth => "Number. Width of the marker stroke (border) in pixels", + :markerstrokecolor => "Color Type. Color of the marker stroke (border). `:match` will take the value from `:foreground_color_subplot`.", + :markerstrokealpha => "Number in [0,1]. The alpha/opacity override for the marker stroke (border). `nothing` (the default) means it will take the alpha value of markerstrokecolor.", + :bins => "Integer, NTuple{2,Integer}, AbstractVector or Symbol. Default is :auto (the Freedman-Diaconis rule). For histogram-types, defines the approximate number of bins to aim for, or the auto-binning algorithm to use (:sturges, :sqrt, :rice, :scott or :fd). For fine-grained control pass a Vector of break values, e.g. `range(minimum(x), stop = maximum(x), length = 25)`", + :smooth => "Bool. Add a regression line?", + :group => "AbstractVector. Data is split into a separate series, one for each unique value in `group`", + :x => "Various. Input data. First Dimension", + :y => "Various. Input data. Second Dimension", + :z => "Various. Input data. Third Dimension. May be wrapped by a `Surface` for surface and heatmap types.", + :marker_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series data point, which correspond to the color to be used from a markercolor gradient.", + :line_z => "AbstractVector, Function `f(x,y,z) -> z_value`, or Function `f(x,y) -> z_value`, or nothing. z-values for each series line segment, which correspond to the color to be used from a linecolor gradient. Note that for N points, only the first N-1 values are used (one per line-segment).", + :fill_z => "Matrix{Float64} of the same size as z matrix, which specifies the color of the 3D surface; the default value is `nothing`.", + :levels => "Integer, NTuple{2,Integer}, or AbstractVector. Levels or number of levels (or x-levels/y-levels) for a contour type.", + :orientation => "Symbol. Horizontal or vertical orientation for bar types. Values `:h`, `:hor`, `:horizontal` correspond to horizontal (sideways, anchored to y-axis), and `:v`, `:vert`, and `:vertical` correspond to vertical (the default).", + :bar_position => "Symbol. Choose from `:overlay` (default), `:stack`. (warning: May not be implemented fully)", + :bar_width => "nothing or Number. Width of bars in data coordinates. When nothing, chooses based on x (or y when `orientation = :h`).", + :bar_edges => "Bool. Align bars to edges (true), or centers (the default)?", + :xerror => "AbstractVector or 2-Tuple of Vectors. x (horizontal) error relative to x-value. If 2-tuple of vectors, the first vector corresponds to the left error (and the second to the right)", + :yerror => "AbstractVector or 2-Tuple of Vectors. y (vertical) error relative to y-value. If 2-tuple of vectors, the first vector corresponds to the bottom error (and the second to the top)", + :ribbon => "Number or AbstractVector. Creates a fillrange around the data points.", + :quiver => "AbstractVector or 2-Tuple of vectors. The directional vectors U,V which specify velocity/gradient vectors for a quiver plot.", + :arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.", + :normalize => "Bool or Symbol. Histogram normalization mode. Possible values are: false/:none (no normalization, default), true/:pdf (normalize to a discrete Probability Density Function, where the total area of the bins is 1), :probability (bin heights sum to 1) and :density (the area of each bin, rather than the height, is equal to the counts - useful for uneven bin sizes).", + :weights => "AbstractVector. Used in histogram types for weighted counts.", + :show_empty_bins => "Bool. Whether empty bins in a 2D histogram are colored as 0 (true), or transparent (the default)", + :contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.", + :contour_labels => "Bool. Show labels at the contour lines?", + :match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.", + :subplot => "Integer (subplot index) or Subplot object. The subplot that this series belongs to.", + :series_annotations => "AbstractVector of String or PlotText. These are annotations which are mapped to data points/positions.", + :primary => "Bool. Does this count as a 'real series'? For example, you could have a path (primary), and a scatter (secondary) as 2 separate series, maybe with different data (see sticks recipe for an example). The secondary series will get the same color, etc as the primary.", + :hover => "nothing or vector of strings. Text to display when hovering over each data point.", + :colorbar_entry => "Bool. Include this series in the color bar? Set to `false` to exclude.", -# plot args -:plot_title => "String. Title for the whole plot (not the subplots) (Note: Not currently implemented)", -:background_color => "Color Type. Base color for all backgrounds.", -:background_color_outside => "Color Type or `:match` (matches `:background_color`). Color outside the plot area(s)", -:foreground_color => "Color Type. Base color for all foregrounds.", -: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)", -: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`", -: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).", -:overwrite_figure => "Bool. Should we reuse the same GUI window/figure when plotting (true) or open a new one (false).", -:html_output_format => "Symbol. When writing html output, what is the format? `:png` and `:svg` are currently supported.", -:tex_output_standalone => "Bool. When writing tex output, should the source include a preamble for a standalone document class.", -:inset_subplots => "nothing or vector of 2-tuple (parent,bbox). optionally pass a vector of (parent,bbox) tuples which are the parent layout and the relative bounding box of inset subplots", -:dpi => "Number. Dots Per Inch of output figures", -:thickness_scaling => "Number. Scale for the thickness of all line elements like lines, borders, axes, grid lines, ... defaults to 1.", -:display_type => "Symbol (`:auto`, `:gui`, or `:inline`). When supported, `display` will either open a GUI window or plot inline.", -:extra_kwargs => "Either one of (`:plot`, `:subplot`, `:series`) to specify for which element extra keyword args are collected or a KW (Dict{Symbol,Any}) to pass a map of extra keyword args which may be specific to a backend. Default: `:series`.\n Example: `pgfplotsx(); scatter(1:5, extra_kwargs=Dict(:subplot=>Dict(\"axis line shift\" => \"10pt\"))`", -:fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides", -:warn_on_unsupported => "Bool. Warn on unsupported attributes, series types and marker shapes", + # plot args + :plot_title => "String. Title for the whole plot (not the subplots)", + :plot_titlevspan => "Number in [0,1]. Vertical span of the whole plot title (fraction of the plot height)", + :background_color => "Color Type. Base color for all backgrounds.", + :background_color_outside => "Color Type or `:match` (matches `:background_color`). Color outside the plot area(s)", + :foreground_color => "Color Type. Base color for all foregrounds.", + :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)", + :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`", + :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).", + :overwrite_figure => "Bool. Should we reuse the same GUI window/figure when plotting (true) or open a new one (false).", + :html_output_format => "Symbol. When writing html output, what is the format? `:png` and `:svg` are currently supported.", + :tex_output_standalone => "Bool. When writing tex output, should the source include a preamble for a standalone document class.", + :inset_subplots => "nothing or vector of 2-tuple (parent,bbox). optionally pass a vector of (parent,bbox) tuples which are the parent layout and the relative bounding box of inset subplots", + :dpi => "Number. Dots Per Inch of output figures", + :thickness_scaling => "Number. Scale for the thickness of all line elements like lines, borders, axes, grid lines, ... defaults to 1.", + :display_type => "Symbol (`:auto`, `:gui`, or `:inline`). When supported, `display` will either open a GUI window or plot inline.", + :extra_kwargs => "Either one of (`:plot`, `:subplot`, `:series`) to specify for which element extra keyword args are collected or a KW (Dict{Symbol,Any}) to pass a map of extra keyword args which may be specific to a backend. Default: `:series`.\n Example: `pgfplotsx(); scatter(1:5, extra_kwargs=Dict(:subplot=>Dict(\"axis line shift\" => \"10pt\"))`", + :fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides", + :warn_on_unsupported => "Bool. Warn on unsupported attributes, series types and marker shapes", -# subplot args -:title => "String. Subplot title.", -:titlelocation => "Symbol. Position of subplot title. Values: `:left`, `:center`, `:right`", -:titlefontfamily => "String or Symbol. Font family of subplot title.", -:titlefontsize => "Integer. Font pointsize of subplot title.", -:titlefonthalign => "Symbol. Font horizontal alignment of subplot title: :hcenter, :left, :right or :center", -:titlefontvalign => "Symbol. Font vertical alignment of subplot title: :vcenter, :top, :bottom or :center", -:titlefontrotation => "Real. Font rotation of subplot title", -:titlefontcolor => "Color Type. Font color of subplot title", -:background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.", -:background_color_legend => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.", -:background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).", -:foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.", -:foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.", -: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.", -: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.", -:legendfontsize => "Integer. Font pointsize of legend entries.", -:legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center", -:legendfontvalign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center", -:legendfontrotation => "Real. Font rotation of legend entries", -:legendfontcolor => "Color Type. Font color of legend entries", -:legendtitle => "String. Legend title.", -:legendtitlefontfamily => "String or Symbol. Font family of the legend title.", -:legendtitlefontsize => "Integer. Font pointsize the legend title.", -:legendtitlefonthalign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center", -:legendtitlefontvalign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center", -:legendtitlefontrotation => "Real. Font rotation of the legend title", -:legendtitlefontcolor => "Color Type. Font color of the legend title", -:colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)", -:clims => "`:auto`, NTuple{2,Number}, or a function that takes series data in and returns NTuple{2,Number}. Fixes the limits of the colorbar.", -:legendfont => "Font. Font of legend items.", -: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.", -:projection => "Symbol or String. '3d' or 'polar'", -:aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.", -:margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.", -:left_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the left of the subplot.", -:top_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the top of the subplot.", -:right_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the right of the subplot.", -:bottom_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the bottom of the subplot.", -:subplot_index => "Integer. Internal (not set by user). Specifies the index of this subplot in the Plot's `plt.subplot` list.", -:colorbar_title => "String. Title of colorbar.", -:framestyle => "Symbol. Style of the axes frame. Choose from $(_allFramestyles)", -:camera => "NTuple{2, Real}. Sets the view angle (azimuthal, elevation) for 3D plots", + # subplot args + :title => "String. Subplot title.", + :titlelocation => "Symbol. Position of subplot title. Values: `:left`, `:center`, `:right`", + :titlefontfamily => "String or Symbol. Font family of subplot title.", + :titlefontsize => "Integer. Font pointsize of subplot title.", + :titlefonthalign => "Symbol. Font horizontal alignment of subplot title: :hcenter, :left, :right or :center", + :titlefontvalign => "Symbol. Font vertical alignment of subplot title: :vcenter, :top, :bottom or :center", + :titlefontrotation => "Real. Font rotation of subplot title", + :titlefontcolor => "Color Type. Font color of subplot title", + :background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.", + :background_color_legend => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.", + :background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).", + :foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.", + :foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.", + :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.", + :legend => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position) or angle or (angle,inout) tuple. Bottom left corner of legend is placed at (x,y). Symbol values: `:none`; `:best`; `:inline`; `:inside`; `:legend`; any valid combination of `:(outer ?)(top/bottom ?)(right/left ?)`, i.e.: `:top`, `:topright`, `:outerleft`, `:outerbottomright` ... (note: only some may be supported in each backend). Legend is positioned at (angle degrees) (so (90,:outer) is roughly equivalent to :outertop), close to the inside of the axes or the outside if inout=:outer.", + :legendfontfamily => "String or Symbol. Font family of legend entries.", + :legendfontsize => "Integer. Font pointsize of legend entries.", + :legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center", + :legendfontvalign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center", + :legendfontrotation => "Real. Font rotation of legend entries", + :legendfontcolor => "Color Type. Font color of legend entries", + :legendtitle => "String. Legend title.", + :legendtitlefontfamily => "String or Symbol. Font family of the legend title.", + :legendtitlefontsize => "Integer. Font pointsize the legend title.", + :legendtitlefonthalign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center", + :legendtitlefontvalign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center", + :legendtitlefontrotation => "Real. Font rotation of the legend title", + :legendtitlefontcolor => "Color Type. Font color of the legend title", + :colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)", + :clims => "`:auto`, NTuple{2,Number}, or a function that takes series data in and returns NTuple{2,Number}. Fixes the limits of the colorbar.", + :colorbar_fontfamily => "String or Symbol. Font family of colobar entries.", + :colorbar_ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`", + :colorbar_tickfontfamily => "String or Symbol. Font family of colorbar tick labels.", + :colorbar_tickfontsize => "Integer. Font pointsize of colorbar tick entries.", + :colorbar_tickfontcolor => "Color Type. Font color of colorbar tick entries", + :colorbar_scale => "Symbol. Scale of the colorbar axis: `:none`, `:ln`, `:log2`, `:log10`", + :colorbar_formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.", + :legendfont => "Font. Font of legend items.", + :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, PlotText (created with `text(args...)`), or a tuple of arguments to `text` (e.g., `(\"Label\", 8, :red, :top)`). Add one-off text annotations at the x,y coordinates.", + :annotationfontfamily => "String or Symbol. Font family of annotations.", + :annotationfontsize => "Integer. Font pointsize of annotations.", + :annotationhalign => "Symbol. horizontal alignment of annotations, :hcenter, :left, :right or :center.", + :annotationvalign => "Symbol. Vertical alignment of annotations, :vcenter, :top, :bottom or :center.", + :annotationrotation => "Float. Rotation of annotations in degrees.", + :annotationcolor => "Colorant or :match. Color of annotations.", + :projection => "Symbol or String. '3d' or 'polar'", + :aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.", + :margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.", + :left_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the left of the subplot.", + :top_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the top of the subplot.", + :right_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding to the right of the subplot.", + :bottom_margin => "Measure (multiply by `mm`, `px`, etc) or `:match` (matches `:margin`). Specifies the extra padding on the bottom of the subplot.", + :subplot_index => "Integer. Internal (not set by user). Specifies the index of this subplot in the Plot's `plt.subplot` list.", + :colorbar_title => "String. Title of colorbar.", + :framestyle => "Symbol. Style of the axes frame. Choose from $(_allFramestyles)", + :camera => "NTuple{2, Real}. Sets the view angle (azimuthal, elevation) for 3D plots", -# axis args -:guide => "String. Axis guide (label).", -:guide_position => "Symbol. Position of axis guides: :top, :bottom, :left or :right", -:lims => "NTuple{2,Number} or Symbol. Force axis limits. Only finite values are used (you can set only the right limit with `xlims = (-Inf, 2)` for example). `:round` widens the limit to the nearest round number ie. [0.1,3.6]=>[0.0,4.0]", -:ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`", -:scale => "Symbol. Scale of the axis: `:none`, `:ln`, `:log2`, `:log10`", -:rotation => "Number. Degrees rotation of tick labels.", -:flip => "Bool. Should we flip (reverse) the axis?", -:formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.", -:tickfontfamily => "String or Symbol. Font family of tick labels.", -:tickfontsize => "Integer. Font pointsize of tick labels.", -:tickfonthalign => "Symbol. Font horizontal alignment of tick labels: :hcenter, :left, :right or :center", -:tickfontvalign => "Symbol. Font vertical alignment of tick labels: :vcenter, :top, :bottom or :center", -:tickfontrotation => "Real. Font rotation of tick labels", -:tickfontcolor => "Color Type. Font color of tick labels", -:guidefontfamily => "String or Symbol. Font family of axes guides.", -:guidefontsize => "Integer. Font pointsize of axes guides.", -:guidefonthalign => "Symbol. Font horizontal alignment of axes guides: :hcenter, :left, :right or :center", -:guidefontvalign => "Symbol. Font vertical alignment of axes guides: :vcenter, :top, :bottom or :center", -:guidefontrotation => "Real. Font rotation of axes guides", -:guidefontcolor => "Color Type. Font color of axes guides", -:foreground_color_axis => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis ticks.", -:foreground_color_border => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of plot area border (spines).", -:foreground_color_text => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of tick labels.", -:foreground_color_guide => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis guides (axis labels).", -:mirror => "Bool. Switch the side of the tick labels (right or top).", -:grid => "Bool, Symbol, String or `nothing`. Show the grid lines? `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:none`, `:off`", -:foreground_color_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of grid lines.", -:gridalpha => "Number in [0,1]. The alpha/opacity override for the grid lines.", -:gridstyle => "Symbol. Style of the grid lines. Choose from $(_allStyles)", -:gridlinewidth => "Number. Width of the grid lines (in pixels)", -:foreground_color_minor_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of minor grid lines.", -:minorgrid => "Bool. Adds minor grid lines and ticks to the plot. Set minorticks to change number of gridlines", -:minorticks => "Integer. Intervals to divide the gap between major ticks into", -:minorgridalpha => "Number in [0,1]. The alpha/opacity override for the minorgrid lines.", -:minorgridstyle => "Symbol. Style of the minor grid lines. Choose from $(_allStyles)", -:minorgridlinewidth => "Number. Width of the minor grid lines (in pixels)", -:tick_direction => "Symbol. Direction of the ticks. `:in` or `:out`", -:showaxis => "Bool, Symbol or String. Show the axis. `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:off`", -:widen => "Bool. Widen the axis limits by a small factor to avoid cut-off markers and lines at the borders. Defaults to `true`.", -:draw_arrow => "Bool. Draw arrow at the end of the axis.", + # axis args + :guide => "String. Axis guide (label).", + :guide_position => "Symbol. Position of axis guides: :top, :bottom, :left or :right", + :lims => """ + NTuple{2,Number} or Symbol. Force axis limits. Only finite values are used (you can set only the right limit with `xlims = (-Inf, 2)` for example). + `:round` widens the limit to the nearest round number ie. [0.1,3.6]=>[0.0,4.0] + `:symmetric` sets the limits to be symmetric around zero. + Set widen=true to widen the specified limits (as occurs when lims are not specified). + """, + :ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`", + :scale => "Symbol. Scale of the axis: `:none`, `:ln`, `:log2`, `:log10`", + :rotation => "Number. Degrees rotation of tick labels.", + :flip => "Bool. Should we flip (reverse) the axis?", + :formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.", + :tickfontfamily => "String or Symbol. Font family of tick labels.", + :tickfontsize => "Integer. Font pointsize of tick labels.", + :tickfonthalign => "Symbol. Font horizontal alignment of tick labels: :hcenter, :left, :right or :center", + :tickfontvalign => "Symbol. Font vertical alignment of tick labels: :vcenter, :top, :bottom or :center", + :tickfontrotation => "Real. Font rotation of tick labels", + :tickfontcolor => "Color Type. Font color of tick labels", + :guidefontfamily => "String or Symbol. Font family of axes guides.", + :guidefontsize => "Integer. Font pointsize of axes guides.", + :guidefonthalign => "Symbol. Font horizontal alignment of axes guides: :hcenter, :left, :right or :center", + :guidefontvalign => "Symbol. Font vertical alignment of axes guides: :vcenter, :top, :bottom or :center", + :guidefontrotation => "Real. Font rotation of axes guides", + :guidefontcolor => "Color Type. Font color of axes guides", + :foreground_color_axis => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis ticks.", + :foreground_color_border => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of plot area border (spines).", + :foreground_color_text => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of tick labels.", + :foreground_color_guide => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of axis guides (axis labels).", + :mirror => "Bool. Switch the side of the tick labels (right or top).", + :grid => "Bool, Symbol, String or `nothing`. Show the grid lines? `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:none`, `:off`", + :foreground_color_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of grid lines.", + :gridalpha => "Number in [0,1]. The alpha/opacity override for the grid lines.", + :gridstyle => "Symbol. Style of the grid lines. Choose from $(_allStyles)", + :gridlinewidth => "Number. Width of the grid lines (in pixels)", + :foreground_color_minor_grid => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of minor grid lines.", + :minorgrid => "Bool. Adds minor grid lines and ticks to the plot. Set minorticks to change number of gridlines", + :minorticks => "Integer. Intervals to divide the gap between major ticks into", + :minorgridalpha => "Number in [0,1]. The alpha/opacity override for the minorgrid lines.", + :minorgridstyle => "Symbol. Style of the minor grid lines. Choose from $(_allStyles)", + :minorgridlinewidth => "Number. Width of the minor grid lines (in pixels)", + :tick_direction => "Symbol. Direction of the ticks. `:in`, `:out` or `:none`", + :showaxis => "Bool, Symbol or String. Show the axis. `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:off`", + :widen => """ + Bool or :auto. Widen the axis limits by a small factor to avoid cut-off markers and lines at the borders. + Defaults to `:auto`, which widens unless limits were manually set. + """, + :draw_arrow => "Bool. Draw arrow at the end of the axis.", ) diff --git a/src/args.jl b/src/args.jl index c640ed39..4fa64f5d 100644 --- a/src/args.jl +++ b/src/args.jl @@ -1,7 +1,7 @@ function makeplural(s::Symbol) str = string(s) if last(str) != 's' - return Symbol(string(s,"s")) + return Symbol(string(s, "s")) end return s end @@ -25,7 +25,7 @@ function add_aliases(sym::Symbol, aliases::Symbol...) end function add_non_underscore_aliases!(aliases::Dict{Symbol,Symbol}) - for (k,v) in aliases + for (k, v) in aliases s = string(k) if '_' in s aliases[make_non_underscore(k)] = v @@ -44,22 +44,42 @@ end # ------------------------------------------------------------ const _allAxes = [:auto, :left, :right] -const _axesAliases = Dict{Symbol,Symbol}( - :a => :auto, - :l => :left, - :r => :right -) +const _axesAliases = Dict{Symbol,Symbol}(:a => :auto, :l => :left, :r => :right) -const _3dTypes = [ - :path3d, :scatter3d, :surface, :wireframe, :contour3d, :volume, :mesh3d -] -const _allTypes = vcat([ - :none, :line, :path, :steppre, :steppost, :sticks, :scatter, - :heatmap, :hexbin, :barbins, :barhist, :histogram, :scatterbins, - :scatterhist, :stepbins, :stephist, :bins2d, :histogram2d, :histogram3d, - :density, :bar, :hline, :vline, - :contour, :pie, :shape, :image -], _3dTypes) +const _3dTypes = [:path3d, :scatter3d, :surface, :wireframe, :contour3d, :volume, :mesh3d] +const _allTypes = vcat( + [ + :none, + :line, + :path, + :steppre, + :stepmid, + :steppost, + :sticks, + :scatter, + :heatmap, + :hexbin, + :barbins, + :barhist, + :histogram, + :scatterbins, + :scatterhist, + :stepbins, + :stephist, + :bins2d, + :histogram2d, + :histogram3d, + :density, + :bar, + :hline, + :vline, + :contour, + :pie, + :shape, + :image, + ], + _3dTypes, +) const _typeAliases = Dict{Symbol,Symbol}( :n => :none, @@ -101,8 +121,9 @@ const _typeAliases = Dict{Symbol,Symbol}( add_non_underscore_aliases!(_typeAliases) const _histogram_like = [:histogram, :barhist, :barbins] -const _line_like = [:line, :path, :steppre, :steppost] -const _surface_like = [:contour, :contourf, :contour3d, :heatmap, :surface, :wireframe, :image] +const _line_like = [:line, :path, :steppre, :stepmid, :steppost] +const _surface_like = + [:contour, :contourf, :contour3d, :heatmap, :surface, :wireframe, :image] like_histogram(seriestype::Symbol) = seriestype in _histogram_like like_line(seriestype::Symbol) = seriestype in _line_like @@ -117,88 +138,88 @@ ispolar(series::Series) = ispolar(series.plotattributes[:subplot]) const _allStyles = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _styleAliases = Dict{Symbol,Symbol}( - :a => :auto, - :s => :solid, - :d => :dash, - :dd => :dashdot, - :ddd => :dashdotdot, + :a => :auto, + :s => :solid, + :d => :dash, + :dd => :dashdot, + :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, + :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 _markerAliases = Dict{Symbol,Symbol}( - :n => :none, - :no => :none, - :a => :auto, - :ellipse => :circle, - :c => :circle, - :circ => :circle, - :square => :rect, - :sq => :rect, - :r => :rect, - :d => :diamond, - :^ => :utriangle, - :ut => :utriangle, - :utri => :utriangle, - :uptri => :utriangle, - :uptriangle => :utriangle, - :v => :dtriangle, - :V => :dtriangle, - :dt => :dtriangle, - :dtri => :dtriangle, - :downtri => :dtriangle, - :downtriangle => :dtriangle, - :> => :rtriangle, - :rt => :rtriangle, - :rtri => :rtriangle, + :n => :none, + :no => :none, + :a => :auto, + :ellipse => :circle, + :c => :circle, + :circ => :circle, + :square => :rect, + :sq => :rect, + :r => :rect, + :d => :diamond, + :^ => :utriangle, + :ut => :utriangle, + :utri => :utriangle, + :uptri => :utriangle, + :uptriangle => :utriangle, + :v => :dtriangle, + :V => :dtriangle, + :dt => :dtriangle, + :dtri => :dtriangle, + :downtri => :dtriangle, + :downtriangle => :dtriangle, + :> => :rtriangle, + :rt => :rtriangle, + :rtri => :rtriangle, :righttri => :rtriangle, :righttriangle => :rtriangle, - :< => :ltriangle, - :lt => :ltriangle, - :ltri => :ltriangle, + :< => :ltriangle, + :lt => :ltriangle, + :ltri => :ltriangle, :lighttri => :ltriangle, :lighttriangle => :ltriangle, - # :+ => :cross, - :plus => :cross, - # :x => :xcross, - :X => :xcross, - :star => :star5, - :s => :star5, - :star1 => :star5, - :s2 => :star8, - :star2 => :star8, - :p => :pentagon, - :pent => :pentagon, - :h => :hexagon, - :hex => :hexagon, - :hep => :heptagon, - :o => :octagon, - :oct => :octagon, - :spike => :vline, + # :+ => :cross, + :plus => :cross, + # :x => :xcross, + :X => :xcross, + :star => :star5, + :s => :star5, + :star1 => :star5, + :s2 => :star8, + :star2 => :star8, + :p => :pentagon, + :pent => :pentagon, + :h => :hexagon, + :hex => :hexagon, + :hep => :heptagon, + :o => :octagon, + :oct => :octagon, + :spike => :vline, ) const _positionAliases = Dict{Symbol,Symbol}( @@ -219,16 +240,34 @@ const _positionAliases = Dict{Symbol,Symbol}( const _allScales = [:identity, :ln, :log2, :log10, :asinh, :sqrt] const _logScales = [:ln, :log2, :log10] const _logScaleBases = Dict(:ln => ℯ, :log2 => 2.0, :log10 => 10.0) -const _scaleAliases = Dict{Symbol,Symbol}( - :none => :identity, - :log => :log10, -) +const _scaleAliases = Dict{Symbol,Symbol}(:none => :identity, :log => :log10) -const _allGridSyms = [:x, :y, :z, - :xy, :xz, :yx, :yz, :zx, :zy, - :xyz, :xzy, :yxz, :yzx, :zxy, :zyx, - :all, :both, :on, :yes, :show, - :none, :off, :no, :hide] +const _allGridSyms = [ + :x, + :y, + :z, + :xy, + :xz, + :yx, + :yz, + :zx, + :zy, + :xyz, + :xzy, + :yxz, + :yzx, + :zxy, + :zyx, + :all, + :both, + :on, + :yes, + :show, + :none, + :off, + :no, + :hide, +] const _allGridArgs = [_allGridSyms; string.(_allGridSyms); nothing] hasgrid(arg::Nothing, letter) = false hasgrid(arg::Bool, letter) = arg @@ -236,17 +275,39 @@ function hasgrid(arg::Symbol, letter) if arg in _allGridSyms arg in (:all, :both, :on) || occursin(string(letter), string(arg)) else - @warn("Unknown grid argument $arg; $(Symbol(letter, :grid)) was set to `true` instead.") + @warn( + "Unknown grid argument $arg; $(Symbol(letter, :grid)) was set to `true` instead." + ) true end end hasgrid(arg::AbstractString, letter) = hasgrid(Symbol(arg), letter) -const _allShowaxisSyms = [:x, :y, :z, - :xy, :xz, :yx, :yz, :zx, :zy, - :xyz, :xzy, :yxz, :yzx, :zxy, :zyx, - :all, :both, :on, :yes, :show, - :off, :no, :hide] +const _allShowaxisSyms = [ + :x, + :y, + :z, + :xy, + :xz, + :yx, + :yz, + :zx, + :zy, + :xyz, + :xzy, + :yxz, + :yzx, + :zxy, + :zyx, + :all, + :both, + :on, + :yes, + :show, + :off, + :no, + :hide, +] const _allShowaxisArgs = [_allGridSyms; string.(_allGridSyms)] showaxis(arg::Nothing, letter) = false showaxis(arg::Bool, letter) = arg @@ -254,214 +315,233 @@ function showaxis(arg::Symbol, letter) if arg in _allGridSyms arg in (:all, :both, :on, :yes) || occursin(string(letter), string(arg)) else - @warn("Unknown showaxis argument $arg; $(Symbol(letter, :showaxis)) was set to `true` instead.") + @warn( + "Unknown showaxis argument $arg; $(Symbol(letter, :showaxis)) was set to `true` instead." + ) true end end showaxis(arg::AbstractString, letter) = hasgrid(Symbol(arg), letter) const _allFramestyles = [:box, :semi, :axes, :origin, :zerolines, :grid, :none] -const _framestyleAliases = Dict{Symbol, Symbol}( - :frame => :box, - :border => :box, - :on => :box, - :transparent => :semi, - :semitransparent => :semi, +const _framestyleAliases = Dict{Symbol,Symbol}( + :frame => :box, + :border => :box, + :on => :box, + :transparent => :semi, + :semitransparent => :semi, ) const _bar_width = 0.8 # ----------------------------------------------------------------------------- const _series_defaults = KW( - :label => :auto, - :colorbar_entry => true, - :seriescolor => :auto, - :seriesalpha => nothing, - :seriestype => :path, - :linestyle => :solid, - :linewidth => :auto, - :linecolor => :auto, - :linealpha => nothing, - :fillrange => nothing, # ribbons, areas, etc - :fillcolor => :match, - :fillalpha => nothing, - :fillstyle => nothing, - :markershape => :none, - :markercolor => :match, - :markeralpha => nothing, - :markersize => 4, - :markerstrokestyle => :solid, - :markerstrokewidth => 1, - :markerstrokecolor => :match, - :markerstrokealpha => nothing, - :bins => :auto, # number of bins for hists - :smooth => false, # regression line? - :group => nothing, # groupby vector - :x => nothing, - :y => nothing, - :z => nothing, # depth for contour, surface, etc - :marker_z => nothing, # value for color scale - :line_z => nothing, - :fill_z => nothing, - :levels => 15, - :orientation => :vertical, - :bar_position => :overlay, # for bar plots and histograms: could also be stack (stack up) or dodge (side by side) - :bar_width => nothing, - :bar_edges => false, - :xerror => nothing, - :yerror => nothing, - :zerror => nothing, - :ribbon => nothing, - :quiver => nothing, - :arrow => nothing, # allows for adding arrows to line/path... call `arrow(args...)` - :normalize => false, # do we want a normalized histogram? - :weights => nothing, # optional weights for histograms (1D and 2D) - :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 - :contour_labels => false, - :subplot => :auto, # which subplot(s) does this series belong to? + :label => :auto, + :colorbar_entry => true, + :seriescolor => :auto, + :seriesalpha => nothing, + :seriestype => :path, + :linestyle => :solid, + :linewidth => :auto, + :linecolor => :auto, + :linealpha => nothing, + :fillrange => nothing, # ribbons, areas, etc + :fillcolor => :match, + :fillalpha => nothing, + :fillstyle => nothing, + :markershape => :none, + :markercolor => :match, + :markeralpha => nothing, + :markersize => 4, + :markerstrokestyle => :solid, + :markerstrokewidth => 1, + :markerstrokecolor => :match, + :markerstrokealpha => nothing, + :bins => :auto, # number of bins for hists + :smooth => false, # regression line? + :group => nothing, # groupby vector + :x => nothing, + :y => nothing, + :z => nothing, # depth for contour, surface, etc + :marker_z => nothing, # value for color scale + :line_z => nothing, + :fill_z => nothing, + :levels => 15, + :orientation => :vertical, + :bar_position => :overlay, # for bar plots and histograms: could also be stack (stack up) or dodge (side by side) + :bar_width => nothing, + :bar_edges => false, + :xerror => nothing, + :yerror => nothing, + :zerror => nothing, + :ribbon => nothing, + :quiver => nothing, + :arrow => nothing, # allows for adding arrows to line/path... call `arrow(args...)` + :normalize => false, # do we want a normalized histogram? + :weights => nothing, # optional weights for histograms (1D and 2D) + :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 + :contour_labels => false, + :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 :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) - :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. - :connections => nothing, # tuple of arrays to specifiy connectivity of a 3d mesh - :extra_kwargs => Dict() + # one logical series to be broken up (path and markers, for example) + :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. + :connections => nothing, # tuple of arrays to specifiy connectivity of a 3d mesh + :extra_kwargs => Dict(), ) - const _plot_defaults = KW( - :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_outside => :match, # background outside grid, - :foreground_color => :auto, # default for all foregrounds, and title color, - :fontfamily => "sans-serif", - :size => (600,400), - :pos => (0,0), - :window_title => "Plots.jl", - :show => false, - :layout => 1, - :link => :none, - :overwrite_figure => true, - :html_output_format => :auto, - :tex_output_standalone => false, - :inset_subplots => nothing, # optionally pass a vector of (parent,bbox) tuples which are - # the parent layout and the relative bounding box of inset subplots - :dpi => DPI, # dots per inch for images, etc - :thickness_scaling => 1, - :display_type => :auto, - :warn_on_unsupported => true, - :extra_plot_kwargs => Dict(), - :extra_kwargs => :series, # directs collection of extra_kwargs + :plot_title => "", + :plot_titleindex => 0, + :plot_titlefontsize => 16, + :plot_titlelocation => :center, # also :left or :right + :plot_titlefontfamily => :match, + :plot_titlefonthalign => :hcenter, + :plot_titlefontvalign => :vcenter, + :plot_titlefontrotation => 0.0, + :plot_titlefontcolor => :match, + :plot_titlevspan => 0.05, # vertical span of the plot title, here 5% + :background_color => colorant"white", # default for all backgrounds, + :background_color_outside => :match, # background outside grid, + :foreground_color => :auto, # default for all foregrounds, and title color, + :fontfamily => "sans-serif", + :size => (600, 400), + :pos => (0, 0), + :window_title => "Plots.jl", + :show => false, + :layout => 1, + :link => :none, + :overwrite_figure => true, + :html_output_format => :auto, + :tex_output_standalone => false, + :inset_subplots => nothing, # optionally pass a vector of (parent,bbox) tuples which are + # the parent layout and the relative bounding box of inset subplots + :dpi => DPI, # dots per inch for images, etc + :thickness_scaling => 1, + :display_type => :auto, + :warn_on_unsupported => true, + :extra_plot_kwargs => Dict(), + :extra_kwargs => :series, # directs collection of extra_kwargs ) - const _subplot_defaults = KW( - :title => "", - :titlelocation => :center, # also :left or :right - :fontfamily_subplot => :match, - :titlefontfamily => :match, - :titlefontsize => 14, - :titlefonthalign => :hcenter, - :titlefontvalign => :vcenter, - :titlefontrotation => 0.0, - :titlefontcolor => :match, + :title => "", + :titlelocation => :center, # also :left or :right + :fontfamily_subplot => :match, + :titlefontfamily => :match, + :titlefontsize => 14, + :titlefonthalign => :hcenter, + :titlefontvalign => :vcenter, + :titlefontrotation => 0.0, + :titlefontcolor => :match, :background_color_subplot => :match, # default for other bg colors... match takes plot default - :background_color_legend => :match, # background of legend - :background_color_inside => :match, # background inside grid + :background_color_legend => :match, # background of legend + :background_color_inside => :match, # background inside grid :foreground_color_subplot => :match, # default for other fg colors... match takes plot default - :foreground_color_legend => :match, # foreground of legend - :foreground_color_title => :match, # title color - :color_palette => :auto, - :legend => :best, - :legendtitle => nothing, - :colorbar => :legend, - :clims => :auto, - :legendfontfamily => :match, - :legendfontsize => 8, - :legendfonthalign => :hcenter, - :legendfontvalign => :vcenter, - :legendfontrotation => 0.0, - :legendfontcolor => :match, - :legendtitlefontfamily => :match, - :legendtitlefontsize => 11, - :legendtitlefonthalign => :hcenter, - :legendtitlefontvalign => :vcenter, - :legendtitlefontrotation => 0.0, - :legendtitlefontcolor => :match, - :annotations => [], # annotation tuples... list of (x,y,annotation) - :projection => :none, # can also be :polar or :3d - :aspect_ratio => :auto, # choose from :none or :equal - :margin => 1mm, - :left_margin => :match, - :top_margin => :match, - :right_margin => :match, - :bottom_margin => :match, - :subplot_index => -1, - :colorbar_title => "", - :colorbar_titlefontsize => 10, - :colorbar_title_location => :center, # also :left or :right - :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() + :foreground_color_legend => :match, # foreground of legend + :foreground_color_title => :match, # title color + :color_palette => :auto, + :legend => :best, + :legendtitle => nothing, + :colorbar => :legend, + :clims => :auto, + :colorbar_fontfamily => :match, + :colorbar_ticks => :auto, + :colorbar_tickfontfamily => :match, + :colorbar_tickfontsize => 8, + :colorbar_tickfonthalign => :hcenter, + :colorbar_tickfontvalign => :vcenter, + :colorbar_tickfontrotation => 0.0, + :colorbar_tickfontcolor => :match, + :colorbar_scale => :identity, + :colorbar_formatter => :auto, + :colorbar_discrete_values => [], + :colorbar_continuous_values => zeros(0), + :legendfontfamily => :match, + :legendfontsize => 8, + :legendfonthalign => :hcenter, + :legendfontvalign => :vcenter, + :legendfontrotation => 0.0, + :legendfontcolor => :match, + :legendtitlefontfamily => :match, + :legendtitlefontsize => 11, + :legendtitlefonthalign => :hcenter, + :legendtitlefontvalign => :vcenter, + :legendtitlefontrotation => 0.0, + :legendtitlefontcolor => :match, + :annotations => [], # annotation tuples... list of (x,y,annotation) + :annotationfontfamily => :match, + :annotationfontsize => 14, + :annotationhalign => :hcenter, + :annotationvalign => :vcenter, + :annotationrotation => 0.0, + :annotationcolor => :match, + :projection => :none, # can also be :polar or :3d + :aspect_ratio => :auto, # choose from :none or :equal + :margin => 1mm, + :left_margin => :match, + :top_margin => :match, + :right_margin => :match, + :bottom_margin => :match, + :subplot_index => -1, + :colorbar_title => "", + :colorbar_titlefontsize => 10, + :colorbar_title_location => :center, # also :left or :right + :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( - :guide => "", - :guide_position => :auto, - :lims => :auto, - :ticks => :auto, - :scale => :identity, - :rotation => 0, - :flip => false, - :link => [], - :tickfontfamily => :match, - :tickfontsize => 8, - :tickfonthalign => :hcenter, - :tickfontvalign => :vcenter, - :tickfontrotation => 0.0, - :tickfontcolor => :match, - :guidefontfamily => :match, - :guidefontsize => 11, - :guidefonthalign => :hcenter, - :guidefontvalign => :vcenter, - :guidefontrotation => 0.0, - :guidefontcolor => :match, - :foreground_color_axis => :match, # axis border/tick colors, - :foreground_color_border => :match, # plot area border/spines, - :foreground_color_text => :match, # tick text color, - :foreground_color_guide => :match, # guide text color, - :discrete_values => [], - :formatter => :auto, - :mirror => false, - :grid => true, - :foreground_color_grid => :match, # grid color - :gridalpha => 0.1, - :gridstyle => :solid, - :gridlinewidth => 0.5, + :guide => "", + :guide_position => :auto, + :lims => :auto, + :ticks => :auto, + :scale => :identity, + :rotation => 0, + :flip => false, + :link => [], + :tickfontfamily => :match, + :tickfontsize => 8, + :tickfonthalign => :hcenter, + :tickfontvalign => :vcenter, + :tickfontrotation => 0.0, + :tickfontcolor => :match, + :guidefontfamily => :match, + :guidefontsize => 11, + :guidefonthalign => :hcenter, + :guidefontvalign => :vcenter, + :guidefontrotation => 0.0, + :guidefontcolor => :match, + :foreground_color_axis => :match, # axis border/tick colors, + :foreground_color_border => :match, # plot area border/spines, + :foreground_color_text => :match, # tick text color, + :foreground_color_guide => :match, # guide text color, + :discrete_values => [], + :formatter => :auto, + :mirror => false, + :grid => true, + :foreground_color_grid => :match, # grid color + :gridalpha => 0.1, + :gridstyle => :solid, + :gridlinewidth => 0.5, :foreground_color_minor_grid => :match, # grid color - :minorgridalpha => 0.05, - :minorgridstyle => :solid, - :minorgridlinewidth => 0.5, - :tick_direction => :in, - :minorticks => false, - :minorgrid => false, - :showaxis => true, - :widen => true, - :draw_arrow => false, + :minorgridalpha => 0.05, + :minorgridstyle => :solid, + :minorgridlinewidth => 0.5, + :tick_direction => :in, + :minorticks => false, + :minorgrid => false, + :showaxis => true, + :widen => :auto, + :draw_arrow => false, ) const _suppress_warnings = Set{Symbol}([ @@ -482,35 +562,45 @@ const _suppress_warnings = Set{Symbol}([ const _axis_defaults_byletter = KW() function reset_axis_defaults_byletter!() - for letter in (:x,:y,:z) + for letter in (:x, :y, :z) _axis_defaults_byletter[letter] = KW() - for (k,v) in _axis_defaults + for (k, v) in _axis_defaults _axis_defaults_byletter[letter][k] = v end end end reset_axis_defaults_byletter!() -for letter in (:x,:y,:z), k in keys(_axis_defaults) +for letter in (:x, :y, :z), k in keys(_axis_defaults) # allow the underscore version too: xguide or x_guide add_aliases(Symbol(letter, k), Symbol(letter, "_", k)) end -const _all_defaults = KW[ - _series_defaults, - _plot_defaults, - _subplot_defaults -] +const _all_defaults = KW[_series_defaults, _plot_defaults, _subplot_defaults] const _initial_defaults = deepcopy(_all_defaults) const _initial_axis_defaults = deepcopy(_axis_defaults) # to be able to reset font sizes to initial values -const _initial_fontsizes = Dict(:titlefontsize => _subplot_defaults[:titlefontsize], - :legendfontsize => _subplot_defaults[:legendfontsize], - :legendtitlefontsize => _subplot_defaults[:legendtitlefontsize], - :tickfontsize => _axis_defaults[:tickfontsize], - :guidefontsize => _axis_defaults[:guidefontsize]) +const _initial_plt_fontsizes = + Dict(:plot_titlefontsize => _plot_defaults[:plot_titlefontsize]) + +const _initial_sp_fontsizes = Dict( + :titlefontsize => _subplot_defaults[:titlefontsize], + :legendfontsize => _subplot_defaults[:legendfontsize], + :legendtitlefontsize => _subplot_defaults[:legendtitlefontsize], + :annotationfontsize => _subplot_defaults[:annotationfontsize], + :colorbar_tickfontsize => _subplot_defaults[:colorbar_tickfontsize], + :colorbar_titlefontsize => _subplot_defaults[:colorbar_titlefontsize], +) + +const _initial_ax_fontsizes = Dict( + :tickfontsize => _axis_defaults[:tickfontsize], + :guidefontsize => _axis_defaults[:guidefontsize], +) + +const _initial_fontsizes = + merge(_initial_plt_fontsizes, _initial_sp_fontsizes, _initial_ax_fontsizes) const _internal_args = [:plot_object, :series_plotindex, :markershape_to_add, :letter, :idxfilter] @@ -521,7 +611,8 @@ const _subplot_args = sort(union(collect(keys(_subplot_defaults)))) const _plot_args = sort(union(collect(keys(_plot_defaults)))) const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid] -const _magic_subplot_args = [:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont] +const _magic_subplot_args = + [:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont] const _magic_series_args = [:line, :marker, :fill] const _all_axis_args = sort(union([_axis_args; _magic_axis_args])) @@ -534,17 +625,24 @@ const _all_args = is_subplot_attr(k) = k in _all_subplot_args is_series_attr(k) = k in _all_series_args -is_axis_attr(k) = Symbol(chop(string(k); head=1, tail=0)) in _all_axis_args +is_axis_attr(k) = Symbol(chop(string(k); head = 1, tail = 0)) in _all_axis_args is_axis_attr_noletter(k) = k in _all_axis_args 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) # ----------------------------------------------------------------------------- -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 -function aliasesAndAutopick(plotattributes::AKW, sym::Symbol, aliases::Dict{Symbol,Symbol}, options::AVec, plotIndex::Int) +function aliasesAndAutopick( + plotattributes::AKW, + sym::Symbol, + aliases::Dict{Symbol,Symbol}, + options::AVec, + plotIndex::Int, +) if plotattributes[sym] == :auto plotattributes[sym] = autopick_ignore_none_auto(options, plotIndex) elseif haskey(aliases, plotattributes[sym]) @@ -552,19 +650,16 @@ function aliasesAndAutopick(plotattributes::AKW, sym::Symbol, aliases::Dict{Symb end end -function aliases(aliasMap::Dict{Symbol,Symbol}, val) - sortedkeys(filter((k,v)-> v==val, aliasMap)) -end +aliases(aliasMap::Dict{Symbol,Symbol}, val) = + sortedkeys(filter((k, v) -> v == val, aliasMap)) # ----------------------------------------------------------------------------- - # margin -add_aliases(:left_margin , :leftmargin ) -add_aliases(:top_margin , :topmargin) -add_aliases(:bottom_margin , :bottommargin) -add_aliases(:right_margin ,:rightmargin) - +add_aliases(:left_margin, :leftmargin) +add_aliases(:top_margin, :topmargin) +add_aliases(:bottom_margin, :bottommargin) +add_aliases(:right_margin, :rightmargin) # colors add_aliases(:seriescolor, :c, :color, :colour) @@ -574,36 +669,176 @@ add_aliases(:markerstrokecolor, :msc, :mscolor, :mscolour, :markerstrokecolour) add_aliases(:markerstrokewidth, :msw, :mswidth) add_aliases(:fillcolor, :fc, :fcolor, :fcolour, :fillcolour) -add_aliases(:background_color, :bg, :bgcolor, :bg_color, :background, - :background_colour, :bgcolour, :bg_colour) -add_aliases(:background_color_legend, :bg_legend, :bglegend, :bgcolor_legend, :bg_color_legend, :background_legend, - :background_colour_legend, :bgcolour_legend, :bg_colour_legend) -add_aliases(:background_color_subplot, :bg_subplot, :bgsubplot, :bgcolor_subplot, :bg_color_subplot, :background_subplot, - :background_colour_subplot, :bgcolour_subplot, :bg_colour_subplot) -add_aliases(:background_color_inside, :bg_inside, :bginside, :bgcolor_inside, :bg_color_inside, :background_inside, - :background_colour_inside, :bgcolour_inside, :bg_colour_inside) -add_aliases(:background_color_outside, :bg_outside, :bgoutside, :bgcolor_outside, :bg_color_outside, :background_outside, - :background_colour_outside, :bgcolour_outside, :bg_colour_outside) -add_aliases(:foreground_color, :fg, :fgcolor, :fg_color, :foreground, - :foreground_colour, :fgcolour, :fg_colour) -add_aliases(:foreground_color_legend, :fg_legend, :fglegend, :fgcolor_legend, :fg_color_legend, :foreground_legend, - :foreground_colour_legend, :fgcolour_legend, :fg_colour_legend) -add_aliases(:foreground_color_subplot, :fg_subplot, :fgsubplot, :fgcolor_subplot, :fg_color_subplot, :foreground_subplot, - :foreground_colour_subplot, :fgcolour_subplot, :fg_colour_subplot) -add_aliases(:foreground_color_grid, :fg_grid, :fggrid, :fgcolor_grid, :fg_color_grid, :foreground_grid, - :foreground_colour_grid, :fgcolour_grid, :fg_colour_grid, :gridcolor) -add_aliases(:foreground_color_minor_grid, :fg_minor_grid, :fgminorgrid, :fgcolor_minorgrid, :fg_color_minorgrid, :foreground_minorgrid, - :foreground_colour_minor_grid, :fgcolour_minorgrid, :fg_colour_minor_grid, :minorgridcolor) -add_aliases(:foreground_color_title, :fg_title, :fgtitle, :fgcolor_title, :fg_color_title, :foreground_title, - :foreground_colour_title, :fgcolour_title, :fg_colour_title, :titlecolor) -add_aliases(:foreground_color_axis, :fg_axis, :fgaxis, :fgcolor_axis, :fg_color_axis, :foreground_axis, - :foreground_colour_axis, :fgcolour_axis, :fg_colour_axis, :axiscolor) -add_aliases(:foreground_color_border, :fg_border, :fgborder, :fgcolor_border, :fg_color_border, :foreground_border, - :foreground_colour_border, :fgcolour_border, :fg_colour_border, :bordercolor) -add_aliases(:foreground_color_text, :fg_text, :fgtext, :fgcolor_text, :fg_color_text, :foreground_text, - :foreground_colour_text, :fgcolour_text, :fg_colour_text, :textcolor) -add_aliases(:foreground_color_guide, :fg_guide, :fgguide, :fgcolor_guide, :fg_color_guide, :foreground_guide, - :foreground_colour_guide, :fgcolour_guide, :fg_colour_guide, :guidecolor) +add_aliases( + :background_color, + :bg, + :bgcolor, + :bg_color, + :background, + :background_colour, + :bgcolour, + :bg_colour, +) +add_aliases( + :background_color_legend, + :bg_legend, + :bglegend, + :bgcolor_legend, + :bg_color_legend, + :background_legend, + :background_colour_legend, + :bgcolour_legend, + :bg_colour_legend, +) +add_aliases( + :background_color_subplot, + :bg_subplot, + :bgsubplot, + :bgcolor_subplot, + :bg_color_subplot, + :background_subplot, + :background_colour_subplot, + :bgcolour_subplot, + :bg_colour_subplot, +) +add_aliases( + :background_color_inside, + :bg_inside, + :bginside, + :bgcolor_inside, + :bg_color_inside, + :background_inside, + :background_colour_inside, + :bgcolour_inside, + :bg_colour_inside, +) +add_aliases( + :background_color_outside, + :bg_outside, + :bgoutside, + :bgcolor_outside, + :bg_color_outside, + :background_outside, + :background_colour_outside, + :bgcolour_outside, + :bg_colour_outside, +) +add_aliases( + :foreground_color, + :fg, + :fgcolor, + :fg_color, + :foreground, + :foreground_colour, + :fgcolour, + :fg_colour, +) +add_aliases( + :foreground_color_legend, + :fg_legend, + :fglegend, + :fgcolor_legend, + :fg_color_legend, + :foreground_legend, + :foreground_colour_legend, + :fgcolour_legend, + :fg_colour_legend, +) +add_aliases( + :foreground_color_subplot, + :fg_subplot, + :fgsubplot, + :fgcolor_subplot, + :fg_color_subplot, + :foreground_subplot, + :foreground_colour_subplot, + :fgcolour_subplot, + :fg_colour_subplot, +) +add_aliases( + :foreground_color_grid, + :fg_grid, + :fggrid, + :fgcolor_grid, + :fg_color_grid, + :foreground_grid, + :foreground_colour_grid, + :fgcolour_grid, + :fg_colour_grid, + :gridcolor, +) +add_aliases( + :foreground_color_minor_grid, + :fg_minor_grid, + :fgminorgrid, + :fgcolor_minorgrid, + :fg_color_minorgrid, + :foreground_minorgrid, + :foreground_colour_minor_grid, + :fgcolour_minorgrid, + :fg_colour_minor_grid, + :minorgridcolor, +) +add_aliases( + :foreground_color_title, + :fg_title, + :fgtitle, + :fgcolor_title, + :fg_color_title, + :foreground_title, + :foreground_colour_title, + :fgcolour_title, + :fg_colour_title, + :titlecolor, +) +add_aliases( + :foreground_color_axis, + :fg_axis, + :fgaxis, + :fgcolor_axis, + :fg_color_axis, + :foreground_axis, + :foreground_colour_axis, + :fgcolour_axis, + :fg_colour_axis, + :axiscolor, +) +add_aliases( + :foreground_color_border, + :fg_border, + :fgborder, + :fgcolor_border, + :fg_color_border, + :foreground_border, + :foreground_colour_border, + :fgcolour_border, + :fg_colour_border, + :bordercolor, +) +add_aliases( + :foreground_color_text, + :fg_text, + :fgtext, + :fgcolor_text, + :fg_color_text, + :foreground_text, + :foreground_colour_text, + :fgcolour_text, + :fg_colour_text, + :textcolor, +) +add_aliases( + :foreground_color_guide, + :fg_guide, + :fgguide, + :fgcolor_guide, + :fg_color_guide, + :foreground_guide, + :foreground_colour_guide, + :fgcolour_guide, + :fg_colour_guide, + :guidecolor, +) # alphas add_aliases(:seriesalpha, :alpha, :α, :opacity) @@ -643,11 +878,29 @@ add_aliases(:zlims, :zlim, :zlimit, :zlimits) add_aliases(:zticks, :ztick) add_aliases(:zrotation, :zrot, :zr) add_aliases(:guidefontsize, :labelfontsize) -add_aliases(:fill_z, :fillz, :fz, :surfacecolor, :surfacecolour, :sc, :surfcolor, :surfcolour) +add_aliases( + :fill_z, + :fillz, + :fz, + :surfacecolor, + :surfacecolour, + :sc, + :surfcolor, + :surfcolour, +) add_aliases(:legend, :leg, :key) add_aliases(:legendtitle, :legend_title, :labeltitle, :label_title, :leg_title, :key_title) add_aliases(:colorbar, :cb, :cbar, :colorkey) -add_aliases(:colorbar_title, :colorbartitle, :cb_title, :cbtitle, :cbartitle, :cbar_title, :colorkeytitle, :colorkey_title) +add_aliases( + :colorbar_title, + :colorbartitle, + :cb_title, + :cbtitle, + :cbartitle, + :cbar_title, + :colorkeytitle, + :colorkey_title, +) add_aliases(:clims, :clim, :cbarlims, :cbar_lims, :climits, :color_limits) add_aliases(:smooth, :regression, :reg) add_aliases(:levels, :nlevels, :nlev, :levs) @@ -665,18 +918,75 @@ add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty) add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio) add_aliases(:subplot, :sp, :subplt, :splt) add_aliases(:projection, :proj) -add_aliases(:titlelocation, :title_location, :title_loc, :titleloc, :title_position, :title_pos, :titlepos, :titleposition, :title_align, :title_alignment) -add_aliases(:series_annotations, :series_ann, :seriesann, :series_anns, :seriesanns, :series_annotation, :text, :txt, :texts, :txts) +add_aliases( + :titlelocation, + :title_location, + :title_loc, + :titleloc, + :title_position, + :title_pos, + :titlepos, + :titleposition, + :title_align, + :title_alignment, +) +add_aliases( + :series_annotations, + :series_ann, + :seriesann, + :series_anns, + :seriesanns, + :series_annotation, + :text, + :txt, + :texts, + :txts, +) add_aliases(:html_output_format, :format, :fmt, :html_format) add_aliases(:orientation, :direction, :dir) add_aliases(:inset_subplots, :inset, :floating) add_aliases(:stride, :wirefame_stride, :surface_stride, :surf_str, :str) add_aliases(:gridlinewidth, :gridwidth, :grid_linewidth, :grid_width, :gridlw, :grid_lw) add_aliases(:gridstyle, :grid_style, :gridlinestyle, :grid_linestyle, :grid_ls, :gridls) -add_aliases(:minorgridlinewidth, :minorgridwidth, :minorgrid_linewidth, :minorgrid_width, :minorgridlw, :minorgrid_lw) -add_aliases(:minorgridstyle, :minorgrid_style, :minorgridlinestyle, :minorgrid_linestyle, :minorgrid_ls, :minorgridls) -add_aliases(:framestyle, :frame_style, :frame, :axesstyle, :axes_style, :boxstyle, :box_style, :box, :borderstyle, :border_style, :border) -add_aliases(:tick_direction, :tickdirection, :tick_dir, :tickdir, :tick_orientation, :tickorientation, :tick_or, :tickor) +add_aliases( + :minorgridlinewidth, + :minorgridwidth, + :minorgrid_linewidth, + :minorgrid_width, + :minorgridlw, + :minorgrid_lw, +) +add_aliases( + :minorgridstyle, + :minorgrid_style, + :minorgridlinestyle, + :minorgrid_linestyle, + :minorgrid_ls, + :minorgridls, +) +add_aliases( + :framestyle, + :frame_style, + :frame, + :axesstyle, + :axes_style, + :boxstyle, + :box_style, + :box, + :borderstyle, + :border_style, + :border, +) +add_aliases( + :tick_direction, + :tickdirection, + :tick_dir, + :tickdir, + :tick_orientation, + :tickorientation, + :tick_or, + :tickor, +) add_aliases(:camera, :cam, :viewangle, :view_angle) add_aliases(:contour_labels, :contourlabels, :clabels, :clabs) add_aliases(:warn_on_unsupported, :warn) @@ -694,7 +1004,7 @@ function parse_axis_kw(s::Symbol) s = string(s) for letter in ('x', 'y', 'z') if startswith(s, letter) - return (Symbol(letter), Symbol(chop(s, head=1, tail=0))) + return (Symbol(letter), Symbol(chop(s, head = 1, tail = 0))) end end return nothing @@ -752,14 +1062,12 @@ function default(; reset = true, kw...) end kw = KW(kw) RecipesPipeline.preprocess_attributes!(kw) - for (k,v) in kw + for (k, v) in kw default(k, v) end end -function default(plotattributes::AKW, k::Symbol) - get(plotattributes, k, default(k)) -end +default(plotattributes::AKW, k::Symbol) = get(plotattributes, k, default(k)) function reset_defaults() foreach(merge!, _all_defaults, _initial_defaults) @@ -785,109 +1093,118 @@ function handleColors!(plotattributes::AKW, arg, csym::Symbol) false end - - function processLineArg(plotattributes::AKW, arg) # seriestype if allLineTypes(arg) plotattributes[:seriestype] = arg - # linestyle + # linestyle elseif allStyles(arg) plotattributes[:linestyle] = arg elseif typeof(arg) <: Stroke arg.width === nothing || (plotattributes[:linewidth] = arg.width) - arg.color === nothing || (plotattributes[:linecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.color === nothing || ( + plotattributes[:linecolor] = + arg.color == :auto ? :auto : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[:linealpha] = arg.alpha) arg.style === nothing || (plotattributes[:linestyle] = arg.style) elseif typeof(arg) <: Brush - arg.size === nothing || (plotattributes[:fillrange] = arg.size) - arg.color === nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.size === nothing || (plotattributes[:fillrange] = arg.size) + arg.color === nothing || ( + plotattributes[:fillcolor] = + arg.color == :auto ? :auto : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[:fillalpha] = arg.alpha) arg.style === nothing || (plotattributes[:fillstyle] = arg.style) elseif typeof(arg) <: Arrow || arg in (:arrow, :arrows) plotattributes[:arrow] = arg - # linealpha + # linealpha elseif allAlphas(arg) plotattributes[:linealpha] = arg - # linewidth + # linewidth elseif allReals(arg) plotattributes[:linewidth] = arg - # color + # color elseif !handleColors!(plotattributes, arg, :linecolor) @warn("Skipped line arg $arg.") - end end - function processMarkerArg(plotattributes::AKW, arg) # markershape if allShapes(arg) plotattributes[:markershape] = arg - # stroke style + # stroke style elseif allStyles(arg) plotattributes[:markerstrokestyle] = arg elseif typeof(arg) <: Stroke arg.width === nothing || (plotattributes[:markerstrokewidth] = arg.width) - arg.color === nothing || (plotattributes[:markerstrokecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.color === nothing || ( + plotattributes[:markerstrokecolor] = + arg.color == :auto ? :auto : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[:markerstrokealpha] = arg.alpha) arg.style === nothing || (plotattributes[:markerstrokestyle] = arg.style) elseif typeof(arg) <: Brush - arg.size === nothing || (plotattributes[:markersize] = arg.size) - arg.color === nothing || (plotattributes[:markercolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.size === nothing || (plotattributes[:markersize] = arg.size) + arg.color === nothing || ( + plotattributes[:markercolor] = + arg.color == :auto ? :auto : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[:markeralpha] = arg.alpha) - # linealpha + # linealpha elseif allAlphas(arg) plotattributes[:markeralpha] = arg - # bool + # bool elseif typeof(arg) <: Bool plotattributes[:markershape] = arg ? :circle : :none - # markersize + # markersize elseif allReals(arg) plotattributes[:markersize] = arg - # markercolor + # markercolor elseif !handleColors!(plotattributes, arg, :markercolor) @warn("Skipped marker arg $arg.") - end end - function processFillArg(plotattributes::AKW, arg) # fr = get(plotattributes, :fillrange, 0) if typeof(arg) <: Brush - arg.size === nothing || (plotattributes[:fillrange] = arg.size) - arg.color === nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.size === nothing || (plotattributes[:fillrange] = arg.size) + arg.color === nothing || ( + plotattributes[:fillcolor] = + arg.color == :auto ? :auto : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[:fillalpha] = arg.alpha) arg.style === nothing || (plotattributes[:fillstyle] = arg.style) elseif typeof(arg) <: Bool plotattributes[:fillrange] = arg ? 0 : nothing - # fillrange function + # fillrange function elseif allFunctions(arg) plotattributes[:fillrange] = arg - # fillalpha + # fillalpha elseif allAlphas(arg) plotattributes[:fillalpha] = arg - # fillrange provided as vector or number - elseif typeof(arg) <: Union{AbstractArray{<:Real}, Real} + # fillrange provided as vector or number + elseif typeof(arg) <: Union{AbstractArray{<:Real},Real} plotattributes[:fillrange] = arg elseif !handleColors!(plotattributes, arg, :fillcolor) @@ -897,7 +1214,6 @@ function processFillArg(plotattributes::AKW, arg) return end - function processGridArg!(plotattributes::AKW, arg, letter) if arg in _allGridArgs || isa(arg, Bool) plotattributes[Symbol(letter, :grid)] = hasgrid(arg, letter) @@ -906,23 +1222,26 @@ function processGridArg!(plotattributes::AKW, arg, letter) plotattributes[Symbol(letter, :gridstyle)] = arg elseif typeof(arg) <: Stroke - arg.width === nothing || (plotattributes[Symbol(letter, :gridlinewidth)] = arg.width) - arg.color === nothing || (plotattributes[Symbol(letter, :foreground_color_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) + arg.width === nothing || + (plotattributes[Symbol(letter, :gridlinewidth)] = arg.width) + arg.color === nothing || ( + plotattributes[Symbol(letter, :foreground_color_grid)] = + arg.color in (:auto, :match) ? :match : plot_color(arg.color) + ) arg.alpha === nothing || (plotattributes[Symbol(letter, :gridalpha)] = arg.alpha) arg.style === nothing || (plotattributes[Symbol(letter, :gridstyle)] = arg.style) - # linealpha + # linealpha elseif allAlphas(arg) plotattributes[Symbol(letter, :gridalpha)] = arg - # linewidth + # linewidth elseif allReals(arg) plotattributes[Symbol(letter, :gridlinewidth)] = arg - # color + # color elseif !handleColors!(plotattributes, arg, Symbol(letter, :foreground_color_grid)) @warn("Skipped grid arg $arg.") - end end @@ -935,23 +1254,29 @@ function processMinorGridArg!(plotattributes::AKW, arg, letter) plotattributes[Symbol(letter, :minorgrid)] = true elseif typeof(arg) <: Stroke - arg.width === nothing || (plotattributes[Symbol(letter, :minorgridlinewidth)] = arg.width) - arg.color === nothing || (plotattributes[Symbol(letter, :foreground_color_minor_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) - arg.alpha === nothing || (plotattributes[Symbol(letter, :minorgridalpha)] = arg.alpha) - arg.style === nothing || (plotattributes[Symbol(letter, :minorgridstyle)] = arg.style) + arg.width === nothing || + (plotattributes[Symbol(letter, :minorgridlinewidth)] = arg.width) + arg.color === nothing || ( + plotattributes[Symbol(letter, :foreground_color_minor_grid)] = + arg.color in (:auto, :match) ? :match : plot_color(arg.color) + ) + arg.alpha === nothing || + (plotattributes[Symbol(letter, :minorgridalpha)] = arg.alpha) + arg.style === nothing || + (plotattributes[Symbol(letter, :minorgridstyle)] = arg.style) plotattributes[Symbol(letter, :minorgrid)] = true - # linealpha + # linealpha elseif allAlphas(arg) plotattributes[Symbol(letter, :minorgridalpha)] = arg plotattributes[Symbol(letter, :minorgrid)] = true - # linewidth + # linewidth elseif allReals(arg) plotattributes[Symbol(letter, :minorgridlinewidth)] = arg plotattributes[Symbol(letter, :minorgrid)] = true - # color + # color elseif handleColors!(plotattributes, arg, Symbol(letter, :foreground_color_minor_grid)) plotattributes[Symbol(letter, :minorgrid)] = true else @@ -971,9 +1296,9 @@ function processFontArg!(plotattributes::AKW, fontname::Symbol, arg) elseif arg == :center plotattributes[Symbol(fontname, :halign)] = :hcenter plotattributes[Symbol(fontname, :valign)] = :vcenter - elseif arg in (:hcenter, :left, :right) + elseif arg ∈ _haligns plotattributes[Symbol(fontname, :halign)] = arg - elseif arg in (:vcenter, :top, :bottom) + elseif arg ∈ _valigns plotattributes[Symbol(fontname, :valign)] = arg elseif T <: Colorant plotattributes[Symbol(fontname, :color)] = arg @@ -1099,7 +1424,8 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) end # fonts - for fontname in (:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont) + for fontname in + (:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont) args = RecipesPipeline.pop_kw!(plotattributes, fontname, ()) for arg in wraptuple(args) processFontArg!(plotattributes, fontname, arg) @@ -1111,7 +1437,8 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) processLineArg(plotattributes, arg) end - if haskey(plotattributes, :seriestype) && haskey(_typeAliases, plotattributes[:seriestype]) + if haskey(plotattributes, :seriestype) && + haskey(_typeAliases, plotattributes[:seriestype]) plotattributes[:seriestype] = _typeAliases[plotattributes[:seriestype]] end @@ -1124,7 +1451,9 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) RecipesPipeline.reset_kw!(plotattributes, :marker) if haskey(plotattributes, :markershape) plotattributes[:markershape] = _replace_markershape(plotattributes[:markershape]) - if plotattributes[:markershape] == :none && plotattributes[:seriestype] in (:scatter, :scatterbins, :scatterhist, :scatter3d) #the default should be :auto, not :none, so that :none can be set explicitly and would be respected + if plotattributes[:markershape] == :none && + get(plotattributes, :seriestype, :path) in + (:scatter, :scatterbins, :scatterhist, :scatter3d) #the default should be :auto, not :none, so that :none can be set explicitly and would be respected plotattributes[:markershape] = :circle end elseif anymarker @@ -1139,10 +1468,11 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) # handle series annotations if haskey(plotattributes, :series_annotations) - plotattributes[:series_annotations] = series_annotations(wraptuple(plotattributes[:series_annotations])...) + plotattributes[:series_annotations] = + series_annotations(wraptuple(plotattributes[:series_annotations])...) end - # convert into strokes and brushes + # convert into strokes and brushes if haskey(plotattributes, :arrow) a = plotattributes[:arrow] @@ -1157,7 +1487,6 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) end end - # if get(plotattributes, :arrow, false) == true # plotattributes[:arrow] = arrow() # end @@ -1171,19 +1500,21 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW) end # framestyle - if haskey(plotattributes, :framestyle) && haskey(_framestyleAliases, plotattributes[:framestyle]) + if haskey(plotattributes, :framestyle) && + haskey(_framestyleAliases, plotattributes[:framestyle]) plotattributes[:framestyle] = _framestyleAliases[plotattributes[:framestyle]] end # warnings for moved recipes st = get(plotattributes, :seriestype, :path) 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 return end - # ----------------------------------------------------------------------------- const _already_warned = Dict{Symbol,Set{Symbol}}() @@ -1206,10 +1537,12 @@ function warn_on_unsupported_args(pkg::AbstractBackend, plotattributes) end if !isempty(_to_warn) && - !get(plotattributes, :warn_on_unsupported, _plot_defaults[:warn_on_unsupported]) + !get(plotattributes, :warn_on_unsupported, _plot_defaults[:warn_on_unsupported]) for k in sort(collect(_to_warn)) push!(already_warned, k) - @warn("Keyword argument $k not supported with $pkg. Choose from: $(supported_attrs(pkg))") + @warn( + "Keyword argument $k not supported with $pkg. Choose from: $(supported_attrs(pkg))" + ) end end return extra_kwargs @@ -1224,13 +1557,19 @@ function warn_on_unsupported(pkg::AbstractBackend, plotattributes) return end if !is_seriestype_supported(pkg, plotattributes[:seriestype]) - @warn("seriestype $(plotattributes[:seriestype]) is unsupported with $pkg. Choose from: $(supported_seriestypes(pkg))") + @warn( + "seriestype $(plotattributes[:seriestype]) is unsupported with $pkg. Choose from: $(supported_seriestypes(pkg))" + ) end if !is_style_supported(pkg, plotattributes[:linestyle]) - @warn("linestyle $(plotattributes[:linestyle]) is unsupported with $pkg. Choose from: $(supported_styles(pkg))") + @warn( + "linestyle $(plotattributes[:linestyle]) is unsupported with $pkg. Choose from: $(supported_styles(pkg))" + ) end if !is_marker_supported(pkg, plotattributes[:markershape]) - @warn("markershape $(plotattributes[:markershape]) is unsupported with $pkg. Choose from: $(supported_markers(pkg))") + @warn( + "markershape $(plotattributes[:markershape]) is unsupported with $pkg. Choose from: $(supported_markers(pkg))" + ) end end @@ -1242,13 +1581,14 @@ function warn_on_unsupported_scales(pkg::AbstractBackend, plotattributes::AKW) if haskey(plotattributes, k) v = plotattributes[k] if !is_scale_supported(pkg, v) - @warn("scale $v is unsupported with $pkg. Choose from: $(supported_scales(pkg))") + @warn( + "scale $v is unsupported with $pkg. Choose from: $(supported_scales(pkg))" + ) end end end end - # ----------------------------------------------------------------------------- function convertLegendValue(val::Symbol) @@ -1256,7 +1596,28 @@ function convertLegendValue(val::Symbol) :best elseif val in (:no, :none) :none - elseif val in (:right, :left, :top, :bottom, :inside, :best, :legend, :topright, :topleft, :bottomleft, :bottomright, :outertopright, :outertopleft, :outertop, :outerright, :outerleft, :outerbottomright, :outerbottomleft, :outerbottom, :inline) + elseif val in ( + :right, + :left, + :top, + :bottom, + :inside, + :best, + :legend, + :topright, + :topleft, + :bottomleft, + :bottomright, + :outertopright, + :outertopleft, + :outertop, + :outerright, + :outerleft, + :outerbottomright, + :outerbottomleft, + :outerbottom, + :inline, + ) val else error("Invalid symbol for legend: $val") @@ -1264,36 +1625,42 @@ function convertLegendValue(val::Symbol) end convertLegendValue(val::Bool) = val ? :best : :none convertLegendValue(val::Nothing) = :none -convertLegendValue(v::Tuple{S,T}) where {S<:Real, T<:Real} = v +convertLegendValue(v::Tuple{S,T}) where {S<:Real,T<:Real} = v +convertLegendValue(v::Tuple{<:Real,Symbol}) = v +convertLegendValue(v::Real) = v convertLegendValue(v::AbstractArray) = map(convertLegendValue, v) # ----------------------------------------------------------------------------- - # 1-row matrices will give an element # multi-row matrices will give a column # InputWrapper just gives the contents # anything else is returned as-is function slice_arg(v::AMat, idx::Int) - c = mod1(idx, size(v,2)) - m,n = axes(v) - size(v,1) == 1 ? v[first(m),n[c]] : v[:,n[c]] + c = mod1(idx, size(v, 2)) + m, n = axes(v) + size(v, 1) == 1 ? v[first(m), n[c]] : v[:, n[c]] end slice_arg(wrapper::InputWrapper, idx) = wrapper.obj slice_arg(v, idx) = v - # given an argument key (k), extract the argument value for this index, # and set into plotattributes[k]. Matrices are sliced by column. # if nothing is set (or container is empty), return the existing value. -function slice_arg!(plotattributes_in, plotattributes_out, - k::Symbol, idx::Int, remove_pair::Bool) +function slice_arg!( + plotattributes_in, + plotattributes_out, + k::Symbol, + idx::Int, + remove_pair::Bool, +) v = get(plotattributes_in, k, plotattributes_out[k]) - plotattributes_out[k] = if haskey(plotattributes_in, k) && typeof(v) <: AMat && !isempty(v) - slice_arg(v, idx) - else - v - end + plotattributes_out[k] = + if haskey(plotattributes_in, k) && typeof(v) <: AMat && !isempty(v) + slice_arg(v, idx) + else + v + end if remove_pair RecipesPipeline.reset_kw!(plotattributes_in, k) end @@ -1330,10 +1697,10 @@ const _match_map = KW( :background_color_inside => :background_color_subplot, :foreground_color_legend => :foreground_color_subplot, :foreground_color_title => :foreground_color_subplot, - :left_margin => :margin, - :top_margin => :margin, - :right_margin => :margin, - :bottom_margin => :margin, + :left_margin => :margin, + :top_margin => :margin, + :right_margin => :margin, + :bottom_margin => :margin, :titlefontfamily => :fontfamily_subplot, :titlefontcolor => :foreground_color_subplot, :legendfontfamily => :fontfamily_subplot, @@ -1343,25 +1710,29 @@ const _match_map = KW( :colorbar_fontfamily => :fontfamily_subplot, :colorbar_titlefontfamily => :fontfamily_subplot, :colorbar_titlefontcolor => :foreground_color_subplot, + :colorbar_tickfontfamily => :fontfamily_subplot, + :colorbar_tickfontcolor => :foreground_color_subplot, :plot_titlefontfamily => :fontfamily, :plot_titlefontcolor => :foreground_color, :tickfontcolor => :foreground_color_text, :guidefontcolor => :foreground_color_guide, + :annotationfontfamily => :fontfamily_subplot, + :annotationcolor => :foreground_color_subplot, ) # these can match values from the parent container (axis --> subplot --> plot) const _match_map2 = KW( :background_color_subplot => :background_color, :foreground_color_subplot => :foreground_color, - :foreground_color_axis => :foreground_color_subplot, - :foreground_color_border => :foreground_color_subplot, - :foreground_color_grid => :foreground_color_subplot, - :foreground_color_minor_grid=> :foreground_color_subplot, - :foreground_color_guide => :foreground_color_subplot, - :foreground_color_text => :foreground_color_subplot, - :fontfamily_subplot => :fontfamily, - :tickfontfamily => :fontfamily_subplot, - :guidefontfamily => :fontfamily_subplot, + :foreground_color_axis => :foreground_color_subplot, + :foreground_color_border => :foreground_color_subplot, + :foreground_color_grid => :foreground_color_subplot, + :foreground_color_minor_grid => :foreground_color_subplot, + :foreground_color_guide => :foreground_color_subplot, + :foreground_color_text => :foreground_color_subplot, + :fontfamily_subplot => :fontfamily, + :tickfontfamily => :fontfamily_subplot, + :guidefontfamily => :fontfamily_subplot, ) # properly retrieve from plt.attr, passing `:match` to the correct key @@ -1374,7 +1745,6 @@ function Base.getindex(plt::Plot, k::Symbol) end end - # properly retrieve from sp.attr, passing `:match` to the correct key function Base.getindex(sp::Subplot, k::Symbol) v = sp.attr[k] @@ -1389,7 +1759,6 @@ function Base.getindex(sp::Subplot, k::Symbol) end end - # properly retrieve from axis.attr, passing `:match` to the correct key function Base.getindex(axis::Axis, k::Symbol) v = axis.plotattributes[k] @@ -1404,9 +1773,7 @@ function Base.getindex(axis::Axis, k::Symbol) end end -function Base.getindex(series::Series, k::Symbol) - series.plotattributes[k] -end +Base.getindex(series::Series, k::Symbol) = series.plotattributes[k] Base.setindex!(plt::Plot, v, k::Symbol) = (plt.attr[k] = v) Base.setindex!(sp::Subplot, v, k::Symbol) = (sp.attr[k] = v) @@ -1418,7 +1785,6 @@ Base.get(sp::Subplot, k::Symbol, v) = get(sp.attr, k, v) Base.get(axis::Axis, k::Symbol, v) = get(axis.plotattributes, k, v) Base.get(series::Series, k::Symbol, v) = get(series.plotattributes, k, v) - # ----------------------------------------------------------------------------- function fg_color(plotattributes::AKW) @@ -1440,16 +1806,14 @@ function fg_color_sp(plotattributes::AKW) end end - - # update attr from an input dictionary function _update_plot_args(plt::Plot, plotattributes_in::AKW) - for (k,v) in _plot_defaults + for (k, v) in _plot_defaults slice_arg!(plotattributes_in, plt.attr, k, 1, true) end # handle colors - plotattributes= plt.attr + plotattributes = plt.attr plt[:background_color] = plot_color(plotattributes[:background_color]) plt[:foreground_color] = fg_color(plotattributes) # bg = plot_color(plt.attr[:background_color]) @@ -1495,7 +1859,13 @@ function _update_subplot_colors(sp::Subplot) return end -function _update_axis(plt::Plot, sp::Subplot, plotattributes_in::AKW, letter::Symbol, subplot_index::Int) +function _update_axis( + plt::Plot, + sp::Subplot, + plotattributes_in::AKW, + letter::Symbol, + subplot_index::Int, +) # get (maybe initialize) the axis axis = get_axis(sp, letter) @@ -1511,7 +1881,12 @@ function _update_axis(plt::Plot, sp::Subplot, plotattributes_in::AKW, letter::Sy return end -function _update_axis(axis::Axis, plotattributes_in::AKW, letter::Symbol, subplot_index::Int) +function _update_axis( + axis::Axis, + plotattributes_in::AKW, + letter::Symbol, + subplot_index::Int, +) # build the KW of arguments from the letter version (i.e. xticks --> ticks) kw = KW() for k in _all_axis_args @@ -1559,7 +1934,13 @@ function _update_axis_links(plt::Plot, axis::Axis, letter::Symbol) end # update a subplots args and axes -function _update_subplot_args(plt::Plot, sp::Subplot, plotattributes_in, subplot_index::Int, remove_pair::Bool) +function _update_subplot_args( + plt::Plot, + sp::Subplot, + plotattributes_in, + subplot_index::Int, + remove_pair::Bool, +) anns = RecipesPipeline.pop_kw!(sp.attr, :annotations) # # grab those args which apply to this subplot @@ -1576,20 +1957,25 @@ function _update_subplot_args(plt::Plot, sp::Subplot, plotattributes_in, subplot 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 + 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 + _update_subplot_colorbars(sp) end # ----------------------------------------------------------------------------- -has_black_border_for_default(st) = error("The seriestype attribute only accepts Symbols, you passed the $(typeof(st)) $st.") -has_black_border_for_default(st::Function) = error("The seriestype attribute only accepts Symbols, you passed the function $st.") -function has_black_border_for_default(st::Symbol) +has_black_border_for_default(st) = error( + "The seriestype attribute only accepts Symbols, you passed the $(typeof(st)) $st.", +) +has_black_border_for_default(st::Function) = + error("The seriestype attribute only accepts Symbols, you passed the function $st.") +has_black_border_for_default(st::Symbol) = like_histogram(st) || st in (:hexbin, :bar, :shape) -end # converts a symbol or string into a Colorant or ColorGradient # and assigns a color automatically @@ -1602,9 +1988,8 @@ function get_series_color(c, sp::Subplot, n::Int, seriestype) plot_color(c) end -function get_series_color(c::AbstractArray, sp::Subplot, n::Int, seriestype) - map(x->get_series_color(x, sp, n, seriestype), c) -end +get_series_color(c::AbstractArray, sp::Subplot, n::Int, seriestype) = + map(x -> get_series_color(x, sp, n, seriestype), c) function ensure_gradient!(plotattributes::AKW, csym::Symbol, asym::Symbol) if plotattributes[csym] isa ColorPalette @@ -1614,31 +1999,37 @@ function ensure_gradient!(plotattributes::AKW, csym::Symbol, asym::Symbol) end plotattributes[csym] = cgrad(plotattributes[csym], categorical = true, alpha = α) elseif !(plotattributes[csym] isa ColorGradient) - plotattributes[csym] = typeof(plotattributes[asym]) <: AbstractVector ? cgrad() : cgrad(alpha = plotattributes[asym]) + plotattributes[csym] = + typeof(plotattributes[asym]) <: AbstractVector ? cgrad() : + cgrad(alpha = plotattributes[asym]) end end function _replace_linewidth(plotattributes::AKW) # get a good default linewidth... 0 for surface and heatmaps if plotattributes[:linewidth] == :auto - plotattributes[:linewidth] = (get(plotattributes, :seriestype, :path) in (:surface,:heatmap,:image) ? 0 : 1) + plotattributes[:linewidth] = ( + get(plotattributes, :seriestype, :path) in (:surface, :heatmap, :image) ? 0 : 1 + ) end end function _slice_series_args!(plotattributes::AKW, plt::Plot, sp::Subplot, commandIndex::Int) for k in keys(_series_defaults) - haskey(plotattributes, k) && slice_arg!(plotattributes, plotattributes, k, commandIndex, false) + haskey(plotattributes, k) && + slice_arg!(plotattributes, plotattributes, k, commandIndex, false) end return plotattributes end -label_to_string(label::Bool, series_plotindex) = label ? label_to_string(:auto, series_plotindex) : "" +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 + if label == :auto return string("y", series_plotindex) - elseif label==:none + elseif label == :none return "" else throw(ArgumentError("unsupported symbol $(label) passed to `label`")) @@ -1651,8 +2042,20 @@ function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot) globalIndex = plotattributes[:series_plotindex] plotIndex = _series_index(plotattributes, sp) - aliasesAndAutopick(plotattributes, :linestyle, _styleAliases, supported_styles(pkg), plotIndex) - aliasesAndAutopick(plotattributes, :markershape, _markerAliases, supported_markers(pkg), plotIndex) + aliasesAndAutopick( + plotattributes, + :linestyle, + _styleAliases, + supported_styles(pkg), + plotIndex, + ) + aliasesAndAutopick( + plotattributes, + :markershape, + _markerAliases, + supported_markers(pkg), + plotIndex, + ) # update alphas for asym in (:linealpha, :markeralpha, :fillalpha) @@ -1671,7 +2074,7 @@ function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot) # update other colors for s in (:line, :marker, :fill) - csym, asym = Symbol(s,:color), Symbol(s,:alpha) + csym, asym = Symbol(s, :color), Symbol(s, :alpha) plotattributes[csym] = if plotattributes[csym] == :auto plot_color(if has_black_border_for_default(stype) && s == :line sp[:foreground_color_subplot] @@ -1717,7 +2120,7 @@ function _update_series_attributes!(plotattributes::AKW, plt::Plot, sp::Subplot) plotattributes[:label] = label_to_string.(plotattributes[:label], globalIndex) _replace_linewidth(plotattributes) - plotattributes + plotattributes end function _series_index(plotattributes, sp) @@ -1738,7 +2141,7 @@ end #-------------------------------------------------- ## inspired by Base.@kwdef -macro add_attributes( level, expr ) +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] @@ -1756,18 +2159,32 @@ macro add_attributes( level, expr ) # 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)))) - )) + 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 diff --git a/src/axes.jl b/src/axes.jl index 944d724a..31c339ee 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -1,5 +1,4 @@ - # xaxis(args...; kw...) = Axis(:x, args...; kw...) # yaxis(args...; kw...) = Axis(:y, args...; kw...) # zaxis(args...; kw...) = Axis(:z, args...; kw...) @@ -36,42 +35,41 @@ function process_axis_arg!(plotattributes::AKW, arg, letter = "") T = typeof(arg) arg = get(_scaleAliases, arg, arg) if typeof(arg) <: Font - plotattributes[Symbol(letter,:tickfont)] = arg - plotattributes[Symbol(letter,:guidefont)] = arg + plotattributes[Symbol(letter, :tickfont)] = arg + plotattributes[Symbol(letter, :guidefont)] = arg elseif arg in _allScales - plotattributes[Symbol(letter,:scale)] = arg + plotattributes[Symbol(letter, :scale)] = arg elseif arg in (:flip, :invert, :inverted) - plotattributes[Symbol(letter,:flip)] = true + plotattributes[Symbol(letter, :flip)] = true elseif T <: AbstractString - plotattributes[Symbol(letter,:guide)] = arg + plotattributes[Symbol(letter, :guide)] = arg - # xlims/ylims + # xlims/ylims elseif (T <: Tuple || T <: AVec) && length(arg) == 2 sym = typeof(arg[1]) <: Number ? :lims : :ticks - plotattributes[Symbol(letter,sym)] = arg + plotattributes[Symbol(letter, sym)] = arg - # xticks/yticks + # xticks/yticks elseif T <: AVec - plotattributes[Symbol(letter,:ticks)] = arg + plotattributes[Symbol(letter, :ticks)] = arg elseif arg === nothing - plotattributes[Symbol(letter,:ticks)] = [] + plotattributes[Symbol(letter, :ticks)] = [] elseif T <: Bool || arg in _allShowaxisArgs - plotattributes[Symbol(letter,:showaxis)] = showaxis(arg, letter) + plotattributes[Symbol(letter, :showaxis)] = showaxis(arg, letter) elseif typeof(arg) <: Number - plotattributes[Symbol(letter,:rotation)] = arg + plotattributes[Symbol(letter, :rotation)] = arg elseif typeof(arg) <: Function - plotattributes[Symbol(letter,:formatter)] = arg + plotattributes[Symbol(letter, :formatter)] = arg elseif !handleColors!(plotattributes, arg, Symbol(letter, :foreground_color_axis)) @warn("Skipped $(letter)axis arg $arg") - end end @@ -87,13 +85,19 @@ function attr!(axis::Axis, args...; kw...) RecipesPipeline.preprocess_attributes!(KW(kw)) # then override for any keywords... only those keywords that already exists in plotattributes - for (k,v) in kw + for (k, v) in kw if haskey(plotattributes, k) if k == :discrete_values # add these discrete values to the axis for vi in v discrete_value!(axis, vi) end + #could perhaps use TimeType here, as Date and DateTime are both subtypes of TimeType + # or could perhaps check if dateformatter or datetimeformatter is in use + elseif k == :lims && isa(v, Tuple{Date,Date}) + plotattributes[k] = (v[1].instant.periods.value, v[2].instant.periods.value) + elseif k == :lims && isa(v, Tuple{DateTime,DateTime}) + plotattributes[k] = (v[1].instant.periods.value, v[2].instant.periods.value) else plotattributes[k] = v end @@ -116,11 +120,8 @@ Base.setindex!(axis::Axis, v, ks::Symbol...) = setindex!(axis.plotattributes, v, Base.haskey(axis::Axis, k::Symbol) = haskey(axis.plotattributes, k) ignorenan_extrema(axis::Axis) = (ex = axis[:extrema]; (ex.emin, ex.emax)) -const _label_func = Dict{Symbol,Function}( - :log10 => x -> "10^$x", - :log2 => x -> "2^$x", - :ln => x -> "e^$x", -) +const _label_func = + Dict{Symbol,Function}(:log10 => x -> "10^$x", :log2 => x -> "2^$x", :ln => x -> "e^$x") labelfunc(scale::Symbol, backend::AbstractBackend) = get(_label_func, scale, string) const _label_func_tex = Dict{Symbol,Function}( @@ -130,12 +131,10 @@ const _label_func_tex = Dict{Symbol,Function}( ) labelfunc_tex(scale::Symbol) = get(_label_func_tex, scale, convert_sci_unicode) - -function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) - amin, amax = axis_limits(sp, axis[:letter]) +function optimal_ticks_and_labels(ticks, alims, scale, formatter) + amin, amax = alims # scale the limits - scale = axis[:scale] sf = RecipesPipeline.scale_func(scale) # If the axis input was a Date or DateTime use a special logic to find @@ -146,18 +145,18 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) # rather than on the input format # TODO: maybe: non-trivial scale (:ln, :log2, :log10) for date/datetime if ticks === nothing && scale == :identity - if axis[:formatter] == RecipesPipeline.dateformatter + if formatter == RecipesPipeline.dateformatter # optimize_datetime_ticks returns ticks and labels(!) based on # integers/floats corresponding to the DateTime type. Thus, the axes # limits, which resulted from converting the Date type to integers, # are converted to 'DateTime integers' (actually floats) before # being passed to optimize_datetime_ticks. # (convert(Int, convert(DateTime, convert(Date, i))) == 87600000*i) - ticks, labels = optimize_datetime_ticks(864e5 * amin, 864e5 * amax; - k_min = 2, k_max = 4) + ticks, labels = + optimize_datetime_ticks(864e5 * amin, 864e5 * amax; k_min = 2, k_max = 4) # Now the ticks are converted back to floats corresponding to Dates. return ticks / 864e5, labels - elseif axis[:formatter] == RecipesPipeline.datetimeformatter + elseif formatter == RecipesPipeline.datetimeformatter return optimize_datetime_ticks(amin, amax; k_min = 2, k_max = 4) end end @@ -167,8 +166,9 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) scaled_ticks = optimize_ticks( sf(amin), sf(amax); - k_min = 4, # minimum number of ticks + k_min = scale ∈ _logScales ? 2 : 4, # minimum number of ticks k_max = 8, # maximum number of ticks + scale = scale, )[1] elseif typeof(ticks) <: Int scaled_ticks, viewmin, viewmax = optimize_ticks( @@ -180,19 +180,22 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) # `strict_span = false` rewards cases where the span of the # chosen ticks is not too much bigger than amin - amax: strict_span = false, + scale = scale, ) - axis[:lims] = map(RecipesPipeline.inverse_scale_func(scale), (viewmin, viewmax)) + # axis[:lims] = map(RecipesPipeline.inverse_scale_func(scale), (viewmin, viewmax)) else scaled_ticks = map(sf, (filter(t -> amin <= t <= amax, ticks))) end unscaled_ticks = map(RecipesPipeline.inverse_scale_func(scale), scaled_ticks) labels = if any(isfinite, unscaled_ticks) - formatter = axis[:formatter] if formatter in (:auto, :plain, :scientific, :engineering) map(labelfunc(scale, backend()), Showoff.showoff(scaled_ticks, formatter)) elseif formatter == :latex - map(x -> string("\$", replace(convert_sci_unicode(x), '×' => "\\times"), "\$"), Showoff.showoff(unscaled_ticks, :auto)) + map( + x -> string("\$", replace(convert_sci_unicode(x), '×' => "\\times"), "\$"), + Showoff.showoff(unscaled_ticks, :auto), + ) else # there was an override for the formatter... use that on the unscaled ticks map(formatter, unscaled_ticks) @@ -215,80 +218,172 @@ end # return (continuous_values, discrete_values) for the ticks on this axis function get_ticks(sp::Subplot, axis::Axis; update = true) if update || !haskey(axis.plotattributes, :optimized_ticks) + dvals = axis[:discrete_values] 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 - - dvals = axis[:discrete_values] - cv, dv = if typeof(ticks) <: Symbol - if !isempty(dvals) - # discrete ticks... - n = length(dvals) - rng = if ticks == :auto - Int[round(Int,i) for i in range(1, stop=n, length=min(n,15))] - else # if ticks == :all - 1:n - end - 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 + axis.plotattributes[:optimized_ticks] = + if ( + ticks isa Symbol && + ticks !== :none && + ispolar(sp) && + axis[:letter] === :x && + !isempty(dvals) + ) + collect(0:(pi / 4):(7pi / 4)), string.(0:45:315) else - error("Unknown ticks type in get_ticks: $(typeof(ticks))") + cvals = axis[:continuous_values] + alims = axis_limits(sp, axis[:letter]) + scale = axis[:scale] + formatter = axis[:formatter] + get_ticks(ticks, cvals, dvals, alims, scale, formatter) end - axis.plotattributes[:optimized_ticks] = (cv, dv) - end end - axis.plotattributes[:optimized_ticks] + return axis.plotattributes[:optimized_ticks] end +# Ticks getter functions +for l in (:x, :y, :z) + axis = string(l, "-axis") # "x-axis" + ticks = string(l, "ticks") # "xticks" + f = Symbol(ticks) # :xticks + @eval begin + """ + $($f)(p::Plot) + + returns a vector of the $($axis) ticks of the subplots of `p`. + + Example use: + + ```jldoctest + julia> p = plot(1:5, $($ticks)=[1,2]) + + julia> $($f)(p) + 1-element Vector{Tuple{Vector{Float64}, Vector{String}}}: + ([1.0, 2.0], ["1", "2"]) + ``` + + If `p` consists of a single subplot, you might want to grab + only the first element, via + + ```jldoctest + julia> $($f)(p)[1] + ([1.0, 2.0], ["1", "2"]) + ``` + + or you can call $($f) on the first (only) subplot of `p` via + + ```jldoctest + julia> $($f)(p[1]) + ([1.0, 2.0], ["1", "2"]) + ``` + """ + $f(p::Plot) = get_ticks(p, $(Meta.quot(l))) + """ + $($f)(sp::Subplot) + + returns the $($axis) ticks of the subplot `sp`. + + Note that the ticks are returned as tuples of values and labels: + + ```jldoctest + julia> sp = plot(1:5, $($ticks)=[1,2]).subplots[1] + Subplot{1} + + julia> $($f)(sp) + ([1.0, 2.0], ["1", "2"]) + ``` + """ + $f(sp::Subplot) = get_ticks(sp, $(Meta.quot(l))) + export $f + end +end +# get_ticks from axis symbol :x, :y, or :z +get_ticks(sp::Subplot, s::Symbol) = get_ticks(sp, sp[Symbol(s, :axis)]) +get_ticks(p::Plot, s::Symbol) = [get_ticks(sp, s) for sp in p.subplots] + +function get_ticks(ticks::Symbol, cvals::T, dvals, args...) where {T} + if ticks === :none + return T[], String[] + elseif !isempty(dvals) + n = length(dvals) + if ticks === :all || n < 16 + return cvals, string.(dvals) + else + Δ = ceil(Int, n / 10) + rng = Δ:Δ:n + return cvals[rng], string.(dvals[rng]) + end + else + return optimal_ticks_and_labels(nothing, args...) + end +end +get_ticks(ticks::AVec, cvals, dvals, args...) = optimal_ticks_and_labels(ticks, args...) +function get_ticks(ticks::Int, dvals, cvals, args...) + if !isempty(dvals) + rng = round.(Int, range(1, stop = length(dvals), length = ticks)) + cvals[rng], string.(dvals[rng]) + else + optimal_ticks_and_labels(ticks, args...) + end +end +get_ticks(ticks::NTuple{2,Any}, args...) = ticks +get_ticks(::Nothing, cvals::T, args...) where {T} = T[], String[] +get_ticks(ticks::Bool, args...) = + ticks ? get_ticks(:auto, args...) : get_ticks(nothing, args...) +get_ticks(::T, args...) where {T} = error("Unknown ticks type in get_ticks: $T") + _transform_ticks(ticks) = ticks -_transform_ticks(ticks::AbstractArray{T}) where T <: Dates.TimeType = Dates.value.(ticks) -_transform_ticks(ticks::NTuple{2, Any}) = (_transform_ticks(ticks[1]), ticks[2]) +_transform_ticks(ticks::AbstractArray{T}) where {T<:Dates.TimeType} = Dates.value.(ticks) +_transform_ticks(ticks::NTuple{2,Any}) = (_transform_ticks(ticks[1]), ticks[2]) function get_minor_ticks(sp, axis, ticks) - axis[:minorticks] in (:none, nothing, false) && !axis[:minorgrid] && return nothing + axis[:minorticks] ∈ (:none, nothing, false) && !axis[:minorgrid] && return nothing ticks = ticks[1] length(ticks) < 2 && return nothing amin, amax = axis_limits(sp, axis[:letter]) - #Add one phantom tick either side of the ticks to ensure minor ticks extend to the axis limits - if length(ticks) > 2 - ratio = (ticks[3] - ticks[2])/(ticks[2] - ticks[1]) - elseif axis[:scale] in (:none, :identity) - ratio = 1 - else - return nothing - end - first_step = ticks[2] - ticks[1] - last_step = ticks[end] - ticks[end-1] - ticks = [ticks[1] - first_step/ratio; ticks; ticks[end] + last_step*ratio] + scale = axis[:scale] + log_scaled = scale ∈ _logScales + base = get(_logScaleBases, scale, nothing) + + # add one phantom tick either side of the ticks to ensure minor ticks extend to the axis limits + if log_scaled + sub = round(Int, log(base, ticks[2] / ticks[1])) + ticks = [ticks[1] / base; ticks; ticks[end] * base] + else + sub = 1 # unused + ratio = length(ticks) > 2 ? (ticks[3] - ticks[2]) / (ticks[2] - ticks[1]) : 1 + first_step = ticks[2] - ticks[1] + last_step = ticks[end] - ticks[end - 1] + ticks = [ticks[1] - first_step / ratio; ticks; ticks[end] + last_step * ratio] + end + + # default to 9 intervals between major ticks for log10 scale and 5 intervals otherwise + n_default = (scale == :log10) ? 9 : 5 + n = + typeof(axis[:minorticks]) <: Integer && axis[:minorticks] > 1 ? axis[:minorticks] : + n_default - #Default to 5 intervals between major ticks - n = typeof(axis[:minorticks]) <: Integer && axis[:minorticks] > 1 ? axis[:minorticks] : 5 minorticks = typeof(ticks[1])[] - for (i,hi) in enumerate(ticks[2:end]) + for (i, hi) in enumerate(ticks[2:end]) lo = ticks[i] if isfinite(lo) && isfinite(hi) && hi > lo - append!(minorticks,collect(lo + (hi-lo)/n :(hi-lo)/n: hi - (hi-lo)/2n)) + if log_scaled + for e in 1:sub + lo_ = lo * base^(e - 1) + hi_ = lo_ * base + step = (hi_ - lo_) / n + append!( + minorticks, + collect( + (lo_ + (e > 1 ? 0 : step)):step:(hi_ - (e < sub ? 0 : + step / 2)), + ), + ) + end + else + step = (hi - lo) / n + append!(minorticks, collect((lo + step):step:(hi - step / 2))) + end end end minorticks[amin .<= minorticks .<= amax] @@ -296,17 +391,15 @@ end # ------------------------------------------------------------------------- - function reset_extrema!(sp::Subplot) - for asym in (:x,:y,:z) - sp[Symbol(asym,:axis)][:extrema] = Extrema() + for asym in (:x, :y, :z) + sp[Symbol(asym, :axis)][:extrema] = Extrema() end for series in sp.series_list expand_extrema!(sp, series.plotattributes) end end - function expand_extrema!(ex::Extrema, v::Number) ex.emin = isfinite(v) ? min(v, ex.emin) : ex.emin ex.emax = isfinite(v) ? max(v, ex.emax) : ex.emax @@ -321,14 +414,13 @@ end expand_extrema!(axis::Axis, ::Nothing) = axis[:extrema] expand_extrema!(axis::Axis, ::Bool) = axis[:extrema] - function expand_extrema!(axis::Axis, v::Tuple{MIN,MAX}) where {MIN<:Number,MAX<:Number} ex = axis[:extrema] ex.emin = isfinite(v[1]) ? min(v[1], ex.emin) : ex.emin ex.emax = isfinite(v[2]) ? max(v[2], ex.emax) : ex.emax ex end -function expand_extrema!(axis::Axis, v::AVec{N}) where N<:Number +function expand_extrema!(axis::Axis, v::AVec{N}) where {N<:Number} ex = axis[:extrema] for vi in v expand_extrema!(ex, vi) @@ -336,7 +428,6 @@ function expand_extrema!(axis::Axis, v::AVec{N}) where N<:Number ex end - function expand_extrema!(sp::Subplot, plotattributes::AKW) vert = isvertical(plotattributes) @@ -347,7 +438,12 @@ function expand_extrema!(sp::Subplot, plotattributes::AKW) else letter == :x ? :y : letter == :y ? :x : :z end] - if letter != :z && plotattributes[:seriestype] == :straightline && any(series[:seriestype] != :straightline for series in series_list(sp)) && data[1] != data[2] + if ( + letter != :z && + plotattributes[:seriestype] == :straightline && + any(series[:seriestype] != :straightline for series in series_list(sp)) && + data[1] != data[2] + ) data = [NaN] end axis = sp[Symbol(letter, "axis")] @@ -356,7 +452,8 @@ function expand_extrema!(sp::Subplot, plotattributes::AKW) expand_extrema!(sp[:xaxis], data.x_extents) expand_extrema!(sp[:yaxis], data.y_extents) expand_extrema!(sp[:zaxis], data.z_extents) - elseif eltype(data) <: Number || (isa(data, Surface) && all(di -> isa(di, Number), data.surf)) + elseif eltype(data) <: Number || + (isa(data, Surface) && all(di -> isa(di, Number), data.surf)) if !(eltype(data) <: Number) # huh... must have been a mis-typed surface? lets swap it out data = plotattributes[letter] = Surface(Matrix{Float64}(data.surf)) @@ -366,7 +463,8 @@ function expand_extrema!(sp::Subplot, plotattributes::AKW) # TODO: need more here... gotta track the discrete reference value # as well as any coord offset (think of boxplot shape coords... they all # correspond to the same x-value) - plotattributes[letter], plotattributes[Symbol(letter,"_discrete_indices")] = discrete_value!(axis, data) + plotattributes[letter], plotattributes[Symbol(letter, "_discrete_indices")] = + discrete_value!(axis, data) expand_extrema!(axis, plotattributes[letter]) end end @@ -400,7 +498,9 @@ function expand_extrema!(sp::Subplot, plotattributes::AKW) bw = plotattributes[:bar_width] if bw === nothing - bw = plotattributes[:bar_width] = _bar_width * ignorenan_minimum(filter(x->x>0,diff(sort(data)))) + bw = + plotattributes[:bar_width] = + _bar_width * ignorenan_minimum(filter(x -> x > 0, diff(sort(data)))) end axis = sp.attr[Symbol(dsym, :axis)] expand_extrema!(axis, ignorenan_maximum(data) + 0.5maximum(bw)) @@ -431,35 +531,64 @@ function widen(lmin, lmax, scale = :identity) span = f(lmax) - f(lmin) # eps = NaNMath.max(1e-16, min(1e-2span, 1e-10)) eps = NaNMath.max(1e-16, 0.03span) - invf(f(lmin)-eps), invf(f(lmax)+eps) + invf(f(lmin) - eps), invf(f(lmax) + eps) end # figure out if widening is a good idea. -const _widen_seriestypes = (:line, :path, :steppre, :steppost, :sticks, :scatter, :barbins, :barhist, :histogram, :scatterbins, :scatterhist, :stepbins, :stephist, :bins2d, :histogram2d, :bar, :shape, :path3d, :scatter3d) +const _widen_seriestypes = ( + :line, + :path, + :steppre, + :stepmid, + :steppost, + :sticks, + :scatter, + :barbins, + :barhist, + :histogram, + :scatterbins, + :scatterhist, + :stepbins, + :stephist, + :bins2d, + :histogram2d, + :bar, + :shape, + :path3d, + :scatter3d, +) function default_should_widen(axis::Axis) - should_widen = false - if !(is_2tuple(axis[:lims]) || axis[:lims] == :round) - for sp in axis.sps - for series in series_list(sp) - if series.plotattributes[:seriestype] in _widen_seriestypes - should_widen = true - end + if axis[:widen] isa Bool + return axis[:widen] + end + # automatic behavior: widen if limits aren't specified and series type is appropriate + (is_2tuple(axis[:lims]) || axis[:lims] == :round) && return false + for sp in axis.sps + for series in series_list(sp) + if series.plotattributes[:seriestype] in _widen_seriestypes + return true end end end - should_widen + false end -function round_limits(amin,amax) - scale = 10^(1-round(log10(amax - amin))) - amin = floor(amin*scale)/scale - amax = ceil(amax*scale)/scale +function round_limits(amin, amax, scale) + base = get(_logScaleBases, scale, 10.0) + factor = base^(1 - round(log(base, amax - amin))) + amin = floor(amin * factor) / factor + amax = ceil(amax * factor) / factor amin, amax end # using the axis extrema and limit overrides, return the min/max value for this axis -function axis_limits(sp, letter, should_widen = default_should_widen(sp[Symbol(letter, :axis)]), consider_aspect = true) +function axis_limits( + sp, + letter, + should_widen = default_should_widen(sp[Symbol(letter, :axis)]), + consider_aspect = true, +) axis = sp[Symbol(letter, :axis)] ex = axis[:extrema] amin, amax = ex.emin, ex.emax @@ -467,13 +596,20 @@ function axis_limits(sp, letter, should_widen = default_should_widen(sp[Symbol(l has_user_lims = (isa(lims, Tuple) || isa(lims, AVec)) && length(lims) == 2 if has_user_lims lmin, lmax = lims - if lmin != :auto && isfinite(lmin) + if lmin == :auto + elseif isfinite(lmin) amin = lmin end - if lmax != :auto && isfinite(lmax) + if lmax == :auto + elseif isfinite(lmax) amax = lmax end end + if lims == :symmetric + aval = max(abs(amin), abs(amax)) + amin = -aval + amax = aval + end if amax <= amin && isfinite(amin) amax = amin + 1.0 end @@ -484,20 +620,25 @@ function axis_limits(sp, letter, should_widen = default_should_widen(sp[Symbol(l if axis[:letter] == :x amin, amax = 0, 2pi elseif lims == :auto - #widen max radius so ticks dont overlap with theta axis + # widen max radius so ticks dont overlap with theta axis 0, amax + 0.1 * abs(amax - amin) else amin, amax end - elseif should_widen && axis[:widen] + elseif should_widen widen(amin, amax, axis[:scale]) elseif lims == :round - round_limits(amin,amax) + round_limits(amin, amax, axis[:scale]) else amin, amax end - if !has_user_lims && consider_aspect && letter in (:x, :y) && !(sp[:aspect_ratio] in (:none, :auto) || RecipesPipeline.is3d(:sp)) + if ( + !has_user_lims && + consider_aspect && + letter in (:x, :y) && + !(sp[:aspect_ratio] in (:none, :auto) || RecipesPipeline.is3d(:sp)) + ) aspect_ratio = isa(sp[:aspect_ratio], Number) ? sp[:aspect_ratio] : 1 plot_ratio = height(plotarea(sp)) / width(plotarea(sp)) dist = amax - amin @@ -565,11 +706,11 @@ end # add the discrete value for each item. return the continuous values and the indices function discrete_value!(axis::Axis, v::AMat) - n,m = axes(v) + n, m = axes(v) cmat = zeros(axes(v)) discrete_indices = similar(Array{Int}, axes(v)) for i in n, j in m - cmat[i,j], discrete_indices[i,j] = discrete_value!(axis, v[i,j]) + cmat[i, j], discrete_indices[i, j] = discrete_value!(axis, v[i, j]) end cmat, discrete_indices end @@ -612,7 +753,11 @@ function axis_drawing_info(sp, letter) if sp[:framestyle] != :grid push!(segments, reverse_if((amin, oa1), isy), reverse_if((amax, oa1), isy)) # don't show the 0 tick label for the origin framestyle - if sp[:framestyle] == :origin && !(ticks in (:none, nothing, false)) && length(ticks) > 1 + if ( + sp[:framestyle] == :origin && + !(ticks in (:none, nothing, false)) && + length(ticks) > 1 + ) i = findfirst(==(0), ticks[1]) if i !== nothing deleteat!(ticks[1], i) @@ -628,60 +773,62 @@ function axis_drawing_info(sp, letter) ) end end - if !(ax[:ticks] in (:none, nothing, false)) + if ax[:ticks] ∉ (:none, nothing, false) f = RecipesPipeline.scale_func(oax[:scale]) invf = RecipesPipeline.inverse_scale_func(oax[:scale]) - tick_start, tick_stop = if sp[:framestyle] == :origin - t = invf(f(0) + 0.012 * (f(oamax) - f(oamin))) - (-t, t) - else - ticks_in = ax[:tick_direction] == :out ? -1 : 1 - t = invf(f(oa1) + 0.012 * (f(oa2) - f(oa1)) * ticks_in) - (oa1, t) - end - for tick in ticks[1] - if ax[:showaxis] - push!( - tick_segments, - reverse_if((tick, tick_start), isy), - reverse_if((tick, tick_stop), isy), - ) + add_major_or_minor_segments(ticks, grid, segments, factor, cond) = begin + ticks === nothing && return + if cond + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + factor * (f(oamax) - f(oamin))) + (-t, t) + else + ticks_in = ax[:tick_direction] == :out ? -1 : 1 + t = invf(f(oa1) + factor * (f(oa2) - f(oa1)) * ticks_in) + (oa1, t) + end end - if ax[:grid] - push!( - grid_segments, - reverse_if((tick, oamin), isy), - reverse_if((tick, oamax), isy), - ) - 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(oamax) - f(oamin))) - (-t, t) - else - t = invf(f(oa1) + 0.006 * (f(oa2) - f(oa1)) * ticks_in) - (oa1, t) - end - for tick in minor_ticks - if ax[:showaxis] + for tick in ticks + if ax[:showaxis] && cond push!( tick_segments, reverse_if((tick, tick_start), isy), reverse_if((tick, tick_stop), isy), ) end - if ax[:minorgrid] + if grid push!( - minorgrid_segments, + segments, reverse_if((tick, oamin), isy), reverse_if((tick, oamax), isy), ) end end end + + ax_length = letter === :x ? height(sp.plotarea).value : width(sp.plotarea).value + + # add major grid segments + add_major_or_minor_segments( + ticks[1], + ax[:grid], + grid_segments, + 1.2 / ax_length, + ax[:tick_direction] !== :none, + ) + + # add minor grid segments + if ax[:minorticks] ∉ (:none, nothing, false) || ax[:minorgrid] + add_major_or_minor_segments( + minor_ticks, + ax[:minorgrid], + minorgrid_segments, + 0.6 / ax_length, + true, + ) + end end end @@ -691,7 +838,7 @@ function axis_drawing_info(sp, letter) tick_segments = tick_segments, grid_segments = grid_segments, minorgrid_segments = minorgrid_segments, - border_segments = border_segments + border_segments = border_segments, ) end @@ -727,8 +874,7 @@ function axis_drawing_info_3d(sp, letter) minorgrid_segments = Segments(3) border_segments = Segments(3) - - if sp[:framestyle] != :none# && letter === :x + if sp[:framestyle] != :none # && letter === :x na0, na1 = if sp[:framestyle] in (:origin, :zerolines) 0, 0 else @@ -748,9 +894,13 @@ function axis_drawing_info_3d(sp, 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 + if ( + sp[:framestyle] == :origin && + !(ticks in (:none, nothing, false)) && + length(ticks) > 1 + ) i0 = findfirst(==(0), ticks[1]) - if ind !== nothing + if i0 !== nothing deleteat!(ticks[1], i0) deleteat!(ticks[2], i0) end @@ -764,72 +914,70 @@ function axis_drawing_info_3d(sp, 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)) + + if ax[:ticks] ∉ (: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) - 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), - ) + add_major_or_minor_segments(ticks, grid, segments, factor, cond) = begin + ticks === nothing && return + if cond + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + factor * (f(namax) - f(namin))) + (-t, t) + else + ticks_in = ax[:tick_direction] == :out ? -1 : 1 + t = invf(f(na0) + factor * (f(na1) - f(na0)) * ticks_in) + (na0, t) + end 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] + for tick in ticks + if ax[:showaxis] && cond push!( tick_segments, sort_3d_axes(tick, tick_start, fa0, letter), sort_3d_axes(tick, tick_stop, fa0, letter), ) end - if ax[:minorgrid] + if grid + fa0_, fa1_ = reverse_if((fa0, fa1), ax[:mirror]) + ga0_, ga1_ = reverse_if((ga0, ga1), ax[:mirror]) push!( - minorgrid_segments, - sort_3d_axes(tick, ga0, fa0, letter), - sort_3d_axes(tick, ga1, fa0, letter), + 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), + segments, + sort_3d_axes(tick, ga1_, fa0_, letter), + sort_3d_axes(tick, ga1_, fa1_, letter), ) end end end + + # add major grid segments + add_major_or_minor_segments( + ticks[1], + ax[:grid], + grid_segments, + 0.012, + ax[:tick_direction] !== :none, + ) + + # add minor grid segments + if ax[:minorticks] ∉ (:none, nothing, false) || ax[:minorgrid] + add_major_or_minor_segments( + minor_ticks, + ax[:minorgrid], + minorgrid_segments, + 0.006, + true, + ) + end end end @@ -839,11 +987,11 @@ function axis_drawing_info_3d(sp, letter) tick_segments = tick_segments, grid_segments = grid_segments, minorgrid_segments = minorgrid_segments, - border_segments = border_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]) \ No newline at end of file +axes_shift(t, i) = i % 3 == 0 ? t : i % 3 == 1 ? (t[3], t[1], t[2]) : (t[2], t[3], t[1]) diff --git a/src/backends.jl b/src/backends.jl index bd280f0f..09247960 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -1,12 +1,12 @@ struct NoBackend <: AbstractBackend end -const _backendType = Dict{Symbol, DataType}(:none => NoBackend) -const _backendSymbol = Dict{DataType, Symbol}(NoBackend => :none) +const _backendType = Dict{Symbol,DataType}(:none => NoBackend) +const _backendSymbol = Dict{DataType,Symbol}(NoBackend => :none) const _backends = Symbol[] const _initialized_backends = Set{Symbol}() const _default_backends = (:none, :gr, :plotly) -const _backend_packages = Dict{Symbol, Symbol}() +const _backend_packages = Dict{Symbol,Symbol}() "Returns a list of supported backends" backends() = _backends @@ -66,10 +66,12 @@ function text_size(lablen::Int, sz::Number, rot::Number = 0) # now compute the generalized "height" after rotation as the "opposite+adjacent" of 2 triangles height = abs(sind(rot)) * width + abs(cosd(rot)) * ptsz - width = abs(sind(rot+90)) * width + abs(cosd(rot+90)) * ptsz + width = abs(sind(rot + 90)) * width + abs(cosd(rot + 90)) * ptsz width, height end -text_size(lab::AbstractString, sz::Number, rot::Number = 0) = text_size(length(lab), sz, rot) +text_size(lab::AbstractString, sz::Number, rot::Number = 0) = + text_size(length(lab), sz, rot) +text_size(lab::PlotText, sz::Number, rot::Number = 0) = text_size(length(lab.str), sz, rot) # account for the size/length/rotation of tick labels function tick_padding(sp::Subplot, axis::Axis) @@ -103,8 +105,8 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot) # TODO: something different when `RecipesPipeline.is3d(sp) == true` - leftpad = tick_padding(sp, sp[:yaxis]) + sp[:left_margin] + guide_padding(sp[:yaxis]) - toppad = sp[:top_margin] + title_padding(sp) + leftpad = tick_padding(sp, sp[:yaxis]) + sp[:left_margin] + guide_padding(sp[:yaxis]) + toppad = sp[:top_margin] + title_padding(sp) rightpad = sp[:right_margin] bottompad = tick_padding(sp, sp[:xaxis]) + sp[:bottom_margin] + guide_padding(sp[:xaxis]) @@ -124,10 +126,9 @@ _update_plot_object(plt::Plot) = nothing # --------------------------------------------------------- - mutable struct CurrentBackend - sym::Symbol - pkg::AbstractBackend + sym::Symbol + pkg::AbstractBackend end CurrentBackend(sym::Symbol) = CurrentBackend(sym, _backend_instance(sym)) @@ -142,8 +143,10 @@ function _pick_default_backend() if sym in _backends backend(sym) else - @warn("You have set PLOTS_DEFAULT_BACKEND=$env_default but it is not a valid backend package. Choose from:\n\t" * - join(sort(_backends), "\n\t")) + @warn( + "You have set PLOTS_DEFAULT_BACKEND=$env_default but it is not a valid backend package. Choose from:\n\t" * + join(sort(_backends), "\n\t") + ) _fallback_default_backend() end else @@ -151,7 +154,6 @@ function _pick_default_backend() end end - # --------------------------------------------------------- """ @@ -188,7 +190,8 @@ function backend(sym::Symbol) end end -const _deprecated_backends = [:qwt, :winston, :bokeh, :gadfly, :immerse, :glvisualize, :pgfplots] +const _deprecated_backends = + [:qwt, :winston, :bokeh, :gadfly, :immerse, :glvisualize, :pgfplots] function warn_on_deprecated_backend(bsym::Symbol) if bsym in _deprecated_backends @@ -200,23 +203,29 @@ function warn_on_deprecated_backend(bsym::Symbol) end end - - # --------------------------------------------------------- # these are args which every backend supports because they're not used in the backend code const _base_supported_args = [ :color_palette, - :background_color, :background_color_subplot, - :foreground_color, :foreground_color_subplot, + :background_color, + :background_color_subplot, + :foreground_color, + :foreground_color_subplot, :group, :seriestype, - :seriescolor, :seriesalpha, + :seriescolor, + :seriesalpha, :smooth, - :xerror, :yerror, :zerror, + :xerror, + :yerror, + :zerror, :subplot, - :x, :y, :z, - :show, :size, + :x, + :y, + :z, + :show, + :size, :margin, :left_margin, :right_margin, @@ -230,23 +239,21 @@ const _base_supported_args = [ :subplot_index, :discrete_values, :projection, - :show_empty_bins + :show_empty_bins, ] function merge_with_base_supported(v::AVec) v = vcat(v, _base_supported_args) for vi in v if haskey(_axis_defaults, vi) - for letter in (:x,:y,:z) - push!(v, Symbol(letter,vi)) + for letter in (:x, :y, :z) + push!(v, Symbol(letter, vi)) end end end Set(v) end - - @init_backend PyPlot @init_backend UnicodePlots @init_backend Plotly @@ -256,6 +263,7 @@ end @init_backend PGFPlotsX @init_backend InspectDR @init_backend HDF5 +@init_backend Gaston # --------------------------------------------------------- @@ -284,7 +292,6 @@ end # is_subplot_supported(::AbstractBackend) = false # is_subplot_supported() = is_subplot_supported(backend()) - ################################################################################ # initialize the backends @@ -303,36 +310,91 @@ _initialize_backend(pkg::GRBackend) = nothing const _gr_attr = merge_with_base_supported([ :annotations, - :background_color_legend, :background_color_inside, :background_color_outside, - :foreground_color_legend, :foreground_color_grid, :foreground_color_axis, - :foreground_color_text, :foreground_color_border, + :background_color_legend, + :background_color_inside, + :background_color_outside, + :foreground_color_legend, + :foreground_color_grid, + :foreground_color_axis, + :foreground_color_text, + :foreground_color_border, :label, - :seriescolor, :seriesalpha, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, - :fillrange, :fillcolor, :fillalpha, + :seriescolor, + :seriesalpha, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, + :fillrange, + :fillcolor, + :fillalpha, :bins, :layout, - :title, :window_title, - :guide, :lims, :ticks, :scale, :flip, - :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, - :titlefontrotation, :titlefontcolor, - :legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign, - :legendfontrotation, :legendfontcolor, - :tickfontfamily, :tickfontsize, :tickfonthalign, :tickfontvalign, - :tickfontrotation, :tickfontcolor, - :guidefontfamily, :guidefontsize, :guidefonthalign, :guidefontvalign, - :guidefontrotation, :guidefontcolor, - :grid, :gridalpha, :gridstyle, :gridlinewidth, - :legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, - :fill_z, :line_z, :marker_z, :levels, - :ribbon, :quiver, + :title, + :window_title, + :guide, + :lims, + :ticks, + :scale, + :flip, + :titlefontfamily, + :titlefontsize, + :titlefonthalign, + :titlefontvalign, + :titlefontrotation, + :titlefontcolor, + :legendfontfamily, + :legendfontsize, + :legendfonthalign, + :legendfontvalign, + :legendfontrotation, + :legendfontcolor, + :tickfontfamily, + :tickfontsize, + :tickfonthalign, + :tickfontvalign, + :tickfontrotation, + :tickfontcolor, + :guidefontfamily, + :guidefontsize, + :guidefonthalign, + :guidefontvalign, + :guidefontrotation, + :guidefontcolor, + :grid, + :gridalpha, + :gridstyle, + :gridlinewidth, + :legend, + :legendtitle, + :colorbar, + :colorbar_title, + :colorbar_entry, + :colorbar_titlefontfamily, + :colorbar_titlefontsize, + :colorbar_titlefontvalign, + :colorbar_titlefonthalign, + :colorbar_titlefontrotation, + :colorbar_titlefontcolor, + :fill_z, + :line_z, + :marker_z, + :levels, + :ribbon, + :quiver, :orientation, :overwrite_figure, :polar, :aspect_ratio, - :normalize, :weights, + :normalize, + :weights, :inset_subplots, :bar_width, :arrow, @@ -352,6 +414,7 @@ const _gr_seriestype = [ :scatter3d, :surface, :wireframe, + :mesh3d, :volume, :shape, ] @@ -375,35 +438,79 @@ end const _plotly_attr = merge_with_base_supported([ :annotations, - :background_color_legend, :background_color_inside, :background_color_outside, - :foreground_color_legend, :foreground_color_guide, - :foreground_color_grid, :foreground_color_axis, - :foreground_color_text, :foreground_color_border, + :background_color_legend, + :background_color_inside, + :background_color_outside, + :foreground_color_legend, + :foreground_color_guide, + :foreground_color_grid, + :foreground_color_axis, + :foreground_color_text, + :foreground_color_border, :foreground_color_title, :label, - :seriescolor, :seriesalpha, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, :markerstrokestyle, - :fillrange, :fillcolor, :fillalpha, + :seriescolor, + :seriesalpha, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, + :markerstrokestyle, + :fillrange, + :fillcolor, + :fillalpha, :bins, - :title, :titlelocation, - :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, + :title, + :titlelocation, + :titlefontfamily, + :titlefontsize, + :titlefonthalign, + :titlefontvalign, :titlefontcolor, - :legendfontfamily, :legendfontsize, :legendfontcolor, - :tickfontfamily, :tickfontsize, :tickfontcolor, - :guidefontfamily, :guidefontsize, :guidefontcolor, + :legendfontfamily, + :legendfontsize, + :legendfontcolor, + :tickfontfamily, + :tickfontsize, + :tickfontcolor, + :guidefontfamily, + :guidefontsize, + :guidefontcolor, :window_title, - :guide, :lims, :ticks, :scale, :flip, :rotation, - :tickfont, :guidefont, :legendfont, - :grid, :gridalpha, :gridlinewidth, - :legend, :colorbar, :colorbar_title, :colorbar_entry, - :marker_z, :fill_z, :line_z, :levels, - :ribbon, :quiver, + :guide, + :lims, + :ticks, + :scale, + :flip, + :rotation, + :tickfont, + :guidefont, + :legendfont, + :grid, + :gridalpha, + :gridlinewidth, + :legend, + :colorbar, + :colorbar_title, + :colorbar_entry, + :marker_z, + :fill_z, + :line_z, + :levels, + :ribbon, + :quiver, :orientation, # :overwrite_figure, :polar, - :normalize, :weights, + :normalize, + :weights, # :contours, :aspect_ratio, :hover, @@ -414,7 +521,7 @@ const _plotly_attr = merge_with_base_supported([ :tick_direction, :camera, :contour_labels, - ]) +]) const _plotly_seriestype = [ :path, @@ -428,12 +535,24 @@ const _plotly_seriestype = [ :shape, :scattergl, :straightline, - :mesh3d + :mesh3d, ] const _plotly_style = [:auto, :solid, :dash, :dot, :dashdot] const _plotly_marker = [ - :none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, - :cross, :xcross, :pentagon, :hexagon, :octagon, :vline, :hline + :none, + :auto, + :circle, + :rect, + :diamond, + :utriangle, + :dtriangle, + :cross, + :xcross, + :pentagon, + :hexagon, + :octagon, + :vline, + :hline, ] const _plotly_scale = [:identity, :log10] @@ -448,23 +567,50 @@ const _pgfplots_attr = merge_with_base_supported([ :background_color_inside, # :background_color_outside, # :foreground_color_legend, - :foreground_color_grid, :foreground_color_axis, - :foreground_color_text, :foreground_color_border, + :foreground_color_grid, + :foreground_color_axis, + :foreground_color_text, + :foreground_color_border, :label, - :seriescolor, :seriesalpha, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, :markerstrokestyle, - :fillrange, :fillcolor, :fillalpha, + :seriescolor, + :seriesalpha, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, + :markerstrokestyle, + :fillrange, + :fillcolor, + :fillalpha, :bins, # :bar_width, :bar_edges, :title, # :window_title, - :guide, :guide_position, :lims, :ticks, :scale, :flip, :rotation, - :tickfont, :guidefont, :legendfont, - :grid, :legend, - :colorbar, :colorbar_title, - :fill_z, :line_z, :marker_z, :levels, + :guide, + :guide_position, + :lims, + :ticks, + :scale, + :flip, + :rotation, + :tickfont, + :guidefont, + :legendfont, + :grid, + :legend, + :colorbar, + :colorbar_title, + :fill_z, + :line_z, + :marker_z, + :levels, # :ribbon, :quiver, :arrow, # :orientation, # :overwrite_figure, @@ -476,9 +622,36 @@ const _pgfplots_attr = merge_with_base_supported([ :camera, :contour_labels, ]) -const _pgfplots_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] +const _pgfplots_seriestype = [ + :path, + :path3d, + :scatter, + :steppre, + :stepmid, + :steppost, + :histogram2d, + :ysticks, + :xsticks, + :contour, + :shape, + :straightline, +] const _pgfplots_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] -const _pgfplots_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline] #vcat(_allMarkers, Shape) +const _pgfplots_marker = [ + :none, + :auto, + :circle, + :rect, + :diamond, + :utriangle, + :dtriangle, + :cross, + :xcross, + :star5, + :pentagon, + :hline, + :vline, +] #vcat(_allMarkers, Shape) const _pgfplots_scale = [:identity, :ln, :log2, :log10] # ------------------------------------------------------------------------------ @@ -491,11 +664,11 @@ function _initialize_backend(pkg::PlotlyJSBackend) end end -const _plotlyjs_attr = _plotly_attr -const _plotlyjs_seriestype = _plotly_seriestype -const _plotlyjs_style = _plotly_style -const _plotlyjs_marker = _plotly_marker -const _plotlyjs_scale = _plotly_scale +const _plotlyjs_attr = _plotly_attr +const _plotlyjs_seriestype = _plotly_seriestype +const _plotlyjs_style = _plotly_style +const _plotlyjs_marker = _plotly_marker +const _plotlyjs_scale = _plotly_scale # ------------------------------------------------------------------------------ # pyplot @@ -513,32 +686,89 @@ end const _pyplot_attr = merge_with_base_supported([ :annotations, - :background_color_legend, :background_color_inside, :background_color_outside, - :foreground_color_grid, :foreground_color_legend, :foreground_color_title, - :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, + :background_color_legend, + :background_color_inside, + :background_color_outside, + :foreground_color_grid, + :foreground_color_legend, + :foreground_color_title, + :foreground_color_axis, + :foreground_color_border, + :foreground_color_guide, + :foreground_color_text, :label, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, - :fillrange, :fillcolor, :fillalpha, - :bins, :bar_width, :bar_edges, :bar_position, - :title, :titlelocation, :titlefont, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, + :fillrange, + :fillcolor, + :fillalpha, + :bins, + :bar_width, + :bar_edges, + :bar_position, + :title, + :titlelocation, + :titlefont, :window_title, - :guide, :guide_position, :lims, :ticks, :scale, :flip, :rotation, - :titlefontfamily, :titlefontsize, :titlefontcolor, - :legendfontfamily, :legendfontsize, :legendfontcolor, - :tickfontfamily, :tickfontsize, :tickfontcolor, - :guidefontfamily, :guidefontsize, :guidefontcolor, - :grid, :gridalpha, :gridstyle, :gridlinewidth, - :legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, - :marker_z, :line_z, :fill_z, + :guide, + :guide_position, + :lims, + :ticks, + :scale, + :flip, + :rotation, + :titlefontfamily, + :titlefontsize, + :titlefontcolor, + :legendfontfamily, + :legendfontsize, + :legendfontcolor, + :tickfontfamily, + :tickfontsize, + :tickfontcolor, + :guidefontfamily, + :guidefontsize, + :guidefontcolor, + :grid, + :gridalpha, + :gridstyle, + :gridlinewidth, + :legend, + :legendtitle, + :colorbar, + :colorbar_title, + :colorbar_entry, + :colorbar_ticks, + :colorbar_tickfontfamily, + :colorbar_tickfontsize, + :colorbar_tickfonthalign, + :colorbar_tickfontvalign, + :colorbar_tickfontrotation, + :colorbar_tickfontcolor, + :colorbar_scale, + :marker_z, + :line_z, + :fill_z, :levels, - :ribbon, :quiver, :arrow, + :ribbon, + :quiver, + :arrow, :orientation, :overwrite_figure, :polar, - :normalize, :weights, - :contours, :aspect_ratio, + :normalize, + :weights, + :contours, + :aspect_ratio, :clims, :inset_subplots, :dpi, @@ -547,10 +777,11 @@ const _pyplot_attr = merge_with_base_supported([ :tick_direction, :camera, :contour_labels, - ]) +]) const _pyplot_seriestype = [ :path, :steppre, + :stepmid, :steppost, :shape, :straightline, @@ -569,6 +800,112 @@ const _pyplot_style = [:auto, :solid, :dash, :dot, :dashdot] const _pyplot_marker = vcat(_allMarkers, :pixel) const _pyplot_scale = [:identity, :ln, :log2, :log10] +# ------------------------------------------------------------------------------ +# Gaston + +function _initialize_backend(::GastonBackend) + @eval Main begin + import Gaston + export Gaston + end +end + +const _gaston_attr = merge_with_base_supported([ + :annotations, + # :background_color_legend, + # :background_color_inside, + # :background_color_outside, + # :foreground_color_legend, + # :foreground_color_grid, :foreground_color_axis, + # :foreground_color_text, :foreground_color_border, + :label, + :seriescolor, + :seriesalpha, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + # :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, :markerstrokestyle, + # :fillrange, :fillcolor, :fillalpha, + # :bins, + # :bar_width, :bar_edges, + :title, + :window_title, + :guide, + :guide_position, + :lims, + :ticks, + :scale, + :flip, + :rotation, + :tickfont, + :guidefont, + :legendfont, + :grid, + :legend, + # :colorbar, :colorbar_title, + # :fill_z, :line_z, :marker_z, :levels, + # :ribbon, + :quiver, + :arrow, + # :orientation, :overwrite_figure, + :polar, + # :normalize, :weights, :contours, + :aspect_ratio, + :tick_direction, + # :framestyle, + # :camera, + # :contour_labels, +]) + +const _gaston_seriestype = [ + :path, + :path3d, + :scatter, + :steppre, + :stepmid, + :steppost, + :ysticks, + :xsticks, + :contour, + :shape, + :straightline, + :scatter3d, + :contour3d, + :wireframe, + :heatmap, + :surface, + :mesh3d, + :image, +] + +const _gaston_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] + +const _gaston_marker = [ + :none, + :auto, + :pixel, + :cross, + :xcross, + :+, + :x, + :star5, + :rect, + :circle, + :utriangle, + :dtriangle, + :diamond, + :pentagon, + # :hline, + # :vline, +] + +const _gaston_scale = [:identity, :ln, :log2, :log10] + # ------------------------------------------------------------------------------ # unicodeplots @@ -581,14 +918,17 @@ const _unicodeplots_attr = merge_with_base_supported([ :markershape, :bins, :title, - :guide, :lims, - ]) + :guide, + :lims, +]) const _unicodeplots_seriestype = [ - :path, :scatter, :straightline, + :path, + :scatter, + :straightline, # :bar, :shape, :histogram2d, - :spy + :spy, ] const _unicodeplots_style = [:auto, :solid] const _unicodeplots_marker = [:none, :auto, :circle] @@ -602,36 +942,74 @@ const _canvas_type = Ref(:auto) const _hdf5_attr = merge_with_base_supported([ :annotations, - :background_color_legend, :background_color_inside, :background_color_outside, - :foreground_color_grid, :foreground_color_legend, :foreground_color_title, - :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, + :background_color_legend, + :background_color_inside, + :background_color_outside, + :foreground_color_grid, + :foreground_color_legend, + :foreground_color_title, + :foreground_color_axis, + :foreground_color_border, + :foreground_color_guide, + :foreground_color_text, :label, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, - :fillrange, :fillcolor, :fillalpha, - :bins, :bar_width, :bar_edges, :bar_position, - :title, :titlelocation, :titlefont, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, + :fillrange, + :fillcolor, + :fillalpha, + :bins, + :bar_width, + :bar_edges, + :bar_position, + :title, + :titlelocation, + :titlefont, :window_title, - :guide, :lims, :ticks, :scale, :flip, :rotation, - :tickfont, :guidefont, :legendfont, - :grid, :legend, :colorbar, - :marker_z, :line_z, :fill_z, + :guide, + :lims, + :ticks, + :scale, + :flip, + :rotation, + :tickfont, + :guidefont, + :legendfont, + :grid, + :legend, + :colorbar, + :marker_z, + :line_z, + :fill_z, :levels, - :ribbon, :quiver, :arrow, + :ribbon, + :quiver, + :arrow, :orientation, :overwrite_figure, :polar, - :normalize, :weights, - :contours, :aspect_ratio, + :normalize, + :weights, + :contours, + :aspect_ratio, :clims, :inset_subplots, :dpi, :colorbar_title, - ]) +]) const _hdf5_seriestype = [ :path, :steppre, + :stepmid, :steppost, :shape, :straightline, @@ -652,68 +1030,115 @@ const _hdf5_scale = [:identity, :ln, :log2, :log10] # Additional constants #Dict has problems using "Types" as keys. Initialize in "_initialize_backend": -const HDF5PLOT_MAP_STR2TELEM = Dict{String, Type}() -const HDF5PLOT_MAP_TELEM2STR = Dict{Type, String}() +const HDF5PLOT_MAP_STR2TELEM = Dict{String,Type}() +const HDF5PLOT_MAP_TELEM2STR = Dict{Type,String}() #Don't really like this global variable... Very hacky mutable struct HDF5Plot_PlotRef - ref::Union{Plot, Nothing} + ref::Union{Plot,Nothing} end const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing) - # ------------------------------------------------------------------------------ # inspectdr const _inspectdr_attr = merge_with_base_supported([ :annotations, - :background_color_legend, :background_color_inside, :background_color_outside, + :background_color_legend, + :background_color_inside, + :background_color_outside, # :foreground_color_grid, - :foreground_color_legend, :foreground_color_title, - :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, + :foreground_color_legend, + :foreground_color_title, + :foreground_color_axis, + :foreground_color_border, + :foreground_color_guide, + :foreground_color_text, :label, - :seriescolor, :seriesalpha, - :linecolor, :linestyle, :linewidth, :linealpha, - :markershape, :markercolor, :markersize, :markeralpha, - :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, + :seriescolor, + :seriesalpha, + :linecolor, + :linestyle, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokealpha, :markerstrokestyle, #Causes warning not to have it... what is this? - :fillcolor, :fillalpha, #:fillrange, -# :bins, :bar_width, :bar_edges, :bar_position, - :title, :titlelocation, + :fillcolor, + :fillalpha, #:fillrange, + # :bins, :bar_width, :bar_edges, :bar_position, + :title, + :titlelocation, :window_title, - :guide, :lims, :scale, #:ticks, :flip, :rotation, - :titlefontfamily, :titlefontsize, :titlefontcolor, - :legendfontfamily, :legendfontsize, :legendfontcolor, - :tickfontfamily, :tickfontsize, :tickfontcolor, - :guidefontfamily, :guidefontsize, :guidefontcolor, - :grid, :legend, #:colorbar, -# :marker_z, -# :line_z, -# :levels, - # :ribbon, :quiver, :arrow, -# :orientation, + :guide, + :lims, + :scale, #:ticks, :flip, :rotation, + :titlefontfamily, + :titlefontsize, + :titlefontcolor, + :legendfontfamily, + :legendfontsize, + :legendfontcolor, + :tickfontfamily, + :tickfontsize, + :tickfontcolor, + :guidefontfamily, + :guidefontsize, + :guidefontcolor, + :grid, + :legend, #:colorbar, + # :marker_z, + # :line_z, + # :levels, + # :ribbon, :quiver, :arrow, + # :orientation, :overwrite_figure, :polar, -# :normalize, :weights, -# :contours, :aspect_ratio, -# :clims, -# :inset_subplots, + # :normalize, :weights, + # :contours, :aspect_ratio, + # :clims, + # :inset_subplots, :dpi, -# :colorbar_title, - ]) + # :colorbar_title, +]) const _inspectdr_style = [:auto, :solid, :dash, :dot, :dashdot] const _inspectdr_seriestype = [ - :path, :scatter, :shape, :straightline, #, :steppre, :steppost - ] + :path, + :scatter, + :shape, + :straightline, #, :steppre, :stepmid, :steppost +] #see: _allMarkers, _shape_keys const _inspectdr_marker = Symbol[ - :none, :auto, - :circle, :rect, :diamond, - :cross, :xcross, - :utriangle, :dtriangle, :rtriangle, :ltriangle, - :pentagon, :hexagon, :heptagon, :octagon, - :star4, :star5, :star6, :star7, :star8, - :vline, :hline, :+, :x, + :none, + :auto, + :circle, + :rect, + :diamond, + :cross, + :xcross, + :utriangle, + :dtriangle, + :rtriangle, + :ltriangle, + :pentagon, + :hexagon, + :heptagon, + :octagon, + :star4, + :star5, + :star6, + :star7, + :star8, + :vline, + :hline, + :+, + :x, ] const _inspectdr_scale = [:identity, :ln, :log2, :log10] @@ -842,6 +1267,7 @@ const _pgfplotsx_marker = [ :rtriangle, :cross, :xcross, + :x, :star5, :pentagon, :hline, diff --git a/src/backends/deprecated/pgfplots.jl b/src/backends/deprecated/pgfplots.jl index 718d8241..4c9f1ea3 100644 --- a/src/backends/deprecated/pgfplots.jl +++ b/src/backends/deprecated/pgfplots.jl @@ -27,7 +27,7 @@ const _pgfplots_markers = KW( :diamond => "diamond*", :pentagon => "pentagon*", :hline => "-", - :vline => "|" + :vline => "|", ) const _pgfplots_legend_pos = KW( @@ -38,7 +38,6 @@ const _pgfplots_legend_pos = KW( :outertopright => "outer north east", ) - const _pgf_series_extrastyle = KW( :steppre => "const plot mark right", :stepmid => "const plot mark mid", @@ -50,11 +49,7 @@ const _pgf_series_extrastyle = KW( # PGFPlots uses the anchors to define orientations for example to align left # one needs to use the right edge as anchor -const _pgf_annotation_halign = KW( - :center => "", - :left => "right", - :right => "left" -) +const _pgf_annotation_halign = KW(:center => "", :left => "right", :right => "left") const _pgf_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgf_framestyle_defaults = Dict(:semi => :box) @@ -63,7 +58,9 @@ function pgf_framestyle(style::Symbol) return style else default_style = get(_pgf_framestyle_defaults, style, :axes) - @warn("Framestyle :$style is not (yet) supported by the PGFPlots backend. :$default_style was cosen instead.") + @warn( + "Framestyle :$style is not (yet) supported by the PGFPlots backend. :$default_style was cosen instead." + ) default_style end end @@ -78,15 +75,15 @@ end function pgf_color(grad::ColorGradient) # Can't handle ColorGradient here, fallback to defaults. - cstr = @sprintf("{rgb,1:red,%.8f;green,%.8f;blue,%.8f}", 0.0, 0.60560316,0.97868012) + cstr = @sprintf("{rgb,1:red,%.8f;green,%.8f;blue,%.8f}", 0.0, 0.60560316, 0.97868012) cstr, 1 end # Generates a colormap for pgfplots based on a ColorGradient function pgf_colormap(grad::ColorGradient) join(map(grad.colors) do c - @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) - end,", ") + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) + end, ", ") end pgf_thickness_scaling(plt::Plot) = plt[:thickness_scaling] @@ -94,7 +91,7 @@ pgf_thickness_scaling(sp::Subplot) = pgf_thickness_scaling(sp.plt) pgf_thickness_scaling(series) = pgf_thickness_scaling(series[:subplot]) function pgf_fillstyle(plotattributes, i = 1) - cstr,a = pgf_color(get_fillcolor(plotattributes, i)) + cstr, a = pgf_color(get_fillcolor(plotattributes, i)) fa = get_fillalpha(plotattributes, i) if fa !== nothing a = fa @@ -126,8 +123,15 @@ end function pgf_marker(plotattributes, i = 1) shape = _cycle(plotattributes[:markershape], i) - cstr, a = pgf_color(plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i))) - cstr_stroke, a_stroke = pgf_color(plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i))) + cstr, a = pgf_color( + plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i)), + ) + cstr_stroke, a_stroke = pgf_color( + plot_color( + get_markerstrokecolor(plotattributes, i), + get_markerstrokealpha(plotattributes, i), + ), + ) return string( "mark = $(get(_pgfplots_markers, shape, "*")),\n", "mark size = $(pgf_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i)),\n", @@ -138,22 +142,28 @@ function pgf_marker(plotattributes, i = 1) line width = $(pgf_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i)), rotate = $(shape == :dtriangle ? 180 : 0), $(get(_pgfplots_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid")) - }" - ) + }", + ) end function pgf_add_annotation!(o, x, y, val, thickness_scaling = 1) # Construct the style string. # Currently supports color and orientation - cstr,a = pgf_color(val.font.color) - push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text - x, y, - style=""" - $(get(_pgf_annotation_halign,val.font.halign,"")), - color=$cstr, draw opacity=$(convert(Float16,a)), - rotate=$(val.font.rotation), - font=$(pgf_font(val.font.pointsize, thickness_scaling)) - """)) + cstr, a = pgf_color(val.font.color) + push!( + o, + PGFPlots.Plots.Node( + val.str, # Annotation Text + x, + y, + style = """ + $(get(_pgf_annotation_halign,val.font.halign,"")), + color=$cstr, draw opacity=$(convert(Float16,a)), + rotate=$(val.font.rotation), + font=$(pgf_font(val.font.pointsize, thickness_scaling)) + """, + ), + ) end # -------------------------------------------------------------------------------------- @@ -241,7 +251,15 @@ function pgf_series(sp::Subplot, series::Series) # add fillrange if series[:fillrange] !== nothing && st != :shape - push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + push!( + series_collection, + pgf_fillrange_series( + series, + i, + _cycle(series[:fillrange], rng), + seg_args..., + ), + ) end # build/return the series object @@ -313,7 +331,7 @@ end # ---------------------------------------------------------------- function pgf_axis(sp::Subplot, letter) - axis = sp[Symbol(letter,:axis)] + axis = sp[Symbol(letter, :axis)] style = [] kw = KW() @@ -324,7 +342,7 @@ function pgf_axis(sp::Subplot, letter) framestyle = pgf_framestyle(sp[:framestyle]) # axis guide - kw[Symbol(letter,:label)] = axis[:guide] + kw[Symbol(letter, :label)] = axis[:guide] # axis label position labelpos = "" @@ -336,7 +354,23 @@ function pgf_axis(sp::Subplot, letter) # Add label font cstr, α = pgf_color(plot_color(axis[:guidefontcolor])) - push!(style, string(letter, "label style = {", labelpos ,"font = ", pgf_font(axis[:guidefontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", axis[:guidefontrotation], "}")) + push!( + style, + string( + letter, + "label style = {", + labelpos, + "font = ", + pgf_font(axis[:guidefontsize], pgf_thickness_scaling(sp)), + ", color = ", + cstr, + ", draw opacity = ", + α, + ", rotate = ", + axis[:guidefontrotation], + "}", + ), + ) # flip/reverse? axis[:flip] && push!(style, "$letter dir=reverse") @@ -344,7 +378,7 @@ function pgf_axis(sp::Subplot, letter) # scale scale = axis[:scale] if scale in (:log2, :ln, :log10) - kw[Symbol(letter,:mode)] = "log" + kw[Symbol(letter, :mode)] = "log" scale == :ln || push!(style, "log basis $letter=$(scale == :log2 ? 2 : 10)") end @@ -363,16 +397,20 @@ function pgf_axis(sp::Subplot, letter) # limits # TODO: support zlims if letter != :z - lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) - kw[Symbol(letter,:min)] = lims[1] - kw[Symbol(letter,:max)] = lims[2] + lims = + ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : + axis_limits(sp, letter) + kw[Symbol(letter, :min)] = lims[1] + kw[Symbol(letter, :max)] = lims[2] end if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none ticks = get_ticks(sp, axis) #pgf plot ignores ticks with angle below 90 when xmin = 90 so shift values - tick_values = ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : ticks[1] - push!(style, string(letter, "tick = {", join(tick_values,","), "}")) + tick_values = + ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : + ticks[1] + push!(style, string(letter, "tick = {", join(tick_values, ","), "}")) if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto # wrap the power part of label with } tick_labels = Vector{String}(undef, length(ticks[2])) @@ -381,21 +419,59 @@ function pgf_axis(sp::Subplot, letter) power = string("{", power, "}") tick_labels[i] = string(base, "^", power) end - push!(style, string(letter, "ticklabels = {\$", join(tick_labels,"\$,\$"), "\$}")) + push!( + style, + string(letter, "ticklabels = {\$", join(tick_labels, "\$,\$"), "\$}"), + ) elseif axis[:showaxis] - tick_labels = ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2] + tick_labels = + ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2] if axis[:formatter] in (:scientific, :auto) tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$") tick_labels = replace.(tick_labels, Ref("×" => "\\times")) end - push!(style, string(letter, "ticklabels = {", join(tick_labels,","), "}")) + push!(style, string(letter, "ticklabels = {", join(tick_labels, ","), "}")) else push!(style, string(letter, "ticklabels = {}")) end - push!(style, string(letter, "tick align = ", (axis[:tick_direction] == :out ? "outside" : "inside"))) + push!( + style, + string( + letter, + "tick align = ", + (axis[:tick_direction] == :out ? "outside" : "inside"), + ), + ) cstr, α = pgf_color(plot_color(axis[:tickfontcolor])) - push!(style, string(letter, "ticklabel style = {font = ", pgf_font(axis[:tickfontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", axis[:tickfontrotation], "}")) - push!(style, string(letter, " grid style = {", pgf_linestyle(pgf_thickness_scaling(sp) * axis[:gridlinewidth], axis[:foreground_color_grid], axis[:gridalpha], axis[:gridstyle]), "}")) + push!( + style, + string( + letter, + "ticklabel style = {font = ", + pgf_font(axis[:tickfontsize], pgf_thickness_scaling(sp)), + ", color = ", + cstr, + ", draw opacity = ", + α, + ", rotate = ", + axis[:tickfontrotation], + "}", + ), + ) + push!( + style, + string( + letter, + " grid style = {", + pgf_linestyle( + pgf_thickness_scaling(sp) * axis[:gridlinewidth], + axis[:foreground_color_grid], + axis[:gridalpha], + axis[:gridstyle], + ), + "}", + ), + ) end # framestyle @@ -412,7 +488,20 @@ function pgf_axis(sp::Subplot, letter) if framestyle == :zerolines push!(style, string("extra ", letter, " ticks = 0")) push!(style, string("extra ", letter, " tick labels = ")) - push!(style, string("extra ", letter, " tick style = {grid = major, major grid style = {", pgf_linestyle(pgf_thickness_scaling(sp), axis[:foreground_color_border], 1.0), "}}")) + push!( + style, + string( + "extra ", + letter, + " tick style = {grid = major, major grid style = {", + pgf_linestyle( + pgf_thickness_scaling(sp), + axis[:foreground_color_border], + 1.0, + ), + "}}", + ), + ) end if !axis[:showaxis] @@ -421,7 +510,19 @@ function pgf_axis(sp::Subplot, letter) if !axis[:showaxis] || framestyle in (:zerolines, :grid, :none) push!(style, string(letter, " axis line style = {draw opacity = 0}")) else - push!(style, string(letter, " axis line style = {", pgf_linestyle(pgf_thickness_scaling(sp), axis[:foreground_color_border], 1.0), "}")) + push!( + style, + string( + letter, + " axis line style = {", + pgf_linestyle( + pgf_thickness_scaling(sp), + axis[:foreground_color_border], + 1.0, + ), + "}", + ), + ) end # return the style list and KW args @@ -430,7 +531,6 @@ end # ---------------------------------------------------------------- - function _update_plot_object(plt::Plot{PGFPlotsBackend}) plt.o = PGFPlots.Axis[] # Obtain the total height of the plot by extracting the maximal bottom @@ -438,7 +538,7 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) total_height = bottom(bbox(plt.layout)) for sp in plt.subplots - # first build the PGFPlots.Axis object + # first build the PGFPlots.Axis object style = ["unbounded coords=jump"] kw = KW() @@ -456,18 +556,34 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) # A round on 2 decimal places should be enough precision for 300 dpi # plots. bb = bbox(sp) - push!(style, """ - xshift = $(left(bb).value)mm, - yshift = $(round((total_height - (bottom(bb))).value, digits=2))mm, - axis background/.style={fill=$(pgf_color(sp[:background_color_inside])[1])} - """) + push!( + style, + """ + xshift = $(left(bb).value)mm, + yshift = $(round((total_height - (bottom(bb))).value, digits=2))mm, + axis background/.style={fill=$(pgf_color(sp[:background_color_inside])[1])} +""", + ) kw[:width] = "$(width(bb).value)mm" kw[:height] = "$(height(bb).value)mm" if sp[:title] != "" kw[:title] = "$(sp[:title])" cstr, α = pgf_color(plot_color(sp[:titlefontcolor])) - push!(style, string("title style = {font = ", pgf_font(sp[:titlefontsize], pgf_thickness_scaling(sp)), ", color = ", cstr, ", draw opacity = ", α, ", rotate = ", sp[:titlefontrotation], "}")) + push!( + style, + string( + "title style = {font = ", + pgf_font(sp[:titlefontsize], pgf_thickness_scaling(sp)), + ", color = ", + cstr, + ", draw opacity = ", + α, + ", rotate = ", + sp[:titlefontrotation], + "}", + ), + ) end if get_aspect_ratio(sp) in (1, :equal) @@ -481,15 +597,25 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend])) fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) - push!(style, string( - "legend style = {", - pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",", + push!( + style, + string( + "legend style = {", + pgf_linestyle( + pgf_thickness_scaling(sp), + sp[:foreground_color_legend], + fg_alpha, + "solid", + ), + ",", "fill = $cstr,", "fill opacity = $bg_alpha,", "text opacity = $(alpha(plot_color(sp[:legendfontcolor]))),", - "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), - "}", - )) + "font = ", + pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), + "}", + ), + ) if any(s[:seriestype] == :contour for s in series_list(sp)) kw[:view] = "{0}{90}" @@ -520,7 +646,10 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) for series in series_list(sp) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient - push!(style,"colormap={plots}{$(pgf_colormap(series.plotattributes[col]))}") + push!( + style, + "colormap={plots}{$(pgf_colormap(series.plotattributes[col]))}", + ) if sp[:colorbar] == :none kw[:colorbar] = "false" @@ -543,17 +672,26 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) # add series annotations anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgf_add_annotation!(o, xi, yi, PlotText(str, fnt), pgf_thickness_scaling(series)) + for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y]) + pgf_add_annotation!( + o, + xi, + yi, + PlotText(str, fnt), + pgf_thickness_scaling(series), + ) end end # add the annotations for ann in sp[:annotations] - pgf_add_annotation!(o, locate_annotation(sp, ann...)..., pgf_thickness_scaling(sp)) + pgf_add_annotation!( + o, + locate_annotation(sp, ann...)..., + pgf_thickness_scaling(sp), + ) end - # add the PGFPlots.Axis to the list push!(plt.o, o) end @@ -568,7 +706,7 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsBackend}) pgfplt = PGFPlots.plot(plt.o) # save a pdf - fn = tempname()*".pdf" + fn = tempname() * ".pdf" PGFPlots.save(PGFPlots.PDF(fn), pgfplt) # read it into io @@ -579,8 +717,12 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsBackend}) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsBackend}) - fn = tempname()*".tex" - PGFPlots.save(fn, backend_object(plt), include_preamble=plt.attr[:tex_output_standalone]) + fn = tempname() * ".tex" + PGFPlots.save( + fn, + backend_object(plt), + include_preamble = plt.attr[:tex_output_standalone], + ) write(io, read(open(fn), String)) end diff --git a/src/backends/gaston.jl b/src/backends/gaston.jl new file mode 100644 index 00000000..223ce4b7 --- /dev/null +++ b/src/backends/gaston.jl @@ -0,0 +1,600 @@ +# https://github.com/mbaz/Gaston. + +# -------------------------------------------- +# These functions are called by Plots +# -------------------------------------------- + +# Create the window/figure for this backend. +function _create_backend_figure(plt::Plot{GastonBackend}) + state_handle = Gaston.nexthandle() # for now all the figures will be kept + plt.o = Gaston.newfigure(state_handle) +end + +function _before_layout_calcs(plt::Plot{GastonBackend}) + # Initialize all the subplots first + plt.o.subplots = Gaston.SubPlot[] + + n1 = n2 = 0 + if length(plt.inset_subplots) > 0 + n1, sps = gaston_get_subplots(0, plt.inset_subplots, plt.layout) + gaston_init_subplots(plt, sps) + end + + if length(plt.subplots) > 0 + n2, sps = gaston_get_subplots(0, plt.subplots, plt.layout) + end + + if (n = n1 + n2) != length(plt.subplots) + @error "Gaston: $n != $(length(plt.subplots))" + end + + plt.o.layout = gaston_init_subplots(plt, sps) + + # Then add the series (curves in gaston) + for series in plt.series_list + gaston_add_series(plt, series) + end + + for sp in plt.subplots + sp === nothing && continue + for ann in sp[:annotations] + x, y, val = locate_annotation(sp, ann...) + sp.o.axesconf *= "\nset label '$(val.str)' at $x,$y $(gaston_font(val.font))" + end + end + nothing +end + +function _update_min_padding!(sp::Subplot{GastonBackend}) + sp.minpad = 0mm, 0mm, 0mm, 0mm + nothing +end + +function _update_plot_object(plt::Plot{GastonBackend}) + # respect the layout ratio + dat = gaston_multiplot_pos_size(plt.layout, (0, 0, 1, 1)) + gaston_multiplot_pos_size!(dat) + nothing +end + +for (mime, term) in ( + "application/eps" => "epscairo", + "image/eps" => "epslatex", + "application/pdf" => "pdfcairo", + "application/postscript" => "postscript", + "image/png" => "png", + "image/svg+xml" => "svg", + "text/latex" => "tikz", + "application/x-tex" => "epslatex", + "text/plain" => "dumb", +) + @eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{GastonBackend}) + term = String($term) + tmpfile = "$(Gaston.tempname()).$term" + + Gaston.save( + term = term, + output = tmpfile, + handle = plt.o.handle, + saveopts = gaston_saveopts(plt), + ) + while !isfile(tmpfile) + end # avoid race condition with read in next line + write(io, read(tmpfile)) + rm(tmpfile, force = true) + nothing + end +end + +_display(plt::Plot{GastonBackend}) = display(plt.o) + +# -------------------------------------------- +# These functions are gaston specific +# -------------------------------------------- + +function gaston_saveopts(plt::Plot{GastonBackend}) + saveopts = String["size $(join(plt.attr[:size], ","))"] + + push!( + saveopts, + gaston_font( + plottitlefont(plt), + rot = false, + align = false, + color = false, + scale = 1, + ), + ) + + push!(saveopts, "background $(gaston_color(plt.attr[:background_color]))") + + # push!(saveopts, "title '$(plt.attr[:window_title])'") + + # Scale all plot elements to match Plots.jl DPI standard + scaling = plt.attr[:dpi] / Plots.DPI + push!(saveopts, "fontscale $scaling lw $scaling dl $scaling ps $scaling") + + return join(saveopts, " ") +end + +function gaston_get_subplots(n, plt_subplots, layout) + nr, nc = size(layout) + sps = Array{Any}(nothing, nr, nc) + for r in 1:nr, c in 1:nc # NOTE: col major + l = layout[r, c] + if l isa GridLayout + n, sub = gaston_get_subplots(n, plt_subplots, l) + sps[r, c] = size(sub) == (1, 1) ? only(sub) : sub + else + sps[r, c] = get(l.attr, :blank, false) ? nothing : plt_subplots[n += 1] + end + end + return n, sps +end + +function gaston_init_subplots(plt, sps) + sz = nr, nc = size(sps) + for c in 1:nc, r in 1:nr # NOTE: row major + sp = sps[r, c] + if sp isa Subplot || sp === nothing + gaston_init_subplot(plt, sp) + else + gaston_init_subplots(plt, sp) + sz = max.(sz, size(sp)) + end + end + return sz +end + +function gaston_init_subplot( + plt::Plot{GastonBackend}, + sp::Union{Nothing,Subplot{GastonBackend}}, +) + if sp === nothing + push!(plt.o.subplots, sp) + else + dims = + RecipesPipeline.is3d(sp) || + sp.attr[:projection] == "3d" || + needs_any_3d_axes(sp) ? 3 : 2 + any_label = false + for series in series_list(sp) + if dims == 2 && series[:seriestype] ∈ (:heatmap, :contour) + dims = 3 # we need heatmap/contour to use splot, not plot + end + any_label |= should_add_to_legend(series) + end + sp.o = Gaston.Plot( + dims = dims, + curves = [], + axesconf = gaston_parse_axes_args(plt, sp, dims, any_label), + ) + push!(plt.o.subplots, sp.o) + end + nothing +end + +function gaston_multiplot_pos_size(layout, parent_xy_wh) + nr, nc = size(layout) + dat = Array{Any}(nothing, nr, nc) + for r in 1:nr, c in 1:nc + l = layout[r, c] + # width and height (pct) are multiplicative (parent) + w = layout.widths[c].value * parent_xy_wh[3] + h = layout.heights[r].value * parent_xy_wh[4] + if isa(l, EmptyLayout) + dat[r, c] = (c - 1) * w, (r - 1) * h, w, h, nothing + else + # previous position (origin) + prev_r = r > 1 ? dat[r - 1, c] : nothing + prev_c = c > 1 ? dat[r, c - 1] : nothing + prev_r isa Array && (prev_r = prev_r[end, end]) + prev_c isa Array && (prev_c = prev_c[end, end]) + x = prev_c !== nothing ? prev_c[1] + prev_c[3] : parent_xy_wh[1] + y = prev_r !== nothing ? prev_r[2] + prev_r[4] : parent_xy_wh[2] + if l isa GridLayout + sub = gaston_multiplot_pos_size(l, (x, y, w, h)) + dat[r, c] = size(sub) == (1, 1) ? only(sub) : sub + else + dat[r, c] = x, y, w, h, l + end + end + end + return dat +end + +function gaston_multiplot_pos_size!(dat) + nr, nc = size(dat) + for r in 1:nr, c in 1:nc + xy_wh_sp = dat[r, c] + if xy_wh_sp isa Array + gaston_multiplot_pos_size!(xy_wh_sp) + elseif xy_wh_sp isa Tuple + x, y, w, h, sp = xy_wh_sp + sp === nothing && continue + sp.o === nothing && continue + # gnuplot screen coordinates: bottom left at 0,0 and top right at 1,1 + sp.o.axesconf = "set origin $x, $(1 - y - h)\nset size $w, $h\n" * sp.o.axesconf + end + end + nothing +end + +function gaston_add_series(plt::Plot{GastonBackend}, series::Series) + sp = series[:subplot] + gsp = sp.o + x, y, z = series[:x], series[:y], series[:z] + st = series[:seriestype] + + curves = [] + if gsp.dims == 2 && z === nothing + for (n, seg) in enumerate(series_segments(series, st; check = true)) + i, rng = seg.attr_index, seg.range + for sc in gaston_seriesconf!(sp, series, i, n == 1) + push!(curves, Gaston.Curve(x[rng], y[rng], nothing, nothing, sc)) + end + end + else + if z isa Surface + z = z.surf + if st == :image + z = reverse(Float32.(Gray.(z)), dims = 1) # flip y axis + nr, nc = size(z) + if (ly = length(y)) == 2 && ly != nr + y = collect(range(y[1], y[2], length = nr)) + end + if (lx = length(x)) == 2 && lx != nc + x = collect(range(x[1], x[2], length = nc)) + end + elseif st == :heatmap + length(x) == size(z, 2) + 1 && (x = @view x[1:(end - 1)]) + length(y) == size(z, 1) + 1 && (y = @view y[1:(end - 1)]) + end + end + if st == :mesh3d + x, y, z = mesh3d_triangles(x, y, z, series[:connections]) + end + for sc in gaston_seriesconf!(sp, series, 1, true) + push!(curves, Gaston.Curve(x, y, z, nothing, sc)) + end + end + + for c in curves + append = length(gsp.curves) > 0 + push!(gsp.curves, c) + Gaston.write_data(c, gsp.dims, gsp.datafile, append = append) + end + nothing +end + +function gaston_seriesconf!( + sp::Subplot{GastonBackend}, + series::Series, + i::Int, + add_to_legend::Bool, +) + #= + gnuplot abbreviations (see gnuplot/src/set.c) + --------------------------------------------- + dl: dashlength + dt: dashtype + fc: fillcolor + fs: fillstyle + lc: linecolor + lp: linespoints + ls: linestyle + lt: linetype + lw: linewidth + pi: pointinterval + pn: pointnumber + ps: pointscale + pt: pointtype + tc: textcolor + w: with + =# + gsp = sp.o + st = series[:seriestype] + extra = [] + add_to_legend &= should_add_to_legend(series) + curveconf = String[add_to_legend ? "title '$(series[:label])'" : "notitle"] + + clims = get_clims(sp, series) + if st ∈ (:scatter, :scatter3d) + lc, dt, lw = gaston_lc_ls_lw(series, clims, i) + pt, ps, mc = gaston_mk_ms_mc(series, clims, i) + push!(curveconf, "w points pt $pt ps $ps lc $mc") + elseif st ∈ (:path, :straightline, :path3d) + lc, dt, lw = gaston_lc_ls_lw(series, clims, i) + if series[:markershape] == :none # simplepath + push!(curveconf, "w lines lc $lc dt $dt lw $lw") + else + pt, ps, mc = gaston_mk_ms_mc(series, clims, i) + push!(curveconf, "w lp lc $mc dt $dt lw $lw pt $pt ps $ps") + end + elseif st == :shape + fc = gaston_color(get_fillcolor(series, i), get_fillalpha(series, i)) + lc, _ = gaston_lc_ls_lw(series, clims, i) + push!(curveconf, "w filledcurves fc $fc fs solid border lc $lc") + elseif st ∈ (:steppre, :stepmid, :steppost) + step = if st == :steppre + "fsteps" + elseif st == :stepmid + "histeps" + elseif st == :steppost + "steps" + end + push!(curveconf, "w $step") + lc, dt, lw = gaston_lc_ls_lw(series, clims, i) + push!(extra, "w points lc $lc dt $dt lw $lw notitle") + elseif st == :image + palette = gaston_palette(series[:seriescolor]) + gsp.axesconf *= "\nset palette model RGB defined $palette" + push!(curveconf, "w image pixels") + elseif st ∈ (:contour, :contour3d) + push!(curveconf, "w lines") + st == :contour && (gsp.axesconf *= "\nset view map\nunset surface") # 2D + levels = join(map(string, collect(contour_levels(series, clims))), ", ") + gsp.axesconf *= "\nset contour base\nset cntrparam levels discrete $levels" + elseif st ∈ (:surface, :heatmap) + push!(curveconf, "w pm3d") + palette = gaston_palette(series[:seriescolor]) + gsp.axesconf *= "\nset palette model RGB defined $palette" + st == :heatmap && (gsp.axesconf *= "\nset view map") + elseif st ∈ (:wireframe, :mesh3d) + lc, dt, lw = gaston_lc_ls_lw(series, clims, i) + push!(curveconf, "w lines lc $lc dt $dt lw $lw") + elseif st == :quiver + push!(curveconf, "w vectors filled") + else + @warn "Gaston: $st is not implemented yet" + end + + return [join(curveconf, " "), extra...] +end + +function gaston_parse_axes_args( + plt::Plot{GastonBackend}, + sp::Subplot{GastonBackend}, + dims::Int, + any_label::Bool, +) + # axesconf = String["set margins 2, 2, 2, 2"] # left, right, bottom, top + axesconf = String[] + + polar = ispolar(sp) && dims == 2 # cannot splot in polar coordinates + + for letter in (:x, :y, :z) + (letter == :z && dims == 2) && continue + axis = sp.attr[Symbol(letter, :axis)] + # label names + push!( + axesconf, + "set $(letter)label '$(axis[:guide])' $(gaston_font(guidefont(axis)))", + ) + mirror = axis[:mirror] ? "mirror" : "nomirror" + + if axis[:scale] == :identity + logscale, base = "nologscale", "" + elseif axis[:scale] == :log10 + logscale, base = "logscale", "10" + elseif axis[:scale] == :log2 + logscale, base = "logscale", "2" + elseif axis[:scale] == :ln + logscale, base = "logscale", "e" + end + push!(axesconf, "set $logscale $letter $base") + + # handle ticks + if polar + push!(axesconf, "set size square\nunset $(letter)tics") + else + push!( + axesconf, + "set $(letter)tics $(mirror) $(axis[:tick_direction]) $(gaston_font(tickfont(axis)))", + ) + + # major tick locations + if axis[:ticks] != :native + if axis[:flip] + hi, lo = axis_limits(sp, letter) + else + lo, hi = axis_limits(sp, letter) + end + push!(axesconf, "set $(letter)range [$lo:$hi]") + + ticks = get_ticks(sp, axis) + gaston_set_ticks!(axesconf, ticks, letter, "", "") + + if axis[:minorticks] != :native + minor_ticks = get_minor_ticks(sp, axis, ticks) + gaston_set_ticks!(axesconf, minor_ticks, letter, "m", "add") + end + end + end + + if axis[:grid] + push!(axesconf, "set grid " * (polar ? "polar" : "$(letter)tics")) + axis[:minorgrid] && + push!(axesconf, "set grid " * (polar ? "polar" : "m$(letter)tics")) + end + + ratio = get_aspect_ratio(sp) + if ratio != :none + ratio == :equal && (ratio = -1) + push!(axesconf, "set size ratio $ratio") + end + end + gaston_set_legend!(axesconf, sp, any_label) + + if hascolorbar(sp) + push!(axesconf, "set cbtics $(gaston_font(colorbartitlefont(sp)))") + end + + if sp[:title] !== nothing + push!(axesconf, "set title '$(sp[:title])' $(gaston_font(titlefont(sp)))") + end + + if polar + push!(axesconf, "unset border\nset polar\nset border polar") + tmin, tmax = axis_limits(sp, :x, false, false) + rmin, rmax = axis_limits(sp, :y, false, false) + rticks = get_ticks(sp, :y) + if (ttype = ticksType(rticks)) == :ticks + gaston_ticks = string.(rticks) + elseif ttype == :ticks_and_labels + gaston_ticks = String["'$l' $t" for (t, l) in zip(rticks...)] + end + push!( + axesconf, + "set rtics ( " * + join(gaston_ticks, ", ") * + " ) $(gaston_font(tickfont(sp.attr[:yaxis])))", + ) + push!(axesconf, "set trange [$(min(0, tmin)):$(max(2π, tmax))]") + push!(axesconf, "set rrange [$rmin:$rmax]") + push!( + axesconf, + "set ttics 0,30 format \"%g\".GPVAL_DEGREE_SIGN $(gaston_font(tickfont(sp.attr[:xaxis])))", + ) + push!(axesconf, "set mttics 3") + end + + return join(axesconf, "\n") +end + +function gaston_set_ticks!(axesconf, ticks, letter, maj_min, add) + ticks == :auto && return + if ticks ∈ (:none, nothing, false) + push!(axesconf, "unset $(maj_min)$(letter)tics") + return + end + + gaston_ticks = String[] + if (ttype = ticksType(ticks)) == :ticks + tick_locs = @view ticks[:] + for i in eachindex(tick_locs) + tick = if maj_min == "m" + "'' $(tick_locs[i]) 1" # see gnuplot manual 'Mxtics' + else + "$(tick_locs[i])" + end + push!(gaston_ticks, tick) + end + elseif ttype == :ticks_and_labels + tick_locs = @view ticks[1][:] + tick_labels = @view ticks[2][:] + for i in eachindex(tick_locs) + lab = gaston_enclose_tick_string(tick_labels[i]) + push!(gaston_ticks, "'$lab' $(tick_locs[i])") + end + else + gaston_ticks = nothing + @error "Gaston: invalid input for $(maj_min)$(letter)ticks: $ticks" + end + if gaston_ticks !== nothing + push!(axesconf, "set $(letter)tics $add (" * join(gaston_ticks, ", ") * ")") + end + nothing +end + +function gaston_set_legend!(axesconf, sp, any_label) + leg = sp[:legend] + if sp[:legend] ∉ (:none, :inline) && any_label + leg == :best && (leg = :topright) + + push!( + axesconf, + "set key " * (occursin("outer", string(leg)) ? "outside" : "inside"), + ) + for position in ("top", "bottom", "left", "right") + occursin(position, string(leg)) && push!(axesconf, "set key $position") + end + push!(axesconf, "set key $(gaston_font(legendfont(sp), rot=false, align=false))") + if sp[:legendtitle] !== nothing + # NOTE: cannot use legendtitlefont(sp) as it will override legendfont + push!(axesconf, "set key title '$(sp[:legendtitle])'") + end + push!(axesconf, "set key box lw 1 opaque") + push!(axesconf, "set border back") + else + push!(axesconf, "set key off") + end + nothing +end + +# -------------------------------------------- +# Helpers +# -------------------------------------------- + +gaston_halign(k) = (left = :left, hcenter = :center, right = :right)[k] +gaston_valign(k) = (top = :top, vcenter = :center, bottom = :bottom)[k] + +gaston_alpha(alpha) = alpha === nothing ? 0 : alpha + +gaston_lc_ls_lw(series::Series, clims, i::Int) = ( + gaston_color(get_linecolor(series, clims, i), get_linealpha(series, i)), + gaston_linestyle(get_linestyle(series, i)), + get_linewidth(series, i), +) + +gaston_mk_ms_mc(series::Series, clims, i::Int) = ( + gaston_marker(_cycle(series[:markershape], i), get_markeralpha(series, i)), + _cycle(series[:markersize], i) * 1.3 / 5, + gaston_color(get_markercolor(series, clims, i), get_markeralpha(series, i)), +) + +function gaston_font(f; rot = true, align = true, color = true, scale = 1) + font = String["font '$(f.family),$(round(Int, scale * f.pointsize))'"] + align && push!(font, "$(gaston_halign(f.halign))") + rot && push!(font, "rotate by $(f.rotation)") + color && push!(font, "textcolor $(gaston_color(f.color))") + return join(font, " ") +end + +function gaston_palette(gradient) + palette = String[] + n = -1 + for rgba in gradient # FIXME: naive conversion, inefficient ? + push!(palette, "$(n += 1) $(rgba.r) $(rgba.g) $(rgba.b)") + end + return '(' * join(palette, ", ") * ')' +end + +function gaston_marker(marker, alpha) + # NOTE: :rtriangle, :ltriangle, :hexagon, :heptagon, :octagon seems unsupported by gnuplot + filled = gaston_alpha(alpha) == 0 + marker == :none && return -1 + marker == :pixel && return 0 + marker ∈ (:+, :cross) && return 1 + marker ∈ (:x, :xcross) && return 2 + marker == :star5 && return 3 + marker == :rect && return filled ? 5 : 4 + marker == :circle && return filled ? 7 : 6 + marker == :utriangle && return filled ? 9 : 8 + marker == :dtriangle && return filled ? 11 : 10 + marker == :diamond && return filled ? 13 : 12 + marker == :pentagon && return filled ? 15 : 14 + + @warn "Gaston: unsupported marker $marker" + return 1 +end + +function gaston_color(col, alpha = 0) + col = single_color(col) # in case of gradients + col = alphacolor(col, gaston_alpha(alpha)) # add a default alpha if non existent + return "rgb '#$(hex(col, :aarrggbb))'" +end + +function gaston_linestyle(style) + style == :solid && return "1" + style == :dash && return "2" + style == :dot && return "3" + style == :dashdot && return "4" + style == :dashdotdot && return "5" +end + +function gaston_enclose_tick_string(tick_string) + findfirst("^", tick_string) === nothing && return tick_string + base, power = split(tick_string, "^") + return "$base^{$power}" +end diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 04feae22..ba5f3574 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -6,7 +6,6 @@ import GR export GR - # -------------------------------------------------------------------------------------- gr_linetype(k) = (auto = 1, solid = 1, dash = 2, dot = 3, dashdot = 4, dashdotdot = -1)[k] @@ -27,7 +26,7 @@ gr_markertype(k) = ( octagon = -24, cross = 2, xcross = 5, - + = 2, + (+) = 2, x = 5, star4 = -25, star5 = -26, @@ -92,14 +91,16 @@ const gr_font_family = Dict( gr_color(c) = gr_color(c, color_type(c)) -gr_color(c, ::Type{<:AbstractRGB}) = UInt32( round(UInt, clamp(alpha(c) * 255, 0, 255)) << 24 + - round(UInt, clamp(blue(c) * 255, 0, 255)) << 16 + - round(UInt, clamp(green(c) * 255, 0, 255)) << 8 + - round(UInt, clamp(red(c) * 255, 0, 255)) ) +gr_color(c, ::Type{<:AbstractRGB}) = UInt32( + round(UInt, clamp(alpha(c) * 255, 0, 255)) << 24 + + round(UInt, clamp(blue(c) * 255, 0, 255)) << 16 + + round(UInt, clamp(green(c) * 255, 0, 255)) << 8 + + round(UInt, clamp(red(c) * 255, 0, 255)), +) function gr_color(c, ::Type{<:AbstractGray}) g = round(UInt, clamp(gray(c) * 255, 0, 255)) α = round(UInt, clamp(alpha(c) * 255, 0, 255)) - rgba = UInt32( α<<24 + g<<16 + g<<8 + g ) + rgba = UInt32(α << 24 + g << 16 + g << 8 + g) end gr_color(c, ::Type) = gr_color(RGBA(c), RGB) @@ -108,31 +109,32 @@ function gr_getcolorind(c) convert(Int, GR.inqcolorfromrgb(red(c), green(c), blue(c))) end -gr_set_linecolor(c) = GR.setlinecolorind(gr_getcolorind(_cycle(c,1))) -gr_set_fillcolor(c) = GR.setfillcolorind(gr_getcolorind(_cycle(c,1))) - -gr_set_markercolor(c) = GR.setmarkercolorind(gr_getcolorind(_cycle(c,1))) -gr_set_bordercolor(c) = GR.setbordercolorind(gr_getcolorind(_cycle(c,1))) -gr_set_textcolor(c) = GR.settextcolorind(gr_getcolorind(_cycle(c,1))) +gr_set_linecolor(c) = GR.setlinecolorind(gr_getcolorind(_cycle(c, 1))) +gr_set_fillcolor(c) = GR.setfillcolorind(gr_getcolorind(_cycle(c, 1))) +gr_set_markercolor(c) = GR.setmarkercolorind(gr_getcolorind(_cycle(c, 1))) +gr_set_bordercolor(c) = GR.setbordercolorind(gr_getcolorind(_cycle(c, 1))) +gr_set_textcolor(c) = GR.settextcolorind(gr_getcolorind(_cycle(c, 1))) gr_set_transparency(α::Real) = GR.settransparency(clamp(α, 0, 1)) gr_set_transparency(::Nothing) = GR.settransparency(1) gr_set_transparency(c, α) = gr_set_transparency(α) gr_set_transparency(c::Colorant, ::Nothing) = gr_set_transparency(c) gr_set_transparency(c::Colorant) = GR.settransparency(alpha(c)) -gr_set_arrowstyle(s::Symbol) = GR.setarrowstyle(get( - ( - simple = 1, - hollow = 3, - filled = 4, - triangle = 5, - filledtriangle = 6, - closed = 6, - open = 5, +gr_set_arrowstyle(s::Symbol) = GR.setarrowstyle( + get( + ( + simple = 1, + hollow = 3, + filled = 4, + triangle = 5, + filledtriangle = 6, + closed = 6, + open = 5, + ), + s, + 1, ), - s, - 1, -)) +) gr_set_fillstyle(::Nothing) = GR.setfillintstyle(GR.INTSTYLE_SOLID) function gr_set_fillstyle(s::Symbol) @@ -151,19 +153,17 @@ function gr_set_fillstyle(s::Symbol) ) end - # -------------------------------------------------------------------------------------- - # draw line segments, splitting x/y into contiguous/finite segments # note: this can be used for shapes by passing func `GR.fillarea` function gr_polyline(x, y, func = GR.polyline; arrowside = :none, arrowstyle = :simple) iend = 0 n = length(x) - while iend < n-1 + while iend < n - 1 # set istart to the first index that is finite istart = -1 - for j = iend+1:n + for j in (iend + 1):n if isfinite(x[j]) && isfinite(y[j]) istart = j break @@ -173,7 +173,7 @@ function gr_polyline(x, y, func = GR.polyline; arrowside = :none, arrowstyle = : if istart > 0 # iend is the last finite index iend = -1 - for j = istart+1:n + for j in (istart + 1):n if isfinite(x[j]) && isfinite(y[j]) iend = j else @@ -185,13 +185,13 @@ function gr_polyline(x, y, func = GR.polyline; arrowside = :none, arrowstyle = : # if we found a start and end, draw the line segment, otherwise we're done if istart > 0 && iend > 0 func(x[istart:iend], y[istart:iend]) - if arrowside in (:head,:both) + if arrowside in (:head, :both) gr_set_arrowstyle(arrowstyle) - GR.drawarrow(x[iend-1], y[iend-1], x[iend], y[iend]) + GR.drawarrow(x[iend - 1], y[iend - 1], x[iend], y[iend]) end - if arrowside in (:tail,:both) + if arrowside in (:tail, :both) gr_set_arrowstyle(arrowstyle) - GR.drawarrow(x[istart+1], y[istart+1], x[istart], y[istart]) + GR.drawarrow(x[istart + 1], y[istart + 1], x[istart], y[istart]) end else break @@ -202,10 +202,10 @@ end function gr_polyline3d(x, y, z, func = GR.polyline3d) iend = 0 n = length(x) - while iend < n-1 + while iend < n - 1 # set istart to the first index that is finite istart = -1 - for j = iend+1:n + for j in (iend + 1):n if isfinite(x[j]) && isfinite(y[j]) && isfinite(z[j]) istart = j break @@ -215,7 +215,7 @@ function gr_polyline3d(x, y, z, func = GR.polyline3d) if istart > 0 # iend is the last finite index iend = -1 - for j = istart+1:n + for j in (istart + 1):n if isfinite(x[j]) && isfinite(y[j]) && isfinite(z[j]) iend = j else @@ -237,8 +237,8 @@ gr_inqtext(x, y, s) = gr_inqtext(x, y, string(s)) function gr_inqtext(x, y, s::AbstractString) if length(s) >= 2 && s[1] == '$' && s[end] == '$' - GR.inqmathtex(x, y, s[2:end-1]) - elseif findfirst(isequal('\\'), s) !== nothing || occursin("10^{", s) + GR.inqmathtex(x, y, s[2:(end - 1)]) + elseif occursin('\\', s) || occursin("10^{", s) GR.inqtextext(x, y, s) else GR.inqtext(x, y, s) @@ -249,8 +249,8 @@ gr_text(x, y, s) = gr_text(x, y, string(s)) function gr_text(x, y, s::AbstractString) if length(s) >= 2 && s[1] == '$' && s[end] == '$' - GR.mathtex(x, y, s[2:end-1]) - elseif findfirst(isequal('\\'), s) !== nothing || occursin("10^{", s) + GR.mathtex(x, y, s[2:(end - 1)]) + elseif occursin('\\', s) || occursin("10^{", s) GR.textext(x, y, s) else GR.text(x, y, s) @@ -271,7 +271,10 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) #draw angular grid if xaxis[:grid] gr_set_line( - xaxis[:gridlinewidth], xaxis[:gridstyle], xaxis[:foreground_color_grid], sp + xaxis[:gridlinewidth], + xaxis[:gridstyle], + xaxis[:foreground_color_grid], + sp, ) gr_set_transparency(xaxis[:foreground_color_grid], xaxis[:gridalpha]) for i in eachindex(α) @@ -282,7 +285,10 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) #draw radial grid if yaxis[:grid] gr_set_line( - yaxis[:gridlinewidth], yaxis[:gridstyle], yaxis[:foreground_color_grid], sp + yaxis[:gridlinewidth], + yaxis[:gridstyle], + yaxis[:foreground_color_grid], + sp, ) gr_set_transparency(yaxis[:foreground_color_grid], yaxis[:gridalpha]) for i in eachindex(rtick_values) @@ -304,7 +310,7 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) GR.drawarc(-1, 1, -1, 1, 0, 359) for i in eachindex(α) x, y = GR.wctondc(1.1 * sinf[i], 1.1 * cosf[i]) - GR.textext(x, y, string((360-α[i])%360, "^o")) + GR.textext(x, y, string((360 - α[i]) % 360, "^o")) end end @@ -321,14 +327,12 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) GR.restorestate() end - # using the axis extrema and limit overrides, return the min/max value for this axis gr_x_axislims(sp::Subplot) = axis_limits(sp, :x) gr_y_axislims(sp::Subplot) = axis_limits(sp, :y) gr_z_axislims(sp::Subplot) = axis_limits(sp, :z) gr_xy_axislims(sp::Subplot) = gr_x_axislims(sp)..., gr_y_axislims(sp)... - function gr_fill_viewport(vp::AVec{Float64}, c) GR.savestate() GR.selntran(0) @@ -345,13 +349,15 @@ end # draw ONE Shape function gr_draw_marker(series, xi, yi, clims, i, msize, strokewidth, shape::Shape) sx, sy = coords(shape) - # convert to ndc coords (percentages of window) - GR.selntran(0) + # convert to ndc coords (percentages of window) ... w, h = get_size(series) f = msize / (w + h) + xi, yi = GR.wctondc(xi, yi) - xs = xi .+ sx .* f - ys = yi .+ sy .* f + + # ... convert back to world coordinates + xs_ys = GR.ndctowc.(xi .+ sx .* f, yi .+ sy .* f) + xs, ys = getindex.(xs_ys, 1), getindex.(xs_ys, 2) # draw the interior mc = get_markercolor(series, clims, i) @@ -364,7 +370,6 @@ function gr_draw_marker(series, xi, yi, clims, i, msize, strokewidth, shape::Sha gr_set_line(strokewidth, :solid, msc, series) gr_set_transparency(msc, get_markerstrokealpha(series, i)) GR.polyline(xs, ys) - GR.selntran(1) end function gr_nominal_size(s) @@ -374,16 +379,15 @@ end # draw ONE symbol marker function gr_draw_marker(series, xi, yi, clims, i, msize, strokewidth, shape::Symbol) - GR.setborderwidth(strokewidth); - gr_set_bordercolor(get_markerstrokecolor(series, i)); - gr_set_markercolor(get_markercolor(series, clims, i)); + GR.setborderwidth(strokewidth) + gr_set_bordercolor(get_markerstrokecolor(series, i)) + gr_set_markercolor(get_markercolor(series, clims, i)) gr_set_transparency(get_markeralpha(series, i)) GR.setmarkertype(gr_markertype(shape)) GR.setmarkersize(0.3msize / gr_nominal_size(series)) GR.polymarker([xi], [yi]) end - # --------------------------------------------------------- function gr_set_line(lw, style, c, s) # s can be Subplot or Series @@ -392,7 +396,6 @@ function gr_set_line(lw, style, c, s) # s can be Subplot or Series gr_set_linecolor(c) end - function gr_set_fill(c) #, a) gr_set_fillcolor(c) #, a) GR.setfillintstyle(GR.INTSTYLE_SOLID) @@ -403,29 +406,27 @@ end gr_point_mult(s) = 1.5 * get_thickness_scaling(s) * px / pt / maximum(get_size(s)) # set the font attributes. -function gr_set_font(f::Font, s; halign = f.halign, valign = f.valign, - color = f.color, rotation = f.rotation) +function gr_set_font( + f::Font, + s; + halign = f.halign, + valign = f.valign, + color = f.color, + rotation = f.rotation, +) family = lowercase(f.family) GR.setcharheight(gr_point_mult(s) * f.pointsize) GR.setcharup(sind(-rotation), cosd(-rotation)) if haskey(gr_font_family, family) GR.settextfontprec( gr_font_family[family], - gr_font_family[family] >= 200 ? 3 : GR.TEXT_PRECISION_STRING + gr_font_family[family] >= 200 ? 3 : GR.TEXT_PRECISION_STRING, ) end gr_set_textcolor(color) GR.settextalign(gr_halign(halign), gr_valign(valign)) end -function gr_nans_to_infs!(z) - for (i,zi) in enumerate(z) - if zi == NaN - z[i] = Inf - end - end -end - function gr_w3tondc(x, y, z) xw, yw, zw = GR.wc3towc(x, y, z) x, y = GR.wctondc(xw, yw) @@ -434,7 +435,13 @@ end # -------------------------------------------------------------------------------------- # viewport plot area -function gr_viewport_from_bbox(sp::Subplot{GRBackend}, bb::BoundingBox, w, h, viewport_canvas) +function gr_viewport_from_bbox( + sp::Subplot{GRBackend}, + bb::BoundingBox, + w, + h, + viewport_canvas, +) viewport = zeros(4) viewport[1] = viewport_canvas[2] * (left(bb) / w) viewport[2] = viewport_canvas[2] * (right(bb) / w) @@ -452,7 +459,7 @@ function gr_set_viewport_cmap(sp::Subplot, viewport_plotarea) viewport_plotarea[2] + (RecipesPipeline.is3d(sp) ? 0.07 : 0.02), viewport_plotarea[2] + (RecipesPipeline.is3d(sp) ? 0.10 : 0.05), viewport_plotarea[3], - viewport_plotarea[4] + viewport_plotarea[4], ) end @@ -462,7 +469,7 @@ function gr_set_viewport_polar(viewport_plotarea) xcenter = 0.5 * (xmin + xmax) ycenter = 0.5 * (ymin + ymax) r = 0.5 * NaNMath.min(xmax - xmin, ymax - ymin) - GR.setviewport(xcenter -r, xcenter + r, ycenter - r, ycenter + r) + GR.setviewport(xcenter - r, xcenter + r, ycenter - r, ycenter + r) GR.setwindow(-1, 1, -1, 1) r end @@ -471,16 +478,16 @@ struct GRColorbar gradients fills lines - GRColorbar() = new([],[],[]) + GRColorbar() = new([], [], []) end function gr_update_colorbar!(cbar::GRColorbar, series::Series) style = colorbar_style(series) style === nothing && return - list = style == cbar_gradient ? cbar.gradients : - style == cbar_fill ? cbar.fills : - style == cbar_lines ? cbar.lines : - error("Unknown colorbar style: $style.") + list = + style == cbar_gradient ? cbar.gradients : + style == cbar_fill ? cbar.fills : + style == cbar_lines ? cbar.lines : error("Unknown colorbar style: $style.") push!(list, series) end @@ -488,7 +495,7 @@ function gr_contour_levels(series::Series, clims) levels = contour_levels(series, clims) if isfilledcontour(series) # GR implicitly uses the maximal z value as the highest level - levels = levels[1:end-1] + levels = levels[1:(end - 1)] end levels end @@ -507,10 +514,9 @@ function gr_colorbar_colors(series::Series, clims) else colors = 1000:1255 end - round.(Int,colors) + round.(Int, colors) end - function _cbar_unique(values, propname) out = last(values) if any(x != out for x in values) @@ -530,7 +536,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims, viewport_plotare GR.setwindow(xmin, xmax, zmin, zmax) if !isempty(cbar.gradients) series = cbar.gradients - gr_set_gradient(_cbar_unique(get_colorgradient.(series),"color")) + gr_set_gradient(_cbar_unique(get_colorgradient.(series), "color")) gr_set_transparency(_cbar_unique(get_fillalpha.(series), "fill alpha")) GR.cellarray(xmin, xmax, zmax, zmin, 1, 256, 1000:1255) end @@ -543,21 +549,21 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims, viewport_plotare levels = _cbar_unique(contour_levels.(series, Ref(clims)), "levels") # GR implicitly uses the maximal z value as the highest level if levels[end] < clims[2] - @warn("GR: highest contour level less than maximal z value is not supported.") + @warn "GR: highest contour level less than maximal z value is not supported." # replace levels, rather than assign to levels[end], to ensure type # promotion in case levels is an integer array - levels = [levels[1:end-1]; clims[2]] + levels = [levels[1:(end - 1)]; clims[2]] end colors = gr_colorbar_colors(last(series), clims) - for (from, to, color) in zip(levels[1:end-1], levels[2:end], colors) + for (from, to, color) in zip(levels[1:(end - 1)], levels[2:end], colors) GR.setfillcolorind(color) - GR.fillrect( xmin, xmax, from, to ) + GR.fillrect(xmin, xmax, from, to) end end if !isempty(cbar.lines) series = cbar.lines - gr_set_gradient(_cbar_unique(get_colorgradient.(series),"color")) + gr_set_gradient(_cbar_unique(get_colorgradient.(series), "color")) gr_set_line( _cbar_unique(get_linewidth.(series), "line width"), _cbar_unique(get_linestyle.(series), "line style"), @@ -569,7 +575,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims, viewport_plotare colors = gr_colorbar_colors(last(series), clims) for (line, color) in zip(levels, colors) GR.setlinecolorind(color) - GR.polyline([xmin,xmax], [line,line] ) + GR.polyline([xmin, xmax], [line, line]) end end @@ -577,12 +583,15 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims, viewport_plotare gr_set_line(1, :solid, plot_color(:black), sp) GR.axes(0, ztick, xmax, zmin, 0, 1, 0.005) - gr_set_font(guidefont(sp[:yaxis]), sp) + title = if isa(sp[:colorbar_title], PlotText) + sp[:colorbar_title] + else + text(sp[:colorbar_title], colorbartitlefont(sp)) + end + gr_set_font(title.font, sp) GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(-1, 0) - gr_text( - viewport_plotarea[2] + 0.1, gr_view_ycenter(viewport_plotarea), sp[:colorbar_title] - ) + gr_text(viewport_plotarea[2] + 0.1, gr_view_ycenter(viewport_plotarea), title.str) GR.restorestate() end @@ -590,14 +599,36 @@ end gr_view_xcenter(viewport_plotarea) = 0.5 * (viewport_plotarea[1] + viewport_plotarea[2]) gr_view_ycenter(viewport_plotarea) = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4]) +gr_view_xposition(viewport_plotarea, position) = + viewport_plotarea[1] + position * (viewport_plotarea[2] - viewport_plotarea[1]) +gr_view_yposition(viewport_plotarea, position) = + viewport_plotarea[3] + position * (viewport_plotarea[4] - viewport_plotarea[3]) + +function position(symb) + if symb == :top || symb == :right + return 0.95 + elseif symb == :left || symb == :bottom + return 0.05 + end + return 0.5 +end + +function alignment(symb) + if symb == :top || symb == :right + return GR.TEXT_HALIGN_RIGHT + elseif symb == :left || symb == :bottom + return GR.TEXT_HALIGN_LEFT + end + return GR.TEXT_HALIGN_CENTER +end # -------------------------------------------------------------------------------------- function gr_set_gradient(c) grad = _as_gradient(c) - for (i,z) in enumerate(range(0, stop=1, length=256)) + for (i, z) in enumerate(range(0, stop = 1, length = 256)) c = grad[z] - GR.setcolorrep(999+i, red(c), green(c), blue(c)) + GR.setcolorrep(999 + i, red(c), green(c), blue(c)) end grad end @@ -608,21 +639,19 @@ function gr_set_gradient(series::Series) end # this is our new display func... set up the viewport_canvas, compute bounding boxes, and display each subplot -function gr_display(plt::Plot, fmt="") +function gr_display(plt::Plot, fmt = "") GR.clearws() - dpi_factor = plt[:dpi] / Plots.DPI - if fmt == "svg" - dpi_factor *= 4 - end + dpi_factor = fmt == "png" ? plt[:dpi] / Plots.DPI : 1 # collect some monitor/display sizes in meters and pixels - display_width_meters, display_height_meters, display_width_px, display_height_px = GR.inqdspsize() + display_width_meters, display_height_meters, display_width_px, display_height_px = + GR.inqdspsize() display_width_ratio = display_width_meters / display_width_px display_height_ratio = display_height_meters / display_height_px # compute the viewport_canvas, normalized to the larger dimension - viewport_canvas = Float64[0,1,0,1] + viewport_canvas = Float64[0, 1, 0, 1] w, h = get_size(plt) if w > h ratio = float(h) / w @@ -645,7 +674,7 @@ function gr_display(plt::Plot, fmt="") # subplots: for sp in plt.subplots - gr_display(sp, w*px, h*px, viewport_canvas) + gr_display(sp, w * px, h * px, viewport_canvas) end GR.updatews() @@ -653,12 +682,17 @@ end function gr_set_tickfont(sp, letter) axis = sp[Symbol(letter, :axis)] + + # invalidate alignment changes for small rotations (|θ| < 45°) + trigger(rot) = abs(sind(rot)) < abs(cosd(rot)) ? 0 : sign(rot) + + rot = axis[:rotation] if letter === :x || (RecipesPipeline.is3d(sp) && letter === :y) - halign = (:left, :hcenter, :right)[sign(axis[:rotation]) + 2] - valign = (axis[:mirror] ? :bottom : :top) + halign = (:left, :hcenter, :right)[trigger(rot) + 2] + valign = (axis[:mirror] ? :bottom : :top, :vcenter)[trigger(abs(rot)) + 1] else - halign = (axis[:mirror] ? :left : :right) - valign = (:top, :vcenter, :bottom)[sign(axis[:rotation]) + 2] + halign = (axis[:mirror] ? :left : :right, :hcenter)[trigger(abs(rot)) + 1] + valign = (:top, :vcenter, :bottom)[trigger(rot) + 2] end gr_set_font( tickfont(axis), @@ -717,7 +751,10 @@ function gr_axis_height(sp, axis) GR.savestate() ticks = get_ticks(sp, axis, update = false) gr_set_font(tickfont(axis), sp) - h = (ticks in (nothing, false, :none) ? 0 : last(gr_get_ticks_size(ticks, axis[:rotation]))) + h = ( + ticks in (nothing, false, :none) ? 0 : + last(gr_get_ticks_size(ticks, axis[:rotation])) + ) if axis[:guide] != "" gr_set_font(guidefont(axis), sp) h += last(gr_text_size(axis[:guide])) @@ -730,7 +767,10 @@ function gr_axis_width(sp, axis) GR.savestate() ticks = get_ticks(sp, axis, update = false) gr_set_font(tickfont(axis), sp) - w = (ticks in (nothing, false, :none) ? 0 : first(gr_get_ticks_size(ticks, axis[:rotation]))) + w = ( + ticks in (nothing, false, :none) ? 0 : + first(gr_get_ticks_size(ticks, axis[:rotation])) + ) if axis[:guide] != "" gr_set_font(guidefont(axis), sp) w += last(gr_text_size(axis[:guide])) @@ -748,10 +788,10 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end end # Add margin given by the user - leftpad = 2mm + sp[:left_margin] - toppad = 2mm + sp[:top_margin] - rightpad = 2mm + sp[:right_margin] - bottompad = 2mm + sp[:bottom_margin] + leftpad = 2mm + sp[:left_margin] + toppad = 2mm + sp[:top_margin] + rightpad = 2mm + sp[:right_margin] + bottompad = 2mm + sp[:bottom_margin] # Add margin for title if sp[:title] != "" gr_set_font(titlefont(sp), sp) @@ -762,27 +802,28 @@ function _update_min_padding!(sp::Subplot{GRBackend}) if RecipesPipeline.is3d(sp) xaxis, yaxis, zaxis = sp[:xaxis], sp[:yaxis], sp[:zaxis] - xticks, yticks, zticks = get_ticks(sp, xaxis), get_ticks(sp, yaxis), get_ticks(sp, zaxis) + xticks, yticks, zticks = + get_ticks(sp, xaxis), get_ticks(sp, yaxis), get_ticks(sp, zaxis) # Add margin for x and y ticks h = 0mm - if !(xticks in (nothing, false, :none)) + if !isempty(first(xticks)) gr_set_font( tickfont(xaxis), + sp, halign = (:left, :hcenter, :right)[sign(xaxis[:rotation]) + 2], valign = (xaxis[:mirror] ? :bottom : :top), rotation = xaxis[:rotation], - sp ) l = 0.01 + last(gr_get_ticks_size(xticks, xaxis[:rotation])) h = max(h, 1mm + get_size(sp)[2] * l * px) end - if !(yticks in (nothing, false, :none)) + if !isempty(first(yticks)) gr_set_font( tickfont(yaxis), + sp, halign = (:left, :hcenter, :right)[sign(yaxis[:rotation]) + 2], valign = (yaxis[:mirror] ? :bottom : :top), rotation = yaxis[:rotation], - sp ) l = 0.01 + last(gr_get_ticks_size(yticks, yaxis[:rotation])) h = max(h, 1mm + get_size(sp)[2] * l * px) @@ -796,14 +837,14 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end end - if !(zticks in (nothing, false, :none)) + if !isempty(first(zticks)) gr_set_font( tickfont(zaxis), + sp, halign = (zaxis[:mirror] ? :left : :right), valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2], rotation = zaxis[:rotation], color = zaxis[:tickfontcolor], - sp ) l = 0.01 + first(gr_get_ticks_size(zticks, zaxis[:rotation])) w = 1mm + get_size(sp)[1] * l * px @@ -827,7 +868,10 @@ function _update_min_padding!(sp::Subplot{GRBackend}) h = max(h, 1mm + get_size(sp)[2] * l * px) end if h > 0mm - if xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + if ( + xaxis[:guide_position] == :top || + (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + ) toppad += h else bottompad += h @@ -838,7 +882,10 @@ function _update_min_padding!(sp::Subplot{GRBackend}) gr_set_font(guidefont(sp[:zaxis]), sp) l = last(gr_text_size(sp[:zaxis][:guide])) w = 1mm + get_size(sp)[2] * l * px - if zaxis[:guide_position] == :right || (zaxis[:guide_position] == :auto && zaxis[:mirror] == true) + if ( + zaxis[:guide_position] == :right || + (zaxis[:guide_position] == :auto && zaxis[:mirror] == true) + ) rightpad += w else leftpad += w @@ -847,7 +894,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) else # Add margin for x and y ticks xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) - if !(xticks in (nothing, false, :none)) + if !isempty(first(xticks)) gr_set_tickfont(sp, :x) l = 0.01 + last(gr_get_ticks_size(xticks, sp[:xaxis][:rotation])) h = 1mm + get_size(sp)[2] * l * px @@ -857,7 +904,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) bottompad += h end end - if !(yticks in (nothing, false, :none)) + if !isempty(first(yticks)) gr_set_tickfont(sp, :y) l = 0.01 + first(gr_get_ticks_size(yticks, sp[:yaxis][:rotation])) w = 1mm + get_size(sp)[1] * l * px @@ -873,7 +920,10 @@ function _update_min_padding!(sp::Subplot{GRBackend}) gr_set_font(guidefont(sp[:xaxis]), sp) l = last(gr_text_size(sp[:xaxis][:guide])) h = 1mm + get_size(sp)[2] * l * px - if sp[:xaxis][:guide_position] == :top || (sp[:xaxis][:guide_position] == :auto && sp[:xaxis][:mirror] == true) + if ( + sp[:xaxis][:guide_position] == :top || + (sp[:xaxis][:guide_position] == :auto && sp[:xaxis][:mirror] == true) + ) toppad += h else bottompad += h @@ -884,7 +934,10 @@ function _update_min_padding!(sp::Subplot{GRBackend}) gr_set_font(guidefont(sp[:yaxis]), sp) l = last(gr_text_size(sp[:yaxis][:guide])) w = 1mm + get_size(sp)[2] * l * px - if sp[:yaxis][:guide_position] == :right || (sp[:yaxis][:guide_position] == :auto && sp[:yaxis][:mirror] == true) + if ( + sp[:yaxis][:guide_position] == :right || + (sp[:yaxis][:guide_position] == :auto && sp[:yaxis][:mirror] == true) + ) rightpad += w else leftpad += w @@ -898,7 +951,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end function is_equally_spaced(v) - d = collect(v[2:end] .- v[1:end-1]) + d = collect(v[2:end] .- v[1:(end - 1)]) all(d .≈ d[1]) end @@ -930,9 +983,9 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) viewport_plotarea = gr_viewport_from_bbox(sp, plotarea(sp), w, h, viewport_canvas) # update viewport_plotarea - gr_update_viewport_ratio!(viewport_plotarea, sp) leg = gr_get_legend_geometry(viewport_plotarea, sp) gr_update_viewport_legend!(viewport_plotarea, sp, leg) + gr_update_viewport_ratio!(viewport_plotarea, sp) # fill in the plot area background gr_fill_plotarea(sp, viewport_plotarea) @@ -977,11 +1030,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end end - ## Legend function gr_add_legend(sp, leg, viewport_plotarea) - if !(sp[:legend] in(:none, :inline)) + if sp[:legend] ∉ (:none, :inline) GR.savestate() GR.selntran(0) GR.setscale(0) @@ -991,13 +1043,17 @@ function gr_add_legend(sp, leg, viewport_plotarea) GR.setfillintstyle(GR.INTSTYLE_SOLID) gr_set_fillcolor(sp[:background_color_legend]) GR.fillrect( - xpos - leg.leftw, xpos + leg.textw + leg.rightw, - ypos + leg.dy, ypos - leg.h + xpos - leg.leftw, + xpos + leg.textw + leg.rightw, + ypos + leg.dy, + ypos - leg.h, ) # Allocating white space for actual legend width here gr_set_line(1, :solid, sp[:foreground_color_legend], sp) GR.drawrect( - xpos - leg.leftw, xpos + leg.textw + leg.rightw, - ypos + leg.dy, ypos - leg.h + xpos - leg.leftw, + xpos + leg.textw + leg.rightw, + ypos + leg.dy, + ypos - leg.h, ) # Drawing actual legend width here i = 0 if sp[:legendtitle] !== nothing @@ -1014,9 +1070,12 @@ function gr_add_legend(sp, leg, viewport_plotarea) lc = get_linecolor(series, clims) gr_set_line(sp[:legendfontsize] / 8, get_linestyle(series), lc, sp) - if (st == :shape || series[:fillrange] !== nothing) && series[:ribbon] === nothing + if ( + (st == :shape || series[:fillrange] !== nothing) && + series[:ribbon] === nothing + ) fc = get_fillcolor(series, clims) - gr_set_fill(fc) #, series[:fillalpha]) + gr_set_fill(fc) fs = get_fillstyle(series, i) gr_set_fillstyle(fs) l, r = xpos - leg.width_factor * 3.5, xpos - leg.width_factor / 2 @@ -1071,77 +1130,140 @@ end function gr_legend_pos(sp::Subplot, leg, viewport_plotarea) s = sp[:legend] - typeof(s) <: Symbol || return gr_legend_pos(s, viewport_plotarea) + s isa Real && return gr_legend_pos(s, leg, viewport_plotarea) + if s isa Tuple{<:Real,Symbol} + if s[2] !== :outer + return gr_legend_pos(s[1], leg, viewport_plotarea) + end + + xaxis, yaxis = sp[:xaxis], sp[:yaxis] + xmirror = + xaxis[:guide_position] == :top || + (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + ymirror = + yaxis[:guide_position] == :right || + (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) + axisclearance = [ + !ymirror * gr_axis_width(sp, sp[:yaxis]), + ymirror * gr_axis_width(sp, sp[:yaxis]), + !xmirror * gr_axis_height(sp, sp[:xaxis]), + xmirror * gr_axis_height(sp, sp[:xaxis]), + ] + return gr_legend_pos(s[1], leg, viewport_plotarea; axisclearance) + end + s isa Symbol || return gr_legend_pos(s, viewport_plotarea) str = string(s) if str == "best" str = "topright" end if occursin("outer", str) xaxis, yaxis = sp[:xaxis], sp[:yaxis] - xmirror = xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) - ymirror = yaxis[:guide_position] == :right || (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) + xmirror = + xaxis[:guide_position] == :top || + (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + ymirror = + yaxis[:guide_position] == :right || + (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) end if occursin("right", str) if occursin("outer", str) # As per https://github.com/jheinen/GR.jl/blob/master/src/jlgr.jl#L525 - xpos = viewport_plotarea[2] + leg.xoffset + leg.leftw + ymirror * gr_axis_width(sp, sp[:yaxis]) + xpos = + viewport_plotarea[2] + + leg.xoffset + + leg.leftw + + ymirror * gr_axis_width(sp, sp[:yaxis]) else xpos = viewport_plotarea[2] - leg.rightw - leg.textw - leg.xoffset end elseif occursin("left", str) if occursin("outer", str) - xpos = viewport_plotarea[1] - !ymirror * gr_axis_width(sp, sp[:yaxis]) - leg.xoffset * 2 - leg.rightw - leg.textw + xpos = + viewport_plotarea[1] - !ymirror * gr_axis_width(sp, sp[:yaxis]) - + leg.xoffset * 2 - leg.rightw - leg.textw else xpos = viewport_plotarea[1] + leg.leftw + leg.xoffset end else - xpos = (viewport_plotarea[2] - viewport_plotarea[1]) / 2 + viewport_plotarea[1] + leg.leftw - leg.rightw - leg.textw - leg.xoffset * 2 + xpos = + (viewport_plotarea[2] - viewport_plotarea[1]) / 2 + + viewport_plotarea[1] + + leg.leftw - leg.rightw - leg.textw - leg.xoffset * 2 end if occursin("top", str) if s == :outertop - ypos = viewport_plotarea[4] + leg.yoffset + leg.h + xmirror * gr_axis_height(sp, sp[:xaxis]) + ypos = + viewport_plotarea[4] + + leg.yoffset + + leg.h + + xmirror * gr_axis_height(sp, sp[:xaxis]) else ypos = viewport_plotarea[4] - leg.yoffset - leg.dy end elseif occursin("bottom", str) if s == :outerbottom - ypos = viewport_plotarea[3] - leg.yoffset - leg.h - !xmirror * gr_axis_height(sp, sp[:xaxis]) + ypos = + viewport_plotarea[3] - leg.yoffset - leg.dy - + !xmirror * gr_axis_height(sp, sp[:xaxis]) else ypos = viewport_plotarea[3] + leg.yoffset + leg.h end else # Adding min y to shift legend pos to correct graph (#2377) - ypos = (viewport_plotarea[4] - viewport_plotarea[3] + leg.h) / 2 + viewport_plotarea[3] + ypos = + (viewport_plotarea[4] - viewport_plotarea[3] + leg.h) / 2 + viewport_plotarea[3] end return xpos, ypos end -function gr_legend_pos(v::Tuple{S,T}, viewport_plotarea) where {S<:Real, T<:Real} +function gr_legend_pos(v::Tuple{S,T}, viewport_plotarea) where {S<:Real,T<:Real} xpos = v[1] * (viewport_plotarea[2] - viewport_plotarea[1]) + viewport_plotarea[1] ypos = v[2] * (viewport_plotarea[4] - viewport_plotarea[3]) + viewport_plotarea[3] - (xpos,ypos) + (xpos, ypos) +end + +function gr_legend_pos(theta::Real, leg, viewport_plotarea; axisclearance = nothing) + xcenter = +(viewport_plotarea[1:2]...) / 2 + ycenter = +(viewport_plotarea[3:4]...) / 2 + + if isnothing(axisclearance) + # Inner + # rectangle where the anchor can legally be + xmin = viewport_plotarea[1] + leg.xoffset + leg.leftw + xmax = viewport_plotarea[2] - leg.xoffset - leg.rightw - leg.textw + ymin = viewport_plotarea[3] + leg.yoffset + leg.h + ymax = viewport_plotarea[4] - leg.yoffset - leg.dy + else + # Outer + xmin = + viewport_plotarea[1] - leg.xoffset - leg.rightw - leg.textw - axisclearance[1] + xmax = viewport_plotarea[2] + leg.xoffset + leg.leftw + axisclearance[2] + ymin = viewport_plotarea[3] - leg.yoffset - leg.dy - axisclearance[3] + ymax = viewport_plotarea[4] + leg.yoffset + leg.h + axisclearance[4] + end + return legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax) end function gr_get_legend_geometry(viewport_plotarea, sp) - legendn = 0 - legendw = 0 + legendn = legendw = dy = 0 if sp[:legend] != :none GR.savestate() GR.selntran(0) GR.setscale(0) if sp[:legendtitle] !== nothing gr_set_font(legendtitlefont(sp), sp) + legendn += 1 tbx, tby = gr_inqtext(0, 0, string(sp[:legendtitle])) legendw = tbx[3] - tbx[1] - legendn += 1 + dy = tby[3] - tby[1] end gr_set_font(legendfont(sp), sp) for series in series_list(sp) should_add_to_legend(series) || continue legendn += 1 - lab = series[:label] - tbx, tby = gr_inqtext(0, 0, string(lab)) + tbx, tby = gr_inqtext(0, 0, string(series[:label])) legendw = max(legendw, tbx[3] - tbx[1]) # Holds text width right now + dy = max(dy, tby[3] - tby[1]) end GR.setscale(1) @@ -1158,7 +1280,8 @@ function gr_get_legend_geometry(viewport_plotarea, sp) x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 30 - dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 + dy *= get(sp[:extra_kwargs], :legend_hfactor, 1) + legendh = dy * legendn return ( @@ -1174,28 +1297,59 @@ function gr_get_legend_geometry(viewport_plotarea, sp) ) end - ## Viewport, window and scale function gr_update_viewport_legend!(viewport_plotarea, sp, leg) - leg_str = string(sp[:legend]) + s = sp[:legend] xaxis, yaxis = sp[:xaxis], sp[:yaxis] - xmirror = xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) - ymirror = yaxis[:guide_position] == :right || (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) + xmirror = + xaxis[:guide_position] == :top || + (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + ymirror = + yaxis[:guide_position] == :right || + (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) + if s isa Tuple{<:Real,Symbol} + if s[2] === :outer + (x, y) = gr_legend_pos(sp, leg, viewport_plotarea) # Dry run, to figure out + if x < viewport_plotarea[1] + viewport_plotarea[1] += + leg.leftw + + leg.textw + + leg.rightw + + leg.xoffset + + !ymirror * gr_axis_width(sp, sp[:yaxis]) + elseif x > viewport_plotarea[2] + viewport_plotarea[2] -= leg.leftw + leg.textw + leg.rightw + leg.xoffset + end + if y < viewport_plotarea[3] + viewport_plotarea[3] += + leg.h + leg.dy + leg.yoffset + !xmirror * gr_axis_height(sp, sp[:xaxis]) + elseif y > viewport_plotarea[4] + viewport_plotarea[4] -= leg.h + leg.dy + leg.yoffset + end + end + end + leg_str = string(s) if occursin("outer", leg_str) if occursin("right", leg_str) viewport_plotarea[2] -= leg.leftw + leg.textw + leg.rightw + leg.xoffset elseif occursin("left", leg_str) - viewport_plotarea[1] += leg.leftw + leg.textw + leg.rightw + leg.xoffset + !ymirror * gr_axis_width(sp, sp[:yaxis]) + viewport_plotarea[1] += + leg.leftw + + leg.textw + + leg.rightw + + leg.xoffset + + !ymirror * gr_axis_width(sp, sp[:yaxis]) elseif occursin("top", leg_str) viewport_plotarea[4] -= leg.h + leg.dy + leg.yoffset elseif occursin("bottom", leg_str) - viewport_plotarea[3] += leg.h + leg.dy + leg.yoffset + !xmirror * gr_axis_height(sp, sp[:xaxis]) + viewport_plotarea[3] += + leg.h + leg.dy + leg.yoffset + !xmirror * gr_axis_height(sp, sp[:xaxis]) end end - if sp[:legend] == :inline + if s === :inline if sp[:yaxis][:mirror] viewport_plotarea[1] += leg.w else @@ -1211,16 +1365,22 @@ function gr_update_viewport_ratio!(viewport_plotarea, sp) if ratio == :equal ratio = 1 end - viewport_ratio = (viewport_plotarea[2] - viewport_plotarea[1]) / (viewport_plotarea[4] - viewport_plotarea[3]) + viewport_ratio = + (viewport_plotarea[2] - viewport_plotarea[1]) / + (viewport_plotarea[4] - viewport_plotarea[3]) window_ratio = (xmax - xmin) / (ymax - ymin) / ratio if window_ratio < viewport_ratio viewport_center = 0.5 * (viewport_plotarea[1] + viewport_plotarea[2]) - viewport_size = (viewport_plotarea[2] - viewport_plotarea[1]) * window_ratio / viewport_ratio + viewport_size = + (viewport_plotarea[2] - viewport_plotarea[1]) * window_ratio / + viewport_ratio viewport_plotarea[1] = viewport_center - 0.5 * viewport_size viewport_plotarea[2] = viewport_center + 0.5 * viewport_size elseif window_ratio > viewport_ratio viewport_center = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4]) - viewport_size = (viewport_plotarea[4] - viewport_plotarea[3]) * viewport_ratio / window_ratio + viewport_size = + (viewport_plotarea[4] - viewport_plotarea[3]) * viewport_ratio / + window_ratio viewport_plotarea[3] = viewport_center - 0.5 * viewport_size viewport_plotarea[4] = viewport_center + 0.5 * viewport_size end @@ -1232,12 +1392,22 @@ function gr_set_window(sp, viewport_plotarea) gr_set_viewport_polar(viewport_plotarea) else xmin, xmax, ymin, ymax = gr_xy_axislims(sp) + needs_3d = needs_any_3d_axes(sp) + if needs_3d + zmin, zmax = gr_z_axislims(sp) + zok = zmax > zmin + else + zok = true + end + scaleop = 0 - if xmax > xmin && ymax > ymin + if xmax > xmin && ymax > ymin && zok sp[:xaxis][:scale] == :log10 && (scaleop |= GR.OPTION_X_LOG) sp[:yaxis][:scale] == :log10 && (scaleop |= GR.OPTION_Y_LOG) - sp[:xaxis][:flip] && (scaleop |= GR.OPTION_FLIP_X) - sp[:yaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Y) + needs_3d && sp[:zaxis][:scale] == :log10 && (scaleop |= GR.OPTION_Z_LOG) + sp[:xaxis][:flip] && (scaleop |= GR.OPTION_FLIP_X) + sp[:yaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Y) + needs_3d && sp[:zaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Z) # NOTE: setwindow sets the "data coordinate" limits of the current "viewport" GR.setwindow(xmin, xmax, ymin, ymax) GR.setscale(scaleop) @@ -1251,7 +1421,6 @@ function gr_fill_plotarea(sp, viewport_plotarea) end end - ## Axes function gr_draw_axes(sp, viewport_plotarea) @@ -1260,19 +1429,29 @@ function gr_draw_axes(sp, viewport_plotarea) if RecipesPipeline.is3d(sp) # set space xmin, xmax, ymin, ymax = gr_xy_axislims(sp) - zmin, zmax = axis_limits(sp, :z) - GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) + zmin, zmax = gr_z_axislims(sp) + + camera = round.(Int, sp[:camera]) + + warn_invalid(val) = + if val < 0 || val > 90 + @warn "camera: $(val)° ∉ [0°, 90°]" + end + warn_invalid.(camera) + + GR.setspace(zmin, zmax, camera...) # fill the plot area gr_set_fill(plot_color(sp[:background_color_inside])) plot_area_x = [xmin, xmin, xmin, xmax, xmax, xmax, xmin] plot_area_y = [ymin, ymin, ymax, ymax, ymax, ymin, ymin] plot_area_z = [zmin, zmax, zmax, zmax, zmin, zmin, zmin] - x_bg, y_bg = RecipesPipeline.unzip(GR.wc3towc.(plot_area_x, plot_area_y, plot_area_z)) + x_bg, y_bg = + RecipesPipeline.unzip(GR.wc3towc.(plot_area_x, plot_area_y, plot_area_z)) GR.fillarea(x_bg, y_bg) for letter in (:x, :y, :z) - gr_draw_axis_3d(sp, letter) + gr_draw_axis_3d(sp, letter, viewport_plotarea) end elseif ispolar(sp) r = gr_set_viewport_polar(viewport_plotarea) @@ -1302,7 +1481,7 @@ function gr_draw_axis(sp, letter, viewport_plotarea) gr_label_axis(sp, letter, viewport_plotarea) end -function gr_draw_axis_3d(sp, letter) +function gr_draw_axis_3d(sp, letter, viewport_plotarea) ax = axis_drawing_info_3d(sp, letter) axis = sp[Symbol(letter, :axis)] @@ -1314,8 +1493,10 @@ function gr_draw_axis_3d(sp, letter) gr_draw_ticks(sp, axis, ax.tick_segments, gr_polyline3d) # labels + GR.setscale(0) gr_label_ticks_3d(sp, letter, ax.ticks) gr_label_axis_3d(sp, letter) + gr_set_window(sp, viewport_plotarea) end function gr_draw_grid(sp, axis, segments, func = gr_polyline) @@ -1324,7 +1505,7 @@ function gr_draw_grid(sp, axis, segments, func = gr_polyline) axis[:gridlinewidth], axis[:gridstyle], axis[:foreground_color_grid], - sp + sp, ) gr_set_transparency(axis[:foreground_color_grid], axis[:gridalpha]) func(coords(segments)...) @@ -1332,12 +1513,12 @@ function gr_draw_grid(sp, axis, segments, func = gr_polyline) end function gr_draw_minorgrid(sp, axis, segments, func = gr_polyline) - if axis[:grid] + if axis[:minorgrid] gr_set_line( axis[:minorgridlinewidth], axis[:minorgridstyle], axis[:foreground_color_minor_grid], - sp + sp, ) gr_set_transparency(axis[:foreground_color_minor_grid], axis[:minorgridalpha]) func(coords(segments)...) @@ -1390,13 +1571,14 @@ function gr_label_ticks(sp, letter, ticks) oamin, oamax = axis_limits(sp, oletter) gr_set_tickfont(sp, letter) out_factor = ifelse(axis[:tick_direction] === :out, 1.5, 1) - x_offset = isy ? (axis[:mirror] ? 1 : -1) * 1.5e-2 * out_factor : 0 - y_offset = isy ? 0 : (axis[:mirror] ? 1 : -1) * 8e-3 * out_factor + x_offset = isy ? -1.5e-2 * out_factor : 0 + y_offset = isy ? 0 : -8e-3 * out_factor ov = sp[:framestyle] == :origin ? 0 : xor(oaxis[:flip], axis[:mirror]) ? oamax : oamin + sgn = axis[:mirror] ? -1 : 1 for (cv, dv) in zip(ticks...) x, y = GR.wctondc(reverse_if((cv, ov), isy)...) - gr_text(x + x_offset, y + y_offset, dv) + gr_text(x + sgn * x_offset, y + sgn * y_offset, dv) end end @@ -1415,7 +1597,6 @@ function gr_label_ticks_3d(sp, letter, ticks) famin, famax = axis_limits(sp, far_letter) n0, n1 = letter === :y ? (namax, namin) : (namin, namax) - # find out which axes we are dealing with i = findfirst(==(letter), (:x, :y, :z)) letters = axes_shift((:x, :y, :z), 1 - i) @@ -1428,8 +1609,8 @@ function gr_label_ticks_3d(sp, letter, ticks) xax, yax, zax = getindex.(Ref(sp), asyms) gr_set_tickfont(sp, letter) - nt = sp[:framestyle] == :origin ? 0 : xor(ax[:mirror], nax[:flip]) ? n1 : n0 - ft = sp[:framestyle] == :origin ? 0 : xor(ax[:mirror], fax[:flip]) ? famax : famin + nt = sp[:framestyle] == :origin ? 0 : ax[:mirror] ? n1 : n0 + ft = sp[:framestyle] == :origin ? 0 : ax[:mirror] ? famax : famin xoffset = if letter === :x (sp[:yaxis][:mirror] ? 1 : -1) * 1e-2 * (sp[:xaxis][:tick_direction] == :out ? 1.5 : 1) @@ -1446,7 +1627,10 @@ function gr_label_ticks_3d(sp, letter, ticks) 0 end - for (cv, dv) in zip(ticks...) + cvs, dvs = ticks + ax[:flip] && reverse!(cvs) + + for (cv, dv) in zip((cvs, dvs)...) xi, yi = gr_w3tondc(sort_3d_axes(cv, nt, ft, letter)...) gr_text(xi + xoffset, yi + yoffset, dv) end @@ -1454,32 +1638,44 @@ end function gr_label_axis(sp, letter, viewport_plotarea) axis = sp[Symbol(letter, :axis)] + mirror = axis[:mirror] # guide if axis[:guide] != "" - isy = letter === :y GR.savestate() gr_set_font(guidefont(axis), sp) guide_position = axis[:guide_position] - if isy - w = 0.02 + gr_axis_width(sp, axis) - GR.setcharup(-1, 0) - if guide_position == :right || (guide_position == :auto && axis[:mirror]) - GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) - gr_text(viewport_plotarea[2] + w, gr_view_ycenter(viewport_plotarea), axis[:guide]) + angle = float(axis[:guidefontrotation]) # github.com/JuliaPlots/Plots.jl/issues/3089 + if letter === :y + angle += 180.0 # default angle = 0. should yield GR.setcharup(-1, 0) i.e. 180° + GR.setcharup(cosd(angle), sind(angle)) + ypos = gr_view_yposition(viewport_plotarea, position(axis[:guidefontvalign])) + yalign = alignment(axis[:guidefontvalign]) + if guide_position === :right || (guide_position == :auto && mirror) + GR.settextalign(yalign, GR.TEXT_VALIGN_BOTTOM) + xpos = viewport_plotarea[2] + 0.03 + mirror * gr_axis_width(sp, axis) else - GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) - gr_text(viewport_plotarea[1] - w, gr_view_ycenter(viewport_plotarea), axis[:guide]) + GR.settextalign(yalign, GR.TEXT_VALIGN_TOP) + xpos = viewport_plotarea[1] - 0.03 - !mirror * gr_axis_width(sp, axis) end else - h = 0.01 + gr_axis_height(sp, axis) - if guide_position == :top || (guide_position == :auto && axis[:mirror]) - GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) - gr_text(gr_view_xcenter(viewport_plotarea), viewport_plotarea[4] + h, axis[:guide]) + angle += 90.0 # default angle = 0. should yield GR.setcharup(0, 1) i.e. 90° + GR.setcharup(cosd(angle), sind(angle)) + xpos = gr_view_xposition(viewport_plotarea, position(axis[:guidefonthalign])) + xalign = alignment(axis[:guidefonthalign]) + if guide_position === :top || (guide_position == :auto && mirror) + GR.settextalign(xalign, GR.TEXT_VALIGN_TOP) + ypos = + viewport_plotarea[4] + + 0.015 + + (mirror ? gr_axis_height(sp, axis) : 0.015) else - GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) - gr_text(gr_view_xcenter(viewport_plotarea), viewport_plotarea[3] - h, axis[:guide]) + GR.settextalign(xalign, GR.TEXT_VALIGN_BOTTOM) + ypos = + viewport_plotarea[3] - 0.015 - + (mirror ? 0.015 : gr_axis_height(sp, axis)) end end + gr_text(xpos, ypos, axis[:guide]) GR.restorestate() end end @@ -1508,19 +1704,20 @@ function gr_label_axis_3d(sp, letter) # color = ax[:guidefontcolor], ) ag = (amin + amax) / 2 - ng = xor(ax[:mirror], nax[:flip]) ? n1 : n0 - fg = xor(ax[:mirror], fax[:flip]) ? famax : famin + ng = ax[:mirror] ? n1 : n0 + fg = ax[:mirror] ? famax : famin x, y = gr_w3tondc(sort_3d_axes(ag, ng, fg, letter)...) if letter in (:x, :y) h = gr_axis_height(sp, ax) x_offset = letter === :x ? -h : h y_offset = -h else - x_offset = -gr_axis_width(sp, ax) + x_offset = -0.03 - gr_axis_width(sp, ax) y_offset = 0 end letter === :z && GR.setcharup(-1, 0) - gr_text(x + x_offset, y + y_offset, ax[:guide]) + sgn = ax[:mirror] ? -1 : 1 + gr_text(x + sgn * x_offset, y + sgn * y_offset, ax[:guide]) GR.restorestate() end end @@ -1546,7 +1743,6 @@ function gr_add_title(sp, viewport_plotarea, viewport_subplot) end end - ## Series function gr_add_series(sp, series) @@ -1586,7 +1782,7 @@ function gr_add_series(sp, series) gr_draw_markers(series, x, y, clims) end elseif st === :shape - gr_draw_shapes(series, x, y, clims) + gr_draw_shapes(series, clims) elseif st in (:path3d, :scatter3d) gr_draw_segments_3d(series, x, y, z, clims) if st === :scatter3d || series[:markershape] !== :none @@ -1596,27 +1792,23 @@ function gr_add_series(sp, series) end elseif st === :contour gr_draw_contour(series, x, y, z, clims) - elseif st in (:surface, :wireframe) + elseif st in (:surface, :wireframe, :mesh3d) gr_draw_surface(series, x, y, z, clims) elseif st === :volume sp[:legend] = :none GR.gr3.clear() dmin, dmax = GR.gr3.volume(y.v, 0) - elseif st in (:heatmap, :image) - if !ispolar(series) - # `z` is already transposed, so we need to reverse before passing its size. - x, y = heatmap_edges(x, xscale, y, yscale, reverse(size(z))) - end - if st === :heatmap - gr_draw_heatmap(series, x, y, z, clims) - else - gr_draw_image(series, x, y, z, clims) - end + elseif st === :heatmap + # `z` is already transposed, so we need to reverse before passing its size. + x, y = heatmap_edges(x, xscale, y, yscale, reverse(size(z)), ispolar(series)) + gr_draw_heatmap(series, x, y, z, clims) + elseif st === :image + gr_draw_image(series, x, y, z, clims) end # this is all we need to add the series_annotations text anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, x, y) + for (xi, yi, str, fnt) in EachAnn(anns, x, y) gr_set_font(fnt, sp) gr_text(GR.wctondc(xi, yi)..., str) end @@ -1625,16 +1817,16 @@ function gr_add_series(sp, series) gr_set_font(legendfont(sp), sp) gr_set_textcolor(plot_color(sp[:legendfontcolor])) if sp[:yaxis][:mirror] - (_,i) = sp[:xaxis][:flip] ? findmax(x) : findmin(x) + (_, i) = sp[:xaxis][:flip] ? findmax(x) : findmin(x) GR.settextalign(GR.TEXT_HALIGN_RIGHT, GR.TEXT_VALIGN_HALF) offset = -0.01 else - (_,i) = sp[:xaxis][:flip] ? findmin(x) : findmax(x) + (_, i) = sp[:xaxis][:flip] ? findmin(x) : findmax(x) GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) offset = 0.01 end - (x_l,y_l) = GR.wctondc(x[i],y[i]) - gr_text(x_l+offset,y_l,series[:label]) + (x_l, y_l) = GR.wctondc(x[i], y[i]) + gr_text(x_l + offset, y_l, series[:label]) end GR.restorestate() end @@ -1642,12 +1834,13 @@ end function gr_draw_segments(series, x, y, fillrange, clims) st = series[:seriestype] if x !== nothing && length(x) > 1 - segments = iter_segments(series, st) + segments = series_segments(series, st; check = true) # do area fill if fillrange !== nothing GR.setfillintstyle(GR.INTSTYLE_SOLID) fr_from, fr_to = (is_2tuple(fillrange) ? fillrange : (y, fillrange)) - for (i, rng) in enumerate(segments) + for segment in segments + i, rng = segment.attr_index, segment.range fc = get_fillcolor(series, clims, i) gr_set_fillcolor(fc) fs = get_fillstyle(series, i) @@ -1661,11 +1854,10 @@ function gr_draw_segments(series, x, y, fillrange, clims) # draw the line(s) if st in (:path, :straightline) - for (i, rng) in enumerate(segments) + for segment in segments + i, rng = segment.attr_index, segment.range lc = get_linecolor(series, clims, i) - gr_set_line( - get_linewidth(series, i), get_linestyle(series, i), lc, series - ) + gr_set_line(get_linewidth(series, i), get_linestyle(series, i), lc, series) arrowside = isa(series[:arrow], Arrow) ? series[:arrow].side : :none arrowstyle = isa(series[:arrow], Arrow) ? series[:arrow].style : :simple gr_set_fillcolor(lc) @@ -1679,12 +1871,11 @@ end function gr_draw_segments_3d(series, x, y, z, clims) if series[:seriestype] === :path3d && length(x) > 1 lz = series[:line_z] - segments = iter_segments(series, :path3d) - for (i, rng) in enumerate(segments) + segments = series_segments(series, :path3d; check = true) + for segment in segments + i, rng = segment.attr_index, segment.range lc = get_linecolor(series, clims, i) - gr_set_line( - get_linewidth(series, i), get_linestyle(series, i), lc, series - ) + gr_set_line(get_linewidth(series, i), get_linestyle(series, i), lc, series) gr_set_transparency(lc, get_linealpha(series, i)) GR.polyline3d(x[rng], y[rng], z[rng]) end @@ -1699,29 +1890,39 @@ function gr_draw_markers( msize = series[:markersize], strokewidth = series[:markerstrokewidth], ) - isempty(x) && return GR.setfillintstyle(GR.INTSTYLE_SOLID) shapes = series[:markershape] if shapes != :none - for (i, rng) in enumerate(iter_segments(series, :scatter)) - rng = intersect(eachindex(x), rng) + for segment in series_segments(series, :scatter) + i = segment.attr_index + rng = intersect(eachindex(x), segment.range) if !isempty(rng) ms = get_thickness_scaling(series) * _cycle(msize, i) msw = get_thickness_scaling(series) * _cycle(strokewidth, i) shape = _cycle(shapes, i) for j in rng - gr_draw_marker(series, _cycle(x, j), _cycle(y, j), clims, i, ms, msw, shape) + gr_draw_marker( + series, + _cycle(x, j), + _cycle(y, j), + clims, + i, + ms, + msw, + shape, + ) end end end end end -function gr_draw_shapes(series, x, y, clims) +function gr_draw_shapes(series, clims) x, y = shape_data(series) - for (i,rng) in enumerate(iter_segments(x, y)) + for segment in series_segments(series, :shape) + i, rng = segment.attr_index, segment.range if length(rng) > 1 # connect to the beginning rng = vcat(rng, rng[1]) @@ -1749,13 +1950,14 @@ end function gr_draw_contour(series, x, y, z, clims) GR.setspace(clims[1], clims[2], 0, 90) gr_set_line(get_linewidth(series), get_linestyle(series), get_linecolor(series), series) - is_lc_black = let black=plot_color(:black) - plot_color(series[:linecolor]) in (black,[black]) + gr_set_transparency(get_fillalpha(series)) + is_lc_black = let black = plot_color(:black) + plot_color(series[:linecolor]) in (black, [black]) end h = gr_contour_levels(series, clims) if series[:fillrange] !== nothing if series[:fillcolor] != series[:linecolor] && !is_lc_black - @warn("GR: filled contour only supported with black contour lines") + @warn "GR: filled contour only supported with black contour lines" end GR.contourf(x, y, h, z, series[:contour_labels] == true ? 1 : 0) else @@ -1765,60 +1967,73 @@ function gr_draw_contour(series, x, y, z, clims) end function gr_draw_surface(series, x, y, z, clims) - if series[:seriestype] === :surface - if length(x) == length(y) == length(z) - GR.trisurface(x, y, z) + e_kwargs = series[:extra_kwargs] + st = series[:seriestype] + if st === :surface + if ndims(x) == ndims(y) == ndims(z) == 2 + GR.gr3.surface(x', y', z, GR.OPTION_3D_MESH) else - try - GR.gr3.surface(x, y, z, GR.OPTION_COLORED_MESH) - catch - GR.surface(x, y, z, GR.OPTION_COLORED_MESH) + fillalpha = get_fillalpha(series) + fillcolor = get_fillcolor(series) + # NOTE: setting nx = 0 or ny = 0 disables GR.gridit interpolation + nx, ny = get(e_kwargs, :nx, 200), get(e_kwargs, :ny, 200) + if length(x) == length(y) == length(z) && nx > 0 && ny > 0 + x, y, z = GR.gridit(x, y, z, nx, ny) + end + d_opt = get(e_kwargs, :display_option, GR.OPTION_COLORED_MESH) + if (!isnothing(fillalpha) && fillalpha < 1) || alpha(first(fillcolor)) < 1 + gr_set_transparency(fillcolor, fillalpha) + GR.surface(x, y, z, d_opt) + else + GR.gr3.surface(x, y, z, d_opt) end end - else # wireframe + elseif st === :wireframe GR.setfillcolorind(0) - GR.surface(x, y, z, GR.OPTION_FILLED_MESH) + GR.surface(x, y, z, get(e_kwargs, :display_option, GR.OPTION_FILLED_MESH)) + elseif st === :mesh3d + @warn "GR: mesh3d is experimental (no face colors)" + gr_set_line( + get_linewidth(series), + get_linestyle(series), + get_linecolor(series), + series, + ) + GR.polyline3d(mesh3d_triangles(x, y, z, series[:connections])...) + else + throw(ArgumentError("Not handled !")) end end function gr_draw_heatmap(series, x, y, z, clims) fillgrad = _as_gradient(series[:fillcolor]) - if !ispolar(series) - GR.setspace(clims..., 0, 90) - w, h = length(x) - 1, length(y) - 1 - if is_uniformly_spaced(x) && is_uniformly_spaced(y) - # For uniformly spaced data use GR.drawimage, which can be - # much faster than GR.nonuniformcellarray, especially for - # pdf output, and also supports alpha values. - # Note that drawimage draws uniformly spaced data correctly - # even on log scales, where it is visually non-uniform. - colors = plot_color.(get(fillgrad, z, clims), series[:fillalpha]) - rgba = gr_color.(colors) - GR.drawimage(first(x), last(x), last(y), first(y), w, h, rgba) - else - if something(series[:fillalpha], 1) < 1 - @warn "GR: transparency not supported in non-uniform heatmaps. Alpha values ignored." - end - z_normalized = get_z_normalized.(z, clims...) - rgba = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] - GR.nonuniformcellarray(x, y, w, h, rgba) - end + GR.setspace(clims..., 0, 90) + w, h = length(x) - 1, length(y) - 1 + if !ispolar(series) && is_uniformly_spaced(x) && is_uniformly_spaced(y) + # For uniformly spaced data use GR.drawimage, which can be + # much faster than GR.nonuniformcellarray, especially for + # pdf output, and also supports alpha values. + # Note that drawimage draws uniformly spaced data correctly + # even on log scales, where it is visually non-uniform. + colors = plot_color.(get(fillgrad, z, clims), series[:fillalpha]) + rgba = gr_color.(colors) + GR.drawimage(first(x), last(x), last(y), first(y), w, h, rgba) else - phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl - nx, ny = length(series[:x]), length(series[:y]) - xmin, xmax, ymin, ymax = gr_xy_axislims(series[:subplot]) - GR.setwindow(-ymax, ymax, -ymax, ymax) - if ymin > 0 - @warn "'ymin[1] > 0' (rmin) is not yet supported." - end - if series[:y][end] != ny - @warn "Right now only the maximum value of y (r) is taken into account." + if something(series[:fillalpha], 1) < 1 + @warn "GR: transparency not supported in non-uniform heatmaps. Alpha values ignored." end z_normalized = get_z_normalized.(z, clims...) rgba = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] - GR.polarcellarray(0, 0, phimin, phimax, 0, ymax, nx, ny, rgba) - # Right now only the maximum value of y (r) is taken into account. - # This is certainly not perfect but nonuniform polar array is not yet supported in GR.jl + if !ispolar(series) + GR.nonuniformcellarray(x, y, w, h, rgba) + else + if y[1] < 0 + @warn "'y[1] < 0' (rmin) is not yet supported." + end + xmin, xmax, ymin, ymax = gr_xy_axislims(series[:subplot]) + GR.setwindow(-ymax, ymax, -ymax, ymax) + GR.nonuniformpolarcellarray(rad2deg.(x), y, w, h, rgba) + end end end @@ -1830,7 +2045,6 @@ function gr_draw_image(series, x, y, z, clims) GR.drawimage(xmin, xmax, ymax, ymin, w, h, rgba) end - # ---------------------------------------------------------------- for (mime, fmt) in ( @@ -1867,7 +2081,11 @@ function _display(plt::Plot{GRBackend}) ENV["GKS_FILEPATH"] = filepath gr_display(plt) GR.emergencyclosegks() - content = string("\033]1337;File=inline=1;preserveAspectRatio=0:", base64encode(open(read, filepath)), "\a") + content = string( + "\033]1337;File=inline=1;preserveAspectRatio=0:", + base64encode(open(read, filepath)), + "\a", + ) println(content) rm(filepath) else diff --git a/src/backends/hdf5.jl b/src/backends/hdf5.jl index 8c1d24f2..9959a683 100644 --- a/src/backends/hdf5.jl +++ b/src/backends/hdf5.jl @@ -13,7 +13,6 @@ Read from .hdf5 file using: display(pread) ==# - #==TODO =============================================================================== 1. Support more features. @@ -46,7 +45,7 @@ import Dates #Plots.jl imports HDF5 to main: import ..HDF5 -import ..HDF5: HDF5Group, HDF5Dataset +import ..HDF5: Group, Dataset import ..Colors, ..Colorant import ..PlotUtils.ColorSchemes.ColorScheme @@ -56,7 +55,8 @@ import ..HDF5PLOT_MAP_STR2TELEM, ..HDF5PLOT_MAP_TELEM2STR import ..HDF5Plot_PlotRef, ..HDF5PLOT_PLOTREF import ..BoundingBox, ..Extrema, ..Length import ..RecipesPipeline.datetimeformatter -import ..PlotUtils.ColorPalette, ..PlotUtils.CategoricalColorGradient, ..PlotUtils.ContinuousColorGradient +import ..PlotUtils.ColorPalette, + ..PlotUtils.CategoricalColorGradient, ..PlotUtils.ContinuousColorGradient import ..Surface, ..Shape, ..Arrow import ..GridLayout, ..RootLayout import ..Font, ..PlotText, ..SeriesAnnotations @@ -66,14 +66,13 @@ import .._axis_defaults import ..plot, ..plot! #Types that already have built-in HDF5 support (just write out natively): -const HDF5_SupportedTypes = Union{Number, String} +const HDF5_SupportedTypes = Union{Number,String} #TODO: Types_HDF5Support #Dispatch types: -struct CplxTuple; end #Identifies a "complex" tuple structure (not merely numbers) +struct CplxTuple end #Identifies a "complex" tuple structure (not merely numbers) #HDF5 reader will auto-detect type correctly: -struct HDF5_AutoDetect; end #See HDF5_SupportedTypes - +struct HDF5_AutoDetect end #See HDF5_SupportedTypes #== ===============================================================================# @@ -82,13 +81,12 @@ if length(HDF5PLOT_MAP_TELEM2STR) < 1 #Possible element types of high-level data types: #(Used to add type information as an HDF5 string attribute) #(Also used to dispatch appropriate read function through _read_typed()) - _telem2str = Dict{String, Type}( + _telem2str = Dict{String,Type}( "NOTHING" => Nothing, "SYMBOL" => Symbol, "RGBA" => Colorant, #Write out any Colorant to an #RRGGBBAA string "TUPLE" => Tuple, - "CTUPLE" => CplxTuple, #Tuple of complex structures - + "CTUPLE" => CplxTuple, "EXTREMA" => Extrema, "LENGTH" => Length, "ARRAY" => Array, #Array{Any} (because Array{T<:Union{Number, String}} natively supported by HDF5) @@ -115,10 +113,12 @@ if length(HDF5PLOT_MAP_TELEM2STR) < 1 "SUBPLOT" => Subplot, ) merge!(HDF5PLOT_MAP_STR2TELEM, _telem2str) #Faster to create than push!()?? - merge!(HDF5PLOT_MAP_TELEM2STR, Dict{Type, String}(v=>k for (k,v) in HDF5PLOT_MAP_STR2TELEM)) + merge!( + HDF5PLOT_MAP_TELEM2STR, + Dict{Type,String}(v => k for (k, v) in HDF5PLOT_MAP_STR2TELEM), + ) end - #==Helper functions ===============================================================================# @@ -151,48 +151,47 @@ function _hdf5_merge!(dest::AKW, src::AKW) end #_type_for_map returns the type to use with HDF5PLOT_MAP_TELEM2STR[], in case it is not concrete: -_type_for_map(::Type{T}) where T = T #Catch-all -_type_for_map(::Type{T}) where T<:BoundingBox = BoundingBox -_type_for_map(::Type{T}) where T<:ColorScheme = ColorScheme -_type_for_map(::Type{T}) where T<:Surface = Surface - +_type_for_map(::Type{T}) where {T} = T #Catch-all +_type_for_map(::Type{T}) where {T<:BoundingBox} = BoundingBox +_type_for_map(::Type{T}) where {T<:ColorScheme} = ColorScheme +_type_for_map(::Type{T}) where {T<:Surface} = Surface #==Read/write things like type name in attributes ===============================================================================# -function _write_datatype_attr(ds::Union{HDF5Group, HDF5Dataset}, ::Type{T}) where T +function _write_datatype_attr(ds::Union{Group,Dataset}, ::Type{T}) where {T} typestr = HDF5PLOT_MAP_TELEM2STR[T] - HDF5.attrs(ds)["TYPE"] = typestr + HDF5.attributes(ds)["TYPE"] = typestr end -function _read_datatype_attr(ds::Union{HDF5Group, HDF5Dataset}) - if !HDF5.exists(HDF5.attrs(ds), "TYPE") +function _read_datatype_attr(ds::Union{Group,Dataset}) + if !Base.haskey(HDF5.attributes(ds), "TYPE") return HDF5_AutoDetect end - typestr = HDF5.read(HDF5.attrs(ds)["TYPE"]) + typestr = HDF5.read(HDF5.attributes(ds)["TYPE"]) return HDF5PLOT_MAP_STR2TELEM[typestr] end #Type parameter attributes: -function _write_typeparam_attr(ds::HDF5Dataset, v::Length{T}) where T - HDF5.attrs(ds)["TYPEPARAM"] = string(T) #Need to add units for Length +function _write_typeparam_attr(ds::Dataset, v::Length{T}) where {T} + HDF5.attributes(ds)["TYPEPARAM"] = string(T) #Need to add units for Length end -_read_typeparam_attr(ds::HDF5Dataset) = HDF5.read(HDF5.attrs(ds)["TYPEPARAM"]) +_read_typeparam_attr(ds::Dataset) = HDF5.read(HDF5.attributes(ds)["TYPEPARAM"]) -function _write_length_attr(grp::HDF5Group, v::Vector) #of a vector - HDF5.attrs(grp)["LENGTH"] = length(v) +function _write_length_attr(grp::Group, v::Vector) #of a vector + HDF5.attributes(grp)["LENGTH"] = length(v) end -_read_length_attr(::Type{Vector}, grp::HDF5Group) = HDF5.read(HDF5.attrs(grp)["LENGTH"]) +_read_length_attr(::Type{Vector}, grp::Group) = HDF5.read(HDF5.attributes(grp)["LENGTH"]) -function _write_size_attr(grp::HDF5Group, v::Array) #of an array - HDF5.attrs(grp)["SIZE"] = [size(v)...] +function _write_size_attr(grp::Group, v::Array) #of an array + HDF5.attributes(grp)["SIZE"] = [size(v)...] end -_read_size_attr(::Type{Array}, grp::HDF5Group) = tuple(HDF5.read(HDF5.attrs(grp)["SIZE"])...) - +_read_size_attr(::Type{Array}, grp::Group) = + tuple(HDF5.read(HDF5.attributes(grp)["SIZE"])...) #==_write_typed(): Simple (leaf) datatypes. (Labels with type name.) ===============================================================================# #= No: write out struct instead! -function _write_typed(grp::HDF5Group, name::String, v::T) where T +function _write_typed(grp::Group, name::String, v::T) where T tstr = string(T) path = HDF5.name(grp) * "/" * name @info("Type not supported: $tstr\npath: $path") @@ -200,52 +199,50 @@ function _write_typed(grp::HDF5Group, name::String, v::T) where T end =# #Default behaviour: Assumes value is supported by HDF5 format -function _write_typed(grp::HDF5Group, name::String, v::HDF5_SupportedTypes) +function _write_typed(grp::Group, name::String, v::HDF5_SupportedTypes) grp[name] = v return #No need to _write_datatype_attr end -function _write_typed(grp::HDF5Group, name::String, v::Nothing) +function _write_typed(grp::Group, name::String, v::Nothing) grp[name] = "nothing" #Redundancy check/easier to read HDF5 file _write_datatype_attr(grp[name], Nothing) end -function _write_typed(grp::HDF5Group, name::String, v::Symbol) +function _write_typed(grp::Group, name::String, v::Symbol) grp[name] = String(v) _write_datatype_attr(grp[name], Symbol) end -function _write_typed(grp::HDF5Group, name::String, v::Colorant) +function _write_typed(grp::Group, name::String, v::Colorant) vstr = "#" * Colors.hex(v, :RRGGBBAA) grp[name] = vstr _write_datatype_attr(grp[name], Colorant) end -function _write_typed(grp::HDF5Group, name::String, v::Extrema) +function _write_typed(grp::Group, name::String, v::Extrema) grp[name] = [v.emin, v.emax] #More compact than writing struct _write_datatype_attr(grp[name], Extrema) end -function _write_typed(grp::HDF5Group, name::String, v::Length) +function _write_typed(grp::Group, name::String, v::Length) grp[name] = v.value _write_datatype_attr(grp[name], Length) _write_typeparam_attr(grp[name], v) end -function _write_typed(grp::HDF5Group, name::String, v::typeof(datetimeformatter)) +function _write_typed(grp::Group, name::String, v::typeof(datetimeformatter)) grp[name] = string(v) #Just write something that helps reader - _write_datatype_attr(grp[name], typeof(datetimeformatter)) + _write_datatype_attr(grp[name], typeof(datetimeformatter)) end -function _write_typed(grp::HDF5Group, name::String, v::Array{T}) where T<:Number #Default for arrays +function _write_typed(grp::Group, name::String, v::Array{T}) where {T<:Number} #Default for arrays grp[name] = v return #No need to _write_datatype_attr end -function _write_typed(grp::HDF5Group, name::String, v::AbstractRange) +function _write_typed(grp::Group, name::String, v::AbstractRange) _write_typed(grp, name, collect(v)) #For now end - - #== Helper functions for writing complex data structures ===============================================================================# #Write an array using HDF5 hierarchy (when not using simple numeric eltype): -function _write_harray(grp::HDF5Group, name::String, v::Array) - sgrp = HDF5.g_create(grp, name) +function _write_harray(grp::Group, name::String, v::Array) + sgrp = HDF5.create_group(grp, name) sz = size(v) lidx = LinearIndices(sz) @@ -260,8 +257,8 @@ function _write_harray(grp::HDF5Group, name::String, v::Array) end #Write Dict without tagging with type: -function _write(grp::HDF5Group, name::String, d::AbstractDict) - sgrp = HDF5.g_create(grp, name) +function _write(grp::Group, name::String, d::AbstractDict) + sgrp = HDF5.create_group(grp, name) for (k, v) in d kstr = string(k) _write_typed(sgrp, kstr, v) @@ -270,20 +267,19 @@ function _write(grp::HDF5Group, name::String, d::AbstractDict) end #Write out arbitrary `struct`s: -function _writestructgeneric(grp::HDF5Group, obj::T) where T +function _writestructgeneric(grp::Group, obj::T) where {T} for fname in fieldnames(T) - v = getfield(obj, fname) - _write_typed(grp, String(fname), v) + v = getfield(obj, fname) + _write_typed(grp, String(fname), v) end return end - #==_write_typed(): More complex structures. (Labels with type name.) ===============================================================================# #Catch-all (default behaviour for `struct`s): -function _write_typed(grp::HDF5Group, name::String, v::T) where T +function _write_typed(grp::Group, name::String, v::T) where {T} #NOTE: need "name" parameter so that call signature is same with built-ins MT = _type_for_map(T) try #Check to see if type is supported @@ -294,68 +290,67 @@ function _write_typed(grp::HDF5Group, name::String, v::T) where T end #If attribute is supported and no writer is defined, then this should work: - objgrp = HDF5.g_create(grp, name) + objgrp = HDF5.create_group(grp, name) _write_datatype_attr(objgrp, MT) _writestructgeneric(objgrp, v) end -function _write_typed(grp::HDF5Group, name::String, v::Array{T}) where T +function _write_typed(grp::Group, name::String, v::Array{T}) where {T} _write_harray(grp, name, v) _write_datatype_attr(grp[name], Array) #{Any} end -function _write_typed(grp::HDF5Group, name::String, v::Tuple, ::Type{ELT}) where ELT<: Number #Basic Tuple +function _write_typed(grp::Group, name::String, v::Tuple, ::Type{ELT}) where {ELT<:Number} #Basic Tuple _write_typed(grp, name, [v...]) _write_datatype_attr(grp[name], Tuple) end -function _write_typed(grp::HDF5Group, name::String, v::Tuple, ::Type) #CplxTuple +function _write_typed(grp::Group, name::String, v::Tuple, ::Type) #CplxTuple _write_harray(grp, name, [v...]) _write_datatype_attr(grp[name], CplxTuple) end -_write_typed(grp::HDF5Group, name::String, v::Tuple) = _write_typed(grp, name, v, eltype(v)) +_write_typed(grp::Group, name::String, v::Tuple) = _write_typed(grp, name, v, eltype(v)) -function _write_typed(grp::HDF5Group, name::String, v::Dict) -#= - tstr = string(Dict) - path = HDF5.name(grp) * "/" * name - @info("Type not supported: $tstr\npath: $path") - return -=# +function _write_typed(grp::Group, name::String, v::Dict) + #= + tstr = string(Dict) + path = HDF5.name(grp) * "/" * name + @info("Type not supported: $tstr\npath: $path") + return + =# #No support for structures with Dicts yet end -function _write_typed(grp::HDF5Group, name::String, d::DefaultsDict) #Typically for plot attributes +function _write_typed(grp::Group, name::String, d::DefaultsDict) #Typically for plot attributes _write(grp, name, d) _write_datatype_attr(grp[name], DefaultsDict) end -function _write_typed(grp::HDF5Group, name::String, v::Axis) - sgrp = HDF5.g_create(grp, name) +function _write_typed(grp::Group, name::String, v::Axis) + sgrp = HDF5.create_group(grp, name) #Ignore: sps::Vector{Subplot} _write_typed(sgrp, "plotattributes", v.plotattributes) _write_datatype_attr(sgrp, Axis) end -function _write_typed(grp::HDF5Group, name::String, v::Subplot) +function _write_typed(grp::Group, name::String, v::Subplot) #Not for use in main "Plot.subplots[]" hierarchy. Just establishes reference with subplot_index. - sgrp = HDF5.g_create(grp, name) + sgrp = HDF5.create_group(grp, name) _write_typed(sgrp, "index", v[:subplot_index]) _write_datatype_attr(sgrp, Subplot) return end -function _write_typed(grp::HDF5Group, name::String, v::Plot) +function _write_typed(grp::Group, name::String, v::Plot) #Don't write plot references end - #==_write(): Write out more complex structures NOTE: No need to write out type information (inferred from hierarchy) ===============================================================================# -function _write(grp::HDF5Group, sp::Subplot{HDF5Backend}) +function _write(grp::Group, sp::Subplot{HDF5Backend}) _write_typed(grp, "attr", sp.attr) - listgrp = HDF5.g_create(grp, "series_list") + listgrp = HDF5.create_group(grp, "series_list") _write_length_attr(listgrp, sp.series_list) for (i, series) in enumerate(sp.series_list) #Just write .plotattributes part: @@ -365,71 +360,73 @@ function _write(grp::HDF5Group, sp::Subplot{HDF5Backend}) return end -function _write(grp::HDF5Group, plt::Plot{HDF5Backend}) +function _write(grp::Group, plt::Plot{HDF5Backend}) _write_typed(grp, "attr", plt.attr) - listgrp = HDF5.g_create(grp, "subplots") + listgrp = HDF5.create_group(grp, "subplots") _write_length_attr(listgrp, plt.subplots) for (i, sp) in enumerate(plt.subplots) - sgrp = HDF5.g_create(listgrp, "$i") + sgrp = HDF5.create_group(listgrp, "$i") _write(sgrp, sp) end return end -function hdf5plot_write(plt::Plot{HDF5Backend}, path::AbstractString; name::String="_unnamed") +function hdf5plot_write( + plt::Plot{HDF5Backend}, + path::AbstractString; + name::String = "_unnamed", +) HDF5.h5open(path, "w") do file - HDF5.d_write(file, "VERSION_INFO", _get_Plots_versionstr()) - grp = HDF5.g_create(file, h5plotpath(name)) + HDF5.write_dataset(file, "VERSION_INFO", _get_Plots_versionstr()) + grp = HDF5.create_group(file, h5plotpath(name)) _write(grp, plt) end end - #== _read(): Read data, but not type information. ===============================================================================# #Types with built-in HDF5 support: -_read(::Type{HDF5_AutoDetect}, ds::HDF5Dataset) = HDF5.read(ds) +_read(::Type{HDF5_AutoDetect}, ds::Dataset) = HDF5.read(ds) -function _read(::Type{Nothing}, ds::HDF5Dataset) +function _read(::Type{Nothing}, ds::Dataset) nstr = "nothing" v = HDF5.read(ds) if nstr != v path = HDF5.name(ds) - throw(Meta.ParseError("_read(::Nothing, ::HDF5Group): Read $v != $nstr:\n$path")) + throw(Meta.ParseError("_read(::Nothing, ::Group): Read $v != $nstr:\n$path")) end return nothing end -_read(::Type{Symbol}, ds::HDF5Dataset) = Symbol(HDF5.read(ds)) -_read(::Type{Colorant}, ds::HDF5Dataset) = parse(Colorant, HDF5.read(ds)) -_read(::Type{Tuple}, ds::HDF5Dataset) = tuple(HDF5.read(ds)...) -function _read(::Type{Extrema}, ds::HDF5Dataset) +_read(::Type{Symbol}, ds::Dataset) = Symbol(HDF5.read(ds)) +_read(::Type{Colorant}, ds::Dataset) = parse(Colorant, HDF5.read(ds)) +_read(::Type{Tuple}, ds::Dataset) = tuple(HDF5.read(ds)...) +function _read(::Type{Extrema}, ds::Dataset) v = HDF5.read(ds) return Extrema(v[1], v[2]) end -function _read(::Type{Length}, ds::HDF5Dataset) +function _read(::Type{Length}, ds::Dataset) TUNIT = Symbol(_read_typeparam_attr(ds)) v = HDF5.read(ds) T = typeof(v) return Length{TUNIT,T}(v) end -_read(::Type{typeof(datetimeformatter)}, ds::HDF5Dataset) = datetimeformatter - +_read(::Type{typeof(datetimeformatter)}, ds::Dataset) = datetimeformatter #== Helper functions for reading in complex data structures ===============================================================================# #When type is unknown, _read_typed() figures it out: -function _read_typed(grp::HDF5Group, name::String) +function _read_typed(grp::Group, name::String) ds = grp[name] t = _read_datatype_attr(ds) return _read(t, ds) end #_readstructgeneric: Needs object values to be written out with _write_typed(): -function _readstructgeneric(::Type{T}, grp::HDF5Group) where T +function _readstructgeneric(::Type{T}, grp::Group) where {T} vlist = Array{Any}(nothing, fieldcount(T)) for (i, fname) in enumerate(fieldnames(T)) vlist[i] = _read_typed(grp, String(fname)) @@ -438,10 +435,10 @@ function _readstructgeneric(::Type{T}, grp::HDF5Group) where T end #Read KW from group: -function _read(::Type{KW}, grp::HDF5Group) +function _read(::Type{KW}, grp::Group) d = KW() - gnames = names(grp) - for k in gnames + gkeys = keys(grp) + for k in gkeys try v = _read_typed(grp, k) d[Symbol(k)] = v @@ -454,16 +451,17 @@ function _read(::Type{KW}, grp::HDF5Group) return d end - #== _read(): More complex structures. ===============================================================================# #Catch-all (default behaviour for `struct`s): -_read(T::Type, grp::HDF5Group) = _readstructgeneric(T, grp) +_read(T::Type, grp::Group) = _readstructgeneric(T, grp) -function _read(::Type{Array}, grp::HDF5Group) #Array{Any} +function _read(::Type{Array}, grp::Group) #Array{Any} sz = _read_size_attr(Array, grp) - if tuple(0) == sz; return []; end + if tuple(0) == sz + return [] + end result = Array{Any}(undef, sz) lidx = LinearIndices(sz) @@ -479,9 +477,9 @@ function _read(::Type{Array}, grp::HDF5Group) #Array{Any} return reshape(result, sz) end -_read(::Type{CplxTuple}, grp::HDF5Group) = tuple(_read(Array, grp)...) +_read(::Type{CplxTuple}, grp::Group) = tuple(_read(Array, grp)...) -function _read(::Type{GridLayout}, grp::HDF5Group) +function _read(::Type{GridLayout}, grp::Group) #parent = _read_typed(grp, "parent") #Can't use generic reader parent = RootLayout() #TODO: support parent??? minpad = _read_typed(grp, "minpad") @@ -494,32 +492,33 @@ function _read(::Type{GridLayout}, grp::HDF5Group) return GridLayout(parent, minpad, bbox, grid, widths, heights, attr) end #Defaults depends on context. So: user must constructs with defaults, then read. -function _read(::Type{DefaultsDict}, grp::HDF5Group) +function _read(::Type{DefaultsDict}, grp::Group) #User should set DefaultsDict.defaults to one of: # _plot_defaults, _subplot_defaults, _axis_defaults, _series_defaults path = HDF5.name(ds) - @warn("Cannot yet read DefaultsDict using _read_typed():\n $path\nCannot fully reconstruct plot.") + @warn( + "Cannot yet read DefaultsDict using _read_typed():\n $path\nCannot fully reconstruct plot." + ) end -function _read(::Type{Axis}, grp::HDF5Group) +function _read(::Type{Axis}, grp::Group) #1st arg appears to be ref to subplots. Seems to work without it. return Axis([], DefaultsDict(_read(KW, grp["plotattributes"]), _axis_defaults)) end -function _read(::Type{Subplot}, grp::HDF5Group) +function _read(::Type{Subplot}, grp::Group) #Not for use in main "Plot.subplots[]" hierarchy. Just establishes reference with subplot_index. idx = _read_typed(grp, "index") return HDF5PLOT_PLOTREF.ref.subplots[idx] end - #== _read(): Main plot structures ===============================================================================# -function _read(grp::HDF5Group, sp::Subplot) - listgrp = HDF5.g_open(grp, "series_list") +function _read(grp::Group, sp::Subplot) + listgrp = HDF5.open_group(grp, "series_list") nseries = _read_length_attr(Vector, listgrp) for i in 1:nseries - sgrp = HDF5.g_open(listgrp, "$i") + sgrp = HDF5.open_group(listgrp, "$i") seriesinfo = _read(KW, sgrp) plot!(sp, seriesinfo[:x], seriesinfo[:y]) #Add data & create data structures @@ -527,42 +526,40 @@ function _read(grp::HDF5Group, sp::Subplot) end #Perform after adding series... otherwise values get overwritten: - agrp = HDF5.g_open(grp, "attr") + agrp = HDF5.open_group(grp, "attr") _hdf5_merge!(sp.attr, _read(KW, agrp)) return sp end -function _read_plot(grp::HDF5Group) - listgrp = HDF5.g_open(grp, "subplots") +function _read_plot(grp::Group) + listgrp = HDF5.open_group(grp, "subplots") n = _read_length_attr(Vector, listgrp) #Construct new plot, +allocate subplots: - plt = plot(layout=n) + plt = plot(layout = n) HDF5PLOT_PLOTREF.ref = plt #Used when reading "layout" - agrp = HDF5.g_open(grp, "attr") + agrp = HDF5.open_group(grp, "attr") _hdf5_merge!(plt.attr, _read(KW, agrp)) for (i, sp) in enumerate(plt.subplots) - sgrp = HDF5.g_open(listgrp, "$i") + sgrp = HDF5.open_group(listgrp, "$i") _read(sgrp, sp) end return plt end -function hdf5plot_read(path::AbstractString; name::String="_unnamed") +function hdf5plot_read(path::AbstractString; name::String = "_unnamed") HDF5.h5open(path, "r") do file - grp = HDF5.g_open(file, h5plotpath("_unnamed")) + grp = HDF5.open_group(file, h5plotpath("_unnamed")) return _read_plot(grp) end end - end #module _hdf5_implementation - #==Implement Plots.jl backend interface for HDF5Backend ===============================================================================# @@ -640,7 +637,8 @@ end #==Interface actually required to use HDF5Backend ===============================================================================# -hdf5plot_write(plt::Plot{HDF5Backend}, path::AbstractString) = _hdf5_implementation.hdf5plot_write(plt, path) +hdf5plot_write(plt::Plot{HDF5Backend}, path::AbstractString) = + _hdf5_implementation.hdf5plot_write(plt, path) hdf5plot_write(path::AbstractString) = _hdf5_implementation.hdf5plot_write(current(), path) hdf5plot_read(path::AbstractString) = _hdf5_implementation.hdf5plot_read(path) diff --git a/src/backends/inspectdr.jl b/src/backends/inspectdr.jl index e86fb995..e5db6d2b 100644 --- a/src/backends/inspectdr.jl +++ b/src/backends/inspectdr.jl @@ -17,9 +17,6 @@ Add in functionality to Plots.jl: is_marker_supported(::InspectDRBackend, shape::Shape) = true -_inspectdr_to_pixels(bb::BoundingBox) = - InspectDR.BoundingBox(to_pixels(left(bb)), to_pixels(right(bb)), to_pixels(top(bb)), to_pixels(bottom(bb))) - #Do we avoid Map to avoid possible pre-comile issues? function _inspectdr_mapglyph(s::Symbol) s == :rect && return :square @@ -47,16 +44,16 @@ _inspectdr_mapcolor(v::Colorant) = v function _inspectdr_mapcolor(g::PlotUtils.ColorGradient) @warn("Color gradients are currently unsupported in InspectDR.") #Pick middle color: - _inspectdr_mapcolor(g.colors[div(1+end,2)]) + _inspectdr_mapcolor(g.colors[div(1 + end, 2)]) end function _inspectdr_mapcolor(v::AVec) @warn("Vectors of colors are currently unsupported in InspectDR.") #Pick middle color: - _inspectdr_mapcolor(v[div(1+end,2)]) + _inspectdr_mapcolor(v[div(1 + end, 2)]) end #Hack: suggested point size does not seem adequate relative to plot size, for some reason. -_inspectdr_mapptsize(v) = 1.5*v +_inspectdr_mapptsize(v) = 1.5 * v function _inspectdr_add_annotations(plot, x, y, val) #What kind of annotation is this? @@ -64,14 +61,21 @@ end #plot::InspectDR.Plot2D function _inspectdr_add_annotations(plot, x, y, val::PlotText) - vmap = Dict{Symbol, Symbol}(:top=>:t, :bottom=>:b) #:vcenter - hmap = Dict{Symbol, Symbol}(:left=>:l, :right=>:r) #:hcenter + vmap = Dict{Symbol,Symbol}(:top => :t, :bottom => :b) #:vcenter + hmap = Dict{Symbol,Symbol}(:left => :l, :right => :r) #:hcenter align = Symbol(get(vmap, val.font.valign, :c), get(hmap, val.font.halign, :c)) - fnt = InspectDR.Font(val.font.family, val.font.pointsize, - color =_inspectdr_mapcolor(val.font.color) + fnt = InspectDR.Font( + val.font.family, + val.font.pointsize, + color = _inspectdr_mapcolor(val.font.color), ) - ann = InspectDR.atext(val.str, x=x, y=y, - font=fnt, angle=val.font.rotation, align=align + ann = InspectDR.atext( + val.str, + x = x, + y = y, + font = fnt, + angle = val.font.rotation, + align = align, ) InspectDR.add(plot, ann) return @@ -79,9 +83,63 @@ end # --------------------------------------------------------------------------- +function _inspectdr_getaxisticks(ticks, gridlines, xfrm) + TickCustom = InspectDR.TickCustom + _xfrm(coord) = InspectDR.axis2aloc(Float64(coord), xfrm.spec) #Ensure Float64 - in case + + ttype = ticksType(ticks) + if ticks == :native + #keep current + elseif ttype == :ticks_and_labels + pos = ticks[1] + labels = ticks[2] + nticks = length(ticks[1]) + newticks = TickCustom[TickCustom(_xfrm(pos[i]), labels[i]) for i in 1:nticks] + gridlines = InspectDR.GridLinesCustom(gridlines) + gridlines.major = newticks + gridlines.minor = [] + gridlines.displayminor = false + elseif ttype == :ticks + nticks = length(ticks) + gridlines.major = Float64[_xfrm(t) for t in ticks] + gridlines.minor = [] + gridlines.displayminor = false + elseif isnothing(ticks) + gridlines.major = [] + gridlines.minor = [] + else #Assume ticks == :native + #keep current + end + + return gridlines #keep current +end + +function _inspectdr_setticks(sp::Subplot, plot, strip, xaxis, yaxis) + InputXfrm1D = InspectDR.InputXfrm1D + _get_ticks(axis) = :native == axis[:ticks] ? (:native) : get_ticks(sp, axis) + wantnative(ticks) = (:native == ticks) + + xticks = _get_ticks(xaxis) + yticks = _get_ticks(yaxis) + + if wantnative(xticks) && wantnative(yticks) + #Don't "eval" tick values + return + end + + #TODO: Allow InspectDR to independently "eval" x or y ticks + ext = InspectDR.getextents_aloc(plot, 1) + grid = InspectDR._eval(strip.grid, plot.xscale, strip.yscale, ext) + grid.xlines = _inspectdr_getaxisticks(xticks, grid.xlines, InputXfrm1D(plot.xscale)) + grid.ylines = _inspectdr_getaxisticks(yticks, grid.ylines, InputXfrm1D(strip.yscale)) + strip.grid = grid +end + +# --------------------------------------------------------------------------- + function _inspectdr_getscale(s::Symbol, yaxis::Bool) -#TODO: Support :asinh, :sqrt - kwargs = yaxis ? (:tgtmajor=>8, :tgtminor=>2) : () #More grid lines on y-axis + #TODO: Support :asinh, :sqrt + kwargs = yaxis ? (:tgtmajor => 8, :tgtminor => 2) : () #More grid lines on y-axis if :log2 == s return InspectDR.AxisScale(:log2; kwargs...) elseif :log10 == s @@ -96,13 +154,12 @@ end # --------------------------------------------------------------------------- #Glyph used when plotting "Shape"s: -INSPECTDR_GLYPH_SHAPE = InspectDR.GlyphPolyline( - 2*InspectDR.GLYPH_SQUARE.x, InspectDR.GLYPH_SQUARE.y -) +INSPECTDR_GLYPH_SHAPE = + InspectDR.GlyphPolyline(2 * InspectDR.GLYPH_SQUARE.x, InspectDR.GLYPH_SQUARE.y) mutable struct InspecDRPlotRef - mplot::Union{Nothing, InspectDR.Multiplot} - gui::Union{Nothing, InspectDR.GtkPlot} + mplot::Union{Nothing,InspectDR.Multiplot} + gui::Union{Nothing,InspectDR.GtkPlot} end _inspectdr_getmplot(::Any) = nothing @@ -151,7 +208,9 @@ end function _initialize_subplot(plt::Plot{InspectDRBackend}, sp::Subplot{InspectDRBackend}) plot = sp.o #Don't do anything without a "subplot" object: Will process later. - if nothing == plot; return; end + if nothing == plot + return + end plot.data = [] plot.userannot = [] #Clear old markers/text annotation/polyline "annotation" return plot @@ -167,9 +226,12 @@ function _series_added(plt::Plot{InspectDRBackend}, series::Series) st = series[:seriestype] sp = series[:subplot] plot = sp.o + clims = get_clims(sp, series) #Don't do anything without a "subplot" object: Will process later. - if nothing == plot; return; end + if nothing == plot + return + end _vectorize(v) = isa(v, Vector) ? v : collect(v) #InspectDR only supports vectors x, y = if st == :straightline @@ -180,30 +242,33 @@ function _series_added(plt::Plot{InspectDRBackend}, series::Series) #No support for polar grid... but can still perform polar transformation: if ispolar(sp) - Θ = x; r = y - x = r.*cos.(Θ); y = r.*sin.(Θ) + Θ = x + r = y + x = r .* cos.(Θ) + y = r .* sin.(Θ) end # doesn't handle mismatched x/y - wrap data (pyplot behaviour): - nx = length(x); ny = length(y) + nx = length(x) + ny = length(y) if nx < ny - series[:x] = Float64[x[mod1(i,nx)] for i=1:ny] + series[:x] = Float64[x[mod1(i, nx)] for i in 1:ny] elseif ny > nx - series[:y] = Float64[y[mod1(i,ny)] for i=1:nx] + series[:y] = Float64[y[mod1(i, ny)] for i in 1:nx] end -#= TODO: Eventually support - series[:fillcolor] #I think this is fill under line - zorder = series[:series_plotindex] + #= TODO: Eventually support + series[:fillcolor] #I think this is fill under line + zorder = series[:series_plotindex] -For st in :shape: - zorder = series[:series_plotindex], -=# + For st in :shape: + zorder = series[:series_plotindex], + =# if st in (:shape,) x, y = shape_data(series) nmax = 0 - for (i,rng) in enumerate(iter_segments(x, y)) + for (i, rng) in enumerate(iter_segments(x, y)) nmax = i if length(rng) > 1 linewidth = series[:linewidth] @@ -211,11 +276,12 @@ For st in :shape: linecolor = _inspectdr_mapcolor(_cycle(c, i)) c = plot_color(get_fillcolor(series), get_fillalpha(series)) fillcolor = _inspectdr_mapcolor(_cycle(c, i)) - line = InspectDR.line( - style=:solid, width=linewidth, color=linecolor - ) + line = InspectDR.line(style = :solid, width = linewidth, color = linecolor) apline = InspectDR.PolylineAnnotation( - x[rng], y[rng], line=line, fillcolor=fillcolor + x[rng], + y[rng], + line = line, + fillcolor = fillcolor, ) InspectDR.add(plot, apline) end @@ -228,21 +294,24 @@ For st in :shape: linecolor = _inspectdr_mapcolor(_cycle(c, i)) c = plot_color(get_fillcolor(series), get_fillalpha(series)) fillcolor = _inspectdr_mapcolor(_cycle(c, i)) - wfrm = InspectDR.add(plot, Float64[], Float64[], id=series[:label]) + wfrm = InspectDR.add(plot, Float64[], Float64[], id = series[:label]) wfrm.line = InspectDR.line( - style=:none, width=linewidth, #linewidth affects glyph + style = :none, + width = linewidth, #linewidth affects glyph ) wfrm.glyph = InspectDR.glyph( - shape = INSPECTDR_GLYPH_SHAPE, size = 8, - color = linecolor, fillcolor = fillcolor + shape = INSPECTDR_GLYPH_SHAPE, + size = 8, + color = linecolor, + fillcolor = fillcolor, ) end - elseif st in (:path, :scatter, :straightline) #, :steppre, :steppost) + elseif st in (:path, :scatter, :straightline) #, :steppre, :stepmid, :steppost) #NOTE: In Plots.jl, :scatter plots have 0-linewidths (I think). linewidth = series[:linewidth] #More efficient & allows some support for markerstrokewidth: - _style = (0==linewidth ? :none : series[:linestyle]) - wfrm = InspectDR.add(plot, x, y, id=series[:label]) + _style = (0 == linewidth ? :none : series[:linestyle]) + wfrm = InspectDR.add(plot, x, y, id = series[:label]) wfrm.line = InspectDR.line( style = _style, width = series[:linewidth], @@ -256,14 +325,18 @@ For st in :shape: wfrm.glyph = InspectDR.glyph( shape = _inspectdr_mapglyph(series[:markershape]), size = _inspectdr_mapglyphsize(series[:markersize]), - color = _inspectdr_mapcolor(plot_color(series[:markerstrokecolor], series[:markerstrokealpha])), - fillcolor = _inspectdr_mapcolor(plot_color(series[:markercolor], series[:markeralpha])), + color = _inspectdr_mapcolor( + plot_color(get_markerstrokecolor(series), get_markerstrokealpha(series)), + ), + fillcolor = _inspectdr_mapcolor( + plot_color(get_markercolor(series, clims), get_markeralpha(series)), + ), ) end # this is all we need to add the series_annotations text anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, x, y) + for (xi, yi, str, fnt) in EachAnn(anns, x, y) _inspectdr_add_annotations(plot, xi, yi, PlotText(str, fnt)) end return @@ -283,72 +356,91 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend}) plot = sp.o strip = plot.strips[1] #Only 1 strip supported with Plots.jl - xaxis = sp[:xaxis]; yaxis = sp[:yaxis] + xaxis = sp[:xaxis] + yaxis = sp[:yaxis] xgrid_show = xaxis[:grid] ygrid_show = yaxis[:grid] strip.grid = InspectDR.GridRect( - vmajor=xgrid_show, # vminor=xgrid_show, - hmajor=ygrid_show, # hminor=ygrid_show, + vmajor = xgrid_show, # vminor=xgrid_show, + hmajor = ygrid_show, # hminor=ygrid_show, ) - plot.xscale = _inspectdr_getscale(xaxis[:scale], false) - strip.yscale = _inspectdr_getscale(yaxis[:scale], true) - xmin, xmax = axis_limits(sp, :x) - ymin, ymax = axis_limits(sp, :y) - if ispolar(sp) - #Plots.jl appears to give (xmin,xmax) ≜ (Θmin,Θmax) & (ymin,ymax) ≜ (rmin,rmax) - rmax = NaNMath.max(abs(ymin), abs(ymax)) - xmin, xmax = -rmax, rmax - ymin, ymax = -rmax, rmax - end - plot.xext = InspectDR.PExtents1D() #reset - strip.yext = InspectDR.PExtents1D() #reset - plot.xext_full = InspectDR.PExtents1D(xmin, xmax) - strip.yext_full = InspectDR.PExtents1D(ymin, ymax) - a = plot.annotation - a.title = sp[:title] - a.xlabel = xaxis[:guide]; a.ylabels = [yaxis[:guide]] + plot.xscale = _inspectdr_getscale(xaxis[:scale], false) + strip.yscale = _inspectdr_getscale(yaxis[:scale], true) + xmin, xmax = axis_limits(sp, :x) + ymin, ymax = axis_limits(sp, :y) + if ispolar(sp) + #Plots.jl appears to give (xmin,xmax) ≜ (Θmin,Θmax) & (ymin,ymax) ≜ (rmin,rmax) + rmax = NaNMath.max(abs(ymin), abs(ymax)) + xmin, xmax = -rmax, rmax + ymin, ymax = -rmax, rmax + end + plot.xext_full = InspectDR.PExtents1D(xmin, xmax) + strip.yext_full = InspectDR.PExtents1D(ymin, ymax) + #Set current extents = full extents (needed for _eval(strip.grid,...)) + plot.xext = plot.xext_full + strip.yext = strip.yext_full + _inspectdr_setticks(sp, plot, strip, xaxis, yaxis) - l = plot.layout - l[:frame_canvas].fillcolor = _inspectdr_mapcolor(sp[:background_color_subplot]) - l[:frame_data].fillcolor = _inspectdr_mapcolor(sp[:background_color_inside]) - l[:frame_data].line.color = _inspectdr_mapcolor(xaxis[:foreground_color_axis]) - l[:font_title] = InspectDR.Font(sp[:titlefontfamily], - _inspectdr_mapptsize(sp[:titlefontsize]), - color = _inspectdr_mapcolor(sp[:titlefontcolor]) - ) - #Cannot independently control fonts of axes with InspectDR: - l[:font_axislabel] = InspectDR.Font(xaxis[:guidefontfamily], - _inspectdr_mapptsize(xaxis[:guidefontsize]), - color = _inspectdr_mapcolor(xaxis[:guidefontcolor]) - ) - l[:font_ticklabel] = InspectDR.Font(xaxis[:tickfontfamily], - _inspectdr_mapptsize(xaxis[:tickfontsize]), - color = _inspectdr_mapcolor(xaxis[:tickfontcolor]) - ) - l[:enable_legend] = (sp[:legend] != :none) - #l[:halloc_legend] = 150 #TODO: compute??? - l[:font_legend] = InspectDR.Font(sp[:legendfontfamily], - _inspectdr_mapptsize(sp[:legendfontsize]), - color = _inspectdr_mapcolor(sp[:legendfontcolor]) - ) - l[:frame_legend].fillcolor = _inspectdr_mapcolor(sp[:background_color_legend]) + a = plot.annotation + a.title = sp[:title] + a.xlabel = xaxis[:guide] + a.ylabels = [yaxis[:guide]] + + #Modify base layout of new object: + l = plot.layout.defaults = deepcopy(InspectDR.defaults.plotlayout) + #IMPORTANT: Must deepcopy to ensure we don't change layouts of other plots. + #Works because plot uses defaults (not user-overwritten `layout.values`) + l.frame_canvas.fillcolor = _inspectdr_mapcolor(sp[:background_color_subplot]) + l.frame_data.fillcolor = _inspectdr_mapcolor(sp[:background_color_inside]) + l.frame_data.line.color = _inspectdr_mapcolor(xaxis[:foreground_color_axis]) + l.font_title = InspectDR.Font( + sp[:titlefontfamily], + _inspectdr_mapptsize(sp[:titlefontsize]), + color = _inspectdr_mapcolor(sp[:titlefontcolor]), + ) + #Cannot independently control fonts of axes with InspectDR: + l.font_axislabel = InspectDR.Font( + xaxis[:guidefontfamily], + _inspectdr_mapptsize(xaxis[:guidefontsize]), + color = _inspectdr_mapcolor(xaxis[:guidefontcolor]), + ) + l.font_ticklabel = InspectDR.Font( + xaxis[:tickfontfamily], + _inspectdr_mapptsize(xaxis[:tickfontsize]), + color = _inspectdr_mapcolor(xaxis[:tickfontcolor]), + ) + l.enable_legend = (sp[:legend] != :none) + #l.halloc_legend = 150 #TODO: compute??? + l.font_legend = InspectDR.Font( + sp[:legendfontfamily], + _inspectdr_mapptsize(sp[:legendfontsize]), + color = _inspectdr_mapcolor(sp[:legendfontcolor]), + ) + l.frame_legend.fillcolor = _inspectdr_mapcolor(sp[:background_color_legend]) + + #_round!() ensures values use integer spacings (looks better on screen): + InspectDR._round!(InspectDR.autofit2font!(l, legend_width = 10.0)) #10 "em"s wide + return end # called just before updating layout bounding boxes... in case you need to prep # for the calcs function _before_layout_calcs(plt::Plot{InspectDRBackend}) mplot = _inspectdr_getmplot(plt.o) - if nothing == mplot; return; end + if nothing == mplot + return + end mplot.title = plt[:plot_title] if "" == mplot.title #Don't use window_title... probably not what you want. #mplot.title = plt[:window_title] end - mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside]) + mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside]) + mplot.layout[:frame] = mplot.layout[:frame] #register changes resize!(mplot.subplots, length(plt.subplots)) nsubplots = length(plt.subplots) for (i, sp) in enumerate(plt.subplots) @@ -392,17 +484,19 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{InspectDRBackend}) plot = sp.o - if !isa(plot, InspectDR.Plot2D); return sp.minpad; end + if !isa(plot, InspectDR.Plot2D) + return sp.minpad + end #Computing plotbounds with 0-BoundingBox returns required padding: - bb = InspectDR.plotbounds(plot.layout.values, InspectDR.BoundingBox(0,0,0,0)) + bb = InspectDR.plotbounds(plot.layout.values, InspectDR.BoundingBox(0, 0, 0, 0)) #NOTE: plotbounds always pads for titles, legends, etc. even if not in use. #TODO: possibly zero-out items not in use?? # add in the user-specified margin to InspectDR padding: - leftpad = abs(bb.xmin)*px + sp[:left_margin] - toppad = abs(bb.ymin)*px + sp[:top_margin] - rightpad = abs(bb.xmax)*px + sp[:right_margin] - bottompad = abs(bb.ymax)*px + sp[:bottom_margin] + leftpad = abs(bb.xmin) * px + sp[:left_margin] + toppad = abs(bb.ymin) * px + sp[:top_margin] + rightpad = abs(bb.xmax) * px + sp[:right_margin] + bottompad = abs(bb.ymax) * px + sp[:bottom_margin] sp.minpad = (leftpad, toppad, rightpad, bottompad) end @@ -411,16 +505,25 @@ end # Override this to update plot items (title, xlabel, etc), and add annotations (plotattributes[:annotations]) function _update_plot_object(plt::Plot{InspectDRBackend}) mplot = _inspectdr_getmplot(plt.o) - if nothing == mplot; return; end + if nothing == mplot + return + end + mplot.bblist = InspectDR.BoundingBox[] for (i, sp) in enumerate(plt.subplots) - graphbb = _inspectdr_to_pixels(plotarea(sp)) - plot = mplot.subplots[i] - plot.plotbb = InspectDR.plotbounds(plot.layout.values, graphbb) + figw, figh = sp.plt[:size] + pcts = bbox_to_pcts(sp.bbox, figw * px, figh * px) + _left, _bottom, _width, _height = pcts + ymax = 1.0 - _bottom + ymin = ymax - _height + bb = InspectDR.BoundingBox(_left, _left + _width, ymin, ymax) + push!(mplot.bblist, bb) end gplot = _inspectdr_getgui(plt.o) - if nothing == gplot; return; end + if nothing == gplot + return + end gplot.src = mplot #Ensure still references current plot InspectDR.refresh(gplot) @@ -456,7 +559,9 @@ end # Display/show the plot (open a GUI window, or browser page, for example). function _display(plt::Plot{InspectDRBackend}) mplot = _inspectdr_getmplot(plt.o) - if nothing == mplot; return; end + if nothing == mplot + return + end gplot = _inspectdr_getgui(plt.o) if nothing == gplot diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index d5caf807..e63bd9ae 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -8,23 +8,11 @@ Base.@kwdef mutable struct PGFPlotsXPlot function PGFPlotsXPlot(is_created, was_shown, the_plot) pgfx_plot = new(is_created, was_shown, the_plot) # tikz libraries - PGFPlotsX.push_preamble!( - pgfx_plot.the_plot, - "\\usetikzlibrary{arrows.meta}", - ) - PGFPlotsX.push_preamble!( - pgfx_plot.the_plot, - "\\usetikzlibrary{backgrounds}", - ) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{backgrounds}") # pgfplots libraries - PGFPlotsX.push_preamble!( - pgfx_plot.the_plot, - "\\usepgfplotslibrary{patchplots}", - ) - PGFPlotsX.push_preamble!( - pgfx_plot.the_plot, - "\\usepgfplotslibrary{fillbetween}", - ) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween}") # compatibility fixes # add background layer to standard layers PGFPlotsX.push_preamble!( @@ -82,13 +70,14 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat,Surface}) end return xn, yn, zn end +surface_to_vecs(x::AVec, y::AVec, z::AVec) = x, y, z function Base.push!(pgfx_plot::PGFPlotsXPlot, item) push!(pgfx_plot.the_plot, item) end function pgfx_split_extra_opts(extra) - return (get(extra, :add, nothing), filter( x-> first(x) != :add, extra)) + return (get(extra, :add, nothing), filter(x -> first(x) != :add, extra)) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created || pgfx_plot.was_shown @@ -100,8 +89,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) extra_plot = wraptuple(extra_plot) push!(the_plot, extra_plot...) end - bgc = plt.attr[:background_color_outside] == :match ? - plt.attr[:background_color] : plt.attr[:background_color_outside] + bgc = + plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : + plt.attr[:background_color_outside] if bgc isa Colors.Colorant cstr = plot_color(bgc) a = alpha(cstr) @@ -117,11 +107,27 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end for sp in plt.subplots - bb1 = sp.plotarea bb2 = bbox(sp) + dx, dy = bb2.x0 + sp_width = width(bb2) + sp_height = height(bb2) + if sp[:subplot_index] == plt[:plot_titleindex] + x = dx + sp_width / 2 - 10mm # FIXME: get rid of magic constant + y = dy + sp_height / 2 + pgfx_add_annotation!( + the_plot, + x, + y, + PlotText(plt[:plot_title], plottitlefont(plt)), + pgfx_thickness_scaling(plt); + cs = "", + options = PGFPlotsX.Options("anchor" => "center"), + ) + continue + end + sp_width = width(bb2) sp_height = height(bb2) - dx, dy = bb2.x0 lpad = leftpad(sp) + sp[:left_margin] rpad = rightpad(sp) + sp[:right_margin] tpad = toppad(sp) + sp[:top_margin] @@ -130,10 +136,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) dy += tpad axis_height = sp_height - (tpad + bpad) axis_width = sp_width - (rpad + lpad) - - cstr = plot_color(sp[:background_color_legend]) - a = alpha(cstr) - fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(title_cstr) title_loc = sp[:titlelocation] @@ -142,48 +144,24 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) axis_opt = PGFPlotsX.Options( "point meta max" => get_clims(sp)[2], "point meta min" => get_clims(sp)[1], - "legend cell align" => "left", "title" => sp[:title], "title style" => PGFPlotsX.Options( - pgfx_get_title_pos(title_loc)..., - "font" => pgfx_font( - sp[:titlefontsize], - pgfx_thickness_scaling(sp), - ), + pgfx_get_title_pos(title_loc)..., + "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), "color" => title_cstr, "draw opacity" => title_a, "rotate" => sp[:titlefontrotation], ), - "legend style" => PGFPlotsX.Options( - pgfx_linestyle( - pgfx_thickness_scaling(sp), - sp[:foreground_color_legend], - fg_alpha, - "solid", - ) => nothing, - "fill" => cstr, - "fill opacity" => a, - "text opacity" => alpha(plot_color(sp[:legendfontcolor])), - "font" => pgfx_font( - sp[:legendfontsize], - pgfx_thickness_scaling(sp), - ), - ), - "axis background/.style" => PGFPlotsX.Options( - "fill" => bgc_inside, - "opacity" => bgc_inside_a, - ), + "legend style" => pgfx_get_legend_style(sp), + "axis background/.style" => + PGFPlotsX.Options("fill" => bgc_inside, "opacity" => bgc_inside_a), # These are for layouting "anchor" => "north west", "xshift" => string(dx), "yshift" => string(-dy), ) - sp_width > 0 * mm ? push!(axis_opt, "width" => string(axis_width)) : - nothing - sp_height > 0 * mm ? push!(axis_opt, "height" => string(axis_height)) : - nothing - # legend position - push!(axis_opt["legend style"], pgfx_get_legend_pos(sp[:legend])...) + sp_width > 0 * mm ? push!(axis_opt, "width" => string(axis_width)) : nothing + sp_height > 0 * mm ? push!(axis_opt, "height" => string(axis_height)) : nothing for letter in (:x, :y, :z) if letter != :z || RecipesPipeline.is3d(sp) pgfx_axis!(axis_opt, sp, letter) @@ -224,16 +202,22 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) @label colorbar_end if hascolorbar(sp) - colorbar_style = PGFPlotsX.Options( - "title" => sp[:colorbar_title], - "xticklabel style" => pgfx_get_ticklabel_style(sp, sp[:xaxis]), - "yticklabel style" => pgfx_get_ticklabel_style(sp, sp[:yaxis]), - ) + cticks = get_colorbar_ticks(sp)[2] + colorbar_style = PGFPlotsX.Options("title" => sp[:colorbar_title]) if sp[:colorbar] === :top - push!(colorbar_style, + push!( + colorbar_style, "at" => string((0.5, 1.05)), "anchor" => "south", + "xtick" => string("{", join(cticks, ","), "}"), "xticklabel pos" => "upper", + "xticklabel style" => pgfx_get_colorbar_ticklabel_style(sp), + ) + else + push!( + colorbar_style, + "ytick" => string("{", join(cticks, ","), "}"), + "yticklabel style" => pgfx_get_colorbar_ticklabel_style(sp), ) end push!( @@ -241,6 +225,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) string("colorbar", pgfx_get_colorbar_pos(sp[:colorbar])) => nothing, "colorbar style" => colorbar_style, ) + else + push!(axis_opt, "colorbar" => "false") end if RecipesPipeline.is3d(sp) azim, elev = sp[:camera] @@ -280,15 +266,19 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "color" => single_color(opt[:linecolor]), "name path" => string(series_id), ) - extra_series, extra_series_opt = pgfx_split_extra_opts(series[:extra_kwargs]) + extra_series, extra_series_opt = + pgfx_split_extra_opts(series[:extra_kwargs]) 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 else series_func = PGFPlotsX.Plot end - if sf !== nothing && - !isfilledcontour(series) && series[:ribbon] === nothing + if sf !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing push!(series_opt, "area legend" => nothing) end pgfx_add_series!(Val(st), axis, series_opt, series, series_func, opt) @@ -338,9 +328,10 @@ end function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, opt) # treat segments - segments = iter_segments(series, series[:seriestype]) + segments = collect(series_segments(series, series[:seriestype]; check = true)) sf = opt[:fillrange] - for (i, rng) in enumerate(segments) + for (k, segment) in enumerate(segments) + i, rng = segment.attr_index, segment.range segment_opt = PGFPlotsX.Options() segment_opt = merge(segment_opt, pgfx_linestyle(opt, i)) if opt[:markershape] != :none @@ -351,10 +342,7 @@ function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, o 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) - ], + ["($(x[i] * mark_size), $(y[i] * mark_size))" for i in eachindex(x)], " -- ", ) c = get_markercolor(series, i) @@ -372,31 +360,26 @@ function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, o 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, - ) + 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, - ) + 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) + if ( + k == 1 && + series[:subplot][:legend] != :none && + pgfx_should_add_to_legend(series) + ) pgfx_filllegend!(series_opt, opt) end end @@ -405,46 +388,44 @@ function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, o 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, - ) - ) + 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] + 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] + 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) + :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) + 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) + segment_plot = series_func(merge(series_opt, segment_opt), coordinates) push!(axis, segment_plot) end # fill between functions @@ -462,11 +443,14 @@ function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, o ), ) end - pgfx_add_legend!(axis, series, opt, i) + pgfx_add_legend!(axis, series, opt, k) end # for segments # get that last marker - if !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]))))) + 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 @@ -490,20 +474,20 @@ function pgfx_add_series!(::Val{:scatter3d}, axis, series_opt, series, series_fu end function pgfx_add_series!(::Val{:surface}, axis, series_opt, series, series_func, opt) + alpha = get_fillalpha(series) push!( series_opt, "surf" => nothing, - "mesh/rows" => length(opt[:x]), - "mesh/cols" => length(opt[:y]), + "mesh/rows" => length(unique(opt[:x])), # unique if its all vectors + "mesh/cols" => length(unique(opt[:y])), "z buffer" => "sort", + "opacity" => alpha === nothing ? 1.0 : alpha, ) 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]) - ) + push!(series_opt, "mesh" => nothing, "mesh/rows" => length(opt[:x])) pgfx_add_series!(axis, series_opt, series, series_func, opt) end @@ -528,12 +512,15 @@ function pgfx_add_series!(::Val{:heatmap}, axis, series_opt, series, series_func 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 ") + 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 + "patch table" => ptable, ) pgfx_add_series!(axis, series_opt, series, series_func, opt) end @@ -568,8 +555,10 @@ function pgfx_add_series!(::Val{:contour3d}, axis, series_opt, series, series_fu 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]))) + series_plot = + series_func(series_opt, PGFPlotsX.Table(Contour.contours(args..., opt[:levels]))) push!(axis, series_plot) pgfx_add_legend!(axis, series, opt) end @@ -586,12 +575,26 @@ function pgfx_add_series!(::Val{:quiver}, axis, series_opt, series, series_func, ) x = opt[:x] y = opt[:y] - table = PGFPlotsX.Table([ - :x => x, - :y => y, - :u => opt[:quiver][1], - :v => opt[:quiver][2], - ]) + 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) @@ -653,7 +656,8 @@ function pgfx_add_legend!(axis, series, opt, i = 1) return nothing end -pgfx_series_arguments(series, opt, range) = (arg[range] for arg in pgfx_series_arguments(series, opt)) +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] return if st in (:contour, :contour3d) @@ -691,7 +695,7 @@ pgfx_get_marker(k) = get( none = "none", cross = "+", xcross = "x", - + = "+", + (+) = "+", x = "x", utriangle = "triangle*", dtriangle = "triangle*", @@ -717,7 +721,7 @@ pgfx_get_xguide_pos(k) = get( left = "at={(ticklabel* cs:-0.02)}, anchor=east,", ), k, - "at={(ticklabel cs:0.5)}, anchor=near ticklabel" + "at={(ticklabel cs:0.5)}, anchor=near ticklabel", ) pgfx_get_yguide_pos(k) = get( @@ -727,7 +731,7 @@ pgfx_get_yguide_pos(k) = get( bottom = "at={(ticklabel* cs:-0.02)}, anchor=north,", ), k, - "at={(ticklabel cs:0.5)}, anchor=near ticklabel" + "at={(ticklabel cs:0.5)}, anchor=near ticklabel", ) pgfx_get_legend_pos(k) = get( @@ -752,36 +756,93 @@ pgfx_get_legend_pos(k) = get( Symbol(k), ("at" => string((1.02, 1)), "anchor" => "north west"), ) -pgfx_get_legend_pos(t::Tuple) = ("at" => "{$(string(t))}", "anchor" => "north west") -pgfx_get_legend_pos(nt::NamedTuple) = ("at" => "{$(string(nt.at))}", "anchor" => string(nt.anchor)) +pgfx_get_legend_pos(t::Tuple{S,T}) where {S<:Real,T<:Real} = + ("at" => "{$(string(t))}", "anchor" => "north west") +pgfx_get_legend_pos(nt::NamedTuple) = + ("at" => "{$(string(nt.at))}", "anchor" => string(nt.anchor)) +pgfx_get_legend_pos(theta::Real) = pgfx_get_legend_pos((theta, :inner)) +function pgfx_get_legend_pos(v::Tuple{S,Symbol}) where {S<:Real} + (s, c) = sincosd(v[1]) + anchors = [ + "south west" "south" "south east" + "west" "center" "east" + "north west" "north" "north east" + ] + + if v[2] === :inner + rect = (0.07, 0.5, 1.0, 0.07, 0.52, 1.0) + anchor = anchors[legend_anchor_index(s), legend_anchor_index(c)] + else + rect = (-0.15, 0.5, 1.05, -0.15, 0.52, 1.1) + anchor = anchors[4 - legend_anchor_index(s), 4 - legend_anchor_index(c)] + end + return ("at" => "$(string(legend_pos_from_angle(v[1],rect...)))", "anchor" => anchor) +end + +function pgfx_get_legend_style(sp) + cstr = plot_color(sp[:background_color_legend]) + a = alpha(cstr) + fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) + legfont = legendfont(sp) + PGFPlotsX.Options( + pgfx_linestyle( + pgfx_thickness_scaling(sp), + sp[:foreground_color_legend], + fg_alpha, + "solid", + ) => nothing, + "fill" => cstr, + "fill opacity" => a, + "text opacity" => alpha(plot_color(sp[:legendfontcolor])), + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)), + "text" => plot_color(sp[:legendfontcolor]), + "cells" => PGFPlotsX.Options( + "anchor" => get( + (left = "west", right = "east", hcenter = "center"), + legfont.halign, + "west", + ), + ), + pgfx_get_legend_pos(sp[:legend])..., + ) +end pgfx_get_colorbar_pos(s) = get((left = " left", bottom = " horizontal", top = " horizontal"), s, "") pgfx_get_colorbar_pos(b::Bool) = "" -pgfx_get_title_pos(s) = - get(( +pgfx_get_title_pos(s) = get( + ( left = ("at" => "{(0,1)}", "anchor" => "south west"), right = ("at" => "{(1,1)}", "anchor" => "south east"), - ), s, - ("at" => "{(0.5,1)}", "anchor" => "south")) + ), + s, + ("at" => "{(0.5,1)}", "anchor" => "south"), +) pgfx_get_title_pos(t::Tuple) = ("at" => "{$(string(t))}", "anchor" => "south") -pgfx_get_title_pos(nt::NamedTuple) = ("at" => "{$(string(nt.at))}", "anchor" => string(nt.anchor)) +pgfx_get_title_pos(nt::NamedTuple) = + ("at" => "{$(string(nt.at))}", "anchor" => string(nt.anchor)) function pgfx_get_ticklabel_style(sp, axis) cstr = plot_color(axis[:tickfontcolor]) return PGFPlotsX.Options( - "font" => pgfx_font( - axis[:tickfontsize], pgfx_thickness_scaling(sp) - ), + "font" => pgfx_font(axis[:tickfontsize], pgfx_thickness_scaling(sp)), "color" => cstr, "draw opacity" => alpha(cstr), "rotate" => axis[:tickfontrotation], ) end +function pgfx_get_colorbar_ticklabel_style(sp) + cstr = plot_color(sp[:colorbar_tickfontcolor]) + return PGFPlotsX.Options( + "font" => pgfx_font(sp[:colorbar_tickfontsize], pgfx_thickness_scaling(sp)), + "color" => cstr, + "draw opacity" => alpha(cstr), + "rotate" => sp[:colorbar_tickfontrotation], + ) +end ## -------------------------------------------------------------------------------------- -# Generates a colormap for pgfplots based on a ColorGradient pgfx_arrow(::Nothing) = "every arrow/.append style={-}" function pgfx_arrow(arr::Arrow, side = arr.side) components = String[] @@ -812,6 +873,7 @@ function pgfx_filllegend!(series_opt, opt) }""") end +# Generates a colormap for pgfplots based on a ColorGradient pgfx_colormap(cl::PlotUtils.AbstractColorList) = pgfx_colormap(color_list(cl)) function pgfx_colormap(v::Vector{<:Colorant}) join(map(v) do c @@ -819,18 +881,26 @@ function pgfx_colormap(v::Vector{<:Colorant}) end, "\n") end function pgfx_colormap(cg::ColorGradient) - join(map(1:length(cg)) do i - @sprintf("rgb(%.8fcm)=(%.8f,%.8f,%.8f)", cg.values[i], red(cg.colors[i]), green(cg.colors[i]), blue(cg.colors[i])) - end, "\n") + join( + map(1:length(cg)) do i + @sprintf( + "rgb(%.8f)=(%.8f,%.8f,%.8f)", + cg.values[i], + red(cg.colors[i]), + green(cg.colors[i]), + blue(cg.colors[i]) + ) + end, + "\n", + ) end - function pgfx_framestyle(style::Symbol) if style in (:box, :axes, :origin, :zerolines, :grid, :none) return style else default_style = get((semi = :box,), style, :axes) - @warn( "Framestyle :$style is not (yet) supported by the PGFPlotsX backend. :$default_style was cosen instead.",) + @warn "Framestyle :$style is not (yet) supported by the PGFPlotsX backend. :$default_style was chosen instead." default_style end end @@ -872,22 +942,29 @@ function pgfx_font(fontsize, thickness_scaling = 1, font = "\\selectfont") return string("{\\fontsize{", fs, " pt}{", 1.3fs, " pt}", font, "}") 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) series.plotattributes[:primary] && - !( - series.plotattributes[:seriestype] in ( - :hexbin, - :bins2d, - :histogram2d, - :hline, - :vline, - :contour, - :contourf, - :contour3d, - :heatmap, - :image, + !( + series.plotattributes[:seriestype] in ( + :hexbin, + :bins2d, + :histogram2d, + :hline, + :vline, + :contour, + :contourf, + :contour3d, + :heatmap, + :image, + ) ) - ) end function pgfx_marker(plotattributes, i = 1) @@ -904,8 +981,9 @@ function pgfx_marker(plotattributes, i = 1) pgfx_thickness_scaling(plotattributes) * 0.75 * _cycle(plotattributes[:markersize], i) - mark_freq = !any(isnan, plotattributes[:y]) && plotattributes[:markershape] isa AVec ? - length(plotattributes[:markershape]) : 1 + mark_freq = + !any(isnan, plotattributes[:y]) && plotattributes[:markershape] isa AVec ? + length(plotattributes[:markershape]) : 1 return PGFPlotsX.Options( "mark" => shape isa Shape ? "PlotsShape$i" : pgfx_get_marker(shape), "mark size" => "$mark_size pt", @@ -928,29 +1006,47 @@ function pgfx_marker(plotattributes, i = 1) else 0 end, - pgfx_get_linestyle(_cycle(plotattributes[:markerstrokestyle], i)) => nothing, + pgfx_get_linestyle(_cycle(plotattributes[:markerstrokestyle], i)) => + nothing, ), ) end -function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) +function pgfx_add_annotation!( + o, + x, + y, + val, + thickness_scaling = 1; + cs = "axis cs:", + options = PGFPlotsX.Options(), +) # Construct the style string. cstr = val.font.color a = alpha(cstr) push!( o, - [ + join([ "\\node", - PGFPlotsX.Options( - get((center = "", left = "right", right = "left"), val.font.halign, "") => - nothing, - "color" => cstr, - "draw opacity" => convert(Float16, a), - "rotate" => val.font.rotation, - "font" => pgfx_font(val.font.pointsize, thickness_scaling), + sprint( + PGFPlotsX.print_tex, + merge( + PGFPlotsX.Options( + get( + (hcenter = "", left = "right", right = "left"), + val.font.halign, + "", + ) => nothing, + "color" => cstr, + "draw opacity" => convert(Float16, a), + "rotate" => val.font.rotation, + "font" => pgfx_font(val.font.pointsize, thickness_scaling), + ), + options, + ), ), - " at (axis cs:$x, $y) {$(val.str)};", - ], + string(" at (", cs, x, ",", y, ") {", val.str, "};"), + ]), ) end @@ -1015,15 +1111,13 @@ end function pgfx_fillrange_series!(axis, series, series_func, i, fillrange, rng) fillrange_opt = PGFPlotsX.Options("line width" => "0", "draw opacity" => "0") fillrange_opt = merge(fillrange_opt, pgfx_fillstyle(series, i)) - fillrange_opt = merge(fillrange_opt, pgfx_marker(series, i)) + push!(fillrange_opt, "mark" => "none") # no markers on fillranges push!(fillrange_opt, "forget plot" => nothing) opt = series.plotattributes - args = RecipesPipeline.is3d(series) ? (opt[:x][rng], opt[:y][rng], opt[:z][rng]) : + args = + RecipesPipeline.is3d(series) ? (opt[:x][rng], opt[:y][rng], opt[:z][rng]) : (opt[:x][rng], opt[:y][rng]) - push!( - axis, - PGFPlotsX.PlotInc(fillrange_opt, pgfx_fillrange_args(fillrange, args...)), - ) + push!(axis, PGFPlotsX.PlotInc(fillrange_opt, pgfx_fillrange_args(fillrange, args...))) return axis end @@ -1053,8 +1147,8 @@ function pgfx_sanitize_string(s::AbstractString) s = replace(s, r"\\?\{" => "\\{") s = replace(s, r"\\?\}" => "\\}") s = map(split(s, "")) do s - isascii(s) ? s : latexify(s) - end |> join + isascii(s) ? s : latexify(s) + end |> join end @require LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" begin using .LaTeXStrings @@ -1065,60 +1159,58 @@ end end end function pgfx_sanitize_plot!(plt) - for (key, value) in plt.attr - if value isa Union{AbstractString, AbstractVector{<:AbstractString}} - plt.attr[key] = pgfx_sanitize_string.(value) - end + for (key, value) in plt.attr + if value isa Union{AbstractString,AbstractVector{<:AbstractString}} + plt.attr[key] = pgfx_sanitize_string.(value) end - for subplot in plt.subplots - for (key, value) in subplot.attr - if key == :annotations && subplot.attr[:annotations] !== nothing - old_ann = subplot.attr[key] - for i in eachindex(old_ann) - subplot.attr[key][i] = (old_ann[i][1], old_ann[i][2], pgfx_sanitize_string(old_ann[i][3])) - end - elseif value isa Union{AbstractString, AbstractVector{<:AbstractString}} - subplot.attr[key] = pgfx_sanitize_string.(value) + end + for subplot in plt.subplots + for (key, value) in subplot.attr + if key == :annotations && subplot.attr[:annotations] !== nothing + old_ann = subplot.attr[key] + for i in eachindex(old_ann) + subplot.attr[key][i] = + (old_ann[i][1], old_ann[i][2], pgfx_sanitize_string(old_ann[i][3])) end + elseif value isa Union{AbstractString,AbstractVector{<:AbstractString}} + subplot.attr[key] = pgfx_sanitize_string.(value) end end - for series in plt.series_list - for (key, value) in series.plotattributes - if key == :series_annotations && series.plotattributes[:series_annotations] !== nothing - old_ann = series.plotattributes[key].strs - for i in eachindex(old_ann) - series.plotattributes[key].strs[i] = pgfx_sanitize_string(old_ann[i]) - end - elseif value isa Union{AbstractString, AbstractVector{<:AbstractString}} - series.plotattributes[key] = pgfx_sanitize_string.(value) + end + for series in plt.series_list + for (key, value) in series.plotattributes + if key == :series_annotations && + series.plotattributes[:series_annotations] !== nothing + old_ann = series.plotattributes[key].strs + for i in eachindex(old_ann) + series.plotattributes[key].strs[i] = pgfx_sanitize_string(old_ann[i]) end + elseif value isa Union{AbstractString,AbstractVector{<:AbstractString}} + series.plotattributes[key] = pgfx_sanitize_string.(value) end end - ## + end + ## end # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter, :axis)] # turn off scaled ticks + push!(opt, "scaled $(letter) ticks" => "false", string(letter, :label) => axis[:guide]) + tick_color = plot_color(axis[:foreground_color_axis]) push!( opt, - "scaled $(letter) ticks" => "false", - string(letter, :label) => axis[:guide], - ) - tick_color = plot_color(axis[:foreground_color_axis]) - push!(opt, - "$(letter) tick style" => PGFPlotsX.Options( - "color" => color(tick_color), - "opacity" => alpha(tick_color), - ), + "$(letter) tick style" => + PGFPlotsX.Options("color" => color(tick_color), "opacity" => alpha(tick_color)), ) tick_label_color = plot_color(axis[:tickfontcolor]) - push!(opt, + push!( + opt, "$(letter) tick label style" => PGFPlotsX.Options( "color" => color(tick_color), "opacity" => alpha(tick_color), - "rotate" => axis[:rotation] + "rotate" => axis[:rotation], ), ) @@ -1140,7 +1232,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) opt, string(letter, "label style") => PGFPlotsX.Options( labelpos => nothing, - "font" => pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), + "font" => pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), "color" => cstr, "draw opacity" => α, "rotate" => axis[:guidefontrotation], @@ -1154,8 +1246,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) scale = axis[:scale] if scale in (:log2, :ln, :log10) push!(opt, string(letter, :mode) => "log") - scale == :ln || - push!(opt, "log basis $letter" => "$(scale == :log2 ? 2 : 10)") + scale == :ln || push!(opt, "log basis $letter" => "$(scale == :log2 ? 2 : 10)") end # ticks on or off @@ -1173,7 +1264,8 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # limits - lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : + lims = + ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) push!(opt, string(letter, :min) => lims[1], string(letter, :max) => lims[2]) @@ -1184,12 +1276,8 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) tick_values = ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : ticks[1] - push!( - opt, - string(letter, "tick") => string("{", join(tick_values, ","), "}"), - ) - if axis[:showaxis] && - axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto + push!(opt, string(letter, "tick") => string("{", join(tick_values, ","), "}")) + if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto # wrap the power part of label with } tick_labels = Vector{String}(undef, length(ticks[2])) for (i, label) in enumerate(ticks[2]) @@ -1204,28 +1292,28 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) ) elseif axis[:showaxis] tick_labels = - ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : - ticks[2] + ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2] if axis[:formatter] in (:scientific, :auto) tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$") tick_labels = replace.(tick_labels, Ref("×" => "\\times")) end push!( opt, - string(letter, "ticklabels") => - string("{", join(tick_labels, ","), "}"), + string(letter, "ticklabels") => string("{", join(tick_labels, ","), "}"), ) else push!(opt, string(letter, "ticklabels") => "{}") end - push!( - opt, - string(letter, "tick align") => - (axis[:tick_direction] == :out ? "outside" : "inside"), - ) - push!( - opt, string(letter, "ticklabel style") => pgfx_get_ticklabel_style(sp, axis) - ) + if axis[:tick_direction] === :none + push!(opt, string(letter, "tick style") => "draw=none") + else + push!( + opt, + string(letter, "tick align") => + (axis[:tick_direction] == :out ? "outside" : "inside"), + ) + end + push!(opt, string(letter, "ticklabel style") => pgfx_get_ticklabel_style(sp, axis)) push!( opt, string(letter, " grid style") => pgfx_linestyle( @@ -1249,7 +1337,8 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) minor_ticks push!( opt, - string("extra ", letter, " ticks") => string("{", join(minor_ticks, ","), "}"), + string("extra ", letter, " ticks") => + string("{", join(minor_ticks, ","), "}"), ) push!(opt, string("extra ", letter, " tick labels") => "") push!( @@ -1262,7 +1351,9 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis[:minorgridalpha], axis[:minorgridstyle], ), - "major tick length" => typeof(axis[:minorticks]) <: Integer && axis[:minorticks] > 1 || axis[:minorticks] ? "0.1cm" : "0" + "major tick length" => + typeof(axis[:minorticks]) <: Integer && axis[:minorticks] > 1 || + axis[:minorticks] ? "0.1cm" : "0", ), ) end @@ -1319,7 +1410,8 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) leg = sp[:legend] - if leg in (:best, :outertopright, :outerright, :outerbottomright) || (leg isa Tuple && leg[1] >= 1) + if leg in (:best, :outertopright, :outerright, :outerbottomright) || + (leg isa Tuple && leg[1] >= 1) sp.minpad = (0mm, 0mm, 5mm, 0mm) else sp.minpad = (0mm, 0mm, 0mm, 0mm) @@ -1338,22 +1430,22 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o(plt) end -for mime in ("application/pdf", "image/png", "image/svg+xml") - @eval function _show( - io::IO, - mime::MIME{Symbol($mime)}, - plt::Plot{PGFPlotsXBackend}, - ) +for mime in ("application/pdf", "image/svg+xml") + @eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PGFPlotsXBackend}) plt.o.was_shown = true show(io, mime, plt.o.the_plot) end end -function _show( - io::IO, - mime::MIME{Symbol("application/x-tex")}, - plt::Plot{PGFPlotsXBackend}, -) +function _show(io::IO, mime::MIME{Symbol("image/png")}, plt::Plot{PGFPlotsXBackend}) + plt.o.was_shown = true + plt_file = tempname() * ".png" + PGFPlotsX.pgfsave(plt_file, plt.o.the_plot; dpi = plt[:dpi]) + write(io, read(plt_file)) + rm(plt_file; force = true) +end + +function _show(io::IO, mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlotsXBackend}) plt.o.was_shown = true PGFPlotsX.print_tex( io, diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index d6a712c8..8a47fc1b 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -7,12 +7,13 @@ function _plotly_framestyle(style::Symbol) return style else default_style = get((semi = :box, origin = :zerolines), style, :axes) - @warn("Framestyle :$style is not supported by Plotly and PlotlyJS. :$default_style was cosen instead.") + @warn( + "Framestyle :$style is not supported by Plotly and PlotlyJS. :$default_style was chosen instead." + ) default_style end end - # -------------------------------------------------------------------------------------- using UUIDs @@ -23,7 +24,7 @@ function labelfunc(scale::Symbol, backend::PlotlyBackend) texfunc = labelfunc_tex(scale) function (x) tex_x = texfunc(x) - sup_x = replace( tex_x, r"\^{(.*)}"=>s"\1" ) + sup_x = replace(tex_x, r"\^{(.*)}" => s"\1") # replace dash with \minus (U+2212) replace(sup_x, "-" => "−") end @@ -32,30 +33,25 @@ end function plotly_font(font::Font, color = font.color) KW( :family => font.family, - :size => round(Int, font.pointsize*1.4), + :size => round(Int, font.pointsize * 1.4), :color => rgba_string(color), ) end - -function plotly_annotation_dict(x, y, val; xref="paper", yref="paper") - KW( - :text => val, - :xref => xref, - :x => x, - :yref => yref, - :y => y, - :showarrow => false, - ) +function plotly_annotation_dict(x, y, val; xref = "paper", yref = "paper") + KW(:text => val, :xref => xref, :x => x, :yref => yref, :y => y, :showarrow => false) end -function plotly_annotation_dict(x, y, ptxt::PlotText; xref="paper", yref="paper") - merge(plotly_annotation_dict(x, y, ptxt.str; xref=xref, yref=yref), KW( - :font => plotly_font(ptxt.font), - :xanchor => ptxt.font.halign == :hcenter ? :center : ptxt.font.halign, - :yanchor => ptxt.font.valign == :vcenter ? :middle : ptxt.font.valign, - :rotation => -ptxt.font.rotation, - )) +function plotly_annotation_dict(x, y, ptxt::PlotText; xref = "paper", yref = "paper") + merge( + plotly_annotation_dict(x, y, ptxt.str; xref = xref, yref = yref), + KW( + :font => plotly_font(ptxt.font), + :xanchor => ptxt.font.halign == :hcenter ? :center : ptxt.font.halign, + :yanchor => ptxt.font.valign == :vcenter ? :middle : ptxt.font.valign, + :rotation => -ptxt.font.rotation, + ), + ) end # function get_annotation_dict_for_arrow(plotattributes::KW, xyprev::Tuple, xy::Tuple, a::Arrow) @@ -100,9 +96,9 @@ function plotly_apply_aspect_ratio(sp::Subplot, plotarea, pcts) if aspect_ratio == :equal aspect_ratio = 1.0 end - xmin,xmax = axis_limits(sp, :x) - ymin,ymax = axis_limits(sp, :y) - want_ratio = ((xmax-xmin) / (ymax-ymin)) / aspect_ratio + xmin, xmax = axis_limits(sp, :x) + ymin, ymax = axis_limits(sp, :y) + want_ratio = ((xmax - xmin) / (ymax - ymin)) / aspect_ratio parea_ratio = width(plotarea) / height(plotarea) if want_ratio > parea_ratio # need to shrink y @@ -118,33 +114,34 @@ function plotly_apply_aspect_ratio(sp::Subplot, plotarea, pcts) pcts end - # this method gets the start/end in percentage of the canvas for this axis direction function plotly_domain(sp::Subplot) 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) x_domain = [pcts[1], pcts[1] + pcts[3]] y_domain = [pcts[2], pcts[2] + pcts[4]] return x_domain, y_domain end - function plotly_axis(axis, sp, anchor = nothing, domain = nothing) letter = axis[:letter] framestyle = sp[:framestyle] ax = KW( - :visible => framestyle != :none, - :title => axis[:guide], - :showgrid => axis[:grid], - :gridcolor => rgba_string(plot_color(axis[:foreground_color_grid], axis[:gridalpha])), - :gridwidth => axis[:gridlinewidth], - :zeroline => framestyle == :zerolines, + :visible => framestyle != :none, + :title => axis[:guide], + :showgrid => axis[:grid], + :gridcolor => + rgba_string(plot_color(axis[:foreground_color_grid], axis[:gridalpha])), + :gridwidth => axis[:gridlinewidth], + :zeroline => framestyle == :zerolines, :zerolinecolor => rgba_string(axis[:foreground_color_axis]), - :showline => framestyle in (:box, :axes) && axis[:showaxis], - :linecolor => rgba_string(plot_color(axis[:foreground_color_axis])), - :ticks => axis[:tick_direction] == :out ? "outside" : "inside", - :mirror => framestyle == :box, + :showline => framestyle in (:box, :axes) && axis[:showaxis], + :linecolor => rgba_string(plot_color(axis[:foreground_color_axis])), + :ticks => + axis[:tick_direction] === :out ? "outside" : + axis[:tick_direction] === :in ? "inside" : "", + :mirror => framestyle == :box, :showticklabels => axis[:showaxis], ) if anchor !== nothing @@ -165,7 +162,9 @@ function plotly_axis(axis, sp, anchor = nothing, domain = nothing) if !(axis[:ticks] in (nothing, :none, false)) ax[:titlefont] = plotly_font(guidefont(axis)) ax[:tickfont] = plotly_font(tickfont(axis)) - ax[:tickcolor] = framestyle in (:zerolines, :grid) || !axis[:showaxis] ? rgba_string(invisible()) : rgb_string(axis[:foreground_color_axis]) + ax[:tickcolor] = + framestyle in (:zerolines, :grid) || !axis[:showaxis] ? + rgba_string(invisible()) : rgb_string(axis[:foreground_color_axis]) ax[:linecolor] = rgba_string(axis[:foreground_color_axis]) # ticks @@ -194,10 +193,7 @@ function plotly_axis(axis, sp, anchor = nothing, domain = nothing) end function plotly_polaraxis(sp::Subplot, axis::Axis) - ax = KW( - :visible => axis[:showaxis], - :showline => axis[:grid], - ) + ax = KW(:visible => axis[:showaxis], :showline => axis[:grid]) if axis[:letter] == :x ax[:range] = rad2deg.(axis_limits(sp, :x)) @@ -215,7 +211,7 @@ function plotly_layout(plt::Plot) w, h = plt[:size] plotattributes_out[:width], plotattributes_out[:height] = w, h plotattributes_out[:paper_bgcolor] = rgba_string(plt[:background_color_outside]) - plotattributes_out[:margin] = KW(:l=>0, :b=>20, :r=>0, :t=>20) + plotattributes_out[:margin] = KW(:l => 0, :b => 20, :r => 0, :t => 20) plotattributes_out[:annotations] = KW[] @@ -236,9 +232,12 @@ function plotly_layout(plt::Plot) else 0.5 * (left(bb) + right(bb)) end - titlex, titley = xy_mm_to_pcts(xmm, top(bbox(sp)), w*px, h*px) + titlex, titley = xy_mm_to_pcts(xmm, top(bbox(sp)), w * px, h * px) title_font = font(titlefont(sp), :top) - push!(plotattributes_out[:annotations], plotly_annotation_dict(titlex, titley, text(sp[:title], title_font))) + push!( + plotattributes_out[:annotations], + plotly_annotation_dict(titlex, titley, text(sp[:title], title_font)), + ) end plotattributes_out[:plot_bgcolor] = rgba_string(sp[:background_color_inside]) @@ -247,8 +246,10 @@ function plotly_layout(plt::Plot) sp[:framestyle] = _plotly_framestyle(sp[:framestyle]) if ispolar(sp) - plotattributes_out[Symbol("angularaxis$(spidx)")] = plotly_polaraxis(sp, sp[:xaxis]) - plotattributes_out[Symbol("radialaxis$(spidx)")] = plotly_polaraxis(sp, sp[:yaxis]) + plotattributes_out[Symbol("angularaxis$(spidx)")] = + plotly_polaraxis(sp, sp[:xaxis]) + plotattributes_out[Symbol("radialaxis$(spidx)")] = + plotly_polaraxis(sp, sp[:yaxis]) else x_domain, y_domain = plotly_domain(sp) if RecipesPipeline.is3d(sp) @@ -263,15 +264,15 @@ function plotly_layout(plt::Plot) #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, + :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) + 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)")] = @@ -285,16 +286,28 @@ function plotly_layout(plt::Plot) # annotations for ann in sp[:annotations] - append!(plotattributes_out[:annotations], KW[plotly_annotation_dict(locate_annotation(sp, ann...)...; xref = "x$(x_idx)", yref = "y$(y_idx)")]) + append!( + plotattributes_out[:annotations], + KW[plotly_annotation_dict( + locate_annotation(sp, ann...)...; + xref = "x$(x_idx)", + yref = "y$(y_idx)", + )], + ) end # series_annotations for series in series_list(sp) anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - push!(plotattributes_out[:annotations], plotly_annotation_dict( - xi, - yi, - PlotText(str,fnt); xref = "x$(x_idx)", yref = "y$(y_idx)") + for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y]) + push!( + plotattributes_out[:annotations], + plotly_annotation_dict( + xi, + yi, + PlotText(str, fnt); + xref = "x$(x_idx)", + yref = "y$(y_idx)", + ), ) end end @@ -317,29 +330,32 @@ function plotly_layout(plt::Plot) end # turn off hover if nothing's using it - if all(series -> series.plotattributes[:hover] in (false,:none), plt.series_list) + if all(series -> series.plotattributes[:hover] in (false, :none), plt.series_list) plotattributes_out[:hovermode] = "none" end plotattributes_out = recursive_merge(plotattributes_out, plt.attr[:extra_plot_kwargs]) end - function plotly_add_legend!(plotattributes_out::KW, sp::Subplot) plotattributes_out[:showlegend] = sp[:legend] != :none legend_position = plotly_legend_pos(sp[:legend]) if sp[:legend] != :none plotattributes_out[:legend] = KW( - :bgcolor => rgba_string(sp[:background_color_legend]), + :bgcolor => rgba_string(sp[:background_color_legend]), :bordercolor => rgba_string(sp[:foreground_color_legend]), :borderwidth => 1, :traceorder => "normal", :xanchor => legend_position.xanchor, :yanchor => legend_position.yanchor, - :font => plotly_font(legendfont(sp)), + :font => plotly_font(legendfont(sp)), :tracegroupgap => 0, :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 @@ -356,36 +372,71 @@ function plotly_legend_pos(pos::Symbol) xouterright = 1.05 xouterleft = -0.15 plotly_legend_position_mapping = ( - right = (coords = [1.0, ycenter], xanchor = "right", yanchor = "middle"), - left = (coords = [xleft, ycenter], xanchor = "left", yanchor = "middle"), - top = (coords = [xcenter, ytop], xanchor = "center", yanchor = "top"), - bottom = (coords = [xcenter, ybot], xanchor = "center", yanchor = "bottom"), - bottomleft = (coords = [xleft, ybot], xanchor = "left", yanchor = "bottom"), + right = (coords = [1.0, ycenter], xanchor = "right", yanchor = "middle"), + left = (coords = [xleft, ycenter], xanchor = "left", yanchor = "middle"), + top = (coords = [xcenter, ytop], xanchor = "center", yanchor = "top"), + bottom = (coords = [xcenter, ybot], xanchor = "center", yanchor = "bottom"), + bottomleft = (coords = [xleft, ybot], xanchor = "left", yanchor = "bottom"), bottomright = (coords = [1.0, ybot], xanchor = "right", yanchor = "bottom"), - topright = (coords = [1.0, 1.0], xanchor = "right", yanchor = "top"), - topleft = (coords = [xleft, 1.0], xanchor = "left", yanchor = "top"), - 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") + topright = (coords = [1.0, 1.0], xanchor = "right", yanchor = "top"), + topleft = (coords = [xleft, 1.0], xanchor = "left", yanchor = "top"), + 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) end -plotly_legend_pos(v::Tuple{S,T}) where {S<:Real, T<:Real} = (coords=v, xanchor="left", yanchor="top") +plotly_legend_pos(v::Tuple{S,T}) where {S<:Real,T<:Real} = + (coords = v, xanchor = "left", yanchor = "top") +plotly_legend_pos(theta::Real) = plotly_legend_pos((theta, :inner)) + +function plotly_legend_pos(v::Tuple{S,Symbol}) where {S<:Real} + (s, c) = sincosd(v[1]) + xanchors = ["left", "center", "right"] + yanchors = ["bottom", "middle", "top"] + + if v[2] === :inner + rect = (0.07, 0.5, 1.0, 0.07, 0.52, 1.0) + xanchor = xanchors[legend_anchor_index(c)] + yanchor = yanchors[legend_anchor_index(s)] + else + rect = (-0.15, 0.5, 1.05, -0.15, 0.52, 1.1) + xanchor = xanchors[4 - legend_anchor_index(c)] + yanchor = yanchors[4 - legend_anchor_index(s)] + end + return ( + coords = legend_pos_from_angle(v[1], rect...), + xanchor = xanchor, + yanchor = yanchor, + ) +end function plotly_layout_json(plt::Plot) JSON.json(plotly_layout(plt), 4) end - plotly_colorscale(cg::ColorGradient, α = nothing) = [[v, rgba_string(plot_color(cg.colors[v], α))] for v in cg.values] function plotly_colorscale(c::AbstractVector{<:Colorant}, α = nothing) @@ -404,13 +455,12 @@ function plotly_colorscale(cg::PlotUtils.CategoricalColorGradient, α = nothing) cinds = repeat(1:n, inner = 2) vinds = vcat((i:(i + 1) for i in 1:n)...) return [ - [cg.values[vinds[i]], rgba_string(plot_color(color_list(cg)[cinds[i]], α))] - for i in eachindex(cinds) + [cg.values[vinds[i]], rgba_string(plot_color(color_list(cg)[cinds[i]], α))] for + i in eachindex(cinds) ] end plotly_colorscale(c, α = nothing) = plotly_colorscale(_as_gradient(c), α) - get_plotly_marker(k, def) = get( ( rect = "square", @@ -437,12 +487,11 @@ function plotly_link_indicies(plt::Plot, sp::Subplot) x_idx, y_idx end - # the Shape contructor will automatically close the shape. since we need it closed, # we split by NaNs and then construct/destruct the shapes to get the closed coords function plotly_close_shapes(x, y) xs, ys = nansplit(x), nansplit(y) - for i=eachindex(xs) + for i in eachindex(xs) shape = Shape(xs[i], ys[i]) xs[i], ys[i] = coords(shape) end @@ -455,7 +504,7 @@ function plotly_data(series::Series, letter::Symbol, data) data = if axis[:ticks] == :native && data !== nothing plotly_native_data(axis, data) else - data + data end if series[:seriestype] in (:heatmap, :contour, :surface, :wireframe, :mesh3d) @@ -488,7 +537,9 @@ function plotly_convert_to_datetime(x::AbstractArray, formatter::Function) elseif formatter == timeformatter map(xi -> string(Dates.Date(Dates.now()), " ", formatter(xi)), x) else - error("Invalid DateTime formatter. Expected Plots.datetime/date/time formatter but got $formatter") + error( + "Invalid DateTime formatter. Expected Plots.datetime/date/time formatter but got $formatter", + ) end end #ensures that a gradient is called if a single color is supplied where a gradient is needed (e.g. if a series recipe defines marker_z) @@ -526,11 +577,12 @@ function plotly_series(plt::Plot, series::Series) x, y = straightline_data(series, 100) z = series[:z] else - x, y, z = series[:x], series[:y], series[:z] + x, y, z = series[:x], series[:y], series[:z] end - x, y, z = (plotly_data(series, letter, data) - for (letter, data) in zip((:x, :y, :z), (x, y, z)) + x, y, z = ( + plotly_data(series, letter, data) for + (letter, data) in zip((:x, :y, :z), (x, y, z)) ) plotattributes_out[:name] = series[:label] @@ -538,7 +590,8 @@ function plotly_series(plt::Plot, series::Series) isscatter = st in (:scatter, :scatter3d, :scattergl) hasmarker = isscatter || series[:markershape] != :none hasline = st in (:path, :path3d, :straightline) - hasfillrange = st in (:path, :scatter, :scattergl, :straightline) && + hasfillrange = + st in (:path, :scatter, :scattergl, :straightline) && (isa(series[:fillrange], AbstractVector) || isa(series[:fillrange], Tuple)) plotattributes_out[:colorbar] = KW(:title => sp[:colorbar_title]) @@ -556,7 +609,8 @@ function plotly_series(plt::Plot, series::Series) y = heatmap_edges(y, sp[:yaxis][:scale]) plotattributes_out[:type] = "heatmap" plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z - plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha]) + plotattributes_out[:colorscale] = + plotly_colorscale(series[:fillcolor], series[:fillalpha]) plotattributes_out[:showscale] = hascolorbar(sp) elseif st == :contour @@ -564,24 +618,31 @@ function plotly_series(plt::Plot, series::Series) plotattributes_out[:type] = "contour" plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x, y, z plotattributes_out[:ncontours] = series[:levels] + 2 - plotattributes_out[:contours] = KW(:coloring => filled ? "fill" : "lines", :showlabels => series[:contour_labels] == true) - plotattributes_out[:colorscale] = plotly_colorscale(series[:linecolor], series[:linealpha]) + plotattributes_out[:contours] = KW( + :coloring => filled ? "fill" : "lines", + :showlabels => series[:contour_labels] == true, + ) + plotattributes_out[:colorscale] = + plotly_colorscale(series[:linecolor], series[:linealpha]) plotattributes_out[:showscale] = hascolorbar(sp) && hascolorbar(series) 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 if st == :wireframe plotattributes_out[:hidesurface] = true wirelines = KW( :show => true, - :color => rgba_string(plot_color(series[:linecolor], series[:linealpha])), + :color => + rgba_string(plot_color(series[:linecolor], series[:linealpha])), :highlightwidth => series[:linewidth], ) - plotattributes_out[:contours] = KW(:x => wirelines, :y => wirelines, :z => wirelines) + plotattributes_out[:contours] = + KW(:x => wirelines, :y => wirelines, :z => wirelines) plotattributes_out[:showscale] = false else - plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha]) + plotattributes_out[:colorscale] = + plotly_colorscale(series[:fillcolor], series[:fillalpha]) plotattributes_out[:opacity] = series[:fillalpha] if series[:fill_z] !== nothing plotattributes_out[:surfacecolor] = handle_surface(series[:fill_z]) @@ -589,24 +650,34 @@ function plotly_series(plt::Plot, series::Series) plotattributes_out[:showscale] = hascolorbar(sp) end elseif st == :mesh3d - plotattributes_out[:type] = "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])) + + 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]) @@ -621,12 +692,25 @@ function plotly_series(plt::Plot, series::Series) if hasmarker inds = eachindex(x) plotattributes_out[:marker] = KW( - :symbol => get_plotly_marker(series[:markershape], string(series[:markershape])), + :symbol => + get_plotly_marker(series[:markershape], string(series[:markershape])), # :opacity => series[:markeralpha], :size => 2 * _cycle(series[:markersize], inds), - :color => rgba_string.(plot_color.(get_markercolor.(series, inds), get_markeralpha.(series, inds))), + :color => + rgba_string.( + plot_color.( + get_markercolor.(series, inds), + get_markeralpha.(series, inds), + ), + ), :line => KW( - :color => rgba_string.(plot_color.(get_markerstrokecolor.(series, inds), get_markerstrokealpha.(series, inds))), + :color => + rgba_string.( + plot_color.( + get_markerstrokecolor.(series, inds), + get_markerstrokealpha.(series, inds), + ), + ), :width => _cycle(series[:markerstrokewidth], inds), ), ) @@ -639,7 +723,7 @@ function plotly_series(plt::Plot, series::Series) end function plotly_series_shapes(plt::Plot, series::Series, clims) - segments = iter_segments(series) + segments = series_segments(series; check = true) plotattributes_outs = Vector{KW}(undef, length(segments)) # TODO: create a plotattributes_out for each polygon @@ -654,40 +738,52 @@ function plotly_series_shapes(plt::Plot, series::Series, clims) :legendgroup => series[:label], ) - x, y = (plotly_data(series, letter, data) - for (letter, data) in zip((:x, :y), shape_data(series, 100)) + x, y = ( + plotly_data(series, letter, data) for + (letter, data) in zip((:x, :y), shape_data(series, 100)) ) - for (i,rng) in enumerate(segments) + for (k, segment) in enumerate(segments) + i, rng = segment.attr_index, segment.range length(rng) < 2 && continue # to draw polygons, we actually draw lines with fill - plotattributes_out = merge(plotattributes_base, KW( - :type => "scatter", - :mode => "lines", - :x => vcat(x[rng], x[rng[1]]), - :y => vcat(y[rng], y[rng[1]]), - :fill => "tozeroy", - :fillcolor => rgba_string(plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i))), - )) + plotattributes_out = merge( + plotattributes_base, + KW( + :type => "scatter", + :mode => "lines", + :x => vcat(x[rng], x[rng[1]]), + :y => vcat(y[rng], y[rng[1]]), + :fill => "tozeroy", + :fillcolor => rgba_string( + plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i)), + ), + ), + ) if series[:markerstrokewidth] > 0 plotattributes_out[:line] = KW( - :color => rgba_string(plot_color(get_linecolor(series, clims, i), get_linealpha(series, i))), + :color => rgba_string( + plot_color(get_linecolor(series, clims, i), get_linealpha(series, i)), + ), :width => get_linewidth(series, i), :dash => string(get_linestyle(series, i)), ) end - plotattributes_out[:showlegend] = i==1 ? should_add_to_legend(series) : false + plotattributes_out[:showlegend] = k == 1 ? should_add_to_legend(series) : false plotly_polar!(plotattributes_out, series) plotly_hover!(plotattributes_out, _cycle(series[:hover], i)) - plotattributes_outs[i] = plotattributes_out + plotattributes_outs[k] = plotattributes_out end if series[:fill_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :fill)) elseif series[:line_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :line)) elseif series[:marker_z] !== nothing - push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :marker)) + push!( + plotattributes_outs, + plotly_colorbar_hack(series, plotattributes_base, :marker), + ) end plotattributes_outs end @@ -698,35 +794,46 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z isscatter = st in (:scatter, :scatter3d, :scattergl) hasmarker = isscatter || series[:markershape] != :none hasline = st in (:path, :path3d, :straightline) - hasfillrange = st in (:path, :scatter, :scattergl, :straightline) && + hasfillrange = + st in (:path, :scatter, :scattergl, :straightline) && (isa(series[:fillrange], AbstractVector) || isa(series[:fillrange], Tuple)) - segments = iter_segments(series, st) - plotattributes_outs = fill(KW(), (hasfillrange ? 2 : 1 ) * length(segments)) + segments = collect(series_segments(series, st)) + plotattributes_outs = fill(KW(), (hasfillrange ? 2 : 1) * length(segments)) - needs_scatter_fix = !isscatter && hasmarker && !any(isnan,y) && length(segments) > 1 + needs_scatter_fix = !isscatter && hasmarker && !any(isnan, y) && length(segments) > 1 + + for (k, segment) in enumerate(segments) + i, rng = segment.attr_index, segment.range - for (i,rng) in enumerate(segments) plotattributes_out = deepcopy(plotattributes_base) - plotattributes_out[:showlegend] = i==1 ? should_add_to_legend(series) : false + plotattributes_out[:showlegend] = k == 1 ? should_add_to_legend(series) : false plotattributes_out[:legendgroup] = series[:label] # set the type if st in (:path, :scatter, :scattergl, :straightline) - plotattributes_out[:type] = st==:scattergl ? "scattergl" : "scatter" + plotattributes_out[:type] = st == :scattergl ? "scattergl" : "scatter" plotattributes_out[:mode] = if hasmarker hasline ? "lines+markers" : "markers" else hasline ? "lines" : "none" end - if series[:fillrange] == true || series[:fillrange] == 0 || isa(series[:fillrange], Tuple) + if series[:fillrange] == true || + series[:fillrange] == 0 || + isa(series[:fillrange], Tuple) plotattributes_out[:fill] = "tozeroy" - plotattributes_out[:fillcolor] = rgba_string(plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i))) - elseif typeof(series[:fillrange]) <: Union{AbstractVector{<:Real}, Real} + plotattributes_out[:fillcolor] = rgba_string( + plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i)), + ) + elseif typeof(series[:fillrange]) <: Union{AbstractVector{<:Real},Real} plotattributes_out[:fill] = "tonexty" - plotattributes_out[:fillcolor] = rgba_string(plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i))) + plotattributes_out[:fillcolor] = rgba_string( + plot_color(get_fillcolor(series, clims, i), get_fillalpha(series, i)), + ) elseif !(series[:fillrange] in (false, nothing)) - @warn("fillrange ignored... plotly only supports filling to zero and to a vector of values. fillrange: $(series[:fillrange])") + @warn( + "fillrange ignored... plotly only supports filling to zero and to a vector of values. fillrange: $(series[:fillrange])" + ) end plotattributes_out[:x], plotattributes_out[:y] = x[rng], y[rng] @@ -737,20 +844,32 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z else hasline ? "lines" : "none" end - plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = x[rng], y[rng], z[rng] + plotattributes_out[:x], plotattributes_out[:y], plotattributes_out[:z] = + x[rng], y[rng], z[rng] end # add "marker" 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))) + 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( - :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 => needs_scatter_fix ? [1, 0] : 1, :size => 2 * _cycle(series[:markersize], i), :color => needs_scatter_fix ? [mcolor, "rgba(0, 0, 0, 0.000)"] : mcolor, :line => KW( - :color => needs_scatter_fix ? [lcolor, "rgba(0, 0, 0, 0.000)"] : lcolor, + :color => + needs_scatter_fix ? [lcolor, "rgba(0, 0, 0, 0.000)"] : lcolor, :width => _cycle(series[:markerstrokewidth], i), ), ) @@ -759,10 +878,14 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z # add "line" if hasline plotattributes_out[:line] = KW( - :color => rgba_string(plot_color(get_linecolor(series, clims, i), get_linealpha(series, i))), + :color => rgba_string( + plot_color(get_linecolor(series, clims, i), get_linealpha(series, i)), + ), :width => get_linewidth(series, i), :shape => if st == :steppre "vh" + elseif st == :stepmid + "hvh" elseif st == :steppost "hv" else @@ -784,8 +907,12 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z if typeof(series[:fillrange]) <: Real series[:fillrange] = fill(series[:fillrange], length(rng)) elseif typeof(series[:fillrange]) <: Tuple - f1 = typeof(series[:fillrange][1]) <: Real ? fill(series[:fillrange][1], length(rng)) : series[:fillrange][1][rng] - f2 = typeof(series[:fillrange][2]) <: Real ? fill(series[:fillrange][2], length(rng)) : series[:fillrange][2][rng] + f1 = + typeof(series[:fillrange][1]) <: Real ? + fill(series[:fillrange][1], length(rng)) : series[:fillrange][1][rng] + f2 = + typeof(series[:fillrange][2]) <: Real ? + fill(series[:fillrange][2], length(rng)) : series[:fillrange][2][rng] series[:fillrange] = (f1, f2) end if isa(series[:fillrange], AbstractVector) @@ -795,15 +922,17 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z else # if fillrange is a tuple with upper and lower limit, plotattributes_out_fillrange # is the series that will do the filling - 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], series[:fillrange]) plotattributes_out_fillrange[:line][:width] = 0 delete!(plotattributes_out, :fill) delete!(plotattributes_out, :fillcolor) end - plotattributes_outs[(2 * i - 1):(2 * i)] = [plotattributes_out_fillrange, plotattributes_out] + plotattributes_outs[(2k - 1):(2k)] = + [plotattributes_out_fillrange, plotattributes_out] else - plotattributes_outs[i] = plotattributes_out + plotattributes_outs[k] = plotattributes_out end end @@ -812,7 +941,10 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z elseif series[:fill_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :fill)) elseif series[:marker_z] !== nothing - push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :marker)) + push!( + plotattributes_outs, + plotly_colorbar_hack(series, plotattributes_base, :marker), + ) end plotattributes_outs @@ -842,7 +974,6 @@ function plotly_colorbar_hack(series::Series, plotattributes_base::KW, sym::Symb return plotattributes_out end - function plotly_polar!(plotattributes_out::KW, series::Series) # convert polar plots x/y to theta/radius if ispolar(series[:subplot]) @@ -879,30 +1010,23 @@ plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt), 4) html_head(plt::Plot{PlotlyBackend}) = plotly_html_head(plt) html_body(plt::Plot{PlotlyBackend}) = plotly_html_body(plt) -const ijulia_initialized = Ref(false) - function plotly_html_head(plt::Plot) plotly = - use_local_dependencies[] ? ("file:///" * plotly_local_file_path[]) : "https://cdn.plot.ly/plotly-1.54.2.min.js" + use_local_dependencies[] ? ("file:///" * plotly_local_file_path[]) : + "https://cdn.plot.ly/$(_plotly_min_js_filename)" 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_head = include_mathjax == "" ? "" : "\n\t\t" + 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_head = + include_mathjax == "" ? "" : "\n\t\t" - if isijulia() && !ijulia_initialized[] - # using requirejs seems to be key to load a js depency in IJulia! - # https://requirejs.org/docs/start.html - # https://github.com/JuliaLang/IJulia.jl/issues/345 - display("text/html", """ - - """) - ijulia_initialized[] = true + if isijulia() + mathjax_head + else + "$mathjax_head" end - return "$mathjax_head" end function plotly_html_body(plt, style = nothing) @@ -910,12 +1034,34 @@ function plotly_html_body(plt, style = nothing) w, h = plt[:size] style = "width:$(w)px;height:$(h)px;" end + + requirejs_prefix = "" + requirejs_suffix = "" + if isijulia() + # require.js adds .js automatically + plotly_no_ext = + use_local_dependencies[] ? ("file:///" * plotly_local_file_path[]) : + "https://cdn.plot.ly/$(_plotly_min_js_filename)" + plotly_no_ext = plotly_no_ext[1:(end - 3)] + + requirejs_prefix = """ + requirejs.config({ + paths: { + Plotly: '$(plotly_no_ext)' + } + }); + require(['Plotly'], function (Plotly) { + """ + requirejs_suffix = "});" + end + uuid = UUIDs.uuid4() html = """
""" html @@ -923,7 +1069,7 @@ end function js_body(plt::Plot, uuid) js = """ - PLOT = document.getElementById('$(uuid)'); + var PLOT = document.getElementById('$(uuid)'); Plotly.plot(PLOT, $(plotly_series_json(plt)), $(plotly_layout_json(plt))); """ end @@ -945,12 +1091,10 @@ function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{Plotly plotly_show_js(io, plot) end - function _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyBackend}) - write(io, standalone_html(plt)) + write(io, embeddable_html(plt)) end - function _display(plt::Plot{PlotlyBackend}) standalone_html_window(plt) end diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index f6f07e80..8dfc373e 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -25,22 +25,24 @@ for (mime, fmt) in ( "image/svg+xml" => "svg", "image/eps" => "eps", ) - @eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt) + @eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = + PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt) end # Use the Plotly implementation for json and html: -_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = plotly_show_js(io, plt) +_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = + plotly_show_js(io, plt) html_head(plt::Plot{PlotlyJSBackend}) = plotly_html_head(plt) html_body(plt::Plot{PlotlyJSBackend}) = plotly_html_body(plt) -_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = write(io, standalone_html(plt)) +_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = + write(io, embeddable_html(plt)) _display(plt::Plot{PlotlyJSBackend}) = display(plotlyjs_syncplot(plt)) function PlotlyJS.WebIO.render(plt::Plot{PlotlyJSBackend}) - plt_html = sprint(show, MIME("text/html"), plt) - return PlotlyJS.WebIO.render(PlotlyJS.WebIO.dom"div"(innerHTML=plt_html)) + return PlotlyJS.WebIO.render(plotlyjs_syncplot(plt)) end function closeall(::PlotlyJSBackend) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 4ded21f3..b516cc9d 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -3,7 +3,6 @@ is_marker_supported(::PyPlotBackend, shape::Shape) = true - # -------------------------------------------------------------------------------------- # problem: https://github.com/tbreloff/Plots.jl/issues/308 @@ -19,16 +18,17 @@ pyfont = PyPlot.pyimport("matplotlib.font_manager") pyticker = PyPlot.pyimport("matplotlib.ticker") pycmap = PyPlot.pyimport("matplotlib.cm") pynp = PyPlot.pyimport("numpy") -pynp."seterr"(invalid="ignore") +pynp."seterr"(invalid = "ignore") pytransforms = PyPlot.pyimport("matplotlib.transforms") pycollections = PyPlot.pyimport("matplotlib.collections") pyart3d = PyPlot.art3D pyrcparams = PyPlot.PyDict(PyPlot.matplotlib."rcParams") - # "support" matplotlib v1.5 set_facecolor_sym = if PyPlot.version < v"2" - @warn("You are using Matplotlib $(PyPlot.version), which is no longer officialy supported by the Plots community. To ensure smooth Plots.jl integration update your Matplotlib library to a version >= 2.0.0") + @warn( + "You are using Matplotlib $(PyPlot.version), which is no longer officialy supported by the Plots community. To ensure smooth Plots.jl integration update your Matplotlib library to a version >= 2.0.0" + ) :set_axis_bgcolor else :set_facecolor @@ -39,7 +39,6 @@ if !isdefined(PyPlot.PyCall, :_setproperty!) @warn "Plots no longer supports PyCall < 1.90.0 and PyPlot < 2.8.0. Either update PyCall and PyPlot or pin Plots to a version <= 0.23.2." end - # # convert colorant to 4-tuple RGBA # py_color(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), (red, green, blue, alpha)) # py_color(cvec::ColorVector, α=nothing) = map(py_color, convertColor(cvec, α).v) @@ -73,23 +72,22 @@ py_color(c::Colorant, α) = py_color(plot_color(c, α)) function py_colormap(cg::ColorGradient) pyvals = collect(zip(cg.values, py_color(PlotUtils.color_list(cg)))) cm = pycolors."LinearSegmentedColormap"."from_list"("tmp", pyvals) - cm."set_bad"(color=(0,0,0,0.0), alpha=0.0) + cm."set_bad"(color = (0, 0, 0, 0.0), alpha = 0.0) cm end function py_colormap(cg::PlotUtils.CategoricalColorGradient) r = range(0, stop = 1, length = 256) pyvals = collect(zip(r, py_color(cg[r]))) cm = pycolors."LinearSegmentedColormap"."from_list"("tmp", pyvals) - cm."set_bad"(color=(0,0,0,0.0), alpha=0.0) + cm."set_bad"(color = (0, 0, 0, 0.0), alpha = 0.0) cm end py_colormap(c) = py_colormap(_as_gradient(c)) - function py_shading(c, z) cmap = py_colormap(c) - ls = pycolors."LightSource"(270,45) - ls."shade"(z, cmap, vert_exag=0.1, blend_mode="soft") + ls = pycolors."LightSource"(270, 45) + ls."shade"(z, cmap, vert_exag = 0.1, blend_mode = "soft") end # get the style (solid, dashed, etc) @@ -106,12 +104,12 @@ end function py_marker(marker::Shape) x, y = coords(marker) n = length(x) - mat = zeros(n+1,2) - for i=1:n - mat[i,1] = x[i] - mat[i,2] = y[i] + mat = zeros(n + 1, 2) + for i in 1:n + mat[i, 1] = x[i] + mat[i, 2] = y[i] end - mat[n+1,:] = mat[1,:] + mat[n + 1, :] = mat[1, :] pypath."Path"(mat) end @@ -152,12 +150,14 @@ end function py_stepstyle(seriestype::Symbol) seriestype == :steppost && return "steps-post" + seriestype == :stepmid && return "steps-mid" seriestype == :steppre && return "steps-pre" return "default" end function py_fillstepstyle(seriestype::Symbol) seriestype == :steppost && return "post" + seriestype == :stepmid && return "mid" seriestype == :steppre && return "pre" return nothing end @@ -200,17 +200,23 @@ function fix_xy_lengths!(plt::Plot{PyPlotBackend}, series::Series) nx, ny = length(x), length(y) if !isa(get(series.plotattributes, :z, nothing), Surface) && nx != ny if nx < ny - series[:x] = Float64[x[mod1(i,nx)] for i=1:ny] + series[:x] = Float64[x[mod1(i, nx)] for i in 1:ny] else - series[:y] = Float64[y[mod1(i,ny)] for i=1:nx] + series[:y] = Float64[y[mod1(i, ny)] for i in 1:nx] end end end end -py_linecolormap(series::Series) = py_colormap(series[:linecolor]) -py_markercolormap(series::Series) = py_colormap(series[:markercolor]) -py_fillcolormap(series::Series) = py_colormap(series[:fillcolor]) +function py_linecolormap(series::Series) + py_colormap(cgrad(series[:linecolor], alpha = get_linealpha(series))) +end +function py_markercolormap(series::Series) + py_colormap(cgrad(series[:markercolor], alpha = get_markeralpha(series))) +end +function py_fillcolormap(series::Series) + py_colormap(cgrad(series[:fillcolor], alpha = get_fillalpha(series))) +end # --------------------------------------------------------------------------- @@ -241,12 +247,11 @@ py_drawfig(fig) = fig."draw"(py_renderer(fig)) # get a vector [left, right, bottom, top] in PyPlot coords (origin is bottom-left!) py_extents(obj) = obj."get_window_extent"()."get_points"() - # compute a bounding box (with origin top-left), however pyplot gives coords with origin bottom-left function py_bbox(obj) fl, fr, fb, ft = py_extents(obj."get_figure"()) l, r, b, t = py_extents(obj) - BoundingBox(l*px, (ft-t)*px, (r-l)*px, (t-b)*px) + BoundingBox(l * px, (ft - t) * px, (r - l) * px, (t - b) * px) end py_bbox(::Nothing) = BoundingBox(0mm, 0mm) @@ -262,13 +267,13 @@ end # bounding box: union of axis tick labels function py_bbox_ticks(ax, letter) - labels = getproperty(ax, Symbol("get_"*letter*"ticklabels"))() + labels = getproperty(ax, Symbol("get_" * letter * "ticklabels"))() py_bbox(labels) end # bounding box: axis guide function py_bbox_axislabel(ax, letter) - pyaxis_label = getproperty(ax, Symbol("get_"*letter*"axis"))().label + pyaxis_label = getproperty(ax, Symbol("get_" * letter * "axis"))().label py_bbox(pyaxis_label) end @@ -299,7 +304,7 @@ end # Create the window/figure for this backend. function _create_backend_figure(plt::Plot{PyPlotBackend}) - w,h = map(px2inch, Tuple(s * plt[:dpi] / Plots.DPI for s in plt[:size])) + w, h = map(px2inch, Tuple(s * plt[:dpi] / Plots.DPI for s in plt[:size])) # # reuse the current figure? fig = if plt[:overwrite_figure] @@ -321,21 +326,15 @@ end function py_init_subplot(plt::Plot{PyPlotBackend}, sp::Subplot{PyPlotBackend}) fig = plt.o proj = sp[:projection] - proj = (proj in (nothing,:none) ? nothing : string(proj)) + proj = (proj in (nothing, :none) ? nothing : string(proj)) # add a new axis, and force it to create a new one by setting a distinct label - ax = fig."add_axes"( - [0,0,1,1], - label = string(gensym()), - projection = proj - ) + ax = fig."add_axes"([0, 0, 1, 1], label = string(gensym()), projection = proj) sp.o = ax end - # --------------------------------------------------------------------------- - # function _series_added(pkg::PyPlotBackend, plt::Plot, plotattributes::KW) # TODO: change this to accept Subplot?? # function _series_added(plt::Plot{PyPlotBackend}, series::Series) @@ -368,15 +367,17 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) end end - xyargs = (st in _3dTypes ? (x,y,z) : (x,y)) + xyargs = (st in _3dTypes ? (x, y, z) : (x, y)) # handle zcolor and get c/cmap needs_colorbar = hascolorbar(sp) vmin, vmax = clims = get_clims(sp, series) # Dict to store extra kwargs - if st == :wireframe - extrakw = KW() # vmin, vmax cause an error for wireframe plot + if st == :wireframe || st == :hexbin + # vmin, vmax cause an error for wireframe plot + # We are not supporting clims for hexbin as calculation of bins is not trivial + extrakw = KW() else extrakw = KW(:vmin => vmin, :vmax => vmax) end @@ -385,7 +386,6 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) handles = [] discrete_colorbar_values = nothing - # pass in an integer value as an arg, but a levels list as a keyword arg levels = series[:levels] levelargs = if isscalar(levels) @@ -403,7 +403,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # for each plotting command, optionally build and add a series handle to the list # line plot - if st in (:path, :path3d, :steppre, :steppost, :straightline) + if st in (:path, :path3d, :steppre, :stepmid, :steppost, :straightline) if maximum(series[:linewidth]) > 0 # 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) @@ -435,17 +435,22 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # end # push!(handles, handle) # else - for (i, rng) in enumerate(iter_segments(series, st)) - handle = ax."plot"((arg[rng] for arg in xyargs)...; - label = i == 1 ? series[:label] : "", - zorder = series[:series_plotindex], - color = py_color(single_color(get_linecolor(series, clims, i)), get_linealpha(series, i)), - linewidth = py_thickness_scale(plt, get_linewidth(series, i)), - linestyle = py_linestyle(st, get_linestyle(series, i)), - solid_capstyle = "butt", - dash_capstyle = "butt", - drawstyle = py_stepstyle(st) - )[1] + for (k, segment) in enumerate(series_segments(series, st; check = true)) + i, rng = segment.attr_index, segment.range + handle = ax."plot"( + (arg[rng] for arg in xyargs)...; + label = k == 1 ? series[:label] : "", + zorder = series[:series_plotindex], + color = py_color( + single_color(get_linecolor(series, clims, i)), + get_linealpha(series, i), + ), + linewidth = py_thickness_scale(plt, get_linewidth(series, i)), + linestyle = py_linestyle(st, get_linestyle(series, i)), + solid_capstyle = "butt", + dash_capstyle = "butt", + drawstyle = py_stepstyle(st), + )[1] push!(handles, handle) end # end @@ -465,11 +470,15 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) :linestyle => py_linestyle(st, get_linestyle(series)), ) add_arrows(x, y) do xyprev, xy - ax."annotate"("", - xytext = (0.001xyprev[1] + 0.999xy[1], 0.001xyprev[2] + 0.999xy[2]), + ax."annotate"( + "", + xytext = ( + 0.001xyprev[1] + 0.999xy[1], + 0.001xyprev[2] + 0.999xy[2], + ), xy = xy, arrowprops = arrowprops, - zorder = 999 + zorder = 999, ) end end @@ -478,10 +487,10 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) end # add markers? - if series[:markershape] != :none && st in ( - :path, :scatter, :path3d, :scatter3d, :steppre, :steppost, :bar - ) - for (i, rng) in enumerate(iter_segments(series, :scatter)) + if series[:markershape] != :none && + st in (:path, :scatter, :path3d, :scatter3d, :steppre, :stepmid, :steppost, :bar) + for segment in series_segments(series, :scatter) + i, rng = segment.attr_index, segment.range xyargs = if st == :bar && !isvertical(series) if RecipesPipeline.is3d(sp) y[rng], x[rng], z[rng] @@ -496,31 +505,42 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) end end - handle = ax."scatter"(xyargs...; + handle = ax."scatter"( + xyargs...; label = series[:label], zorder = series[:series_plotindex] + 0.5, marker = py_marker(_cycle(series[:markershape], i)), - s = py_thickness_scale(plt, _cycle(series[:markersize], i)).^ 2, - facecolors = py_color(get_markercolor(series, i), get_markeralpha(series, i)), - edgecolors = py_color(get_markerstrokecolor(series, i), get_markerstrokealpha(series, i)), + s = py_thickness_scale(plt, _cycle(series[:markersize], i)) .^ 2, + facecolors = py_color( + get_markercolor(series, i), + get_markeralpha(series, i), + ), + 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) end end if st == :hexbin - handle = ax."hexbin"(x, y, + extrakw[:mincnt] = get(series[:extra_kwargs], :mincnt, nothing) + extrakw[:edgecolors] = + get(series[:extra_kwargs], :edgecolors, py_color(get_linecolor(series))) + handle = ax."hexbin"( + x, + y; label = series[:label], C = series[:weights], - gridsize = series[:bins]==:auto ? 100 : series[:bins], # 100 is the default value + gridsize = series[:bins] == :auto ? 100 : series[:bins], # 100 is the default value linewidths = py_thickness_scale(plt, series[:linewidth]), - edgecolors = py_color(get_linecolor(series)), alpha = series[:fillalpha], cmap = py_fillcolormap(series), # applies to the pcolorfast object zorder = series[:series_plotindex], - # extrakw... # We are not supporting clims for hexbin as calculation of bins is not trivial + extrakw..., ) push!(handles, handle) end @@ -540,12 +560,16 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) end # contour lines - handle = ax."contour"(x, y, z, levelargs...; + handle = ax."contour"( + x, + y, + z, + levelargs...; label = series[:label], zorder = series[:series_plotindex], linewidths = py_thickness_scale(plt, series[:linewidth]), linestyles = py_linestyle(st, series[:linestyle]), - extrakw... + extrakw..., ) if series[:contour_labels] == true ax."clabel"(handle, handle.levels) @@ -554,11 +578,15 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # contour fills if series[:fillrange] !== nothing - handle = ax."contourf"(x, y, z, levelargs...; + handle = ax."contourf"( + x, + y, + z, + levelargs...; label = series[:label], zorder = series[:series_plotindex] + 0.5, alpha = series[:fillalpha], - extrakw... + extrakw..., ) push!(handles, handle) end @@ -572,49 +600,56 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) if st == :surface if series[:fill_z] !== nothing # the surface colors are different than z-value - extrakw[:facecolors] = py_shading( - series[:fillcolor], - py_handle_surface(series[:fill_z]), - ) + extrakw[:facecolors] = + py_shading(series[:fillcolor], py_handle_surface(series[:fill_z])) extrakw[:shade] = false else extrakw[:cmap] = py_fillcolormap(series) end end - handle = getproperty(ax, st == :surface ? :plot_surface : :plot_wireframe)(x, y, z; + handle = getproperty(ax, st == :surface ? :plot_surface : :plot_wireframe)( + x, + y, + z; label = series[:label], zorder = series[:series_plotindex], rstride = series[:stride][1], cstride = series[:stride][2], linewidth = py_thickness_scale(plt, series[:linewidth]), edgecolor = py_color(get_linecolor(series)), - extrakw... + extrakw..., ) push!(handles, handle) # contours on the axis planes if series[:contours] - for (zdir,mat) in (("x",x), ("y",y), ("z",z)) + for (zdir, mat) in (("x", x), ("y", y), ("z", z)) offset = (zdir == "y" ? ignorenan_maximum : ignorenan_minimum)(mat) - handle = ax."contourf"(x, y, z, levelargs...; + handle = ax."contourf"( + x, + y, + z, + levelargs...; zdir = zdir, cmap = py_fillcolormap(series), - offset = (zdir == "y" ? ignorenan_maximum : ignorenan_minimum)(mat) # where to draw the contour plane + offset = (zdir == "y" ? ignorenan_maximum : ignorenan_minimum)(mat), # where to draw the contour plane ) push!(handles, handle) end end - elseif typeof(z) <: AbstractVector # tri-surface plot (http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#tri-surface-plots) - handle = ax."plot_trisurf"(x, y, z; + handle = ax."plot_trisurf"( + x, + y, + z; label = series[:label], zorder = series[:series_plotindex], cmap = py_fillcolormap(series), linewidth = py_thickness_scale(plt, series[:linewidth]), edgecolor = py_color(get_linecolor(series)), - extrakw... + extrakw..., ) push!(handles, handle) else @@ -630,7 +665,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) z = if eltype(z) <: Colors.AbstractGray float(z) elseif eltype(z) <: Colorant - map(c -> Float64[red(c),green(c),blue(c),alpha(c)], z) + map(c -> Float64[red(c), green(c), blue(c), alpha(c)], z) else z # hopefully it's in a data format that will "just work" with imshow end @@ -640,7 +675,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) cmap = py_colormap(cgrad(plot_color([:black, :white]))), vmin = 0.0, vmax = 1.0, - extent = (xmin - dx, xmax + dx, ymax + dy, ymin - dy) + extent = (xmin - dx, xmax + dx, ymax + dy, ymin - dy), ) push!(handles, handle) @@ -660,20 +695,24 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) discrete_colorbar_values = dvals end - handle = ax."pcolormesh"(x, y, py_mask_nans(z); + handle = ax."pcolormesh"( + x, + y, + py_mask_nans(z); label = series[:label], zorder = series[:series_plotindex], cmap = py_fillcolormap(series), alpha = series[:fillalpha], # edgecolors = (series[:linewidth] > 0 ? py_linecolor(series) : "face"), - extrakw... + extrakw..., ) push!(handles, handle) end if st == :shape handle = [] - for (i, rng) in enumerate(iter_segments(series)) + for segment in series_segments(series) + i, rng = segment.attr_index, segment.range if length(rng) > 1 fs = get_fillstyle(series, i) has_fs = !isnothing(fs) @@ -694,7 +733,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) hatch = py_fillstyle(fs), linewidth = py_thickness_scale(plt, get_linewidth(series, i)), linestyle = py_linestyle(st, get_linestyle(series, i)), - fill = true + fill = true, ) push!(handle, ax."add_patch"(patches)) end @@ -710,14 +749,15 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # handle area filling fillrange = series[:fillrange] if fillrange !== nothing && st != :contour - for (i, rng) in enumerate(iter_segments(series)) + for segment in series_segments(series) + i, rng = segment.attr_index, segment.range f, dim1, dim2 = if isvertical(series) :fill_between, x[rng], y[rng] else :fill_betweenx, y[rng], x[rng] end n = length(dim1) - args = if typeof(fillrange) <: Union{Real, AVec} + args = if typeof(fillrange) <: Union{Real,AVec} dim1, _cycle(fillrange, rng), dim2 elseif is_2tuple(fillrange) dim1, _cycle(fillrange[1], rng), _cycle(fillrange[2], rng) @@ -729,7 +769,11 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) fc = get_fillcolor(series, clims, i) fa = get_fillalpha(series, i) - handle = getproperty(ax, f)(args..., trues(n), false, py_fillstepstyle(st); + handle = getproperty(ax, f)( + args..., + trues(n), + false, + py_fillstepstyle(st); zorder = series[:series_plotindex], # hatch color/alpha controlled by edge (not face) color/alpha # if has_fs, set edge color/alpha <- fill color/alpha and face alpha <- 0 @@ -744,7 +788,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # this is all we need to add the series_annotations text anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, x, y) + for (xi, yi, str, fnt) in EachAnn(anns, x, y) py_add_annotations(sp, xi, yi, PlotText(str, fnt)) end end @@ -759,23 +803,22 @@ end function py_surround_latextext(latexstring, env) if !isempty(latexstring) && latexstring[1] == '$' && latexstring[end] == '$' - unenclosed = latexstring[2:end-1] + unenclosed = latexstring[2:(end - 1)] else unenclosed = latexstring end PyPlot.LaTeXStrings.latexstring(env, "{", unenclosed, "}") end - -function py_set_ticks(ax, ticks, letter, env) +function py_set_ticks(sp, ax, ticks, letter, env) ticks == :auto && return - axis = getproperty(ax, Symbol(letter,"axis")) + axis = getproperty(ax, Symbol(letter, "axis")) if ticks == :none || ticks === nothing || ticks == false kw = KW() - for dir in (:top,:bottom,:left,:right) - kw[dir] = kw[Symbol(:label,dir)] = false + for dir in (:top, :bottom, :left, :right) + kw[dir] = kw[Symbol(:label, dir)] = false end - axis."set_tick_params"(;which="both", kw...) + axis."set_tick_params"(; which = "both", kw...) return end @@ -785,7 +828,7 @@ function py_set_ticks(ax, ticks, letter, env) elseif ttype == :ticks_and_labels axis."set_ticks"(ticks[1]) - if pyrcparams["text.usetex"] + if get(sp[:extra_kwargs], :rawticklabels, false) tick_labels = ticks[2] else tick_labels = [py_surround_latextext(ticklabel, env) for ticklabel in ticks[2]] @@ -817,54 +860,78 @@ function py_compute_axis_minval(sp::Subplot, axis::Axis) minval end -function py_set_scale(ax, sp::Subplot, axis::Axis) - scale = axis[:scale] - letter = axis[:letter] +function py_set_scale(ax, sp::Subplot, scale::Symbol, letter::Symbol) scale in supported_scales() || return @warn("Unhandled scale value in pyplot: $scale") func = getproperty(ax, Symbol("set_", letter, "scale")) + if PyPlot.version ≥ v"3.3" # https://matplotlib.org/3.3.0/api/api_changes.html + pyletter = Symbol("") + else + pyletter = letter + end kw = KW() arg = if scale == :identity "linear" else - kw[Symbol(:base,letter)] = if scale == :ln + kw[Symbol(:base, pyletter)] = if scale == :ln ℯ elseif scale == :log2 2 elseif scale == :log10 10 end - kw[Symbol(:linthresh,letter)] = NaNMath.max(1e-16, py_compute_axis_minval(sp, axis)) + axis = sp[Symbol(letter, :axis)] + kw[Symbol(:linthresh, pyletter)] = + NaNMath.max(1e-16, py_compute_axis_minval(sp, axis)) "symlog" end func(arg; kw...) end +function py_set_scale(ax, sp::Subplot, axis::Axis) + scale = axis[:scale] + letter = axis[:letter] + py_set_scale(ax, sp, scale, letter) +end + +function py_set_spine_color(spines, color) + for loc in spines + spines[loc]."set_color"(color) + end +end + +function py_set_spine_color(spines::Dict, color) + for (loc, spine) in spines + spine."set_color"(color) + end +end function py_set_axis_colors(sp, ax, a::Axis) - for (loc, spine) in ax.spines - spine."set_color"(py_color(a[:foreground_color_border])) - end + py_set_spine_color(ax.spines, py_color(a[:foreground_color_border])) axissym = Symbol(a[:letter], :axis) if PyPlot.PyCall.hasproperty(ax, axissym) - tickcolor = sp[:framestyle] in (:zerolines, :grid) ? py_color(plot_color(a[:foreground_color_grid], a[:gridalpha])) : py_color(a[:foreground_color_axis]) - ax."tick_params"(axis=string(a[:letter]), which="both", - colors=tickcolor, - labelcolor=py_color(a[:tickfontcolor])) + tickcolor = + sp[:framestyle] in (:zerolines, :grid) ? + py_color(plot_color(a[:foreground_color_grid], a[:gridalpha])) : + py_color(a[:foreground_color_axis]) + ax."tick_params"( + axis = string(a[:letter]), + which = "both", + colors = tickcolor, + labelcolor = py_color(a[:tickfontcolor]), + ) getproperty(ax, axissym).label.set_color(py_color(a[:guidefontcolor])) end end - # -------------------------------------------------------------------------- - function _before_layout_calcs(plt::Plot{PyPlotBackend}) # update the fig w, h = plt[:size] fig = plt.o fig."clear"() dpi = plt[:dpi] - fig."set_size_inches"(w/DPI, h/DPI, forward = true) + fig."set_size_inches"(w / DPI, h / DPI, forward = true) getproperty(fig, set_facecolor_sym)(py_color(plt[:background_color_outside])) fig."set_dpi"(plt[:dpi]) @@ -904,7 +971,9 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) :title end getproperty(ax, func)."set_text"(sp[:title]) - getproperty(ax, func)."set_fontsize"(py_thickness_scale(plt, sp[:titlefontsize])) + getproperty(ax, func)."set_fontsize"( + py_thickness_scale(plt, sp[:titlefontsize]), + ) getproperty(ax, func)."set_family"(sp[:titlefontfamily]) getproperty(ax, func)."set_color"(py_color(sp[:titlefontcolor])) # ax[:set_title](sp[:title], loc = loc) @@ -917,14 +986,17 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) colorbar_series = slist[findfirst(hascolorbar.(slist))] handle = colorbar_series[:serieshandle][end] kw = KW() - if !isempty(sp[:zaxis][:discrete_values]) && colorbar_series[:seriestype] == :heatmap + if !isempty(sp[:zaxis][:discrete_values]) && + colorbar_series[:seriestype] == :heatmap locator, formatter = get_locator_and_formatter(sp[:zaxis][:discrete_values]) # kw[:values] = eachindex(sp[:zaxis][:discrete_values]) kw[:values] = sp[:zaxis][:continuous_values] kw[:ticks] = locator kw[:format] = formatter kw[:boundaries] = vcat(0, kw[:values] + 0.5) - elseif any(colorbar_series[attr] !== nothing for attr in (:line_z, :fill_z, :marker_z)) + elseif any( + colorbar_series[attr] !== nothing for attr in (:line_z, :fill_z, :marker_z) + ) cmin, cmax = get_clims(sp) norm = pycolors."Normalize"(vmin = cmin, vmax = cmax) f = if colorbar_series[:line_z] !== nothing @@ -940,11 +1012,12 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) end kw[:spacing] = "proportional" - fig = plt.o - if RecipesPipeline.is3d(sp) || ispolar(sp) - cbax = fig."add_axes"([0.9, 0.1, 0.03, 0.8]) - cb = fig."colorbar"(handle; cax=cbax, kw...) + cbax = fig."add_axes"( + [0.9, 0.1, 0.03, 0.8], + label = string("cbar", sp[:subplot_index]), + ) + cb = fig."colorbar"(handle; cax = cbax, kw...) else # divider approach works only with 2d plots divider = axes_grid1.make_axes_locatable(ax) @@ -953,7 +1026,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) # cbax = divider.append_axes("right", size=width, pad=pad) # This approach does not work well in subplots colorbar_position = "right" colorbar_pad = "2.5%" - colorbar_orientation="vertical" + colorbar_orientation = "vertical" if sp[:colorbar] == :left colorbar_position = string(sp[:colorbar]) @@ -961,15 +1034,25 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) elseif sp[:colorbar] == :top colorbar_position = string(sp[:colorbar]) colorbar_pad = "2.5%" - colorbar_orientation="horizontal" + colorbar_orientation = "horizontal" elseif sp[:colorbar] == :bottom colorbar_position = string(sp[:colorbar]) colorbar_pad = "5%" - colorbar_orientation="horizontal" + 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...) + cbax = divider.append_axes( + colorbar_position, + size = "5%", + pad = colorbar_pad, + label = string("cbar", sp[:subplot_index]), + ) # 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") @@ -978,50 +1061,119 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) elseif sp[:colorbar] == :bottom cbax.xaxis.set_ticks_position("bottom") 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[:colorbar_titlefontsize]), + family = sp[:colorbar_titlefontfamily], + color = py_color(sp[:colorbar_titlefontcolor]), + ) # cb."formatter".set_useOffset(false) # This for some reason does not work, must be a pyplot bug, instead this is a workaround: cb."formatter".set_powerlimits((-Inf, Inf)) cb."update_ticks"() - for lab in cb."ax"."yaxis"."get_ticklabels"() - lab."set_fontsize"(py_thickness_scale(plt, sp[:yaxis][:tickfontsize])) - lab."set_family"(sp[:yaxis][:tickfontfamily]) - lab."set_color"(py_color(sp[:yaxis][:tickfontcolor])) + env = "\\mathregular" # matches the outer fonts https://matplotlib.org/tutorials/text/mathtext.html + ticks = get_colorbar_ticks(sp) + + if sp[:colorbar] in (:top, :bottom) + axis = sp[:xaxis] # colorbar inherits from x axis + cbar_axis = cb."ax"."xaxis" + ticks_letter = :x + else + axis = sp[:yaxis] # colorbar inherits from y axis + cbar_axis = cb."ax"."yaxis" + ticks_letter = :y end + py_set_scale(cb.ax, sp, sp[:colorbar_scale], ticks_letter) + sp[:colorbar_ticks] == :native ? nothing : + py_set_ticks(sp, cb.ax, ticks, ticks_letter, env) + + for lab in cbar_axis."get_ticklabels"() + lab."set_fontsize"(py_thickness_scale(plt, sp[:colorbar_tickfontsize])) + lab."set_family"(sp[:colorbar_tickfontfamily]) + lab."set_color"(py_color(sp[:colorbar_tickfontcolor])) + end + + # Adjust thickness of the cbar ticks + intensity = 0.5 + cbar_axis."set_tick_params"( + direction = axis[:tick_direction] == :out ? "out" : "in", + width = py_thickness_scale(plt, intensity), + length = axis[:tick_direction] == :none ? 0 : + 5 * py_thickness_scale(plt, intensity), + ) + + cb.outline."set_linewidth"(py_thickness_scale(plt, 1)) + sp.attr[:cbar_handle] = cb sp.attr[:cbar_ax] = cbax end # framestyle if !ispolar(sp) && !RecipesPipeline.is3d(sp) - ax.spines["left"]."set_linewidth"(py_thickness_scale(plt, 1)) - ax.spines["bottom"]."set_linewidth"(py_thickness_scale(plt, 1)) + for pos in ("left", "right", "top", "bottom") + # Scale all axes by default first + ax.spines[pos]."set_linewidth"(py_thickness_scale(plt, 1)) + end + + # Then set visible some of them if sp[:framestyle] == :semi intensity = 0.5 - ax.spines["right"]."set_alpha"(intensity) - ax.spines["top"]."set_alpha"(intensity) - ax.spines["right"]."set_linewidth"(py_thickness_scale(plt, intensity)) - ax.spines["top"]."set_linewidth"(py_thickness_scale(plt, intensity)) + + spine = sp[:yaxis][:mirror] ? "left" : "right" + ax.spines[spine]."set_alpha"(intensity) + ax.spines[spine]."set_linewidth"(py_thickness_scale(plt, intensity)) + + spine = sp[:xaxis][:mirror] ? "bottom" : "top" + ax.spines[spine]."set_linewidth"(py_thickness_scale(plt, intensity)) + ax.spines[spine]."set_alpha"(intensity) + elseif sp[:framestyle] == :box + ax.tick_params(top = true) # Add ticks too + ax.tick_params(right = true) # Add ticks too elseif sp[:framestyle] in (:axes, :origin) - ax.spines["right"]."set_visible"(false) + sp[:xaxis][:mirror] ? ax.spines["bottom"]."set_visible"(false) : ax.spines["top"]."set_visible"(false) + sp[:yaxis][:mirror] ? ax.spines["left"]."set_visible"(false) : + ax.spines["right"]."set_visible"(false) if sp[:framestyle] == :origin ax.spines["bottom"]."set_position"("zero") ax.spines["left"]."set_position"("zero") end elseif sp[:framestyle] in (:grid, :none, :zerolines) - for (loc, spine) in ax.spines - spine."set_visible"(false) + if PyPlot.version >= v"3.4.1" # that is one where it worked, the API change may have some other value + for spine in ax.spines + ax.spines[string(spine)]."set_visible"(false) + end + else + for (loc, spine) in ax.spines + spine."set_visible"(false) + end end if sp[:framestyle] == :zerolines - ax."axhline"(y = 0, color = py_color(sp[:xaxis][:foreground_color_axis]), lw = py_thickness_scale(plt, 0.75)) - ax."axvline"(x = 0, color = py_color(sp[:yaxis][:foreground_color_axis]), lw = py_thickness_scale(plt, 0.75)) + ax."axhline"( + y = 0, + color = py_color(sp[:xaxis][:foreground_color_axis]), + lw = py_thickness_scale(plt, 0.75), + ) + ax."axvline"( + x = 0, + color = py_color(sp[:yaxis][:foreground_color_axis]), + lw = py_thickness_scale(plt, 0.75), + ) end end + + if sp[:xaxis][:mirror] + ax.xaxis."set_label_position"("top") # the guides + sp[:framestyle] == :box ? nothing : ax.xaxis."tick_top"() + end + + if sp[:yaxis][:mirror] + ax.yaxis."set_label_position"("right") # the guides + sp[:framestyle] == :box ? nothing : ax.yaxis."tick_right"() + end end # axis attributes @@ -1030,15 +1182,11 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) PyPlot.PyCall.hasproperty(ax, axissym) || continue axis = sp[axissym] pyaxis = getproperty(ax, axissym) - if axis[:mirror] && letter != :z - pos = letter == :x ? "top" : "right" - pyaxis."set_label_position"(pos) # the guides - pyaxis."set_ticks_position"("both") # the hash marks - getproperty(pyaxis, Symbol(:tick_, pos))() # the tick labels - end + if axis[:guide_position] != :auto && letter != :z pyaxis."set_label_position"(axis[:guide_position]) end + py_set_scale(ax, sp, axis) axis[:ticks] == :native ? nothing : py_set_lims(ax, sp, axis) if ispolar(sp) && letter == :y @@ -1056,34 +1204,35 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) "family" => axis[:tickfontfamily], "size" => py_thickness_scale(plt, axis[:tickfontsize]), "rotation" => axis[:tickfontrotation], - ) + ), ) - positions = getproperty(ax, Symbol("get_",letter,"ticks"))() + positions = getproperty(ax, Symbol("get_", letter, "ticks"))() pyaxis.set_major_locator(pyticker.FixedLocator(positions)) if RecipesPipeline.is3d(sp) - getproperty(ax, Symbol("set_",letter,"ticklabels"))( + getproperty(ax, Symbol("set_", letter, "ticklabels"))( positions; - (Symbol(k) => v for (k, v) in fontProperties)... + (Symbol(k) => v for (k, v) in fontProperties)..., ) else - getproperty(ax, Symbol("set_",letter,"ticklabels"))( + getproperty(ax, Symbol("set_", letter, "ticklabels"))( positions, - fontdict=fontProperties, + 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) + axis[:ticks] == :native ? nothing : py_set_ticks(sp, ax, ticks, letter, env) # Tick marks 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), - length= 5 * py_thickness_scale(plt, intensity) - ) + width = py_thickness_scale(plt, intensity), + length = axis[:tick_direction] == :none ? 0 : + 5 * py_thickness_scale(plt, intensity), + ) getproperty(ax, Symbol("set_", letter, "label"))(axis[:guide]) if get(axis.plotattributes, :flip, false) @@ -1102,14 +1251,15 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) pyaxis."label"."set_rotation"(axis[:guidefontrotation]) end - if axis[:grid] && !(ticks in (:none, nothing, false)) fgcolor = py_color(axis[:foreground_color_grid]) - pyaxis."grid"(true, + pyaxis."grid"( + true, color = fgcolor, linestyle = py_linestyle(:line, axis[:gridstyle]), linewidth = py_thickness_scale(plt, axis[:gridlinewidth]), - alpha = axis[:gridalpha]) + alpha = axis[:gridalpha], + ) ax."set_axisbelow"(true) else pyaxis."grid"(false) @@ -1117,11 +1267,15 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) # if axis[:minorticks] > 1 - pyaxis."set_minor_locator"(PyPlot.matplotlib.ticker.AutoMinorLocator(axis[:minorticks])) + pyaxis."set_minor_locator"( + PyPlot.matplotlib.ticker.AutoMinorLocator(axis[:minorticks]), + ) pyaxis."set_tick_params"( which = "minor", direction = axis[:tick_direction] == :out ? "out" : "in", - width=py_thickness_scale(plt, intensity)) + length = axis[:tick_direction] == :none ? 0 : + py_thickness_scale(plt, intensity), + ) end if axis[:minorgrid] @@ -1131,18 +1285,20 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) pyaxis."set_tick_params"( which = "minor", direction = axis[:tick_direction] == :out ? "out" : "in", - width=py_thickness_scale(plt, intensity)) + length = axis[:tick_direction] == :none ? 0 : + py_thickness_scale(plt, intensity), + ) - pyaxis."grid"(true, + pyaxis."grid"( + true, which = "minor", color = fgcolor, linestyle = py_linestyle(:line, axis[:minorgridstyle]), linewidth = py_thickness_scale(plt, axis[:minorgridlinewidth]), - alpha = axis[:minorgridalpha]) + alpha = axis[:minorgridalpha], + ) end - - py_set_axis_colors(sp, ax, axis) end @@ -1156,9 +1312,9 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) if !ispolar(sp) ax.spines[string(dir)].set_visible(false) end - kw[dir] = kw[Symbol(:label,dir)] = false + kw[dir] = kw[Symbol(:label, dir)] = false end - ax."xaxis"."set_tick_params"(; which="both", kw...) + ax."xaxis"."set_tick_params"(; which = "both", kw...) end if !sp[:yaxis][:showaxis] kw = KW() @@ -1166,9 +1322,9 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) if !ispolar(sp) ax.spines[string(dir)].set_visible(false) end - kw[dir] = kw[Symbol(:label,dir)] = false + kw[dir] = kw[Symbol(:label, dir)] = false end - ax."yaxis"."set_tick_params"(; which="both", kw...) + ax."yaxis"."set_tick_params"(; which = "both", kw...) end # aspect ratio @@ -1181,7 +1337,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) if RecipesPipeline.is3d(sp) #convert azimuthal to match GR behaviour #view_init(elevation, azimuthal) so reverse :camera args - ax."view_init"((sp[:camera].-(90,0))[end:-1:1]...) + ax."view_init"((sp[:camera] .- (90, 0))[end:-1:1]...) end # legend @@ -1198,7 +1354,6 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) py_drawfig(fig) end - # Set the (left, top, right, bottom) minimum padding around the plot area # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{PyPlotBackend}) @@ -1213,20 +1368,37 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend}) toppad = 0mm rightpad = 0mm bottompad = 0mm - for bb in (py_bbox_axis(ax, "x"), py_bbox_axis(ax, "y"), py_bbox_title(ax), py_bbox_legend(ax)) + + for bb in ( + py_bbox_axis(ax, "x"), + py_bbox_axis(ax, "y"), + py_bbox_title(ax), + py_bbox_legend(ax), + ) if ispositive(width(bb)) && ispositive(height(bb)) - leftpad = max(leftpad, left(plotbb) - left(bb)) - toppad = max(toppad, top(plotbb) - top(bb)) - rightpad = max(rightpad, right(bb) - right(plotbb)) - bottompad = max(bottompad, bottom(bb) - bottom(plotbb)) + leftpad = max(leftpad, left(plotbb) - left(bb)) + toppad = max(toppad, top(plotbb) - top(bb)) + rightpad = max(rightpad, right(bb) - right(plotbb)) + bottompad = max(bottompad, bottom(bb) - bottom(plotbb)) + end + end + + if haskey(sp.attr, :cbar_ax) # Treat colorbar the same way + ax = sp.attr[:cbar_handle]."ax" + for bb in (py_bbox_axis(ax, "x"), py_bbox_axis(ax, "y"), py_bbox_title(ax)) + if ispositive(width(bb)) && ispositive(height(bb)) + leftpad = max(leftpad, left(plotbb) - left(bb)) + toppad = max(toppad, top(plotbb) - top(bb)) + rightpad = max(rightpad, right(bb) - right(plotbb)) + bottompad = max(bottompad, bottom(bb) - bottom(plotbb)) + end end end # optionally add the width of colorbar labels and colorbar to rightpad - if haskey(sp.attr, :cbar_ax) + if RecipesPipeline.is3d(sp) && haskey(sp.attr, :cbar_ax) bb = py_bbox(sp.attr[:cbar_handle]."ax"."get_yticklabels"()) sp.attr[:cbar_width] = width(bb) + (sp[:colorbar_title] == "" ? 0px : 30px) - rightpad = rightpad + sp.attr[:cbar_width] end # add in the user-specified margin @@ -1240,70 +1412,53 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend}) sp.minpad = Tuple(dpi_factor .* [leftpad, toppad, rightpad, bottompad]) end - # ----------------------------------------------------------------- function py_add_annotations(sp::Subplot{PyPlotBackend}, x, y, val) ax = sp.o - ax."annotate"(val, xy = (x,y), zorder = 999, annotation_clip = false) + ax."annotate"(val, xy = (x, y), zorder = 999, annotation_clip = false) end - function py_add_annotations(sp::Subplot{PyPlotBackend}, x, y, val::PlotText) ax = sp.o - ax."annotate"(val.str, - xy = (x,y), + ax."annotate"( + val.str, + xy = (x, y), family = val.font.family, color = py_color(val.font.color), - horizontalalignment = val.font.halign == :hcenter ? "center" : string(val.font.halign), - verticalalignment = val.font.valign == :vcenter ? "center" : string(val.font.valign), + horizontalalignment = val.font.halign == :hcenter ? "center" : + string(val.font.halign), + verticalalignment = val.font.valign == :vcenter ? "center" : + string(val.font.valign), rotation = val.font.rotation, size = py_thickness_scale(sp.plt, val.font.pointsize), zorder = 999, - annotation_clip = false + annotation_clip = false, ) end # ----------------------------------------------------------------- -py_legend_pos(pos::Symbol) = get( - ( - right = "right", - left = "center left", - top = "upper center", - bottom = "lower center", - bottomleft = "lower left", - bottomright = "lower right", - topright = "upper right", - topleft = "upper left", - outerright = "center left", - outerleft = "right", - outertop = "lower center", - outerbottom = "upper center", - outerbottomleft = "lower right", - outerbottomright = "lower left", - outertopright = "upper left", - outertopleft = "upper right", - ), - pos, - "best", -) -py_legend_pos(pos) = "lower left" +py_legend_pos(pos::Tuple{S,T}) where {S<:Real,T<:Real} = "lower left" + +function py_legend_pos(pos::Tuple{<:Real,Symbol}) + (s, c) = sincosd(pos[1]) + if pos[2] === :outer + s = -s + c = -c + end + yanchors = ["lower", "center", "upper"] + xanchors = ["left", "center", "right"] + return join([yanchors[legend_anchor_index(s)], xanchors[legend_anchor_index(c)]], ' ') +end + +function py_legend_bbox(pos::Tuple{T,Symbol}) where {T<:Real} + if pos[2] === :outer + return legend_pos_from_angle(pos[1], -0.15, 0.5, 1.0, -0.15, 0.5, 1.0) + end + legend_pos_from_angle(pos[1], 0.0, 0.5, 1.0, 0.0, 0.5, 1.0) +end -py_legend_bbox(pos::Symbol) = get( - ( - outerright = (1.0, 0.5, 0.0, 0.0), - outerleft = (-0.15, 0.5, 0.0, 0.0), - outertop = (0.5, 1.0, 0.0, 0.0), - outerbottom = (0.5, -0.15, 0.0, 0.0), - outerbottomleft = (-0.15, 0.0, 0.0, 0.0), - outerbottomright = (1.0, 0.0, 0.0, 0.0), - outertopright = (1.0, 1.0, 0.0, 0.0), - outertopleft = (-0.15, 1.0, 0.0, 0.0), - ), - pos, - (0.0, 0.0, 1.0, 1.0), -) py_legend_bbox(pos) = pos function py_add_legend(plt::Plot, sp::Subplot, ax) @@ -1316,7 +1471,8 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) if should_add_to_legend(series) clims = get_clims(sp, series) # add a line/marker and a label - push!(handles, + push!( + handles, if series[:seriestype] == :shape || series[:fillrange] !== nothing fs = get_fillstyle(series) has_fs = !isnothing(fs) @@ -1335,23 +1491,44 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) 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, :stepmid, :steppost) hasline = get_linewidth(series) > 0 - PyPlot.plt."Line2D"((0, 1),(0,0), - color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)), - linewidth = py_thickness_scale(plt, hasline * sp[:legendfontsize] / 8), + PyPlot.plt."Line2D"( + (0, 1), + (0, 0), + color = py_color( + single_color(get_linecolor(series, clims)), + get_linealpha(series), + ), + linewidth = py_thickness_scale( + plt, + hasline * sp[:legendfontsize] / 8, + ), linestyle = py_linestyle(:path, get_linestyle(series)), - solid_capstyle = "butt", solid_joinstyle = "miter", - dash_capstyle = "butt", dash_joinstyle = "miter", + solid_capstyle = "butt", + solid_joinstyle = "miter", + dash_capstyle = "butt", + dash_joinstyle = "miter", marker = py_marker(_cycle(series[:markershape], 1)), markersize = py_thickness_scale(plt, 0.8 * sp[:legendfontsize]), - markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)), - markerfacecolor = py_color(single_color(get_markercolor(series, clims)), get_markeralpha(series)), - markeredgewidth = py_thickness_scale(plt, 0.8 * get_markerstrokewidth(series) * sp[:legendfontsize] / first(series[:markersize])) # retain the markersize/markerstroke ratio from the markers on the plot + markeredgecolor = py_color( + single_color(get_markerstrokecolor(series)), + get_markerstrokealpha(series), + ), + markerfacecolor = py_color( + single_color(get_markercolor(series, clims)), + get_markeralpha(series), + ), + markeredgewidth = py_thickness_scale( + plt, + 0.8 * get_markerstrokewidth(series) * sp[:legendfontsize] / + first(series[:markersize]), + ), # retain the markersize/markerstroke ratio from the markers on the plot ) else series[:serieshandle][1] - end + end, ) push!(labels, series[:label]) end @@ -1359,7 +1536,9 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) # if anything was added, call ax.legend and set the colors if !isempty(handles) - leg = ax."legend"(handles, + leg = legend_angle(leg) + leg = ax."legend"( + handles, labels, loc = py_legend_pos(leg), bbox_to_anchor = py_legend_bbox(leg), @@ -1369,18 +1548,28 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) edgecolor = py_color(sp[:foreground_color_legend]), framealpha = alpha(plot_color(sp[:background_color_legend])), fancybox = false, # makes the legend box square - borderpad=0.8 # to match GR legendbox + borderpad = 0.8, # to match GR legendbox ) frame = leg."get_frame"() frame."set_linewidth"(py_thickness_scale(plt, 1)) leg."set_zorder"(1000) if sp[:legendtitle] !== nothing leg."set_title"(sp[:legendtitle]) - PyPlot.plt."setp"(leg."get_title"(), color = py_color(sp[:legendtitlefontcolor]), family = sp[:legendtitlefontfamily], fontsize = py_thickness_scale(plt, sp[:legendtitlefontsize])) + PyPlot.plt."setp"( + leg."get_title"(), + color = py_color(sp[:legendtitlefontcolor]), + family = sp[:legendtitlefontfamily], + fontsize = py_thickness_scale(plt, sp[:legendtitlefontsize]), + ) end for txt in leg."get_texts"() - PyPlot.plt."setp"(txt, color = py_color(sp[:legendfontcolor]), family = sp[:legendfontfamily], fontsize = py_thickness_scale(plt, sp[:legendfontsize])) + PyPlot.plt."setp"( + txt, + color = py_color(sp[:legendfontcolor]), + family = sp[:legendfontfamily], + fontsize = py_thickness_scale(plt, sp[:legendfontsize]), + ) end end end @@ -1388,7 +1577,6 @@ end # ----------------------------------------------------------------- - # Use the bounding boxes (and methods left/top/right/bottom/width/height) `sp.bbox` and `sp.plotarea` to # position the subplot in the backend. function _update_plot_object(plt::Plot{PyPlotBackend}) @@ -1396,14 +1584,19 @@ function _update_plot_object(plt::Plot{PyPlotBackend}) ax = sp.o ax === nothing && return figw, figh = sp.plt[:size] - figw, figh = figw*px, figh*px + figw, figh = figw * px, figh * px pcts = bbox_to_pcts(sp.plotarea, figw, figh) ax."set_position"(pcts) if haskey(sp.attr, :cbar_ax) && RecipesPipeline.is3d(sp) # 2D plots are completely handled by axis dividers cbw = sp.attr[:cbar_width] # this is the bounding box of just the colors of the colorbar (not labels) - cb_bbox = BoundingBox(right(sp.bbox)-cbw - 2mm, top(sp.bbox) + 2mm, _cbar_width-1mm, height(sp.bbox) - 4mm) + cb_bbox = BoundingBox( + right(sp.bbox) - cbw - 2mm, + top(sp.bbox) + 2mm, + _cbar_width - 1mm, + height(sp.bbox) - 4mm, + ) pcts = bbox_to_pcts(cb_bbox, figw, figh) sp.attr[:cbar_ax]."set_position"(pcts) end @@ -1416,26 +1609,25 @@ end _display(plt::Plot{PyPlotBackend}) = plt.o."show"() - for (mime, fmt) in ( - "application/eps" => "eps", - "image/eps" => "eps", - "application/pdf" => "pdf", - "image/png" => "png", - "application/postscript" => "ps", - "image/svg+xml" => "svg", - "application/x-tex" => "pgf" + "application/eps" => "eps", + "image/eps" => "eps", + "application/pdf" => "pdf", + "image/png" => "png", + "application/postscript" => "ps", + "image/svg+xml" => "svg", + "application/x-tex" => "pgf", ) @eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PyPlotBackend}) fig = plt.o fig."canvas"."print_figure"( io, - format=$fmt, + format = $fmt, # bbox_inches = "tight", # figsize = map(px2inch, plt[:size]), facecolor = fig."get_facecolor"(), edgecolor = "none", - dpi = plt[:dpi] + dpi = plt[:dpi], ) end end diff --git a/src/backends/unicodeplots.jl b/src/backends/unicodeplots.jl index f0042436..0812542f 100644 --- a/src/backends/unicodeplots.jl +++ b/src/backends/unicodeplots.jl @@ -1,22 +1,18 @@ # https://github.com/Evizero/UnicodePlots.jl - # don't warn on unsupported... there's just too many warnings!! warn_on_unsupported_args(::UnicodePlotsBackend, plotattributes::KW) = nothing # -------------------------------------------------------------------------------------- -function _canvas_map() - ( - braille = UnicodePlots.BrailleCanvas, - ascii = UnicodePlots.AsciiCanvas, - block = UnicodePlots.BlockCanvas, - dot = UnicodePlots.DotCanvas, - density = UnicodePlots.DensityCanvas, - ) -end - +_canvas_map() = ( + braille = UnicodePlots.BrailleCanvas, + ascii = UnicodePlots.AsciiCanvas, + block = UnicodePlots.BlockCanvas, + dot = UnicodePlots.DotCanvas, + density = UnicodePlots.DensityCanvas, +) # do all the magic here... build it all at once, since we need to know about all the series at the very beginning function rebuildUnicodePlot!(plt::Plot, width, height) @@ -25,8 +21,8 @@ function rebuildUnicodePlot!(plt::Plot, width, height) for sp in plt.subplots xaxis = sp[:xaxis] yaxis = sp[:yaxis] - xlim = axis_limits(sp, :x) - ylim = axis_limits(sp, :y) + xlim = axis_limits(sp, :x) + ylim = axis_limits(sp, :y) # make vectors xlim = [xlim[1], xlim[2]] @@ -49,13 +45,16 @@ function rebuildUnicodePlot!(plt::Plot, width, height) if length(sp.series_list) == 1 series = sp.series_list[1] if series[:seriestype] == :spy - push!(plt.o, UnicodePlots.spy( - series[:z].surf, - width = width, - height = height, - title = sp[:title], - canvas = canvas_type - )) + push!( + plt.o, + UnicodePlots.spy( + series[:z].surf, + width = width, + height = height, + title = sp[:title], + canvas = canvas_type, + ), + ) continue end end @@ -65,13 +64,16 @@ function rebuildUnicodePlot!(plt::Plot, width, height) # canvas_type = UnicodePlots.BarplotGraphics # end - o = UnicodePlots.Plot(x, y, canvas_type; + o = UnicodePlots.Plot( + x, + y, + canvas_type; width = width, height = height, title = sp[:title], xlim = xlim, ylim = ylim, - border = isijulia() ? :ascii : :solid + border = isijulia() ? :ascii : :solid, ) # set the axis labels @@ -88,7 +90,6 @@ function rebuildUnicodePlot!(plt::Plot, width, height) end end - # add a single series function addUnicodeSeries!(o, plotattributes, addlegend::Bool, xlim, ylim) # get the function, or special handling for step/bar/hist @@ -102,8 +103,8 @@ function addUnicodeSeries!(o, plotattributes, addlegend::Bool, xlim, ylim) func = UnicodePlots.lineplot! elseif st == :scatter || plotattributes[:markershape] != :none func = UnicodePlots.scatterplot! - # elseif st == :bar - # func = UnicodePlots.barplot! + # elseif st == :bar + # func = UnicodePlots.barplot! elseif st == :shape func = UnicodePlots.lineplot! else @@ -120,11 +121,20 @@ function addUnicodeSeries!(o, plotattributes, addlegend::Bool, xlim, ylim) end label = addlegend ? plotattributes[:label] : "" - # if we happen to pass in allowed color symbols, great... otherwise let UnicodePlots decide - color = plotattributes[:linecolor] in UnicodePlots.color_cycle ? plotattributes[:linecolor] : :auto + lc = plotattributes[:linecolor] + if typeof(lc) <: UnicodePlots.UserColorType + color = lc + elseif lc isa RGBA{Float64} + lc = convert(ARGB32, lc) + color = map(Int, (red(lc).i, green(lc).i, blue(lc).i)) + else + color = :auto + end # add the series - x, y = RecipesPipeline.unzip(collect(Base.Iterators.filter(xy->isfinite(xy[1])&&isfinite(xy[2]), zip(x,y)))) + x, y = RecipesPipeline.unzip( + collect(Base.Iterators.filter(xy -> isfinite(xy[1]) && isfinite(xy[2]), zip(x, y))), + ) func(o, x, y; color = color, name = label) end @@ -162,7 +172,7 @@ end function unicodeplots_rebuild(plt::Plot{UnicodePlotsBackend}) w, h = plt[:size] - plt.attr[:color_palette] = [RGB(0,0,0)] + plt.attr[:color_palette] = [RGB(0, 0, 0)] rebuildUnicodePlot!(plt, div(w, 10), div(h, 20)) end @@ -172,7 +182,6 @@ function _show(io::IO, ::MIME"text/plain", plt::Plot{UnicodePlotsBackend}) nothing end - function _display(plt::Plot{UnicodePlotsBackend}) unicodeplots_rebuild(plt) map(show, plt.o) diff --git a/src/backends/web.jl b/src/backends/web.jl index 4f827529..92b6b185 100644 --- a/src/backends/web.jl +++ b/src/backends/web.jl @@ -3,7 +3,10 @@ # CREDIT: parts of this implementation were inspired by @joshday's PlotlyLocal.jl -function standalone_html(plt::AbstractPlot; title::AbstractString = get(plt.attr, :window_title, "Plots.jl")) +function standalone_html( + plt::AbstractPlot; + title::AbstractString = get(plt.attr, :window_title, "Plots.jl"), +) """ @@ -19,6 +22,10 @@ function standalone_html(plt::AbstractPlot; title::AbstractString = get(plt.attr """ end +function embeddable_html(plt::AbstractPlot) + html_head(plt) * html_body(plt) +end + function open_browser_window(filename::AbstractString) @static if Sys.isapple() return run(`open $(filename)`) @@ -45,7 +52,8 @@ function standalone_html_window(plt::AbstractPlot) old = use_local_dependencies[] # save state to restore afterwards # 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! - use_local_dependencies[] = plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[]) + use_local_dependencies[] = + plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[]) filename = write_temp_html(plt) open_browser_window(filename) # restore for other backends @@ -54,7 +62,9 @@ end # uses wkhtmltopdf/wkhtmltoimage: http://wkhtmltopdf.org/downloads.html function html_to_png(html_fn, png_fn, w, h) - run(`wkhtmltoimage -f png -q --width $w --height $h --disable-smart-width $html_fn $png_fn`) + run( + `wkhtmltoimage -f png -q --width $w --height $h --disable-smart-width $html_fn $png_fn`, + ) end function show_png_from_html(io::IO, plt::AbstractPlot) diff --git a/src/colorbars.jl b/src/colorbars.jl new file mode 100644 index 00000000..db59c7ef --- /dev/null +++ b/src/colorbars.jl @@ -0,0 +1,97 @@ +# These functions return an operator for use in `get_clims(::Seres, op)` +process_clims(lims::Tuple{<:Number,<:Number}) = + (zlims -> ifelse.(isfinite.(lims), lims, zlims)) ∘ ignorenan_extrema +process_clims(s::Union{Symbol,Nothing,Missing}) = ignorenan_extrema +# don't specialize on ::Function otherwise python functions won't work +process_clims(f) = f + +function get_clims(sp::Subplot, op = process_clims(sp[:clims])) + zmin, zmax = Inf, -Inf + for series in series_list(sp) + if series[:colorbar_entry] + zmin, zmax = _update_clims(zmin, zmax, get_clims(series, op)...) + end + end + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) +end + +function get_clims(sp::Subplot, series::Series, op = process_clims(sp[:clims])) + zmin, zmax = if series[:colorbar_entry] + get_clims(sp, op) + else + get_clims(series, op) + end + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) +end + +""" + get_clims(::Series, op=Plots.ignorenan_extrema) + +Finds the limits for the colorbar by taking the "z-values" for the series and passing them into `op`, +which must return the tuple `(zmin, zmax)`. The default op is the extrema of the finite +values of the input. +""" +function get_clims(series::Series, op = ignorenan_extrema) + zmin, zmax = Inf, -Inf + z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface, :hexbin) + for vals in ( + series[:seriestype] in z_colored_series ? series[:z] : nothing, + series[:line_z], + series[:marker_z], + series[:fill_z], + ) + if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing,Real}) + zmin, zmax = _update_clims(zmin, zmax, op(vals.surf)...) + elseif (vals !== nothing) && (eltype(vals) <: Union{Missing,Real}) + zmin, zmax = _update_clims(zmin, zmax, op(vals)...) + end + end + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) +end + +_update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax) + +@enum ColorbarStyle cbar_gradient cbar_fill cbar_lines + +function colorbar_style(series::Series) + colorbar_entry = series[:colorbar_entry] + if !(colorbar_entry isa Bool) + @warn "Non-boolean colorbar_entry ignored." + colorbar_entry = true + end + + if !colorbar_entry + nothing + elseif isfilledcontour(series) + cbar_fill + elseif iscontour(series) + cbar_lines + elseif series[:seriestype] ∈ (:heatmap, :surface) || + any(series[z] !== nothing for z in [:marker_z, :line_z, :fill_z]) + cbar_gradient + else + nothing + end +end + +hascolorbar(series::Series) = colorbar_style(series) !== nothing +hascolorbar(sp::Subplot) = + sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp)) + +function get_colorbar_ticks(sp::Subplot; update = true) + if update || !haskey(sp.attr, :colorbar_optimized_ticks) + ticks = _transform_ticks(sp[:colorbar_ticks]) + cvals = sp[:colorbar_continuous_values] + dvals = sp[:colorbar_discrete_values] + clims = get_clims(sp) + scale = sp[:colorbar_scale] + formatter = sp[:colorbar_formatter] + sp.attr[:colorbar_optimized_ticks] = + get_ticks(ticks, cvals, dvals, clims, scale, formatter) + end + return sp.attr[:colorbar_optimized_ticks] +end + +function _update_subplot_colorbars(sp::Subplot) + # Dynamic callback from the pipeline if needed +end diff --git a/src/components.jl b/src/components.jl index 6281f7bf..e8eadc72 100644 --- a/src/components.jl +++ b/src/components.jl @@ -1,17 +1,20 @@ -const P2 = GeometryTypes.Point2{Float64} -const P3 = GeometryTypes.Point3{Float64} +const P2 = GeometryBasics.Point2{Float64} +const P3 = GeometryBasics.Point3{Float64} -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)) -nanpush!(a::AbstractVector{P3}, b) = (push!(a, P3(NaN,NaN,NaN)); push!(a, b)) -nanappend!(a::AbstractVector{P3}, b) = (push!(a, P3(NaN,NaN,NaN)); append!(a, b)) +const _haligns = :hcenter, :left, :right +const _valigns = :vcenter, :top, :bottom + +nanpush!(a::AVec{P2}, b) = (push!(a, P2(NaN, NaN)); push!(a, b)) +nanappend!(a::AVec{P2}, b) = (push!(a, P2(NaN, NaN)); append!(a, b)) +nanpush!(a::AVec{P3}, b) = (push!(a, P3(NaN, NaN, NaN)); push!(a, b)) +nanappend!(a::AVec{P3}, b) = (push!(a, P3(NaN, NaN, NaN)); append!(a, b)) compute_angle(v::P2) = (angle = atan(v[2], v[1]); angle < 0 ? 2π - angle : angle) # ------------------------------------------------------------- -struct Shape - x::Vector{Float64} - y::Vector{Float64} +struct Shape{X<:Number,Y<:Number} + x::Vector{X} + y::Vector{Y} # function Shape(x::AVec, y::AVec) # # if x[1] != x[end] || y[1] != y[end] # # new(vcat(x, x[1]), vcat(y, y[1])) @@ -38,115 +41,113 @@ vertices(shape::Shape) = collect(zip(shape.x, shape.y)) @deprecate shape_coords coords "return the vertex points from a Shape or Segments object" -function coords(shape::Shape) - shape.x, shape.y -end +coords(shape::Shape) = shape.x, shape.y -function coords(shapes::AVec{Shape}) - length(shapes) == 0 && return zeros(0), zeros(0) - xs = map(get_xs, shapes) - ys = map(get_ys, shapes) - x, y = map(copy, coords(shapes[1])) - for shape in shapes[2:end] - nanappend!(x, shape.x) - nanappend!(y, shape.y) - end +#coords(shapes::AVec{Shape}) = unzip(map(coords, shapes)) +function coords(shapes::AVec{<:Shape}) + c = map(coords, shapes) + x = [q[1] for q in c] + y = [q[2] for q in c] x, y end "get an array of tuples of points on a circle with radius `r`" -function partialcircle(start_θ, end_θ, n = 20, r=1) - Tuple{Float64,Float64}[(r*cos(u),r*sin(u)) for u in range(start_θ, stop=end_θ, length=n)] -end +partialcircle(start_θ, end_θ, n = 20, r = 1) = + [(r * cos(u), r * sin(u)) for u in range(start_θ, stop = end_θ, length = n)] "interleave 2 vectors into each other (like a zipper's teeth)" -function weave(x,y; ordering = Vector[x,y]) - ret = eltype(x)[] - done = false - while !done - for o in ordering - try - push!(ret, popfirst!(o)) - catch - end +function weave(x, y; ordering = Vector[x, y]) + ret = eltype(x)[] + done = false + while !done + for o in ordering + try + push!(ret, popfirst!(o)) + catch + end + end + done = isempty(x) && isempty(y) end - done = isempty(x) && isempty(y) - end - ret + ret end "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) z1 = offset * π z2 = z1 + π / (n) - outercircle = partialcircle(z1, z1 + 2π, n+1, radius) - innercircle = partialcircle(z2, z2 + 2π, n+1, 0.4radius) + outercircle = partialcircle(z1, z1 + 2π, n + 1, radius) + innercircle = partialcircle(z2, z2 + 2π, n + 1, 0.4radius) Shape(weave(outercircle, innercircle)) end "create a shape by picking points around the unit circle. `n` is the number of point/sides, `offset` is the starting angle" -function makeshape(n; offset = -0.5, radius = 1.0) - z = offset * π - Shape(partialcircle(z, z + 2π, n+1, radius)) -end +makeshape(n; offset = -0.5, radius = 1.0) = + Shape(partialcircle(offset * π, offset * π + 2π, n + 1, radius)) function makecross(; offset = -0.5, radius = 1.0) z2 = offset * π - z1 = z2 - π/8 + z1 = z2 - π / 8 outercircle = partialcircle(z1, z1 + 2π, 9, radius) innercircle = partialcircle(z2, z2 + 2π, 5, 0.5radius) - Shape(weave(outercircle, innercircle, - ordering=Vector[outercircle,innercircle,outercircle])) + Shape( + weave( + outercircle, + innercircle, + ordering = Vector[outercircle, innercircle, outercircle], + ), + ) 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) - tip = from_polar(angle, h) - Shape(P2[(0,0), from_polar(angle - 0.5π, w) - tip, - from_polar(angle + 0.5π, w) - tip, (0,0)]) -end +makearrowhead(angle; h = 2.0, w = 0.4, tip = from_polar(angle, h)) = Shape( + P2[ + (0, 0), + from_polar(angle - 0.5π, w) - tip, + from_polar(angle + 0.5π, w) - tip, + (0, 0), + ], +) const _shapes = KW( :circle => makeshape(20), - :rect => makeshape(4, offset=-0.25), - :diamond => makeshape(4), - :utriangle => makeshape(3, offset=0.5), - :dtriangle => makeshape(3, offset=-0.5), - :rtriangle => makeshape(3, offset=0.0), - :ltriangle => makeshape(3, offset=1.0), - :pentagon => makeshape(5), - :hexagon => makeshape(6), - :heptagon => makeshape(7), - :octagon => makeshape(8), - :cross => makecross(offset=-0.25), - :xcross => makecross(), - :vline => Shape([(0,1),(0,-1)]), - :hline => Shape([(1,0),(-1,0)]), - ) + :rect => makeshape(4, offset = -0.25), + :diamond => makeshape(4), + :utriangle => makeshape(3, offset = 0.5), + :dtriangle => makeshape(3, offset = -0.5), + :rtriangle => makeshape(3, offset = 0.0), + :ltriangle => makeshape(3, offset = 1.0), + :pentagon => makeshape(5), + :hexagon => makeshape(6), + :heptagon => makeshape(7), + :octagon => makeshape(8), + :cross => makecross(offset = -0.25), + :xcross => makecross(), + :vline => Shape([(0, 1), (0, -1)]), + :hline => Shape([(1, 0), (-1, 0)]), +) -for n in [4,5,6,7,8] - _shapes[Symbol("star$n")] = makestar(n) +for n in 4:8 + _shapes[Symbol("star$n")] = makestar(n) end Shape(k::Symbol) = deepcopy(_shapes[k]) # ----------------------------------------------------------------------- - # uses the centroid calculation from https://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon "return the centroid of a Shape" function center(shape::Shape) x, y = coords(shape) n = length(x) - A, Cx, Cy = 0.0, 0.0, 0.0 - for i=1:n - ip1 = i==n ? 1 : i+1 + A, Cx, Cy = 0, 0, 0 + for i in 1:n + ip1 = i == n ? 1 : i + 1 A += x[i] * y[ip1] - x[ip1] * y[i] end A *= 0.5 - for i=1:n - ip1 = i==n ? 1 : i+1 + for i in 1:n + ip1 = i == n ? 1 : i + 1 m = (x[i] * y[ip1] - x[ip1] * y[i]) Cx += (x[i] + x[ip1]) * m Cy += (y[i] + y[ip1]) * m @@ -157,73 +158,64 @@ end function scale!(shape::Shape, x::Real, y::Real = x, c = center(shape)) sx, sy = coords(shape) cx, cy = c - for i=eachindex(sx) + for i in eachindex(sx) sx[i] = (sx[i] - cx) * x + cx sy[i] = (sy[i] - cy) * y + cy end shape end -function scale(shape::Shape, x::Real, y::Real = x, c = center(shape)) - shapecopy = deepcopy(shape) - scale!(shapecopy, x, y, c) -end +scale(shape::Shape, x::Real, y::Real = x, c = center(shape)) = + scale!(deepcopy(shape), x, y, c) "translate a Shape in space" function translate!(shape::Shape, x::Real, y::Real = x) sx, sy = coords(shape) - for i=eachindex(sx) + for i in eachindex(sx) sx[i] += x sy[i] += y end shape end -function translate(shape::Shape, x::Real, y::Real = x) - shapecopy = deepcopy(shape) - translate!(shapecopy, x, y) -end +translate(shape::Shape, x::Real, y::Real = x) = translate!(deepcopy(shape), x, y) -function rotate_x(x::Real, y::Real, Θ::Real, centerx::Real, centery::Real) - (x - centerx) * cos(Θ) - (y - centery) * sin(Θ) + centerx -end +rotate_x(x::Real, y::Real, Θ::Real, centerx::Real, centery::Real) = + ((x - centerx) * cos(Θ) - (y - centery) * sin(Θ) + centerx) -function rotate_y(x::Real, y::Real, Θ::Real, centerx::Real, centery::Real) - (y - centery) * cos(Θ) + (x - centerx) * sin(Θ) + centery -end +rotate_y(x::Real, y::Real, Θ::Real, centerx::Real, centery::Real) = + ((y - centery) * cos(Θ) + (x - centerx) * sin(Θ) + centery) -function rotate(x::Real, y::Real, θ::Real, c = center(shape)) - cx, cy = c - rotate_x(x, y, Θ, cx, cy), rotate_y(x, y, Θ, cx, cy) -end +rotate(x::Real, y::Real, θ::Real, c = center(shape)) = + (rotate_x(x, y, Θ, c...), rotate_y(x, y, Θ, c...)) function rotate!(shape::Shape, Θ::Real, c = center(shape)) x, y = coords(shape) - cx, cy = c - for i=eachindex(x) - xi = rotate_x(x[i], y[i], Θ, cx, cy) - yi = rotate_y(x[i], y[i], Θ, cx, cy) + for i in eachindex(x) + xi = rotate_x(x[i], y[i], Θ, c...) + yi = rotate_y(x[i], y[i], Θ, c...) x[i], y[i] = xi, yi end shape end "rotate an object in space" -function rotate(shape::Shape, Θ::Real, c = center(shape)) - shapecopy = deepcopy(shape) - rotate!(shapecopy, Θ, c) +function rotate(shape::Shape, θ::Real, c = center(shape)) + x, y = coords(shape) + x_new = rotate_x.(x, y, θ, c...) + y_new = rotate_y.(x, y, θ, c...) + Shape(x_new, y_new) end # ----------------------------------------------------------------------- - mutable struct Font - family::AbstractString - pointsize::Int - halign::Symbol - valign::Symbol - rotation::Float64 - color::Colorant + family::AbstractString + pointsize::Int + halign::Symbol + valign::Symbol + rotation::Float64 + color::Colorant end """ @@ -240,80 +232,75 @@ arguments (which are distinguished by type/value) or as keyword arguments. # Examples ```julia-repl julia> font(8) -julia> font(family="serif",halign=:center,rotation=45.0) +julia> font(family="serif", halign=:center, rotation=45.0) ``` """ -function font(args...;kw...) +function font(args...; kw...) + # defaults + family = "sans-serif" + pointsize = 14 + halign = :hcenter + valign = :vcenter + rotation = 0 + color = colorant"black" - # defaults - family = "sans-serif" - pointsize = 14 - halign = :hcenter - valign = :vcenter - rotation = 0.0 - color = colorant"black" + for arg in args + T = typeof(arg) - for arg in args - T = typeof(arg) - - if T == Font - family = arg.family - pointsize = arg.pointsize - halign = arg.halign - valign = arg.valign - rotation = arg.rotation - color = arg.color - elseif arg == :center - halign = :hcenter - valign = :vcenter - elseif arg in (:hcenter, :left, :right) - halign = arg - elseif arg in (:vcenter, :top, :bottom) - valign = arg - elseif T <: Colorant - color = arg - elseif T <: Symbol || T <: AbstractString - try - color = parse(Colorant, string(arg)) - catch - family = string(arg) - end - elseif typeof(arg) <: Integer - pointsize = arg - elseif typeof(arg) <: Real - rotation = convert(Float64, arg) - else - @warn("Unused font arg: $arg ($(typeof(arg)))") + if T == Font + family = arg.family + pointsize = arg.pointsize + halign = arg.halign + valign = arg.valign + rotation = arg.rotation + color = arg.color + elseif arg == :center + halign = :hcenter + valign = :vcenter + elseif arg ∈ _haligns + halign = arg + elseif arg ∈ _valigns + valign = arg + elseif T <: Colorant + color = arg + elseif T <: Symbol || T <: AbstractString + try + color = parse(Colorant, string(arg)) + catch + family = string(arg) + end + elseif typeof(arg) <: Integer + pointsize = arg + elseif typeof(arg) <: Real + rotation = convert(Float64, arg) + else + @warn "Unused font arg: $arg ($(typeof(arg)))" + end end - end - for symbol in keys(kw) - if symbol == :family - family = kw[:family] - elseif symbol == :pointsize - pointsize = kw[:pointsize] - elseif symbol == :halign - halign = kw[:halign] - if halign == :center - halign = :hcenter - end - @assert halign in (:hcenter, :left, :right) - elseif symbol == :valign - valign = kw[:valign] - if valign == :center - valign = :vcenter - end - @assert valign in (:vcenter, :top, :bottom) - elseif symbol == :rotation - rotation = kw[:rotation] - elseif symbol == :color - color = parse(Colorant, kw[:color]) - else - @warn("Unused font kwarg: $symbol") + for sym in keys(kw) + if sym == :family + family = string(kw[sym]) + elseif sym == :pointsize + pointsize = kw[sym] + elseif sym == :halign + halign = kw[sym] + halign == :center && (halign = :hcenter) + @assert halign ∈ _haligns + elseif sym == :valign + valign = kw[sym] + valign == :center && (valign = :vcenter) + @assert valign ∈ _valigns + elseif sym == :rotation + rotation = kw[sym] + elseif sym == :color + color = parse(Colorant, kw[sym]) + else + @warn "Unused font kwarg: $sym" + end end - end - Font(family, pointsize, halign, valign, rotation, color) + Font(family, pointsize, halign, valign, rotation, color) end function scalefontsize(k::Symbol, factor::Number) @@ -328,12 +315,12 @@ 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()` """ function scalefontsizes(factor::Number) - for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize) + for k in keys(merge(_initial_plt_fontsizes, _initial_sp_fontsizes)) scalefontsize(k, factor) end - for letter in (:x,:y,:z) - for k in (:guidefontsize, :tickfontsize) + for letter in (:x, :y, :z) + for k in keys(_initial_ax_fontsizes) scalefontsize(Symbol(letter, k), factor) end end @@ -345,20 +332,20 @@ end Resets font sizes to initial default values. """ function scalefontsizes() - for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize) + for k in keys(merge(_initial_plt_fontsizes, _initial_sp_fontsizes)) f = default(k) if k in keys(_initial_fontsizes) factor = f / _initial_fontsizes[k] - scalefontsize(k, 1.0/factor) + scalefontsize(k, 1.0 / factor) end end - for letter in (:x,:y,:z) - for k in (:guidefontsize, :tickfontsize) + for letter in (:x, :y, :z) + for k in keys(_initial_ax_fontsizes) if k in keys(_initial_fontsizes) f = default(Symbol(letter, k)) factor = f / _initial_fontsizes[k] - scalefontsize(Symbol(letter, k), 1.0/factor) + scalefontsize(Symbol(letter, k), 1.0 / factor) end end end @@ -368,8 +355,8 @@ resetfontsizes() = scalefontsizes() "Wrap a string with font info" struct PlotText - str::AbstractString - font::Font + str::AbstractString + font::Font end PlotText(str) = PlotText(string(str), font()) @@ -382,21 +369,17 @@ Create a PlotText object wrapping a string with font info, for plot annotations. text(t::PlotText) = t text(t::PlotText, font::Font) = PlotText(t.str, font) text(str::AbstractString, f::Font) = PlotText(str, f) -function text(str, args...;kw...) - PlotText(string(str), font(args...;kw...)) -end +text(str, args...; kw...) = PlotText(string(str), font(args...; kw...)) Base.length(t::PlotText) = length(t.str) # ----------------------------------------------------------------------- -# ----------------------------------------------------------------------- - struct Stroke - width - color - alpha - style + width + color + alpha + style end """ @@ -405,132 +388,141 @@ end Define the properties of the stroke used in plotting lines """ function stroke(args...; alpha = nothing) - width = 1 - color = :black - style = :solid + width = 1 + color = :black + style = :solid - for arg in args - T = typeof(arg) + for arg in args + T = typeof(arg) - # if arg in _allStyles - if allStyles(arg) - style = arg - elseif T <: Colorant - color = arg - elseif T <: Symbol || T <: AbstractString - try - color = parse(Colorant, string(arg)) - catch - end - elseif allAlphas(arg) - alpha = arg - elseif allReals(arg) - width = arg - else - @warn("Unused stroke arg: $arg ($(typeof(arg)))") + # if arg in _allStyles + if allStyles(arg) + style = arg + elseif T <: Colorant + color = arg + elseif T <: Symbol || T <: AbstractString + try + color = parse(Colorant, string(arg)) + catch + end + elseif allAlphas(arg) + alpha = arg + elseif allReals(arg) + width = arg + else + @warn "Unused stroke arg: $arg ($(typeof(arg)))" + end end - end - Stroke(width, color, alpha, style) + Stroke(width, color, alpha, style) end - struct Brush - size # fillrange, markersize, or any other sizey attribute - color - alpha + size # fillrange, markersize, or any other sizey attribute + color + alpha end function brush(args...; alpha = nothing) - size = 1 - color = :black + size = 1 + color = :black - for arg in args - T = typeof(arg) + for arg in args + T = typeof(arg) - if T <: Colorant - color = arg - elseif T <: Symbol || T <: AbstractString - try - color = parse(Colorant, string(arg)) - catch - end - elseif allAlphas(arg) - alpha = arg - elseif allReals(arg) - size = arg - else - @warn("Unused brush arg: $arg ($(typeof(arg)))") + if T <: Colorant + color = arg + elseif T <: Symbol || T <: AbstractString + try + color = parse(Colorant, string(arg)) + catch + end + elseif allAlphas(arg) + alpha = arg + elseif allReals(arg) + size = arg + else + @warn "Unused brush arg: $arg ($(typeof(arg)))" + end end - end - Brush(size, color, alpha) + Brush(size, color, alpha) end # ----------------------------------------------------------------------- mutable struct SeriesAnnotations - strs::AbstractVector # the labels/names + strs::AVec # the labels/names font::Font - baseshape::Union{Shape, AbstractVector{Shape}, Nothing} + baseshape::Union{Shape,AVec{Shape},Nothing} scalefactor::Tuple end -function series_annotations(strs::AbstractVector, args...) + +_text_label(lab::Tuple, font) = text(lab[1], font, lab[2:end]...) +_text_label(lab::PlotText, font) = lab +_text_label(lab, font) = text(lab, font) + +series_annotations(anns::AMat) = map(series_annotations, anns) +series_annotations(scalar) = series_annotations([scalar]) +series_annotations(anns::SeriesAnnotations) = anns +series_annotations(::Nothing) = nothing + +function series_annotations(strs::AVec, args...) fnt = font() shp = nothing - scalefactor = (1,1) + scalefactor = 1, 1 for arg in args - if isa(arg, Shape) || (isa(arg, AbstractVector) && eltype(arg) == Shape) + if isa(arg, Shape) || (isa(arg, AVec) && eltype(arg) == Shape) shp = arg elseif isa(arg, Font) fnt = arg elseif isa(arg, Symbol) && haskey(_shapes, arg) shp = _shapes[arg] elseif isa(arg, Number) - scalefactor = (arg,arg) + scalefactor = arg, arg elseif is_2tuple(arg) scalefactor = arg + elseif isa(arg, AVec) + strs = collect(zip(strs, arg)) else - @warn("Unused SeriesAnnotations arg: $arg ($(typeof(arg)))") + @warn "Unused SeriesAnnotations arg: $arg ($(typeof(arg)))" end end # if scalefactor != 1 # for s in get(shp) - # scale!(s, scalefactor, scalefactor, (0,0)) + # scale!(s, scalefactor, scalefactor, (0, 0)) # end # end - SeriesAnnotations(strs, fnt, shp, scalefactor) + SeriesAnnotations([_text_label(s, fnt) for s in strs], fnt, shp, scalefactor) end -series_annotations(anns::SeriesAnnotations) = anns -series_annotations(::Nothing) = nothing function series_annotations_shapes!(series::Series, scaletype::Symbol = :pixels) anns = series[:series_annotations] - # msw,msh = anns.scalefactor + # msw, msh = anns.scalefactor # ms = series[:markersize] - # msw,msh = if isa(ms, AbstractVector) - # 1,1 + # msw, msh = if isa(ms, AVec) + # 1, 1 # elseif is_2tuple(ms) # ms # else - # ms,ms + # ms, ms # end # @show msw msh if anns !== nothing && anns.baseshape !== nothing # we use baseshape to overwrite the markershape attribute # with a list of custom shapes for each - msw,msh = anns.scalefactor + msw, msh = anns.scalefactor msize = Float64[] shapes = Vector{Shape}(undef, length(anns.strs)) for i in eachindex(anns.strs) - str = _cycle(anns.strs,i) + str = _cycle(anns.strs, i) # get the width and height of the string (in mm) sw, sh = text_size(str, anns.font.pointsize) # how much to scale the base shape? - # note: it's a rough assumption that the shape fills the unit box [-1,-1,1,1], + # note: it's a rough assumption that the shape fills the unit box [-1, -1, 1, 1], # so we scale the length-2 shape by 1/2 the total length scalar = (backend() == PyPlotBackend() ? 1.7 : 1.0) xscale = 0.5to_pixels(sw) * scalar @@ -541,7 +533,8 @@ function series_annotations_shapes!(series::Series, scaletype::Symbol = :pixels) maxscale = max(xscale, yscale) push!(msize, maxscale) baseshape = _cycle(anns.baseshape, i) - shapes[i] = scale(baseshape, msw*xscale/maxscale, msh*yscale/maxscale, (0,0)) + shapes[i] = + scale(baseshape, msw * xscale / maxscale, msh * yscale / maxscale, (0, 0)) end series[:markershape] = shapes series[:markersize] = msize @@ -557,89 +550,120 @@ end function Base.iterate(ea::EachAnn, i = 1) if ea.anns === nothing || isempty(ea.anns.strs) || i > length(ea.y) - return nothing + return end - tmp = _cycle(ea.anns.strs,i) - str,fnt = if isa(tmp, PlotText) + tmp = _cycle(ea.anns.strs, i) + str, fnt = if isa(tmp, PlotText) tmp.str, tmp.font else tmp, ea.anns.font end - ((_cycle(ea.x,i), _cycle(ea.y,i), str, fnt), i+1) + ((_cycle(ea.x, i), _cycle(ea.y, i), str, fnt), i + 1) end -annotations(::Nothing) = [] +# ----------------------------------------------------------------------- +annotations(anns::AMat) = map(annotations, anns) +annotations(sa::SeriesAnnotations) = sa annotations(anns::AVec) = anns annotations(anns) = Any[anns] -annotations(sa::SeriesAnnotations) = sa +annotations(::Nothing) = [] -# Expand arrays of coordinates, positions and labels into induvidual annotations +_annotationfont(sp::Subplot) = Plots.font(; + family = sp[:annotationfontfamily], + pointsize = sp[:annotationfontsize], + halign = sp[:annotationhalign], + valign = sp[:annotationvalign], + rotation = sp[:annotationrotation], + color = sp[:annotationcolor], +) + +_annotation(sp::Subplot, font, lab, pos...; alphabet = "abcdefghijklmnopqrstuvwxyz") = ( + pos..., + lab == :auto ? text("($(alphabet[sp[:subplot_index]]))", font) : _text_label(lab, font), +) + +# Expand arrays of coordinates, positions and labels into individual annotations # and make sure labels are of type PlotText -function process_annotation(sp::Subplot, xs, ys, labs, font = font()) +function process_annotation(sp::Subplot, xs, ys, labs, font = _annotationfont(sp)) anns = [] labs = makevec(labs) xlength = length(methods(length, (typeof(xs),))) == 0 ? 1 : length(xs) ylength = length(methods(length, (typeof(ys),))) == 0 ? 1 : length(ys) for i in 1:max(xlength, ylength, length(labs)) - x, y, lab = _cycle(xs, i), _cycle(ys, i), _cycle(labs, i) + x, y, lab = _cycle(xs, i), _cycle(ys, i), _cycle(labs, i) x = typeof(x) <: TimeType ? Dates.value(x) : x y = typeof(y) <: TimeType ? Dates.value(y) : y - if lab == :auto - alphabet = "abcdefghijklmnopqrstuvwxyz" - push!(anns, (x, y, text(string("(", alphabet[sp[:subplot_index]], ")"), font))) - else - push!(anns, (x, y, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab...) : text(lab, font))) - end + push!(anns, _annotation(sp, font, lab, x, y)) end anns end -function process_annotation(sp::Subplot, positions::Union{AVec{Symbol},Symbol}, labs, font = font()) + +function process_annotation( + sp::Subplot, + positions::Union{AVec{Symbol},Symbol,Tuple}, + labs, + font = _annotationfont(sp), +) anns = [] positions, labs = makevec(positions), makevec(labs) for i in 1:max(length(positions), length(labs)) pos, lab = _cycle(positions, i), _cycle(labs, i) - pos = get(_positionAliases, pos, pos) - if lab == :auto - alphabet = "abcdefghijklmnopqrstuvwxyz" - push!(anns, (pos, text(string("(", alphabet[sp[:subplot_index]], ")"), font))) - else - push!(anns, (pos, isa(lab, PlotText) ? lab : isa(lab, Tuple) ? text(lab...) : text(lab, font))) - end + push!(anns, _annotation(sp, font, lab, get(_positionAliases, pos, pos))) end anns end -function process_any_label(lab, font=Font()) - lab isa Tuple ? text(lab...) : text( lab, font ) -end +_relative_position(xmin, xmax, pos::Length{:pct}) = xmin + pos.value * (xmax - xmin) + # Give each annotation coordinates based on specified position -function locate_annotation(sp::Subplot, pos::Symbol, lab::PlotText) - position_multiplier = Dict{Symbol, Tuple{Float64,Float64}}( - :topleft => (0.1, 0.9), - :topcenter => (0.5, 0.9), - :topright => (0.9, 0.9), - :bottomleft => (0.1, 0.1), - :bottomcenter => (0.5, 0.1), - :bottomright => (0.9, 0.1), +function locate_annotation( + sp::Subplot, + pos::Symbol, + label::PlotText; + position_multiplier = Dict{Symbol,Tuple{Float64,Float64}}( + :topleft => (0.1pct, 0.9pct), + :topcenter => (0.5pct, 0.9pct), + :topright => (0.9pct, 0.9pct), + :bottomleft => (0.1pct, 0.1pct), + :bottomcenter => (0.5pct, 0.1pct), + :bottomright => (0.9pct, 0.1pct), + ), +) + x, y = position_multiplier[pos] + ( + _relative_position(axis_limits(sp, :x)..., x), + _relative_position(axis_limits(sp, :y)..., y), + label, ) - xmin, xmax = ignorenan_extrema(sp[:xaxis]) - ymin, ymax = ignorenan_extrema(sp[:yaxis]) - x, y = (xmin, ymin).+ position_multiplier[pos].* (xmax - xmin, ymax - ymin) - (x, y, lab) end locate_annotation(sp::Subplot, x, y, label::PlotText) = (x, y, label) locate_annotation(sp::Subplot, x, y, z, label::PlotText) = (x, y, z, label) + +locate_annotation(sp::Subplot, rel::NTuple{2,<:Number}, label::PlotText) = ( + _relative_position(axis_limits(sp, :x)..., rel[1] * Plots.pct), + _relative_position(axis_limits(sp, :y)..., rel[2] * Plots.pct), + label, +) +locate_annotation(sp::Subplot, rel::NTuple{3,<:Number}, label::PlotText) = ( + _relative_position(axis_limits(sp, :x)..., rel[1] * Plots.pct), + _relative_position(axis_limits(sp, :y)..., rel[2] * Plots.pct), + _relative_position(axis_limits(sp, :z)..., rel[3] * Plots.pct), + label, +) # ----------------------------------------------------------------------- "type which represents z-values for colors and sizes (and anything else that might come up)" struct ZValues - values::Vector{Float64} - zrange::Tuple{Float64,Float64} + values::Vector{Float64} + zrange::Tuple{Float64,Float64} end -function zvalues(values::AVec{T}, zrange::Tuple{T,T} = (ignorenan_minimum(values), ignorenan_maximum(values))) where T<:Real - ZValues(collect(float(values)), map(Float64, zrange)) +function zvalues( + values::AVec{T}, + zrange::Tuple{T,T} = (ignorenan_minimum(values), ignorenan_maximum(values)), +) where {T<:Real} + ZValues(collect(float(values)), map(Float64, zrange)) end # ----------------------------------------------------------------------- @@ -657,13 +681,10 @@ struct SurfaceFunction <: AbstractSurface f::Function end - # ----------------------------------------------------------------------- # # I don't want to clash with ValidatedNumerics, but this would be nice: -# ..(a::T, b::T) = (a,b) - - +# ..(a::T, b::T) = (a, b) # ----------------------------------------------------------------------- @@ -684,8 +705,7 @@ Define arrowheads to apply to lines - args are `style` (`:open` or `:closed`), function arrow(args...) style = :simple side = :head - headlength = 0.3 - headwidth = 0.3 + headlength = headwidth = 0.3 setlength = false for arg in args T = typeof(arg) @@ -705,21 +725,20 @@ function arrow(args...) elseif T <: Tuple && length(arg) == 2 headlength, headwidth = Float64(arg[1]), Float64(arg[2]) else - @warn("Skipped arrow arg $arg") + @warn "Skipped arrow arg $arg" end end Arrow(style, side, headlength, headwidth) end - # allow for do-block notation which gets called on every valid start/end pair which # we need to draw an arrow function add_arrows(func::Function, x::AVec, y::AVec) - for i=2:length(x) - xyprev = (x[i-1], y[i-1]) + for i in 2:length(x) + xyprev = (x[i - 1], y[i - 1]) xy = (x[i], y[i]) if ok(xyprev) && ok(xy) - if i==length(x) || !ok(x[i+1], y[i+1]) + if i == length(x) || !ok(x[i + 1], y[i + 1]) # add the arrow from xyprev to xy func(xyprev, xy) end @@ -729,32 +748,27 @@ end # ----------------------------------------------------------------------- "create a BezierCurve for plotting" -mutable struct BezierCurve{T <: GeometryTypes.Point} +mutable struct BezierCurve{T<:GeometryBasics.Point} control_points::Vector{T} end function (bc::BezierCurve)(t::Real) p = zero(P2) - n = length(bc.control_points)-1 + n = length(bc.control_points) - 1 for i in 0:n - p += bc.control_points[i+1] * binomial(n, i) * (1-t)^(n-i) * t^i + p += bc.control_points[i + 1] * binomial(n, i) * (1 - t)^(n - i) * t^i end p end @deprecate curve_points coords -coords(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, Base.range(first(range), stop=last(range), length=n)) - -# build a BezierCurve which leaves point p vertically upwards and arrives point q vertically upwards. -# may create a loop if necessary. Assumes the view is [0,1] -function directed_curve(args...; kw...) - error("directed_curve has been moved to PlotRecipes") -end +coords(curve::BezierCurve, n::Integer = 30; range = [0, 1]) = + map(curve, Base.range(first(range), stop = last(range), length = n)) function extrema_plus_buffer(v, buffmult = 0.2) - vmin,vmax = ignorenan_extrema(v) - vdiff = vmax-vmin + vmin, vmax = ignorenan_extrema(v) + vdiff = vmax - vmin buffer = vdiff * buffmult vmin - buffer, vmax + buffer end diff --git a/src/examples.jl b/src/examples.jl index c5efc2fc..6cd1e9b3 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -7,7 +7,7 @@ mutable struct PlotExample exprs::Vector{Expr} end -# the _examples we'll run for each +# the _examples we'll run for each backend const _examples = PlotExample[ PlotExample( # 1 "Lines", @@ -28,35 +28,33 @@ const _examples = PlotExample[ to generate the animation.) Use command `gif(anim, filename, fps=15)` to save the animation. """, - [:( - begin - p = plot([sin, cos], zeros(0), leg = false, xlims = (0, 2π), ylims = (-1, 1)) - anim = Animation() - for x in range(0, stop = 2π, length = 20) - push!(p, x, Float64[sin(x), cos(x)]) - frame(anim) + [ + :( + begin + p = plot( + [sin, cos], + zeros(0), + leg = false, + xlims = (0, 2π), + ylims = (-1, 1), + ) + anim = Animation() + for x in range(0, stop = 2π, length = 20) + push!(p, x, Float64[sin(x), cos(x)]) + frame(anim) + end end - end - )], + ), + ], ), PlotExample( # 3 "Parametric plots", "Plot function pair (x(u), y(u)).", - [ - :( + [:( begin - plot( - sin, - x -> sin(2x), - 0, - 2π, - line = 4, - leg = false, - fill = (0, :orange), - ) + plot(sin, x -> sin(2x), 0, 2π, line = 4, leg = false, fill = (0, :orange)) end - ), - ], + )], ), PlotExample( # 4 "Colors", @@ -115,12 +113,11 @@ const _examples = PlotExample[ ) vline!([5, 10]) title!("TITLE") - yaxis!("YLABEL", :log10) + yaxis!("YLABEL", :log10, minorgrid = true) end ), ], ), - PlotExample( # 6 "Images", "Plot an image. y-axis is set to flipped", @@ -128,8 +125,9 @@ const _examples = PlotExample[ :( begin import FileIO - path = - download("http://juliaplots.org/PlotReferenceImages.jl/Plots/pyplot/0.7.0/ref1.png") + path = download( + "http://juliaplots.org/PlotReferenceImages.jl/Plots/pyplot/0.7.0/ref1.png", + ) img = FileIO.load(path) plot(img) end @@ -190,12 +188,11 @@ const _examples = PlotExample[ PlotExample( # 11 "Line types", "", - [ - :( + [:( begin linetypes = [:path :steppre :steppost :sticks :scatter] n = length(linetypes) - x = Vector[sort(rand(20)) for i = 1:n] + x = Vector[sort(rand(20)) for i in 1:n] y = rand(20, n) plot( x, @@ -205,8 +202,7 @@ const _examples = PlotExample[ ms = 15, ) end - ), - ], + )], ), PlotExample( # 12 "Line styles", @@ -237,18 +233,17 @@ const _examples = PlotExample[ [ :( begin - markers = filter( - m -> m in Plots.supported_markers(), - Plots._shape_keys, - ) - markers = reshape(markers, 1, length(markers)) + markers = + filter(m -> m in Plots.supported_markers(), Plots._shape_keys) + markers = permutedims(markers) n = length(markers) x = range(0, stop = 10, length = n + 2)[2:(end - 1)] y = repeat(reshape(reverse(x), 1, :), n, 1) scatter( x, y, - m = (8, :auto), + m = markers, + markersize = 8, lab = map(string, markers), bg = :linen, xlim = (0, 10), @@ -270,17 +265,11 @@ const _examples = PlotExample[ PlotExample( # 15 "Histogram", "", - [ - :( + [:( begin - histogram( - randn(1000), - bins = :scott, - weights = repeat(1:5, outer = 200), - ) + histogram(randn(1000), bins = :scott, weights = repeat(1:5, outer = 200)) end - ), - ], + )], ), PlotExample( # 16 "Subplots", @@ -326,15 +315,13 @@ const _examples = PlotExample[ PlotExample( # 18 "", "", - [ - :( - begin - using Random - Random.seed!(111) - plot!(Plots.fakedata(100, 10)) - end - ) - ] + [:( + begin + using Random + Random.seed!(111) + plot!(Plots.fakedata(100, 10)) + end + )], ), PlotExample( # 19 "Open/High/Low/Close", @@ -357,8 +344,7 @@ const _examples = PlotExample[ bot[i] + hgt[i], bot[i], closepct[i] * hgt[i] + bot[i], - ) - for i = 1:n + ) for i in 1:n ] ohlc(y) end @@ -369,10 +355,21 @@ const _examples = PlotExample[ "Annotations", """ The `annotations` keyword is used for text annotations in data-coordinates. Pass in a - tuple (x,y,text) or a vector of annotations. `annotate!(ann)` is shorthand for `plot!(; - annotation=ann)`. Series annotations are used for annotating individual data points. - They require only the annotation... x/y values are computed. A `PlotText` object can be - build with the method `text(string, attr...)`, which wraps font and color attributes. + tuple `(x, y, text)`, a vector of annotations, each of which is a tuple of `x`, `y` + and `text`. You can position annotations using relative coordinates with the syntax + `((px, py), text)`, where for example `px=.25` positions the annotation at `25%` of + the subplot's axis width. + `text` may be a simple `String`, or a `PlotText` object, which can be built with the + method `text(string, attrs...)`. + This wraps font and color attributes and allows you to set text styling. + `text` may also be a tuple `(string, attrs...)` of arguments which are passed + to `Plots.text`. + + `annotate!(ann)` is shorthand for `plot!(; annotation=ann)`. + + Series annotations are used for annotating individual data points. + They require only the annotation; x/y values are computed. Series annotations + require either plain `String`s or `PlotText` objects. """, [ :( @@ -384,12 +381,8 @@ const _examples = PlotExample[ leg = false, ) annotate!([ - (5, y[5], Plots.text("this is #5", 16, :red, :center)), - ( - 10, - y[10], - Plots.text("this is #10", :right, 20, "courier"), - ), + (5, y[5], ("this is #5", 16, :red, :center)), + (10, y[10], ("this is #10", :right, 20, "courier")), ]) scatter!( range(2, stop = 8, length = 6), @@ -568,8 +561,8 @@ const _examples = PlotExample[ "", [:( begin - xs = [string("x", i) for i = 1:10] - ys = [string("y", i) for i = 1:4] + xs = [string("x", i) for i in 1:10] + ys = [string("y", i) for i in 1:4] z = float((1:4) * reshape(1:10, 1, :)) heatmap(xs, ys, z, aspect_ratio = 1) end @@ -604,12 +597,7 @@ const _examples = PlotExample[ begin import RDatasets singers = RDatasets.dataset("lattice", "singer") - @df singers violin( - :VoicePart, - :Height, - line = 0, - fill = (0.2, :blue), - ) + @df singers violin(:VoicePart, :Height, line = 0, fill = (0.2, :blue)) @df singers boxplot!( :VoicePart, :Height, @@ -637,11 +625,7 @@ const _examples = PlotExample[ anim = Animation() for x in range(1, stop = 2π, length = 20) - plot(push!( - p, - x, - Float64[sin(x), cos(x), atan(x), cos(x), log(x)], - )) + plot(push!(p, x, Float64[sin(x), cos(x), atan(x), cos(x), log(x)])) frame(anim) end end @@ -666,18 +650,8 @@ const _examples = PlotExample[ 10 => ones(40), -10 => ones(40), ) - b = spdiagm( - 0 => 1:50, - 1 => 1:49, - -1 => 1:49, - 10 => 1:40, - -10 => 1:40, - ) - plot( - spy(a), - spy(b), - title = ["Unique nonzeros" "Different nonzeros"], - ) + b = spdiagm(0 => 1:50, 1 => 1:49, -1 => 1:49, 10 => 1:40, -10 => 1:40) + plot(spy(a), spy(b), title = ["Unique nonzeros" "Different nonzeros"]) end ), ], @@ -742,51 +716,37 @@ const _examples = PlotExample[ You can use the `line_z` and `marker_z` properties to associate a color with each line segment or marker in the plot. """, - [ - :( - begin - t = range(0, stop = 1, length = 100) - θ = 6π .* t - x = t .* cos.(θ) - y = t .* sin.(θ) - p1 = plot(x, y, line_z = t, linewidth = 3, legend = false) - p2 = scatter( - x, - y, - marker_z = +, - color = :bluesreds, - legend = false, - ) - plot(p1, p2) - end - ), - ], + [:( + begin + t = range(0, stop = 1, length = 100) + θ = 6π .* t + x = t .* cos.(θ) + y = t .* sin.(θ) + p1 = plot(x, y, line_z = t, linewidth = 3, legend = false) + p2 = scatter(x, y, marker_z = +, color = :bluesreds, legend = false) + plot(p1, p2) + end + )], ), PlotExample( # 36 "Portfolio Composition maps", """ see: http://stackoverflow.com/a/37732384/5075246 """, - [ - :( - begin - using Random - Random.seed!(111) - tickers = ["IBM", "Google", "Apple", "Intel"] - N = 10 - D = length(tickers) - weights = rand(N, D) - weights ./= sum(weights, dims = 2) - returns = sort!((1:N) + D * randn(N)) + [:( + begin + using Random + Random.seed!(111) + tickers = ["IBM", "Google", "Apple", "Intel"] + N = 10 + D = length(tickers) + weights = rand(N, D) + weights ./= sum(weights, dims = 2) + returns = sort!((1:N) + D * randn(N)) - portfoliocomposition( - weights, - returns, - labels = permutedims(tickers), - ) - end - ), - ], + portfoliocomposition(weights, returns, labels = permutedims(tickers)) + end + )], ), PlotExample( # 37 "Ribbons", @@ -799,10 +759,7 @@ const _examples = PlotExample[ :( begin plot( - plot( - 0:10; - ribbon = (LinRange(0, 2, 11), LinRange(0, 1, 11)), - ), + plot(0:10; ribbon = (LinRange(0, 2, 11), LinRange(0, 1, 11))), plot(0:10; ribbon = 0:0.5:5), plot(0:10; ribbon = sqrt), plot(0:10; ribbon = 1), @@ -867,11 +824,7 @@ const _examples = PlotExample[ plot!([(0, 0), (0, 0.9), (2, 0.9), (3, 1), (4, 0.9), (80, 0)]) plot!([(0, 0), (0, 0.9), (3, 0.9), (4, 1), (5, 0.9), (80, 0)]) plot!([(0, 0), (0, 0.9), (4, 0.9), (5, 1), (6, 0.9), (80, 0)]) - lens!( - [1, 6], - [0.9, 1.1], - inset = (1, bbox(0.5, 0.0, 0.4, 0.4)), - ) + lens!([1, 6], [0.9, 1.1], inset = (1, bbox(0.5, 0.0, 0.4, 0.4))) end end, ], @@ -879,17 +832,15 @@ const _examples = PlotExample[ PlotExample( # 41 "Array Types", "Plots supports different `Array` types that follow the `AbstractArray` interface, like `StaticArrays` and `OffsetArrays.`", - [ - quote - begin - using StaticArrays, OffsetArrays - sv = SVector{10}(rand(10)) - ov = OffsetVector(rand(10), -2) - plot([sv, ov], label = ["StaticArray" "OffsetArray"]) - plot!(3ov, ribbon=ov, label="OffsetArray ribbon") - end - end, - ], + [quote + begin + using StaticArrays, OffsetArrays + sv = SVector{10}(rand(10)) + ov = OffsetVector(rand(10), -2) + plot([sv, ov], label = ["StaticArray" "OffsetArray"]) + plot!(3ov, ribbon = ov, label = "OffsetArray ribbon") + end + end], ), PlotExample( # 42 "Setting defaults and font arguments", @@ -905,7 +856,7 @@ const _examples = PlotExample[ tickfont = (12, :orange), guide = "x", framestyle = :zerolines, - yminorgrid = true + yminorgrid = true, ) plot( [sin, cos], @@ -924,29 +875,25 @@ const _examples = PlotExample[ PlotExample( # 43 "Heatmap with DateTime axis", "", - [ - quote - begin - using Dates - z = rand(5, 5) - x = DateTime.(2016:2020) - y = 1:5 - heatmap(x, y, z) - end - end, - ], + [quote + begin + using Dates + z = rand(5, 5) + x = DateTime.(2016:2020) + y = 1:5 + heatmap(x, y, z) + end + end], ), PlotExample( # 44 "Linked axes", "", - [ - quote - begin - x = -5:0.1:5 - plot(plot(x, x->x^2), plot(x, x->sin(x)), layout = 2, link = :y) - end - end, - ], + [quote + begin + x = -5:0.1:5 + plot(plot(x, x -> x^2), plot(x, x -> sin(x)), layout = 2, link = :y) + end + end], ), PlotExample( # 45 "Error bars and array type recipes", @@ -961,8 +908,21 @@ const _examples = PlotExample[ value(m::Measurement) = m.val uncertainty(m::Measurement) = m.err - @recipe function f(::Type{T}, m::T) where T <: AbstractArray{<:Measurement} - if !(get(plotattributes, :seriestype, :path) in [:contour, :contourf, :contour3d, :heatmap, :surface, :wireframe, :image]) + @recipe function f( + ::Type{T}, + m::T, + ) where {T<:AbstractArray{<:Measurement}} + if !( + get(plotattributes, :seriestype, :path) in [ + :contour, + :contourf, + :contour3d, + :heatmap, + :surface, + :wireframe, + :image, + ] + ) error_sym = Symbol(plotattributes[:letter], :error) plotattributes[error_sym] = uncertainty.(m) end @@ -972,14 +932,14 @@ const _examples = PlotExample[ x = Measurement.(10sort(rand(10)), rand(10)) y = Measurement.(10sort(rand(10)), rand(10)) z = Measurement.(10sort(rand(10)), rand(10)) - surf = Measurement.((1:10) .* (1:10)', rand(10,10)) + surf = Measurement.((1:10) .* (1:10)', rand(10, 10)) plot( scatter(x, [x y]), scatter(x, y, z), heatmap(x, y, surf), wireframe(x, y, surf), - legend = :topleft + legend = :topleft, ) end end, @@ -992,90 +952,291 @@ const _examples = PlotExample[ 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] + 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] + "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] + # 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 - ), - ], + # the four triangles gives above give a tetrahedron + mesh3d( + x, + y, + z; + connections = (i, j, k), + title = "triangles", + xlabel = "x", + ylabel = "y", + zlabel = "z", + legend = :none, + margin = 2Plots.mm, + ) + 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] + [ + quote + using Base.Iterators: cycle, take + + yv = ones(9) + ys = [1; 1; NaN; ones(6)] + y = 5 .- [yv 2ys 3yv 4ys] + + plt_color_rows = plot( + y, + seriestype = [:path :path :scatter :scatter], + markershape = collect(take(cycle((:utriangle, :rect)), 9)), + markersize = 8, + color = collect(take(cycle((:red, :black)), 9)), + ) + + plt_z_cols = plot( + y, + markershape = [:utriangle :x :circle :square], + markersize = [5 10 10 5], + marker_z = [5 4 3 2], + line_z = [1 3 3 1], + linewidth = [1 10 5 1], + ) + + plot(plt_color_rows, plt_z_cols) + end, + ], ), PlotExample( # 49 "Polar heatmaps", "", [quote + x = range(0, 2π, length = 9) + y = 0:4 z = (1:4) .+ (1:8)' - heatmap(z, projection = :polar) - end] + heatmap(x, y, 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( # 52 + "3d quiver", + "", [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] + 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], + ), + PlotExample( # 53 + "Step Types", + "A comparison of the various step-like `seriestype`s", + [ + :( + begin + x = 1:5 + y = [1, 2, 3, 2, 1] + default(shape = :circle) + plot( + plot( + x, + y, + markershape = :circle, + seriestype = :steppre, + label = "steppre", + ), + plot( + x, + y, + markershape = :circle, + seriestype = :stepmid, + label = "stepmid", + ), + plot( + x, + y, + markershape = :circle, + seriestype = :steppost, + label = "steppost", + ), + layout = (3, 1), + ) + end + ), + ], + ), + PlotExample( # 54 + "Guide positions and alignment", + "", + [ + :( + begin + plot( + rand(10, 4), + layout = 4, + xguide = "x guide", + yguide = "y guide", + xguidefonthalign = [:left :right :right :left], + yguidefontvalign = [:top :bottom :bottom :top], + xguideposition = :top, + yguideposition = [:right :left :right :left], + ymirror = [false true true false], + xmirror = [false false true true], + legend = false, + seriestype = [:bar :scatter :path :stepmid], + ) + end + ), + ], + ), + PlotExample( # 55 + "3D axis flip / mirror", + "", + [ + :( + begin + using LinearAlgebra + scalefontsizes(0.4) + + x, y = collect(-6:0.5:10), collect(-8:0.5:8) + + args = x, y, (x, y) -> sinc(norm([x, y]) / π) + kwargs = Dict( + :xlabel => "x", + :ylabel => "y", + :zlabel => "z", + :grid => true, + :minorgrid => true, + ) + + plots = [wireframe(args..., title = "wire"; kwargs...)] + + for ax in (:x, :y, :z) + push!( + plots, + wireframe( + args..., + title = "wire-flip-$ax", + xflip = ax == :x, + yflip = ax == :y, + zflip = ax == :z; + kwargs..., + ), + ) + end + + for ax in (:x, :y, :z) + push!( + plots, + wireframe( + args..., + title = "wire-mirror-$ax", + xmirror = ax == :x, + ymirror = ax == :y, + zmirror = ax == :z; + kwargs..., + ), + ) + end + + plt = plot( + plots..., + layout = (@layout [_ ° _; ° ° °; ° ° °]), + margin = 0Plots.px, + ) + + resetfontsizes() + plt + end + ), + ], ), ] # Some constants for PlotDocs and PlotReferenceImages _animation_examples = [2, 31] _backend_skips = Dict( - :gr => [25, 30, 47], - :pyplot => [2, 25, 30, 31, 47, 49], - :plotlyjs => [2, 21, 24, 25, 30, 31, 49], - :plotly => [2, 21, 24, 25, 30, 31, 49], + :gr => [25, 30], + :pyplot => [2, 25, 30, 31, 47, 49, 55], + :plotlyjs => [2, 21, 24, 25, 30, 31, 49, 51, 55], + :plotly => [2, 21, 24, 25, 30, 31, 49, 50, 51, 55], :pgfplotsx => [ 2, # animation 6, # images @@ -1084,11 +1245,18 @@ _backend_skips = Dict( 31, # animation 32, # spy 49, # polar heatmap + 51, # image with custom axes + ], + :inspectdr => [4, 6, 10, 22, 24, 28, 30, 38, 43, 45, 47, 48, 49, 50, 51, 55], + :unicodeplots => [6, 10, 22, 24, 28, 38, 43, 45, 47, 49, 50, 51, 55], + :gaston => [ + 2, # animations + 31, # animations + 49, # TODO: support polar + 50, # TODO: 1D data not supported for pm3d ], ) - - # --------------------------------------------------------------------------------- # make and display one plot diff --git a/src/fileio.jl b/src/fileio.jl index dbb0469e..624eeff5 100644 --- a/src/fileio.jl +++ b/src/fileio.jl @@ -1,8 +1,10 @@ # --------------------------------------------------------- # A backup, if no PNG generation is defined, is to try to make a PDF and use FileIO to convert -_fileio_load(@nospecialize(filename::AbstractString)) = FileIO.load(filename::AbstractString) -_fileio_save(@nospecialize(filename::AbstractString), @nospecialize(x)) = FileIO.save(filename::AbstractString, x) +_fileio_load(@nospecialize(filename::AbstractString)) = + FileIO.load(filename::AbstractString) +_fileio_save(@nospecialize(filename::AbstractString), @nospecialize(x)) = + FileIO.save(filename::AbstractString, x) function _show_pdfbackends(io::IO, ::MIME"image/png", plt::Plot) fn = tempname() @@ -21,4 +23,5 @@ function _show_pdfbackends(io::IO, ::MIME"image/png", plt::Plot) write(io, read(open(pngfn), String)) end -const PDFBackends = Union{PGFPlotsBackend,PlotlyJSBackend,PyPlotBackend,InspectDRBackend,GRBackend} +const PDFBackends = + Union{PGFPlotsBackend,PlotlyJSBackend,PyPlotBackend,InspectDRBackend,GRBackend} diff --git a/src/ijulia.jl b/src/ijulia.jl index 13fc3b2e..3cf8da78 100644 --- a/src/ijulia.jl +++ b/src/ijulia.jl @@ -1,15 +1,14 @@ const use_local_dependencies = Ref(false) const use_local_plotlyjs = Ref(false) - function _init_ijulia_plotting() # IJulia is more stable with local file - use_local_plotlyjs[] = plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[]) + use_local_plotlyjs[] = + plotly_local_file_path[] === nothing ? false : isfile(plotly_local_file_path[]) ENV["MPLBACKEND"] = "Agg" end - """ Add extra jupyter mimetypes to display_dict based on the plot backed. @@ -20,22 +19,17 @@ frontends like jupyterlab and nteract. _ijulia__extra_mime_info!(plt::Plot, out::Dict) = out function _ijulia__extra_mime_info!(plt::Plot{PlotlyJSBackend}, out::Dict) - out["application/vnd.plotly.v1+json"] = Dict( - :data => plotly_series(plt), - :layout => plotly_layout(plt) - ) + out["application/vnd.plotly.v1+json"] = + Dict(:data => plotly_series(plt), :layout => plotly_layout(plt)) out end function _ijulia__extra_mime_info!(plt::Plot{PlotlyBackend}, out::Dict) - out["application/vnd.plotly.v1+json"] = Dict( - :data => plotly_series(plt), - :layout => plotly_layout(plt) - ) + out["application/vnd.plotly.v1+json"] = + Dict(:data => plotly_series(plt), :layout => plotly_layout(plt)) out end - function _ijulia_display_dict(plt::Plot) output_type = Symbol(plt.attr[:html_output_format]) if output_type == :auto @@ -54,9 +48,9 @@ function _ijulia_display_dict(plt::Plot) elseif output_type == :html mime = "text/html" out[mime] = sprint(show, MIME(mime), plt) + _ijulia__extra_mime_info!(plt, out) else error("Unsupported output type $output_type") end - _ijulia__extra_mime_info!(plt, out) out end diff --git a/src/init.jl b/src/init.jl index 3cb22c79..8f8303a6 100644 --- a/src/init.jl +++ b/src/init.jl @@ -1,8 +1,7 @@ using REPL using Scratch -const plotly_local_file_path = Ref{Union{Nothing, String}}(nothing) - +const plotly_local_file_path = Ref{Union{Nothing,String}}(nothing) function _plots_defaults() if isdefined(Main, :PLOTS_DEFAULTS) @@ -12,7 +11,6 @@ function _plots_defaults() end end - function __init__() user_defaults = _plots_defaults() if haskey(user_defaults, :theme) @@ -21,14 +19,27 @@ function __init__() default(; user_defaults...) end - insert!(Base.Multimedia.displays, findlast(x -> x isa Base.TextDisplay || x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, PlotsDisplay()) + insert!( + Base.Multimedia.displays, + findlast( + x -> x isa Base.TextDisplay || x isa REPL.REPLDisplay, + Base.Multimedia.displays, + ) + 1, + PlotsDisplay(), + ) - atreplinit(i -> begin - while PlotsDisplay() in Base.Multimedia.displays - popdisplay(PlotsDisplay()) - end - insert!(Base.Multimedia.displays, findlast(x -> x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, PlotsDisplay()) - end) + atreplinit( + i -> begin + while PlotsDisplay() in Base.Multimedia.displays + popdisplay(PlotsDisplay()) + end + insert!( + Base.Multimedia.displays, + findlast(x -> x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, + PlotsDisplay(), + ) + end, + ) @require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" begin fn = joinpath(@__DIR__, "backends", "hdf5.jl") @@ -70,6 +81,11 @@ function __init__() include(fn) end + @require Gaston = "4b11ee91-296f-5714-9832-002c20994614" begin + fn = joinpath(@__DIR__, "backends", "gaston.jl") + include(fn) + end + @require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin if IJulia.inited _init_ijulia_plotting() @@ -79,9 +95,13 @@ function __init__() end if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true" - global plotly_local_file_path[] = joinpath(@get_scratch!("plotly"), "plotly-1.54.2.min.js") + global plotly_local_file_path[] = + joinpath(@get_scratch!("plotly"), _plotly_min_js_filename) if !isfile(plotly_local_file_path[]) - download("https://cdn.plot.ly/plotly-1.54.2.min.js", plotly_local_file_path[]) + download( + "https://cdn.plot.ly/$(_plotly_min_js_filename)", + plotly_local_file_path[], + ) end use_local_plotlyjs[] = true @@ -89,8 +109,8 @@ function __init__() use_local_dependencies[] = use_local_plotlyjs[] - @require FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" begin - _show(io::IO, mime::MIME"image/png", plt::Plot{<:PDFBackends}) = _show_pdfbackends(io, mime, plt) + _show(io::IO, mime::MIME"image/png", plt::Plot{<:PDFBackends}) = + _show_pdfbackends(io, mime, plt) end end diff --git a/src/layouts.jl b/src/layouts.jl index ff4d0041..3d620fd1 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -18,16 +18,16 @@ ispositive(m::Measure) = m.value > 0 # union together bounding boxes function Base.:+(bb1::BoundingBox, bb2::BoundingBox) # empty boxes don't change the union - ispositive(width(bb1)) || return bb2 + ispositive(width(bb1)) || return bb2 ispositive(height(bb1)) || return bb2 - ispositive(width(bb2)) || return bb1 + ispositive(width(bb2)) || return bb1 ispositive(height(bb2)) || return bb1 l = min(left(bb1), left(bb2)) t = min(top(bb1), top(bb2)) r = max(right(bb1), right(bb2)) b = max(bottom(bb1), bottom(bb2)) - BoundingBox(l, t, r-l, b-t) + BoundingBox(l, t, r - l, b - t) end # this creates a bounding box in the parent's scope, where the child bounding box @@ -53,7 +53,7 @@ end # convert a bounding box from absolute coords to percentages... # returns an array of percentages of figure size: [left, bottom, width, height] function bbox_to_pcts(bb::BoundingBox, figw, figh, flipy = true) - mms = Float64[f(bb).value for f in (left,bottom,width,height)] + mms = Float64[f(bb).value for f in (left, bottom, width, height)] if flipy mms[2] = figh.value - mms[2] # flip y when origin in bottom-left end @@ -61,7 +61,10 @@ function bbox_to_pcts(bb::BoundingBox, figw, figh, flipy = true) end function Base.show(io::IO, bbox::BoundingBox) - print(io, "BBox{l,t,r,b,w,h = $(left(bbox)),$(top(bbox)), $(right(bbox)),$(bottom(bbox)), $(width(bbox)),$(height(bbox))}") + print( + io, + "BBox{l,t,r,b,w,h = $(left(bbox)),$(top(bbox)), $(right(bbox)),$(bottom(bbox)), $(width(bbox)),$(height(bbox))}", + ) end # ----------------------------------------------------------- @@ -83,12 +86,11 @@ function resolve_mixed(mix::MixedMeasures, sp::Subplot, letter::Symbol) end if pct != 0 amin, amax = axis_limits(sp, letter) - xy += pct * (amax-amin) + xy += pct * (amax - amin) end xy end - # ----------------------------------------------------------- # AbstractLayout @@ -160,7 +162,8 @@ parent_bbox(layout::AbstractLayout) = bbox(parent(layout)) # padding(layout::AbstractLayout) = (padding_w(layout), padding_h(layout)) update_position!(layout::AbstractLayout) = nothing -update_child_bboxes!(layout::AbstractLayout, minimum_perimeter = [0mm,0mm,0mm,0mm]) = nothing +update_child_bboxes!(layout::AbstractLayout, minimum_perimeter = [0mm, 0mm, 0mm, 0mm]) = + nothing left(layout::AbstractLayout) = left(bbox(layout)) top(layout::AbstractLayout) = top(bbox(layout)) @@ -206,7 +209,7 @@ mutable struct EmptyLayout <: AbstractLayout end EmptyLayout(parent = RootLayout(); kw...) = EmptyLayout(parent, defaultbox, KW(kw)) -Base.size(layout::EmptyLayout) = (0,0) +Base.size(layout::EmptyLayout) = (0, 0) Base.length(layout::EmptyLayout) = 0 Base.getindex(layout::EmptyLayout, r::Int, c::Int) = nothing @@ -235,22 +238,25 @@ columns of different width. """ grid(args...; kw...) = GridLayout(args...; kw...) -function GridLayout(dims...; - parent = RootLayout(), - widths = zeros(dims[2]), - heights = zeros(dims[1]), - kw...) +function GridLayout( + dims...; + parent = RootLayout(), + widths = zeros(dims[2]), + heights = zeros(dims[1]), + kw..., +) grid = Matrix{AbstractLayout}(undef, dims...) layout = GridLayout( parent, (20mm, 5mm, 2mm, 10mm), defaultbox, grid, - Measure[w*pct for w in widths], - Measure[h*pct for h in heights], + Measure[w * pct for w in widths], + Measure[h * pct for h in heights], # convert(Vector{Float64}, widths), # convert(Vector{Float64}, heights), - KW(kw)) + KW(kw), + ) for i in eachindex(grid) grid[i] = EmptyLayout(layout) end @@ -259,9 +265,9 @@ end Base.size(layout::GridLayout) = size(layout.grid) Base.length(layout::GridLayout) = length(layout.grid) -Base.getindex(layout::GridLayout, r::Int, c::Int) = layout.grid[r,c] +Base.getindex(layout::GridLayout, r::Int, c::Int) = layout.grid[r, c] function Base.setindex!(layout::GridLayout, v, r::Int, c::Int) - layout.grid[r,c] = v + layout.grid[r, c] = v end leftpad(layout::GridLayout) = layout.minpad[1] @@ -269,7 +275,6 @@ toppad(layout::GridLayout) = layout.minpad[2] rightpad(layout::GridLayout) = layout.minpad[3] bottompad(layout::GridLayout) = layout.minpad[4] - # here's how this works... first we recursively "update the minimum padding" (which # means to calculate the minimum size needed from the edge of the subplot to plot area) # for the whole layout tree. then we can compute the "padding borders" of this @@ -281,14 +286,13 @@ bottompad(layout::GridLayout) = layout.minpad[4] function _update_min_padding!(layout::GridLayout) map(_update_min_padding!, layout.grid) layout.minpad = ( - maximum(map(leftpad, layout.grid[:,1])), - maximum(map(toppad, layout.grid[1,:])), - maximum(map(rightpad, layout.grid[:,end])), - maximum(map(bottompad, layout.grid[end,:])) + maximum(map(leftpad, layout.grid[:, 1])), + maximum(map(toppad, layout.grid[1, :])), + maximum(map(rightpad, layout.grid[:, end])), + maximum(map(bottompad, layout.grid[end, :])), ) end - function update_position!(layout::GridLayout) map(update_position!, layout.grid) end @@ -307,7 +311,9 @@ function recompute_lengths(v) end leftover = 1.0pct - tot if cnt > 1 && leftover.value <= 0 - error("Not enough length left over in layout! v = $v, cnt = $cnt, leftover = $leftover") + error( + "Not enough length left over in layout! v = $v, cnt = $cnt, leftover = $leftover", + ) end # now fill in the blanks @@ -315,21 +321,21 @@ function recompute_lengths(v) end # 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) # # create a matrix for each minimum padding direction # _update_min_padding!(layout) - minpad_left = map(leftpad, layout.grid) - minpad_top = map(toppad, layout.grid) - minpad_right = map(rightpad, layout.grid) + minpad_left = map(leftpad, layout.grid) + minpad_top = map(toppad, layout.grid) + minpad_right = map(rightpad, layout.grid) minpad_bottom = map(bottompad, layout.grid) # get the max horizontal (left and right) padding over columns, # and max vertical (bottom and top) padding over rows # TODO: add extra padding here - pad_left = maximum(minpad_left, dims = 1) - pad_top = maximum(minpad_top, dims = 2) - pad_right = maximum(minpad_right, dims = 1) + pad_left = maximum(minpad_left, dims = 1) + pad_top = maximum(minpad_top, dims = 2) + pad_right = maximum(minpad_right, dims = 1) pad_bottom = maximum(minpad_bottom, dims = 2) # make sure the perimeter match the parent @@ -343,7 +349,7 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0 total_pad_vertical = sum(pad_top + pad_bottom) # now we can compute the total plot area in each direction - total_plotarea_horizontal = width(layout) - total_pad_horizontal + total_plotarea_horizontal = width(layout) - total_pad_horizontal total_plotarea_vertical = height(layout) - total_pad_vertical # recompute widths/heights @@ -355,19 +361,22 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0 # denom_h = sum(layout.heights) # we have all the data we need... lets compute the plot areas and set the bounding boxes - for r=1:nr, c=1:nc - child = layout[r,c] + for r in 1:nr, c in 1:nc + child = layout[r, c] # get the top-left corner of this child... the first one is top-left of the parent (i.e. layout) - child_left = (c == 1 ? left(layout.bbox) : right(layout[r, c-1].bbox)) - child_top = (r == 1 ? top(layout.bbox) : bottom(layout[r-1, c].bbox)) + child_left = (c == 1 ? left(layout.bbox) : right(layout[r, c - 1].bbox)) + child_top = (r == 1 ? top(layout.bbox) : bottom(layout[r - 1, c].bbox)) # compute plot area plotarea_left = child_left + pad_left[c] plotarea_top = child_top + pad_top[r] plotarea_width = total_plotarea_horizontal * layout.widths[c] plotarea_height = total_plotarea_vertical * layout.heights[r] - plotarea!(child, BoundingBox(plotarea_left, plotarea_top, plotarea_width, plotarea_height)) + plotarea!( + child, + BoundingBox(plotarea_left, plotarea_top, plotarea_width, plotarea_height), + ) # compute child bbox child_width = pad_left[c] + plotarea_width + pad_right[c] @@ -377,10 +386,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 # all children on this border have the same value min_child_perimeter = [ - c == 1 ? layout.minpad[1] : pad_left[c], - r == 1 ? layout.minpad[2] : pad_top[r], + c == 1 ? layout.minpad[1] : pad_left[c], + r == 1 ? layout.minpad[2] : pad_top[r], c == nc ? layout.minpad[3] : pad_right[c], - r == nr ? layout.minpad[4] : pad_bottom[r] + r == nr ? layout.minpad[4] : pad_bottom[r], ] # recursively update the child's children @@ -395,18 +404,21 @@ function update_inset_bboxes!(plt::Plot) p_area = Measures.resolve(plotarea(sp.parent), sp[:relative_bbox]) plotarea!(sp, p_area) - bbox!(sp, bbox( - left(p_area) - leftpad(sp), - top(p_area) - toppad(sp), - width(p_area) + leftpad(sp) + rightpad(sp), - height(p_area) + toppad(sp) + bottompad(sp) - )) + bbox!( + sp, + bbox( + left(p_area) - leftpad(sp), + top(p_area) - toppad(sp), + width(p_area) + leftpad(sp) + rightpad(sp), + height(p_area) + toppad(sp) + bottompad(sp), + ), + ) end end # ---------------------------------------------------------------------- -calc_num_subplots(layout::AbstractLayout) = 1 +calc_num_subplots(layout::AbstractLayout) = get(layout.attr, :blank, false) ? 0 : 1 function calc_num_subplots(layout::GridLayout) tot = 0 for l in layout.grid @@ -441,7 +453,9 @@ end function layout_args(plotattributes::AKW, n_override::Integer) layout, n = layout_args(n_override, get(plotattributes, :layout, n_override)) if n != n_override - error("When doing layout, n ($n) != n_override ($(n_override)). You're probably trying to force existing plots into a layout that doesn't fit them.") + error( + "When doing layout, n ($n) != n_override ($(n_override)). You're probably trying to force existing plots into a layout that doesn't fit them.", + ) end layout, n end @@ -451,27 +465,27 @@ function layout_args(n::Integer) GridLayout(nr, nc), n end -function layout_args(sztup::NTuple{2, Integer}) +function layout_args(sztup::NTuple{2,Integer}) nr, nc = sztup - GridLayout(nr, nc), nr*nc + GridLayout(nr, nc), nr * nc end layout_args(n_override::Integer, n::Integer) = layout_args(n) -layout_args(n, sztup::NTuple{2, Integer}) = layout_args(sztup) +layout_args(n, sztup::NTuple{2,Integer}) = layout_args(sztup) -function layout_args(n, sztup::Tuple{Colon, Integer}) +function layout_args(n, sztup::Tuple{Colon,Integer}) nc = sztup[2] nr = ceil(Int, n / nc) GridLayout(nr, nc), n end -function layout_args(n, sztup::Tuple{Integer, Colon}) +function layout_args(n, sztup::Tuple{Integer,Colon}) nr = sztup[1] nc = ceil(Int, n / nr) GridLayout(nr, nc), n end -function layout_args(sztup::NTuple{3, Integer}) +function layout_args(sztup::NTuple{3,Integer}) n, nr, nc = sztup nr, nc = compute_gridsize(n, nr, nc) GridLayout(nr, nc), n @@ -488,53 +502,58 @@ layout_args(n_override::Integer, layout::GridLayout) = layout_args(layout) layout_args(huh) = error("unhandled layout type $(typeof(huh)): $huh") - # ---------------------------------------------------------------------- - function build_layout(args...) layout, n = layout_args(args...) - build_layout(layout, n) + build_layout(layout, n, Array{Plot}(undef, 0)) end -# # just a single subplot -# function build_layout(sp::Subplot, n::Integer) -# sp, Subplot[sp], SubplotMap(gensym() => sp) -# end - -# n is the number of subplots... build a grid and initialize the inner subplots recursively -function build_layout(layout::GridLayout, n::Integer) +# n is the number of subplots... +function build_layout(layout::GridLayout, n::Integer, plts::AVec{Plot}) nr, nc = size(layout) subplots = Subplot[] spmap = SubplotMap() + empty = isempty(plts) i = 0 - for r=1:nr, c=1:nc - l = layout[r,c] + for r in 1:nr, c in 1:nc + l = layout[r, c] if isa(l, EmptyLayout) && !get(l.attr, :blank, false) - sp = Subplot(backend(), parent=layout) - layout[r,c] = sp - push!(subplots, sp) - spmap[attr(l,:label,gensym())] = sp + if empty + # initialize the inner subplots recursively + sp = Subplot(backend(), parent = layout) + layout[r, c] = sp + push!(subplots, sp) + spmap[attr(l, :label, gensym())] = sp + inc = 1 + else + # build a layout from a list of existing Plot objects + plt = popfirst!(plts) # grab the first plot out of the list + layout[r, c] = plt.layout + append!(subplots, plt.subplots) + merge!(spmap, plt.spmap) + inc = length(plt.subplots) + end if get(l.attr, :width, :auto) != :auto - layout.widths[c] = attr(l,:width) + layout.widths[c] = attr(l, :width) end if get(l.attr, :height, :auto) != :auto - layout.heights[r] = attr(l,:height) + layout.heights[r] = attr(l, :height) end - i += 1 + i += inc elseif isa(l, GridLayout) # sub-grid if get(l.attr, :width, :auto) != :auto - layout.widths[c] = attr(l,:width) + layout.widths[c] = attr(l, :width) end if get(l.attr, :height, :auto) != :auto - layout.heights[r] = attr(l,:height) + layout.heights[r] = attr(l, :height) end - l, sps, m = build_layout(l, n-i) + l, sps, m = build_layout(l, n - i, plts) append!(subplots, sps) merge!(spmap, m) i += length(sps) - elseif isa(l, Subplot) + elseif isa(l, Subplot) && empty error("Subplot exists. Cannot re-use existing layout. Please make a new one.") end i >= n && break # only add n subplots @@ -543,46 +562,6 @@ function build_layout(layout::GridLayout, n::Integer) layout, subplots, spmap end -# build a layout from a list of existing Plot objects -# TODO... much of the logic overlaps with the method above... can we merge? -function build_layout(layout::GridLayout, numsp::Integer, plts::AVec{Plot}) - nr, nc = size(layout) - subplots = Subplot[] - spmap = SubplotMap() - i = 0 - for r=1:nr, c=1:nc - l = layout[r,c] - if isa(l, EmptyLayout) && !get(l.attr, :blank, false) - plt = popfirst!(plts) # grab the first plot out of the list - layout[r,c] = plt.layout - append!(subplots, plt.subplots) - merge!(spmap, plt.spmap) - if get(l.attr, :width, :auto) != :auto - layout.widths[c] = attr(l,:width) - end - if get(l.attr, :height, :auto) != :auto - layout.heights[r] = attr(l,:height) - end - i += length(plt.subplots) - elseif isa(l, GridLayout) - # sub-grid - if get(l.attr, :width, :auto) != :auto - layout.widths[c] = attr(l,:width) - end - if get(l.attr, :height, :auto) != :auto - layout.heights[r] = attr(l,:height) - end - l, sps, m = build_layout(l, numsp-i, plts) - append!(subplots, sps) - merge!(spmap, m) - i += length(sps) - end - i >= numsp && break # only add n subplots - end - layout, subplots, spmap -end - - # ---------------------------------------------------------------------- # @layout macro @@ -594,9 +573,9 @@ function add_layout_pct!(kw::AKW, v::Expr, idx::Integer, nidx::Integer) if length(v.args) == 3 && isa(num, Number) units = v.args[3] if units == :h - return kw[:h] = num*pct + return kw[:h] = num * pct elseif units == :w - return kw[:w] = num*pct + return kw[:w] = num * pct elseif units in (:pct, :px, :mm, :cm, :inch) idx == 1 && (kw[:w] = v) (idx == 2 || nidx == 1) && (kw[:h] = v) @@ -609,23 +588,29 @@ end function add_layout_pct!(kw::AKW, v::Number, idx::Integer) # kw[idx == 1 ? :w : :h] = v*pct - idx == 1 && (kw[:w] = v*pct) - (idx == 2 || nidx == 1) && (kw[:h] = v*pct) + idx == 1 && (kw[:w] = v * pct) + (idx == 2 || nidx == 1) && (kw[:h] = v * pct) end -isrow(v) = isa(v, Expr) && v.head in (:hcat,:row) +isrow(v) = isa(v, Expr) && v.head in (:hcat, :row) iscol(v) = isa(v, Expr) && v.head == :vcat rowsize(v) = isrow(v) ? length(v.args) : 1 - function create_grid(expr::Expr) if iscol(expr) create_grid_vcat(expr) elseif isrow(expr) - :(let cell = GridLayout(1, $(length(expr.args))) - $([:(cell[1,$i] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...) - cell - end) + :( + let cell = GridLayout(1, $(length(expr.args))) + $( + [ + :(cell[1, $i] = $(create_grid(v))) for + (i, v) in enumerate(expr.args) + ]... + ) + cell + end + ) elseif expr.head == :curly create_grid_curly(expr) @@ -644,39 +629,58 @@ function create_grid_vcat(expr::Expr) nr = length(expr.args) nc = rmin body = Expr(:block) - for r=1:nr + for r in 1:nr arg = expr.args[r] if isrow(arg) - for (c,item) in enumerate(arg.args) - push!(body.args, :(cell[$r,$c] = $(create_grid(item)))) + for (c, item) in enumerate(arg.args) + push!(body.args, :(cell[$r, $c] = $(create_grid(item)))) end else - push!(body.args, :(cell[$r,1] = $(create_grid(arg)))) + push!(body.args, :(cell[$r, 1] = $(create_grid(arg)))) end end - :(let cell = GridLayout($nr, $nc) - $body - cell - end) + :( + let cell = GridLayout($nr, $nc) + $body + cell + end + ) else # otherwise just build one row at a time - :(let cell = GridLayout($(length(expr.args)), 1) - $([:(cell[$i,1] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...) - cell - end) + :( + let cell = GridLayout($(length(expr.args)), 1) + $( + [ + :(cell[$i, 1] = $(create_grid(v))) for + (i, v) in enumerate(expr.args) + ]... + ) + cell + end + ) end end function create_grid_curly(expr::Expr) kw = KW() - for (i,arg) in enumerate(expr.args[2:end]) - add_layout_pct!(kw, arg, i, length(expr.args)-1) + for (i, arg) in enumerate(expr.args[2:end]) + add_layout_pct!(kw, arg, i, length(expr.args) - 1) end s = expr.args[1] if isa(s, Expr) && s.head == :call && s.args[1] == :grid - create_grid(:(grid($(s.args[2:end]...), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto)))))) + create_grid( + :(grid( + $(s.args[2:end]...), + width = $(get(kw, :w, QuoteNode(:auto))), + height = $(get(kw, :h, QuoteNode(:auto))), + )), + ) elseif isa(s, Symbol) - :(EmptyLayout(label = $(QuoteNode(s)), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto))))) + :(EmptyLayout( + label = $(QuoteNode(s)), + width = $(get(kw, :w, QuoteNode(:auto))), + height = $(get(kw, :h, QuoteNode(:auto))), + )) else error("Unknown use of curly brackets: $expr") end @@ -690,14 +694,13 @@ macro layout(mat::Expr) create_grid(mat) end - # ------------------------------------------------------------------------- # make all reference the same axis extrema/values. # merge subplot lists. function link_axes!(axes::Axis...) a1 = axes[1] - for i=2:length(axes) + for i in 2:length(axes) a2 = axes[i] expand_extrema!(a1, ignorenan_extrema(a2)) for k in (:extrema, :discrete_values, :continuous_values, :discrete_map) @@ -719,8 +722,8 @@ function link_subplots(a::AbstractArray{AbstractLayout}, axissym::Symbol) for l in a if isa(l, Subplot) push!(subplots, l) - elseif isa(l, GridLayout) && size(l) == (1,1) - push!(subplots, l[1,1]) + elseif isa(l, GridLayout) && size(l) == (1, 1) + push!(subplots, l[1, 1]) end end subplots @@ -736,20 +739,19 @@ function link_axes!(a::AbstractArray{AbstractLayout}, axissym::Symbol) end # don't do anything for most layout types -function link_axes!(l::AbstractLayout, link::Symbol) -end +function link_axes!(l::AbstractLayout, link::Symbol) end # process a GridLayout, recursively linking axes according to the link symbol function link_axes!(layout::GridLayout, link::Symbol) nr, nc = size(layout) if link in (:x, :both) - for c=1:nc - link_axes!(layout.grid[:,c], :xaxis) + for c in 1:nc + link_axes!(layout.grid[:, c], :xaxis) end end if link in (:y, :both) - for r=1:nr - link_axes!(layout.grid[r,:], :yaxis) + for r in 1:nr + link_axes!(layout.grid[r, :], :yaxis) end end if link == :square @@ -775,11 +777,20 @@ end "Adds a new, empty subplot overlayed on top of `sp`, with a mirrored y-axis and linked x-axis." function twinx(sp::Subplot) - sp[:right_margin] = max(sp[:right_margin], 30px) - plot!(sp.plt, inset = (sp[:subplot_index], bbox(0,0,1,1))) + plot!( + sp.plt, + inset = (sp[:subplot_index], bbox(0, 0, 1, 1)), + right_margin = sp[:right_margin], + left_margin = sp[:left_margin], + top_margin = sp[:top_margin], + bottom_margin = sp[:bottom_margin], + ) twinsp = sp.plt.subplots[end] + twinsp[:xaxis][:grid] = false + twinsp[:yaxis][:grid] = false + twinsp[:xaxis][:showaxis] = false twinsp[:yaxis][:mirror] = true - twinsp[:background_color_inside] = RGBA{Float64}(0,0,0,0) + twinsp[:background_color_inside] = RGBA{Float64}(0, 0, 0, 0) link_axes!(sp[:xaxis], twinsp[:xaxis]) twinsp end diff --git a/src/legend.jl b/src/legend.jl new file mode 100644 index 00000000..0d3c3def --- /dev/null +++ b/src/legend.jl @@ -0,0 +1,58 @@ +""" +```julia +legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax, inout) +``` + +Return `(x,y)` at an angle `theta` degrees from +`(xcenter,ycenter)` on a rectangle defined by (`xmin`, +`xmax`, `ymin`, `ymax`). +""" +function legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax) + (s, c) = sincosd(theta) + x = c < 0 ? (xmin - xcenter) / c : (xmax - xcenter) / c + y = s < 0 ? (ymin - ycenter) / s : (ymax - ycenter) / s + A = min(x, y) + return (xcenter + A * c, ycenter + A * s) +end + +""" +Split continuous range `[-1,1]` evenly into an integer `[1,2,3]` +""" +function legend_anchor_index(x) + x < -1 // 3 && return 1 + x < 1 // 3 && return 2 + return 3 +end + +""" +Turn legend argument into a (theta, :inner) or (theta, :outer) tuple. +For backends where legend position is given in normal coordinates (0,0) -- (1,1), +so :topleft exactly corresponds to (45, :inner) etc. + +If `leg` is a (::Real,::Real) tuple, keep it as is. +""" +legend_angle(leg::Real) = (leg, :inner) +legend_angle(leg::Tuple{S,T}) where {S<:Real,T<:Real} = leg +legend_angle(leg::Tuple{S,Symbol}) where {S<:Real} = leg +legend_angle(leg::Symbol) = get( + ( + topleft = (135, :inner), + top = (90, :inner), + topright = (45, :inner), + left = (180, :inner), + right = (0, :inner), + bottomleft = (225, :inner), + bottom = (270, :inner), + bottomright = (315, :inner), + outertopleft = (135, :outer), + outertop = (90, :outer), + outertopright = (45, :outer), + outerleft = (180, :outer), + outerright = (0, :outer), + outerbottomleft = (225, :outer), + outerbottom = (270, :outer), + outerbottomright = (315, :outer), + ), + leg, + (45, :inner), +) diff --git a/src/output.jl b/src/output.jl index 92f7ec01..785a7cc7 100644 --- a/src/output.jl +++ b/src/output.jl @@ -73,7 +73,6 @@ function txt(plt::Plot, fn::AbstractString) end txt(fn::AbstractString) = txt(current(), fn) - # ---------------------------------------------------------------- const _savemap = Dict( @@ -128,7 +127,6 @@ function savefig(plt::Plot, fn::AbstractString) end savefig(fn::AbstractString) = savefig(current(), fn) - # --------------------------------------------------------- """ @@ -186,8 +184,8 @@ function _show(io::IO, ::MIME"text/html", plt::Plot) end # delegate showable to _show instead -function Base.showable(m::M, plt::P) where {M <: MIME, P <: Plot} - return hasmethod(_show, Tuple{IO, M, P}) +function Base.showable(m::M, plt::P) where {M<:MIME,P<:Plot} + return hasmethod(_show, Tuple{IO,M,P}) end function _display(plt::Plot) @@ -224,7 +222,6 @@ Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) = "Close all open gui windows of the current backend" closeall() = closeall(backend()) - # function html_output_format(fmt) # if fmt == "png" # @eval function Base.show(io::IO, ::MIME"text/html", plt::Plot) @@ -241,7 +238,6 @@ closeall() = closeall(backend()) # # html_output_format("svg") - # --------------------------------------------------------- # Atom PlotPane # --------------------------------------------------------- diff --git a/src/pipeline.jl b/src/pipeline.jl index e02b3478..bb87a69e 100644 --- a/src/pipeline.jl +++ b/src/pipeline.jl @@ -4,44 +4,31 @@ function RecipesPipeline.warn_on_recipe_aliases!( plt::Plot, - plotattributes, - recipe_type, - args..., + plotattributes::AKW, + recipe_type::Symbol, + @nospecialize(args) ) for k in keys(plotattributes) if !is_default_attribute(k) dk = get(_keyAliases, k, k) 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`." + if recipe_type == :user + signature_string = RecipesPipeline.userrecipe_signature_string(args) + elseif recipe_type == :type + signature_string = RecipesPipeline.typerecipe_signature_string(args) + elseif recipe_type == :plot + signature_string = RecipesPipeline.plotrecipe_signature_string(args) + elseif recipe_type == :series + signature_string = RecipesPipeline.seriesrecipe_signature_string(args) + else + throw(ArgumentError("Invalid recipe type `$recipe_type`")) + end + @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 plotattributes[dk] = RecipesPipeline.pop_kw!(plotattributes, k) 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 @@ -53,7 +40,6 @@ function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor) end - ## 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 @@ -74,7 +60,6 @@ RecipesPipeline.is_axis_attribute(plt::Plot, attr) = is_axis_attr_noletter(attr) RecipesPipeline.is_subplot_attribute(plt::Plot, attr) = is_subplot_attr(attr) # in src/args.jl - ## User recipes function RecipesPipeline.process_userrecipe!(plt::Plot, kw_list, kw) @@ -96,13 +81,15 @@ function _preprocess_userrecipe(kw::AKW) # map marker_z if it's a Function if isa(get(kw, :marker_z, nothing), Function) # TODO: should this take y and/or z as arguments? - kw[:marker_z] = isa(kw[:z], Nothing) ? map(kw[:marker_z], kw[:x], kw[:y]) : + kw[:marker_z] = + isa(kw[:z], Nothing) ? map(kw[:marker_z], kw[:x], kw[:y]) : map(kw[:marker_z], kw[:x], kw[:y], kw[:z]) end # map line_z if it's a Function if isa(get(kw, :line_z, nothing), Function) - kw[:line_z] = isa(kw[:z], Nothing) ? map(kw[:line_z], kw[:x], kw[:y]) : + kw[:line_z] = + isa(kw[:z], Nothing) ? map(kw[:line_z], kw[:x], kw[:y]) : map(kw[:line_z], kw[:x], kw[:y], kw[:z]) end @@ -152,15 +139,12 @@ function _add_smooth_kw(kw_list::Vector{KW}, kw::AKW) end end - -RecipesPipeline.get_axis_limits(plt::Plot, f, letter) = axis_limits(plt[1], letter) - +RecipesPipeline.get_axis_limits(plt::Plot, letter) = axis_limits(plt[1], letter, false) ## Plot recipes RecipesPipeline.type_alias(plt::Plot) = get(_typeAliases, st, st) - ## Plot setup function RecipesPipeline.plot_setup!(plt::Plot, plotattributes, kw_list) @@ -171,18 +155,18 @@ end function RecipesPipeline.process_sliced_series_attributes!(plt::Plots.Plot, kw_list) # swap errors - err_inds = findall(kw -> get(kw, :seriestype, :path) in (:xerror, :yerror, :zerror), kw_list) + err_inds = + findall(kw -> get(kw, :seriestype, :path) in (:xerror, :yerror, :zerror), kw_list) for ind in err_inds - if get(kw_list[ind-1],:seriestype,:path) == :scatter + if get(kw_list[ind - 1], :seriestype, :path) == :scatter tmp = copy(kw_list[ind]) - kw_list[ind] = copy(kw_list[ind-1]) - kw_list[ind-1] = tmp + kw_list[ind] = copy(kw_list[ind - 1]) + kw_list[ind - 1] = tmp end end return nothing end - # TODO: Should some of this logic be moved to RecipesPipeline? function _plot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) # merge in anything meant for the Plot @@ -205,7 +189,6 @@ function _plot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) plt.init = true end - # handle inset subplots insets = plt[:inset_subplots] if insets !== nothing @@ -238,7 +221,7 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) # Subplot/Axis attributes set by a user/series recipe apply only to the # Subplot object which they belong to. # TODO: allow matrices to still apply to all subplots - sp_attrs = Dict{Subplot, Any}() + sp_attrs = Dict{Subplot,Any}() for kw in kw_list # get the Subplot object to which the series belongs. sps = get(kw, :subplot, :auto) @@ -255,10 +238,17 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) attr = KW() for (k, v) in collect(kw) if is_subplot_attr(k) || is_axis_attr(k) - attr[k] = pop!(kw, k) + v = pop!(kw, k) + if sps isa AbstractArray && v isa AbstractArray && length(v) == length(sps) + v = v[series_idx(kw_list, kw)] + end + attr[k] = v end if is_axis_attr_noletter(k) v = pop!(kw, k) + if sps isa AbstractArray && v isa AbstractArray && length(v) == length(sps) + v = v[series_idx(kw_list, kw)] + end for letter in (:x, :y, :z) attr[Symbol(letter, k)] = v end @@ -274,6 +264,7 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) sp_attrs[sp] = attr end + _add_plot_title!(plt) # override subplot/axis args. `sp_attrs` take precendence for (idx, sp) in enumerate(plt.subplots) attr = if !haskey(plotattributes, :subplot) || plotattributes[:subplot] == idx @@ -286,12 +277,37 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW}) # do we need to link any axes together? link_axes!(plt.layout, plt[:link]) + return nothing end function series_idx(kw_list::AVec{KW}, kw::AKW) Int(kw[:series_plotindex]) - Int(kw_list[1][:series_plotindex]) + 1 end +function _add_plot_title!(plt) + plot_title = plt[:plot_title] + if plot_title != "" + the_layout = plt.layout + vspan = plt[:plot_titlevspan] + plt.layout = grid(2, 1, heights = (vspan, 1 - vspan)) + plt.layout.grid[1, 1] = subplot = Subplot(plt.backend, parent = plt.layout[1, 1]) + plt.layout.grid[2, 1] = the_layout + subplot.plt = plt + # propagate arguments plt[:plot_titleXXX] --> subplot[:titleXXX] + for sym in filter(x -> startswith(string(x), "plot_title"), keys(_plot_defaults)) + subplot[Symbol(string(sym)[(length("plot_") + 1):end])] = plt[sym] + end + top = plt.backend isa PyPlotBackend ? nothing : 0mm + bot = 0mm + plt[:force_minpad] = nothing, top, nothing, bot + subplot[:subplot_index] = last(plt.subplots)[:subplot_index] + 1 + plt[:plot_titleindex] = subplot[:subplot_index] + subplot[:framestyle] = :none + subplot[:margin] = 0px + push!(plt.subplots, subplot) + end + return nothing +end ## Series recipes @@ -325,7 +341,10 @@ function _prepare_subplot(plt::Plot{T}, plotattributes::AKW) where {T} st = _override_seriestype_check(plotattributes, st) # change to a 3d projection for this subplot? - if RecipesPipeline.needs_3d_axes(st) + if ( + RecipesPipeline.needs_3d_axes(st) || + (st == :quiver && plotattributes[:z] !== nothing) + ) sp.attr[:projection] = "3d" end @@ -339,10 +358,12 @@ end function _override_seriestype_check(plotattributes::AKW, st::Symbol) # 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] - if !isa(z, Nothing) && - (size(plotattributes[:x]) == size(plotattributes[:y]) == size(z)) + if ( + z !== nothing && + (size(plotattributes[:x]) == size(plotattributes[:y]) == size(z)) + ) st = (st == :scatter ? :scatter3d : :path3d) plotattributes[:seriestype] = st end @@ -350,6 +371,14 @@ function _override_seriestype_check(plotattributes::AKW, st::Symbol) st end +function needs_any_3d_axes(sp::Subplot) + any( + RecipesPipeline.needs_3d_axes( + _override_seriestype_check(s.plotattributes, s.plotattributes[:seriestype]), + ) for s in series_list(sp) + ) +end + function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol) # adjust extrema and discrete info if st == :image @@ -370,9 +399,9 @@ end function _add_the_series(plt, sp, plotattributes) extra_kwargs = warn_on_unsupported_args(plt.backend, plotattributes) if (kw = plt[:extra_kwargs]) isa AbstractDict - plt[:extra_plot_kwargs] = get(kw,:plot,KW()) - sp[:extra_kwargs] = get(kw,:subplot, KW()) - plotattributes[:extra_kwargs] = get(kw,:series,KW()) + plt[:extra_plot_kwargs] = get(kw, :plot, KW()) + sp[:extra_kwargs] = get(kw, :subplot, KW()) + plotattributes[:extra_kwargs] = get(kw, :series, KW()) elseif plt[:extra_kwargs] == :plot plt[:extra_plot_kwargs] = extra_kwargs elseif plt[:extra_kwargs] == :subplot diff --git a/src/plot.jl b/src/plot.jl index e52ac499..ba689a0b 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -1,6 +1,6 @@ mutable struct CurrentPlot - nullableplot::Union{AbstractPlot, Nothing} + nullableplot::Union{AbstractPlot,Nothing} end const CURRENT_PLOT = CurrentPlot(nothing) @@ -20,10 +20,44 @@ current(plot::AbstractPlot) = (CURRENT_PLOT.nullableplot = plot) # --------------------------------------------------------- - Base.string(plt::Plot) = "Plot{$(plt.backend) n=$(plt.n)}" Base.print(io::IO, plt::Plot) = print(io, string(plt)) -Base.show(io::IO, plt::Plot) = print(io, string(plt)) +function Base.show(io::IO, plt::Plot) + print(io, string(plt)) + sp_ekwargs = getindex.(plt.subplots, :extra_kwargs) + s_ekwargs = getindex.(plt.series_list, :extra_kwargs) + if ( + isempty(plt[:extra_plot_kwargs]) && + all(isempty, sp_ekwargs) && + all(isempty, s_ekwargs) + ) + return + end + print(io, "\nCaptured extra kwargs:\n") + do_show = true + for (key, value) in plt[:extra_plot_kwargs] + do_show && println(io, " Plot:") + println(io, " "^4, key, ": ", value) + do_show = false + end + do_show = true + for (i, ekwargs) in enumerate(sp_ekwargs) + for (key, value) in ekwargs + do_show && println(io, " SubplotPlot{$i}:") + println(io, " "^4, key, ": ", value) + do_show = false + end + do_show = true + end + for (i, ekwargs) in enumerate(s_ekwargs) + for (key, value) in ekwargs + do_show && println(io, " Series{$i}:") + println(io, " "^4, key, ": ", value) + do_show = false + end + do_show = true + end +end getplot(plt::Plot) = plt getattr(plt::Plot, idx::Int = 1) = plt.attr @@ -31,7 +65,6 @@ convertSeriesIndex(plt::Plot, n::Int) = n # --------------------------------------------------------- - """ The main plot command. Use `plot` to create a new plot object, and `plot!` to add to an existing one: @@ -42,11 +75,12 @@ The main plot command. Use `plot` to create a new plot object, and `plot!` to ad ``` There are lots of ways to pass in data, and lots of keyword arguments... just try it and it will likely work as expected. -When you pass in matrices, it splits by columns. To see the list of available attributes, use the `plotattr([attr])` -function, where `attr` is the symbol `:Series:`, `:Subplot:`, `:Plot` or `:Axis`. Pass any attribute to `plotattr` -as a String to look up its docstring; e.g. `plotattr("seriestype")`. +When you pass in matrices, it splits by columns. To see the list of available attributes, use the `plotattr(attr)` +function, where `attr` is the symbol `:Series`, `:Subplot`, `:Plot`, or `:Axis`. Pass any attribute to `plotattr` +as a String to look up its docstring, e.g., `plotattr("seriestype")`. """ function plot(args...; kw...) + @nospecialize # this creates a new plot with args/kw and sets it to be the current plot plotattributes = KW(kw) RecipesPipeline.preprocess_attributes!(plotattributes) @@ -58,17 +92,21 @@ function plot(args...; kw...) end # build a new plot from existing plots -# note: we split into plt1 and plts_tail so we can dispatch correctly -function plot(plt1::Plot, plts_tail::Plot...; kw...) +# note: we split into plt1, plt2 and plts_tail so we can dispatch correctly +plot(plt1::Plot, plt2::Plot, plts_tail::Plot...; kw...) = + plot!(deepcopy(plt1), deepcopy(plt2), deepcopy.(plts_tail)...; kw...) +function plot!(plt1::Plot, plt2::Plot, plts_tail::Plot...; kw...) + @nospecialize plotattributes = KW(kw) RecipesPipeline.preprocess_attributes!(plotattributes) # build our plot vector from the args - n = length(plts_tail) + 1 + n = length(plts_tail) + 2 plts = Array{Plot}(undef, n) plts[1] = plt1 - for (i,plt) in enumerate(plts_tail) - plts[i+1] = plt + plts[2] = plt2 + for (i, plt) in enumerate(plts_tail) + plts[i + 2] = plt end # compute the layout @@ -95,9 +133,9 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...) plt.init = true series_attr = KW() - for (k,v) in plotattributes + for (k, v) in plotattributes if is_series_attr(k) - series_attr[k] = pop!(plotattributes,k) + series_attr[k] = pop!(plotattributes, k) end end @@ -125,9 +163,10 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...) cmdidx += 1 end end + _add_plot_title!(plt) # first apply any args for the subplots - for (idx,sp) in enumerate(plt.subplots) + for (idx, sp) in enumerate(plt.subplots) _update_subplot_args(plt, sp, plotattributes, idx, false) end @@ -137,10 +176,9 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...) plt end - - # 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 try plt = current() @@ -151,7 +189,9 @@ function plot!(args...; kw...) end # this adds to a specific plot... most plot commands will flow through here +plot(plt::Plot, args...; kw...) = plot!(deepcopy(plt), args...; kw...) function plot!(plt::Plot, args...; kw...) + @nospecialize plotattributes = KW(kw) RecipesPipeline.preprocess_attributes!(plotattributes) # merge!(plt.user_attr, plotattributes) @@ -164,20 +204,20 @@ end # a list of series KW dicts. # note: at entry, we only have those preprocessed args which were passed in... no default values yet function _plot!(plt::Plot, plotattributes, args) + @nospecialize RecipesPipeline.recipe_pipeline!(plt, plotattributes, args) current(plt) _do_plot_show(plt, plt[:show]) return plt end - # we're getting ready to display/output. prep for layout calcs, then update # the plot object after function prepare_output(plt::Plot) _before_layout_calcs(plt) w, h = plt.attr[:size] - plt.layout.bbox = BoundingBox(0mm, 0mm, w*px, h*px) + plt.layout.bbox = BoundingBox(0mm, 0mm, w * px, h * px) # One pass down and back up the tree to compute the minimum padding # of the children on the perimeter. This is an backend callback. @@ -186,6 +226,17 @@ function prepare_output(plt::Plot) _update_min_padding!(sp) end + # spedific to :plot_title see _add_plot_title! + force_minpad = get(plt, :force_minpad, ()) + if !isempty(force_minpad) + for i in eachindex(plt.layout.grid) + plt.layout.grid[i].minpad = Tuple( + i === nothing ? j : i for + (i, j) in zip(force_minpad, plt.layout.grid[i].minpad) + ) + end + end + # now another pass down, to update the bounding boxes update_child_bboxes!(plt.layout) @@ -205,10 +256,12 @@ end # plot to a Subplot function plot(sp::Subplot, args...; kw...) + @nospecialize plt = sp.plt plot(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots)) end function plot!(sp::Subplot, args...; kw...) + @nospecialize plt = sp.plt plot!(plt, args...; kw..., subplot = findfirst(isequal(sp), plt.subplots)) end diff --git a/src/plotattr.jl b/src/plotattr.jl index d695d16e..c9449830 100644 --- a/src/plotattr.jl +++ b/src/plotattr.jl @@ -1,8 +1,10 @@ -const _attribute_defaults = Dict(:Series => _series_defaults, - :Subplot => _subplot_defaults, - :Plot => _plot_defaults, - :Axis => _axis_defaults) +const _attribute_defaults = Dict( + :Series => _series_defaults, + :Subplot => _subplot_defaults, + :Plot => _plot_defaults, + :Axis => _axis_defaults, +) attrtypes() = join(keys(_attribute_defaults), ", ") attributes(attrtype::Symbol) = sort(collect(keys(_attribute_defaults[attrtype]))) @@ -21,7 +23,9 @@ Look up the properties of a Plots attribute, or specify an attribute type. Call The information is the same as that given on https://docs.juliaplots.org/latest/attributes/. """ function plotattr() - println("Specify an attribute type to get a list of supported attributes. Options are $(attrtypes())") + println( + "Specify an attribute type to get a list of supported attributes. Options are $(attrtypes())", + ) end function plotattr(attrtype::Symbol) @@ -44,27 +48,32 @@ printnothing(x) = x printnothing(x::Nothing) = "nothing" function plotattr(attrtype::Symbol, attribute::AbstractString) - in(attrtype, keys(_attribute_defaults)) || ArgumentError("`attrtype` must match one of $(attrtypes())") + in(attrtype, keys(_attribute_defaults)) || + ArgumentError("`attrtype` must match one of $(attrtypes())") attribute = Symbol(lookup_aliases(attrtype, attribute)) desc = get(_arg_desc, attribute, "") first_period_idx = findfirst(isequal('.'), desc) - if isnothing(first_period_idx) + if isnothing(first_period_idx) typedesc = "" desc = strip(desc) else - typedesc = desc[1:first_period_idx-1] - desc = strip(desc[first_period_idx+1:end]) + typedesc = desc[1:(first_period_idx - 1)] + desc = strip(desc[(first_period_idx + 1):end]) end - als = keys(filter(x->x[2]==attribute, _keyAliases)) |> collect |> sort - als = join(map(string,als), ", ") + als = keys(filter(x -> x[2] == attribute, _keyAliases)) |> collect |> sort + als = join(map(string, als), ", ") def = _attribute_defaults[attrtype][attribute] - # Looks up the different elements and plots them - println("$(printnothing(attribute)) ", typedesc == "" ? "" : "{$(printnothing(typedesc))}", "\n", + println( + "$(printnothing(attribute)) ", + typedesc == "" ? "" : "{$(printnothing(typedesc))}", + "\n", als == "" ? "" : "$(printnothing(als))\n", "\n$(printnothing(desc))\n", - "$(printnothing(attrtype)) attribute, ", def == "" ? "" : " default: $(printnothing(def))") + "$(printnothing(attrtype)) attribute, ", + def == "" ? "" : " default: $(printnothing(def))", + ) end diff --git a/src/precompile_includer.jl b/src/precompile_includer.jl index 963c42c2..2a19fe91 100644 --- a/src/precompile_includer.jl +++ b/src/precompile_includer.jl @@ -1,52 +1,17 @@ should_precompile = true - # Don't edit the following! Instead change the script for `snoop_bot`. -ismultios = true -ismultiversion = true +ismultios = false +ismultiversion = false # 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.4/precompile_Plots.jl") - _precompile_() - end - - elseif Sys.iswindows() - @static if v"1.5.0-DEV" <= VERSION <= v"1.5.9" - include("../deps/SnoopCompile/precompile/windows/1.5/precompile_Plots.jl") - _precompile_() - else - include("../deps/SnoopCompile/precompile/windows/1.4/precompile_Plots.jl") - _precompile_() - end - - elseif Sys.isapple() - @static if v"1.5.0-DEV" <= VERSION <= v"1.5.9" - include("../deps/SnoopCompile/precompile/apple/1.5/precompile_Plots.jl") - _precompile_() - else - include("../deps/SnoopCompile/precompile/apple/1.4/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.4/precompile_Plots.jl") - _precompile_() - end - + @static if isfile( + joinpath(@__DIR__, "../deps/SnoopCompile/precompile/precompile_Plots.jl"), + ) + include("../deps/SnoopCompile/precompile/precompile_Plots.jl") + _precompile_() end - +else end # precompile_enclosure diff --git a/src/recipes.jl b/src/recipes.jl index e805fa49..0466d66c 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -41,17 +41,16 @@ function all_seriestypes() sort(collect(sts)) end - # ---------------------------------------------------------------------------------- num_series(x::AMat) = size(x, 2) num_series(x) = 1 -RecipesBase.apply_recipe(plotattributes::AKW, ::Type{T}, plt::AbstractPlot) where {T} = throw(MethodError(T, "Unmatched plot recipe: $T")) +RecipesBase.apply_recipe(plotattributes::AKW, ::Type{T}, plt::AbstractPlot) where {T} = + throw(MethodError(T, "Unmatched plot recipe: $T")) # --------------------------------------------------------------------------- - # for seriestype `line`, need to sort by x values const POTENTIAL_VECTOR_ARGUMENTS = [ @@ -78,6 +77,8 @@ const POTENTIAL_VECTOR_ARGUMENTS = [ :fillrange, ] +@nospecialize + @recipe function f(::Type{Val{:line}}, x, y, z) indices = sortperm(x) x := x[indices] @@ -112,8 +113,8 @@ end @recipe function f(::Type{Val{:hline}}, x, y, z) n = length(y) - newx = repeat(Float64[1, 2, NaN], n) - newy = vec(Float64[yi for i = 1:3, yi in y]) + newx = repeat(Float64[1, 2, NaN], n) + newy = vec(Float64[yi for i in 1:3, yi in y]) x := newx y := newy seriestype := :straightline @@ -123,7 +124,7 @@ end @recipe function f(::Type{Val{:vline}}, x, y, z) n = length(y) - newx = vec(Float64[yi for i = 1:3, yi in y]) + newx = vec(Float64[yi for i in 1:3, yi in y]) x := newx y := repeat(Float64[1, 2, NaN], n) seriestype := :straightline @@ -134,7 +135,7 @@ end @recipe function f(::Type{Val{:hspan}}, x, y, z) n = div(length(y), 2) newx = repeat([-Inf, Inf, Inf, -Inf, NaN], outer = n) - newy = vcat([[y[2i - 1], y[2i - 1], y[2i], y[2i], NaN] for i = 1:n]...) + newy = vcat([[y[2i - 1], y[2i - 1], y[2i], y[2i], NaN] for i in 1:n]...) linewidth --> 0 x := newx y := newy @@ -145,7 +146,7 @@ end @recipe function f(::Type{Val{:vspan}}, x, y, z) n = div(length(y), 2) - newx = vcat([[y[2i - 1], y[2i - 1], y[2i], y[2i], NaN] for i = 1:n]...) + newx = vcat([[y[2i - 1], y[2i - 1], y[2i], y[2i], NaN] for i in 1:n]...) newy = repeat([-Inf, Inf, Inf, -Inf, NaN], outer = n) linewidth --> 0 x := newx @@ -163,45 +164,77 @@ end x := x y := y seriestype := :scatter + @series begin + () + end @series begin seriestype := :path label := "" primary := false () end + primary := false () end @deps scatterpath path scatter +# --------------------------------------------------------------------------- +# regression line and scatter + +# plots line corresponding to linear regression of y on a constant and x +@recipe function f(::Type{Val{:linearfit}}, x, y, z) + x := x + y := y + seriestype := :scatter + @series begin + () + end + @series begin + y := mean(y) .+ cov(x, y) / var(x) .* (x .- mean(x)) + seriestype := :path + label := "" + primary := false + () + end + primary := false + () +end + +@specialize # --------------------------------------------------------------------------- # steps -make_steps(x, st) = x -function make_steps(x::AbstractArray, st) +make_steps(x, st, even) = x +function make_steps(x::AbstractArray, st, even) n = length(x) n == 0 && return zeros(0) - newx = zeros(2n - 1) - for i = 1:n + newx = zeros(2n - (even ? 0 : 1)) + newx[1] = x[1] + for i in 2:n idx = 2i - 1 - newx[idx] = x[i] - if i > 1 + if st == :mid + newx[idx] = newx[idx - 1] = (x[i] + x[i - 1]) / 2 + else + newx[idx] = x[i] newx[idx - 1] = x[st == :pre ? i : i - 1] end end + even && (newx[end] = x[end]) return newx end -make_steps(t::Tuple, st) = Tuple(make_steps(ti, st) for ti in t) +make_steps(t::Tuple, st, even) = Tuple(make_steps(ti, st, even) for ti in t) +@nospecialize # create a path from steps @recipe function f(::Type{Val{:steppre}}, x, y, z) - plotattributes[:x] = make_steps(x, :post) - plotattributes[:y] = make_steps(y, :pre) + plotattributes[:x] = make_steps(x, :post, false) + plotattributes[:y] = make_steps(y, :pre, false) seriestype := :path # handle fillrange - plotattributes[:fillrange] = make_steps(plotattributes[:fillrange], :pre) + plotattributes[:fillrange] = make_steps(plotattributes[:fillrange], :pre, false) # create a secondary series for the markers if plotattributes[:markershape] != :none @@ -220,13 +253,38 @@ end @deps steppre path scatter # create a path from steps -@recipe function f(::Type{Val{:steppost}}, x, y, z) - plotattributes[:x] = make_steps(x, :pre) - plotattributes[:y] = make_steps(y, :post) +@recipe function f(::Type{Val{:stepmid}}, x, y, z) + plotattributes[:x] = make_steps(x, :mid, true) + plotattributes[:y] = make_steps(y, :post, true) seriestype := :path # handle fillrange - plotattributes[:fillrange] = make_steps(plotattributes[:fillrange], :post) + plotattributes[:fillrange] = make_steps(plotattributes[:fillrange], :post, true) + + # create a secondary series for the markers + if plotattributes[:markershape] != :none + @series begin + seriestype := :scatter + x := x + y := y + label := "" + primary := false + () + end + markershape := :none + end + () +end +@deps stepmid path scatter + +# create a path from steps +@recipe function f(::Type{Val{:steppost}}, x, y, z) + plotattributes[:x] = make_steps(x, :pre, false) + plotattributes[:y] = make_steps(y, :post, false) + seriestype := :path + + # handle fillrange + plotattributes[:fillrange] = make_steps(plotattributes[:fillrange], :post, false) # create a secondary series for the markers if plotattributes[:markershape] != :none @@ -244,7 +302,6 @@ end end @deps steppost path scatter - # --------------------------------------------------------------------------- # sticks @@ -262,15 +319,15 @@ end end end newx, newy = zeros(3n), zeros(3n) - newz = z!== nothing ? zeros(3n) : nothing - for i = 1:n + newz = z !== nothing ? zeros(3n) : nothing + for (i, (xi, yi, zi)) in enumerate(zip(x, y, z !== nothing ? z : 1:n)) rng = (3i - 2):(3i) - newx[rng] = [x[i], x[i], NaN] + newx[rng] = [xi, xi, NaN] if z !== nothing - newy[rng] = [y[i], y[i], NaN] - newz[rng] = [_cycle(fr, i), z[i], NaN] + newy[rng] = [yi, yi, NaN] + newz[rng] = [_cycle(fr, i), zi, NaN] else - newy[rng] = [_cycle(fr, i), y[i], NaN] + newy[rng] = [_cycle(fr, i), yi, NaN] end end x := newx @@ -280,7 +337,11 @@ end end fillrange := nothing seriestype := :path - if plotattributes[:linecolor] == :auto && plotattributes[:marker_z] !== nothing && plotattributes[:line_z] === nothing + if ( + plotattributes[:linecolor] == :auto && + plotattributes[:marker_z] !== nothing && + plotattributes[:line_z] === nothing + ) line_z := plotattributes[:marker_z] end @@ -303,6 +364,7 @@ end end @deps sticks path scatter +@specialize # --------------------------------------------------------------------------- # bezier curves @@ -317,6 +379,8 @@ function bezier_value(pts::AVec, t::Real) val end +@nospecialize + # create segmented bezier curves in place of line segments @recipe function f(::Type{Val{:curves}}, x, y, z; npoints = 30) args = z !== nothing ? (x, y, z) : (x, y) @@ -371,8 +435,7 @@ end # create a bar plot as a filled step function @recipe function f(::Type{Val{:bar}}, x, y, z) - procx, procy, xscale, yscale, baseline = - _preprocess_barlike(plotattributes, x, y) + procx, procy, xscale, yscale, baseline = _preprocess_barlike(plotattributes, x, y) nx, ny = length(procx), length(procy) axis = plotattributes[:subplot][isvertical(plotattributes) ? :xaxis : :yaxis] cv = [discrete_value!(axis, xi)[1] for xi in procx] @@ -381,14 +444,16 @@ end elseif nx == ny + 1 0.5 * diff(cv) + cv[1:(end - 1)] else - error("bar recipe: x must be same length as y (centers), or one more than y (edges).\n\t\tlength(x)=$(length(x)), length(y)=$(length(y))") + error( + "bar recipe: x must be same length as y (centers), or one more than y (edges).\n\t\tlength(x)=$(length(x)), length(y)=$(length(y))", + ) end # compute half-width of bars bw = plotattributes[:bar_width] hw = if bw === nothing if nx > 1 - 0.5 * _bar_width * ignorenan_minimum(filter(x -> x > 0, diff(procx))) + 0.5 * _bar_width * ignorenan_minimum(filter(x -> x > 0, diff(sort(procx)))) else 0.5 * _bar_width end @@ -405,9 +470,8 @@ end fillto = map(x -> _is_positive(x) ? typeof(baseline)(x) : baseline, fillto) end - # create the bar shapes by adding x/y segments xseg, yseg = Segments(), Segments() - for i = 1:ny + for i in 1:ny yi = procy[i] if !isnan(yi) center = procx[i] @@ -431,15 +495,30 @@ end # switch back if !isvertical(plotattributes) xseg, yseg = yseg, xseg + x, y = y, x end - # reset orientation orientation := default(:orientation) - x := xseg.pts - y := yseg.pts - seriestype := :shape + # draw the bar shapes + @series begin + seriestype := :shape + series_annotations := nothing + primary := true + x := xseg.pts + y := yseg.pts + () + end + + # add empty series + primary := false + seriestype := :scatter + markersize := 0 + markeralpha := 0 + fillrange := nothing + x := x + y := y () end @deps bar shape @@ -451,8 +530,8 @@ end m, n = size(z.surf) x_pts, y_pts = fill(NaN, 6 * m * n), fill(NaN, 6 * m * n) fz = zeros(m * n) - for i = 1:m # y - for j = 1:n # x + for i in 1:m # y + for j in 1:n # x k = (j - 1) * m + i inds = (6 * (k - 1) + 1):(6 * k - 1) x_pts[inds] .= [xe[j], xe[j + 1], xe[j + 1], xe[j], xe[j]] @@ -472,6 +551,9 @@ end () end @deps plots_heatmap shape + +@specialize + is_3d(::Type{Val{:plots_heatmap}}) = true RecipesPipeline.is_surface(::Type{Val{:plots_heatmap}}) = true RecipesPipeline.is_surface(::Type{Val{:hexbin}}) = true @@ -496,7 +578,6 @@ function _scale_adjusted_values( end end - function _binbarlike_baseline(min_value::T, scale::Symbol) where {T<:Real} if (scale in _logScales) !isnan(min_value) ? min_value / T(_logScaleBases[scale]^log10(2)) : T(1E-3) @@ -505,7 +586,6 @@ function _binbarlike_baseline(min_value::T, scale::Symbol) where {T<:Real} end end - function _preprocess_binbarlike_weights( ::Type{T}, w, @@ -534,10 +614,10 @@ function _preprocess_binlike(plotattributes, x, y) edge, weights, xscale, yscale, baseline end +@nospecialize @recipe function f(::Type{Val{:barbins}}, x, y, z) - edge, weights, xscale, yscale, baseline = - _preprocess_binlike(plotattributes, x, y) + edge, weights, xscale, yscale, baseline = _preprocess_binlike(plotattributes, x, y) if (plotattributes[:bar_width] === nothing) bar_width := diff(edge) end @@ -548,10 +628,8 @@ end end @deps barbins bar - @recipe function f(::Type{Val{:scatterbins}}, x, y, z) - edge, weights, xscale, yscale, baseline = - _preprocess_binlike(plotattributes, x, y) + edge, weights, xscale, yscale, baseline = _preprocess_binlike(plotattributes, x, y) @series begin x := _bin_centers(edge) xerror := diff(edge) / 2 @@ -566,13 +644,9 @@ end end @deps scatterbins xerror scatter -function _stepbins_path( - edge, - weights, - baseline::Real, - xscale::Symbol, - yscale::Symbol, -) +@specialize + +function _stepbins_path(edge, weights, baseline::Real, xscale::Symbol, yscale::Symbol) log_scale_x = xscale in _logScales log_scale_y = yscale in _logScales @@ -632,13 +706,11 @@ function _stepbins_path( (x, y) end - @recipe function f(::Type{Val{:stepbins}}, x, y, z) - axis = - plotattributes[:subplot][Plots.isvertical(plotattributes) ? :xaxis : :yaxis] + @nospecialize + axis = plotattributes[:subplot][Plots.isvertical(plotattributes) ? :xaxis : :yaxis] - edge, weights, xscale, yscale, baseline = - _preprocess_binlike(plotattributes, x, y) + edge, weights, xscale, yscale, baseline = _preprocess_binlike(plotattributes, x, y) xpts, ypts = _stepbins_path(edge, weights, baseline, xscale, yscale) if !isvertical(plotattributes) @@ -690,12 +762,9 @@ function _auto_binning_nbins( # The nd estimator is the key to most automatic binning methods, and is modified for twodimensional histograms to include correlation nd = n_samples^(1 / (2 + N)) - nd = N == 2 ? - min( - n_samples^(1 / (2 + N)), - nd / (1 - cor(first(vs), last(vs))^2)^(3 // 8), - ) : - nd # the >2-dimensional case does not have a nice solution to correlations + nd = + N == 2 ? + min(n_samples^(1 / (2 + N)), nd / (1 - cor(first(vs), last(vs))^2)^(3 // 8)) : nd # the >2-dimensional case does not have a nice solution to correlations v = vs[dim] @@ -724,11 +793,8 @@ _hist_edge(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Integer) where { StatsBase.histrange(vs[dim], binning, :left) _hist_edge(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) where {N} = _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) -_hist_edge( - vs::NTuple{N,AbstractVector}, - dim::Integer, - binning::AbstractVector, -) where {N} = binning +_hist_edge(vs::NTuple{N,AbstractVector}, dim::Integer, binning::AbstractVector) where {N} = + binning _hist_edges(vs::NTuple{N,AbstractVector}, binning::NTuple{N,Any}) where {N} = map(dim -> _hist_edge(vs, dim, binning[dim]), (1:N...,)) @@ -758,8 +824,8 @@ function _make_hist( edges = _hist_edges(localvs, binning) h = float( weights === nothing ? - StatsBase.fit(StatsBase.Histogram, localvs, edges, closed = :left) : - StatsBase.fit( + StatsBase.fit(StatsBase.Histogram, localvs, edges, closed = :left) : + StatsBase.fit( StatsBase.Histogram, localvs, StatsBase.Weights(weights), @@ -770,6 +836,7 @@ function _make_hist( normalize!(h, mode = _hist_norm_mode(normed)) end +@nospecialize @recipe function f(::Type{Val{:histogram}}, x, y, z) seriestype := length(y) > 1e6 ? :stephist : :barhist @@ -819,7 +886,6 @@ end end @deps scatterhist scatterbins - @recipe function f(h::StatsBase.Histogram{T,1,E}) where {T,E} seriestype --> :barbins @@ -829,8 +895,7 @@ end :step => :stepbins, :steppost => :stepbins, # :step can be mapped to :steppost in pre-processing ) - seriestype := - get(st_map, plotattributes[:seriestype], plotattributes[:seriestype]) + seriestype := get(st_map, plotattributes[:seriestype], plotattributes[:seriestype]) if plotattributes[:seriestype] == :scatterbins # Workaround, error bars currently not set correctly by scatterbins @@ -844,7 +909,6 @@ end end end - @recipe function f(hv::AbstractVector{H}) where {H<:StatsBase.Histogram} for h in hv @series begin @@ -853,7 +917,6 @@ end end end - # --------------------------------------------------------------------------- # Histogram 2D @@ -880,7 +943,6 @@ end end Plots.@deps bins2d heatmap - @recipe function f(::Type{Val{:histogram2d}}, x, y, z) h = _make_hist( (x, y), @@ -896,13 +958,11 @@ Plots.@deps bins2d heatmap end @deps histogram2d bins2d - @recipe function f(h::StatsBase.Histogram{T,2,E}) where {T,E} seriestype --> :bins2d (h.edges[1], h.edges[2], Surface(h.weights)) end - # --------------------------------------------------------------------------- # pie @recipe function f(::Type{Val{:pie}}, x, y, z) @@ -924,7 +984,6 @@ end end @deps pie shape - # --------------------------------------------------------------------------- # mesh 3d replacement for non-plotly backends @@ -932,12 +991,15 @@ end # 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.")) + throw( + ArgumentError( + "Giving triangles using the connections argument is only supported on Plotly backend.", + ), + ) end () end - # --------------------------------------------------------------------------- # scatter 3d @@ -955,7 +1017,7 @@ end # --------------------------------------------------------------------------- # lens! - magnify a region of a plot -lens!(args...;kwargs...) = plot!(args...; seriestype=:lens, kwargs...) +lens!(args...; kwargs...) = plot!(args...; seriestype = :lens, kwargs...) export lens! @recipe function f(::Type{Val{:lens}}, plt::AbstractPlot) sp_index, inset_bbox = plotattributes[:inset_subplots] @@ -983,11 +1045,12 @@ export lens! linecolor := :lightgray bbx_mag = (x1 + x2) / 2 bby_mag = (y1 + y2) / 2 - xi_lens, yi_lens = intersection_point(bbx_mag, bby_mag, bbx, bby, abs(bby2 - bby1), abs(bbx2 - bbx1)) - xi_mag, yi_mag = intersection_point(bbx, bby, bbx_mag, bby_mag, abs(y2 - y1), abs(x2 - x1)) + xi_lens, yi_lens = + intersection_point(bbx_mag, bby_mag, bbx, bby, abs(bby2 - bby1), abs(bbx2 - bbx1)) + xi_mag, yi_mag = + intersection_point(bbx, bby, bbx_mag, bby_mag, abs(y2 - y1), abs(x2 - x1)) # add lines - if xl1 < xi_lens < xl2 && - yl1 < yi_lens < yl2 + if xl1 < xi_lens < xl2 && yl1 < yi_lens < yl2 @series begin primary := false subplot := sp_index @@ -1018,6 +1081,8 @@ export lens! nothing end +@specialize + function intersection_point(xA, yA, xB, yB, h, w) s = (yA - yB) / (xA - xB) hh = h / 2 @@ -1030,14 +1095,14 @@ function intersection_point(xA, yA, xB, yB, h, w) else # left return xB - hw, yB - s * hw end - # top or bot? - elseif -hw <= hh/s <= hw + # top or bot? + elseif -hw <= hh / s <= hw if yA > yB # top - return xB + hh/s, yB + hh + return xB + hh / s, yB + hh else # bottom - return xB - hh/s, yB - hh + return xB - hh / s, yB - hh end end end @@ -1045,6 +1110,7 @@ end # contourf - filled contours @recipe function f(::Type{Val{:contourf}}, x, y, z) + @nospecialize fillrange := true seriestype := :contour () @@ -1111,6 +1177,8 @@ end # we will create a series of path segments, where each point represents one # side of an errorbar +@nospecialize + @recipe function f(::Type{Val{:xerror}}, x, y, z) error_style!(plotattributes) markershape := :vline @@ -1160,6 +1228,7 @@ end end @deps zerror path +@specialize # TODO: move quiver to PlotRecipes @@ -1173,35 +1242,51 @@ function quiver_using_arrows(plotattributes::AKW) if !isa(plotattributes[:arrow], Arrow) plotattributes[:arrow] = arrow() end - + is_3d = haskey(plotattributes, :z) && !isnothing(plotattributes[:z]) velocity = error_zipit(plotattributes[:quiver]) 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 x, y = zeros(0), zeros(0) - for i = 1:max(length(xorig), length(yorig)) + is_3d && (z = zeros(0)) + for i in 1:max(length(xorig), length(yorig), is_3d ? 0 : length(zorig)) # get the starting position xi = _cycle(xorig, i) yi = _cycle(yorig, i) - + zi = is_3d ? _cycle(zorig, i) : 0 # get the velocity vi = _cycle(velocity, i) - 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") + if is_3d + vx, vy, vz = if istuple(vi) + vi[1], vi[2], vi[3] + elseif isscalar(vi) + vi, vi, vi + elseif isa(vi, Function) + vi(xi, yi, zi) + 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 - # add the points nanappend!(x, [xi, xi + vx, NaN]) nanappend!(y, [yi, yi + vy, NaN]) + is_3d && nanappend!(z, [zi, zi + vz, NaN]) end - plotattributes[:x], plotattributes[:y] = x, y + if is_3d + plotattributes[:z] = z + end # KW[plotattributes] end @@ -1215,7 +1300,7 @@ function quiver_using_hack(plotattributes::AKW) # for each point, we create an arrow of velocity vi, translated to the x/y coordinates pts = P2[] - for i = 1:max(length(xorig), length(yorig)) + for i in 1:max(length(xorig), length(yorig)) # get the starting position xi = _cycle(xorig, i) @@ -1244,10 +1329,7 @@ function quiver_using_hack(plotattributes::AKW) U2 *= arrow_w ppv = p + v - nanappend!( - pts, - P2[p, ppv - U1, ppv - U1 + U2, ppv, ppv - U1 - U2, ppv - U1], - ) + nanappend!(pts, P2[p, ppv - U1, ppv - U1 + U2, ppv, ppv - U1 - U2, ppv - U1]) end plotattributes[:x], plotattributes[:y] = RecipesPipeline.unzip(pts[2:end]) @@ -1256,6 +1338,7 @@ end # function apply_series_recipe(plotattributes::AKW, ::Type{Val{:quiver}}) @recipe function f(::Type{Val{:quiver}}, x, y, z) + @nospecialize if :arrow in supported_attrs() quiver_using_arrows(plotattributes) else @@ -1265,7 +1348,6 @@ end end @deps quiver shape path - # -------------------------------------------------------------------- # 1 argument # -------------------------------------------------------------------- @@ -1294,8 +1376,10 @@ end end end +@nospecialize + # images - colors -@recipe function f(mat::AMat{T}) where {T <: Colorant} +@recipe function f(mat::AMat{T}) where {T<:Colorant} n, m = axes(mat) if is_seriestype_supported(:image) @@ -1319,25 +1403,34 @@ end coords(shape) end -@recipe function f(shapes::AVec{Shape}) +@recipe function f(shapes::AVec{<:Shape}) seriestype --> :shape + # For backwards compatibility, column vectors of segmenting attributes are + # interpreted as having one element per shape + for attr in union(_segmenting_array_attributes, _segmenting_vector_attributes) + v = get(plotattributes, attr, nothing) + if v isa AVec || v isa AMat && size(v, 2) == 1 + @warn "Column vector attribute `$attr` reinterpreted as row vector (one value per shape).\n" * + "Pass a row vector instead (e.g. using `permutedims`) to suppress this warning." + plotattributes[attr] = permutedims(v) + end + end coords(shapes) end -@recipe function f(shapes::AMat{Shape}) +@recipe function f(shapes::AMat{<:Shape}) seriestype --> :shape for j in axes(shapes, 2) @series coords(vec(shapes[:, j])) end end - # -------------------------------------------------------------------- # 3 arguments # -------------------------------------------------------------------- # images - grays -@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where {T <: Gray} +@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where {T<:Gray} if is_seriestype_supported(:image) seriestype := :image yflip --> true @@ -1352,7 +1445,7 @@ end end # images - colors -@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where {T <: Colorant} +@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where {T<:Colorant} if is_seriestype_supported(:image) seriestype := :image yflip --> true @@ -1369,14 +1462,15 @@ end # -------------------------------------------------------------------- # Lists of tuples and GeometryBasics.Points # -------------------------------------------------------------------- -@recipe f(v::AVec{<:_Point}) = RecipesPipeline.unzip(v) -@recipe f(p::_Point) = [p] +@recipe f(v::AVec{<:GeometryBasics.Point}) = RecipesPipeline.unzip(v) +@recipe f(p::GeometryBasics.Point) = [p] # 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] : RecipesPipeline.unzip(xyuv) +@specialize # ------------------------------------------------- @@ -1416,6 +1510,8 @@ end # 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 +@nospecialize + # to squash ambiguity warnings... @recipe f(x::AVec{Function}, v::AVec{OHLC}) = error() @recipe f( @@ -1427,8 +1523,7 @@ end @recipe f( x::AVec, ohlc::AVec{Tuple{R1,R2,R3,R4}}, -) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = - x, OHLC[OHLC(t...) for t in ohlc] +) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = x, OHLC[OHLC(t...) for t in ohlc] @recipe function f(x::AVec, v::AVec{OHLC}) seriestype := :path @@ -1447,7 +1542,6 @@ end # TODO: everything below here should be either changed to a # series recipe or moved to PlotRecipes - # "Sparsity plot... heatmap of non-zero values of a matrix" # function spy{T<:Real}(z::AMat{T}; kw...) # mat = reshape(map(zi->float(zi!=0), z),1,:) @@ -1474,14 +1568,10 @@ end yflip := true aspect_ratio := 1 rs, cs, zs = Plots.findnz(z.surf) - xlims := ignorenan_extrema(cs) - ylims := ignorenan_extrema(rs) - if plotattributes[:markershape] == :none - markershape := :circle - end - if plotattributes[:markersize] == default(:markersize) - markersize := 1 - end + xlims := widen(ignorenan_extrema(cs)..., get(plotattributes, :xscale, :identity)) + ylims := widen(ignorenan_extrema(rs)..., get(plotattributes, :yscale, :identity)) + markershape --> :circle + markersize --> 1 markerstrokewidth := 0 if length(unique(zs)) == 1 seriescolor --> :black @@ -1497,6 +1587,7 @@ end () end +@specialize Plots.findnz(A::AbstractSparseMatrix) = SparseArrays.findnz(A) @@ -1511,6 +1602,8 @@ end # ------------------------------------------------- +@nospecialize + "Adds ax+b... straight line over the current plot, without changing the axis limits" abline!(plt::Plot, a, b; kw...) = plot!(plt, [0, 1], [b, b + a]; seriestype = :straightline, kw...) @@ -1535,7 +1628,6 @@ end x, real.(y), imag.(y) end - # Moved in from PlotRecipes - see: http://stackoverflow.com/a/37732384/5075246 @userplot PortfolioComposition @@ -1580,3 +1672,5 @@ julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], f end end end + +@specialize diff --git a/src/shorthands.jl b/src/shorthands.jl index 2931162c..923ed5a4 100644 --- a/src/shorthands.jl +++ b/src/shorthands.jl @@ -1,3 +1,5 @@ +@nospecialize + """ scatter(x,y) scatter!(x,y) @@ -55,6 +57,7 @@ Plot a histogram. # Example ```julia-repl julia> histogram([1,2,1,1,4,3,8],bins=0:8) +julia> histogram([1,2,1,1,4,3,8],bins=0:8,weights=weights([4,7,3,9,12,2,6])) ``` """ @shorthands histogram @@ -238,7 +241,6 @@ julia> ohlc(y) """ @shorthands ohlc - """ contour(x,y,z) contour!(x,y,z) @@ -260,7 +262,6 @@ julia> contour(x, y, (x, y) -> x^2 + y^2) "An alias for `contour` with fill = true." @shorthands contourf - @shorthands contour3d """ @@ -405,42 +406,41 @@ julia> curves([1,2,3,4],[1,1,2,4]) @shorthands pie "Plot with seriestype :path3d" -plot3d(args...; kw...) = plot(args...; kw..., seriestype = :path3d) -plot3d!(args...; kw...) = plot!(args...; kw..., seriestype = :path3d) +plot3d(args...; kw...) = plot(args...; kw..., seriestype = :path3d) +plot3d!(args...; kw...) = plot!(args...; kw..., seriestype = :path3d) "Add title to an existing plot" -title!(s::AbstractString; kw...) = plot!(; title = s, kw...) +title!(s::AbstractString; kw...) = plot!(; title = s, kw...) "Add xlabel to an existing plot" -xlabel!(s::AbstractString; kw...) = plot!(; xlabel = s, kw...) +xlabel!(s::AbstractString; kw...) = plot!(; xlabel = s, kw...) "Add ylabel to an existing plot" -ylabel!(s::AbstractString; kw...) = plot!(; ylabel = s, kw...) +ylabel!(s::AbstractString; kw...) = plot!(; ylabel = s, kw...) "Set xlims for an existing plot" -xlims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; xlims = lims, kw...) +xlims!(lims::Tuple; kw...) = plot!(; xlims = lims, kw...) "Set ylims for an existing plot" -ylims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; ylims = lims, kw...) +ylims!(lims::Tuple; kw...) = plot!(; ylims = lims, kw...) "Set zlims for an existing plot" -zlims!(lims::Tuple{T,S}; kw...) where {T<:Real,S<:Real} = plot!(; zlims = lims, kw...) - -xlims!(xmin::Real, xmax::Real; kw...) = plot!(; xlims = (xmin,xmax), kw...) -ylims!(ymin::Real, ymax::Real; kw...) = plot!(; ylims = (ymin,ymax), kw...) -zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmin,zmax), kw...) +zlims!(lims::Tuple; kw...) = plot!(; zlims = lims, kw...) +xlims!(xmin::Real, xmax::Real; kw...) = plot!(; xlims = (xmin, xmax), kw...) +ylims!(ymin::Real, ymax::Real; kw...) = plot!(; ylims = (ymin, ymax), kw...) +zlims!(zmin::Real, zmax::Real; kw...) = plot!(; zlims = (zmin, zmax), kw...) "Set xticks for an existing plot" -xticks!(v::TicksArgs; kw...) = plot!(; xticks = v, kw...) +xticks!(v::TicksArgs; kw...) = plot!(; xticks = v, kw...) "Set yticks for an existing plot" -yticks!(v::TicksArgs; kw...) = plot!(; yticks = v, kw...) +yticks!(v::TicksArgs; kw...) = plot!(; yticks = v, kw...) -xticks!( -ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; xticks = (ticks,labels), kw...) -yticks!( -ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = plot!(; yticks = (ticks,labels), kw...) +xticks!(ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = + plot!(; xticks = (ticks, labels), kw...) +yticks!(ticks::AVec{T}, labels::AVec{S}; kw...) where {T<:Real,S<:AbstractString} = + plot!(; yticks = (ticks, labels), kw...) """ annotate!(anns...) @@ -450,28 +450,32 @@ Add annotations to an existing plot. # Arguments - `anns`: An `AbstractVector` of tuples of the form `(x,y,text)`. The `text` object - can be a `String` or `PlotText`. + can be a `String`, `PlotText` PlotText (created with `text(args...)`), + or a tuple of arguments to `text` (e.g., `("Label", 8, :red, :top)`). # Example ```julia-repl julia> plot(1:10) julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))]) +julia> annotate!([(4, 4, ("More text", 8, 45.0, :bottom, :red))]) ``` """ -annotate!(anns...; kw...) = plot!(; annotation = anns, kw...) +annotate!(anns...; kw...) = plot!(; annotation = anns, kw...) annotate!(anns::Tuple...; kw...) = plot!(; annotation = collect(anns), kw...) annotate!(anns::AVec{<:Tuple}; kw...) = plot!(; annotation = anns, kw...) "Flip the current plots' x axis" -xflip!(flip::Bool = true; kw...) = plot!(; xflip = flip, kw...) +xflip!(flip::Bool = true; kw...) = plot!(; xflip = flip, kw...) "Flip the current plots' y axis" -yflip!(flip::Bool = true; kw...) = plot!(; yflip = flip, kw...) +yflip!(flip::Bool = true; kw...) = plot!(; yflip = flip, kw...) "Specify x axis attributes for an existing plot" -xaxis!(args...; kw...) = plot!(; xaxis = args, kw...) +xaxis!(args...; kw...) = plot!(; xaxis = args, kw...) "Specify y axis attributes for an existing plot" -yaxis!(args...; kw...) = plot!(; yaxis = args, kw...) -xgrid!(args...; kw...) = plot!(; xgrid = args, kw...) -ygrid!(args...; kw...) = plot!(; ygrid = args, kw...) +yaxis!(args...; kw...) = plot!(; yaxis = args, kw...) +xgrid!(args...; kw...) = plot!(; xgrid = args, kw...) +ygrid!(args...; kw...) = plot!(; ygrid = args, kw...) + +@specialize diff --git a/src/subplots.jl b/src/subplots.jl index 35167349..5d1be3a8 100644 --- a/src/subplots.jl +++ b/src/subplots.jl @@ -1,6 +1,5 @@ - -function Subplot(::T; parent = RootLayout()) where T<:AbstractBackend +function Subplot(::T; parent = RootLayout()) where {T<:AbstractBackend} Subplot{T}( parent, Series[], @@ -9,7 +8,7 @@ function Subplot(::T; parent = RootLayout()) where T<:AbstractBackend defaultbox, DefaultsDict(KW(), _subplot_defaults), nothing, - nothing + nothing, ) end @@ -21,8 +20,7 @@ Return the bounding box of a subplot plotarea(sp::Subplot) = sp.plotarea plotarea!(sp::Subplot, bbox::BoundingBox) = (sp.plotarea = bbox) - -Base.size(sp::Subplot) = (1,1) +Base.size(sp::Subplot) = (1, 1) Base.length(sp::Subplot) = 1 Base.getindex(sp::Subplot, r::Int, c::Int) = sp @@ -43,23 +41,23 @@ series_list(sp::Subplot) = sp.series_list # filter(series -> series.plotattribut function should_add_to_legend(series::Series) series.plotattributes[:primary] && - series.plotattributes[:label] != "" && - !( - series.plotattributes[:seriestype] in ( - :hexbin, - :bins2d, - :histogram2d, - :hline, - :vline, - :contour, - :contourf, - :contour3d, - :surface, - :wireframe, - :heatmap, - :image, + series.plotattributes[:label] != "" && + !( + series.plotattributes[:seriestype] in ( + :hexbin, + :bins2d, + :histogram2d, + :hline, + :vline, + :contour, + :contourf, + :contour3d, + :surface, + :wireframe, + :heatmap, + :image, + ) ) - ) end # ---------------------------------------------------------------------- diff --git a/src/themes.jl b/src/themes.jl index bb1489f9..a770bfb0 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -34,11 +34,8 @@ end @userplot ShowTheme -_color_functions = KW( - :protanopic => protanopic, - :deuteranopic => deuteranopic, - :tritanopic => tritanopic, -) +_color_functions = + KW(:protanopic => protanopic, :deuteranopic => deuteranopic, :tritanopic => tritanopic) _get_showtheme_args(thm::Symbol) = thm, identity _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func, identity) @@ -110,8 +107,8 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func subplot := 4 seriestype := :heatmap seriescolor := colorgradient - xticks := (-2π:2π:2π, string.(-2:2:2, "π")) - yticks := (-2π:2π:2π, string.(-2:2:2, "π")) + xticks := ((-2π):(2π):(2π), string.(-2:2:2, "π")) + yticks := ((-2π):(2π):(2π), string.(-2:2:2, "π")) x, y, z end @@ -119,8 +116,8 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func subplot := 5 seriestype := :surface seriescolor := colorgradient - xticks := (-2π:2π:2π, string.(-2:2:2, "π")) - yticks := (-2π:2π:2π, string.(-2:2:2, "π")) + xticks := ((-2π):(2π):(2π), string.(-2:2:2, "π")) + yticks := ((-2π):(2π):(2π), string.(-2:2:2, "π")) x, y, z end @@ -137,5 +134,4 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func line_z := z x, y, z end - end diff --git a/src/types.jl b/src/types.jl index 5a7427c5..24d441a2 100644 --- a/src/types.jl +++ b/src/types.jl @@ -6,7 +6,8 @@ const AVec = AbstractVector const AMat = AbstractMatrix const KW = Dict{Symbol,Any} const AKW = AbstractDict{Symbol,Any} -const TicksArgs = Union{AVec{T}, Tuple{AVec{T}, AVec{S}}, Symbol} where {T<:Real, S<:AbstractString} +const TicksArgs = + Union{AVec{T},Tuple{AVec{T},AVec{S}},Symbol} where {T<:Real,S<:AbstractString} struct PlotsDisplay <: AbstractDisplay end @@ -59,11 +60,10 @@ Extrema() = Extrema(Inf, -Inf) # ----------------------------------------------------------- -const SubplotMap = Dict{Any, Subplot} +const SubplotMap = Dict{Any,Subplot} # ----------------------------------------------------------- - mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T} backend::T # the backend type n::Int # number of series @@ -78,9 +78,18 @@ mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T} end function Plot() - Plot(backend(), 0, DefaultsDict(KW(), _plot_defaults), Series[], nothing, - Subplot[], SubplotMap(), EmptyLayout(), - Subplot[], false) + Plot( + backend(), + 0, + DefaultsDict(KW(), _plot_defaults), + Series[], + nothing, + Subplot[], + SubplotMap(), + EmptyLayout(), + Subplot[], + false, + ) end # ----------------------------------------------------------------------- @@ -89,7 +98,7 @@ Base.getindex(plt::Plot, i::Integer) = plt.subplots[i] Base.length(plt::Plot) = length(plt.subplots) Base.lastindex(plt::Plot) = length(plt) -Base.getindex(plt::Plot, r::Integer, c::Integer) = plt.layout[r,c] +Base.getindex(plt::Plot, r::Integer, c::Integer) = plt.layout[r, c] Base.size(plt::Plot) = size(plt.layout) Base.size(plt::Plot, i::Integer) = size(plt.layout)[i] Base.ndims(plt::Plot) = 2 diff --git a/src/utils.jl b/src/utils.jl index 0bba4422..0d69f3a5 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -1,10 +1,12 @@ -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 +# --------------------------------------------------------------- + +treats_y_as_x(seriestype) = + seriestype in (:vline, :vspan, :histogram, :barhist, :stephist, :scatterhist) + +function replace_image_with_heatmap(z::Array{T}) where {T<:Colorant} n, m = size(z) colors = palette(vec(z)) - newz = reshape(1:n*m, n, m) + newz = reshape(1:(n * m), n, m) newz, colors end @@ -19,8 +21,7 @@ end Segments() = Segments(Float64) Segments(::Type{T}) where {T} = Segments(T[]) -Segments(p::Int) = Segments(NTuple{p, Float64}[]) - +Segments(p::Int) = Segments(NTuple{p,Float64}[]) # Segments() = Segments(zeros(0)) @@ -29,34 +30,42 @@ to_nan(::Type{NTuple{2,Float64}}) = (NaN, NaN) to_nan(::Type{NTuple{3,Float64}}) = (NaN, NaN, NaN) coords(segs::Segments{Float64}) = segs.pts -coords(segs::Segments{NTuple{2,Float64}}) = Float64[p[1] for p in segs.pts], Float64[p[2] for p in segs.pts] -coords(segs::Segments{NTuple{3,Float64}}) = Float64[p[1] for p in segs.pts], Float64[p[2] for p in segs.pts], Float64[p[3] for p in segs.pts] +coords(segs::Segments{NTuple{2,Float64}}) = + Float64[p[1] for p in segs.pts], Float64[p[2] for p in segs.pts] +coords(segs::Segments{NTuple{3,Float64}}) = Float64[p[1] for p in segs.pts], +Float64[p[2] for p in segs.pts], +Float64[p[3] for p in segs.pts] -function Base.push!(segments::Segments{T}, vs...) where T +function Base.push!(segments::Segments{T}, vs...) where {T} if !isempty(segments.pts) push!(segments.pts, to_nan(T)) end for v in vs - push!(segments.pts, convert(T,v)) + push!(segments.pts, convert(T, v)) end segments end -function Base.push!(segments::Segments{T}, vs::AVec) where T +function Base.push!(segments::Segments{T}, vs::AVec) where {T} if !isempty(segments.pts) push!(segments.pts, to_nan(T)) end for v in vs - push!(segments.pts, convert(T,v)) + push!(segments.pts, convert(T, v)) end segments end +struct SeriesSegment + # indexes of this segement in series data vectors + range::UnitRange + # index into vector-valued attributes corresponding to this segment + attr_index::Int +end # ----------------------------------------------------- # helper to manage NaN-separated segments - -mutable struct SegmentsIterator +struct NaNSegmentsIterator args::Tuple n1::Int n2::Int @@ -66,47 +75,92 @@ function iter_segments(args...) tup = Plots.wraptuple(args) n1 = minimum(map(firstindex, tup)) n2 = maximum(map(lastindex, tup)) - SegmentsIterator(tup, n1, n2) + NaNSegmentsIterator(tup, n1, n2) end -function iter_segments(series::Series, seriestype::Symbol = :path) +function series_segments(series::Series, seriestype::Symbol = :path; check = false) x, y, z = series[:x], series[:y], series[:z] - if x === nothing - return UnitRange{Int}[] - elseif has_attribute_segments(series) - if any(isnan,y) - return [iter_segments(y)...] - elseif seriestype in (:scatter, :scatter3d) - return [[i] for i in eachindex(y)] - else - return [i:(i + 1) for i in firstindex(y):lastindex(y)-1] + (x === nothing || isempty(x)) && return UnitRange{Int}[] + + args = RecipesPipeline.is3d(series) ? (x, y, z) : (x, y) + nan_segments = collect(iter_segments(args...)) + + if check + scales = :xscale, :yscale, :zscale + for (n, s) in enumerate(args) + scale = get(series, scales[n], :identity) + if scale ∈ _logScales + for (i, v) in enumerate(s) + if v <= 0 + @warn "Invalid negative or zero value $v found at series index $i for $(scale) based $(scales[n])" + @debug "" exception = (DomainError(v), stacktrace()) + break + end + end + end end + end + + segments = if has_attribute_segments(series) + Iterators.flatten(map(nan_segments) do r + if seriestype in (:scatter, :scatter3d) + (SeriesSegment(i:i, i) for i in r) + else + (SeriesSegment(i:(i + 1), i) for i in first(r):(last(r) - 1)) + end + end) else - segs = UnitRange{Int}[] - args = RecipesPipeline.is3d(series) ? (x, y, z) : (x, y) - for seg in iter_segments(args...) - push!(segs, seg) + (SeriesSegment(r, 1) for r in nan_segments) + end + + warn_on_attr_dim_mismatch(series, x, y, z, segments) + return segments +end + +function warn_on_attr_dim_mismatch(series, x, y, z, segments) + isempty(segments) && return + seg_range = UnitRange( + minimum(first(seg.range) for seg in segments), + maximum(last(seg.range) for seg in segments), + ) + for attr in _segmenting_vector_attributes + v = get(series, attr, nothing) + if v isa AVec && eachindex(v) != seg_range + @warn "Indices $(eachindex(v)) of attribute `$attr` does not match data indices $seg_range." + if any(v -> !isnothing(v) && any(isnan, v), (x, y, z)) + @info """Data contains NaNs or missing values, and indices of `$attr` vector do not match data indices. + If you intend elements of `$attr` to apply to individual NaN-separated segements in the data, + pass each segment in a separate vector instead, and use a row vector for `$attr`. Legend entries + may be suppressed by passing an empty label. + For example, + plot([1:2,1:3], [[4,5],[3,4,5]], label=["y" ""], $attr=[1 2]) + """ + end end - return segs end end # helpers to figure out if there are NaN values in a list of array types -anynan(i::Int, args::Tuple) = any(a -> try isnan(_cycle(a,i)) catch MethodError false end, args) -anynan(args::Tuple) = i -> anynan(i,args) +anynan(i::Int, args::Tuple) = any(a -> try + isnan(_cycle(a, i)) +catch MethodError + false +end, args) +anynan(args::Tuple) = i -> anynan(i, args) anynan(istart::Int, iend::Int, args::Tuple) = any(anynan(args), istart:iend) allnan(istart::Int, iend::Int, args::Tuple) = all(anynan(args), istart:iend) -function Base.iterate(itr::SegmentsIterator, nextidx::Int = itr.n1) - i = findfirst(!anynan(itr.args), nextidx:itr.n2) - i === nothing && return nothing +function Base.iterate(itr::NaNSegmentsIterator, nextidx::Int = itr.n1) + i = findfirst(!anynan(itr.args), nextidx:(itr.n2)) + i === nothing && return nextval = nextidx + i - 1 - j = findfirst(anynan(itr.args), nextval:itr.n2) + j = findfirst(anynan(itr.args), nextval:(itr.n2)) nextnan = j === nothing ? itr.n2 + 1 : nextval + j - 1 - nextval:nextnan-1, nextnan + nextval:(nextnan - 1), nextnan end +Base.IteratorSize(::NaNSegmentsIterator) = Base.SizeUnknown() # Find minimal type that can contain NaN and x # To allow use of NaN separated segments with categorical x axis @@ -116,7 +170,6 @@ float_extended_type(x::AbstractArray{T}) where {T<:Real} = Float64 # ------------------------------------------------------------------------------------ - nop() = nothing notimpl() = error("This has not been implemented yet") @@ -126,12 +179,12 @@ isnothing(x) = false _cycle(wrapper::InputWrapper, idx::Int) = wrapper.obj _cycle(wrapper::InputWrapper, idx::AVec{Int}) = wrapper.obj -_cycle(v::AVec, idx::Int) = v[mod(idx, axes(v,1))] -_cycle(v::AMat, idx::Int) = size(v,1) == 1 ? v[end, mod(idx, axes(v,2))] : v[:, mod(idx, axes(v,2))] +_cycle(v::AVec, idx::Int) = v[mod(idx, axes(v, 1))] +_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::AVec, indices::AVec{Int}) = map(i -> _cycle(v,i), indices) -_cycle(v::AMat, indices::AVec{Int}) = map(i -> _cycle(v,i), indices) +_cycle(v::AVec, indices::AVec{Int}) = map(i -> _cycle(v, i), indices) +_cycle(v::AMat, indices::AVec{Int}) = map(i -> _cycle(v, i), indices) _cycle(v, indices::AVec{Int}) = fill(v, length(indices)) _cycle(cl::PlotUtils.AbstractColorList, idx::Int) = cl[mod1(idx, end)] @@ -146,21 +199,22 @@ makevec(v::AVec) = v makevec(v::T) where {T} = T[v] "duplicate a single value, or pass the 2-tuple through" -maketuple(x::Real) = (x,x) +maketuple(x::Real) = (x, x) maketuple(x::Tuple{T,S}) where {T,S} = x -const _Point{N,T} = Union{GeometryTypes.Point{N,T}, GeometryBasics.Point{N,T}} for i in 2:4 @eval begin - RecipesPipeline.unzip(v::Union{AVec{<:Tuple{Vararg{T,$i} where T}}, - AVec{<:_Point{$i}}}) = $(Expr(:tuple, (:([t[$j] for t in v]) for j=1:i)...)) + RecipesPipeline.unzip( + v::Union{AVec{<:Tuple{Vararg{T,$i} where T}},AVec{<:GeometryBasics.Point{$i}}}, + ) = $(Expr(:tuple, (:([t[$j] for t in v]) for j in 1:i)...)) end end -RecipesPipeline.unzip(v::Union{AVec{<:_Point{N}}, - AVec{<:Tuple{Vararg{T,N} where T}}}) where N = error("$N-dimensional unzip not implemented.") -RecipesPipeline.unzip(v::Union{AVec{<:_Point}, - AVec{<:Tuple}}) = error("Can't unzip points of different dimensions.") +RecipesPipeline.unzip( + ::Union{AVec{<:GeometryBasics.Point{N}},AVec{<:Tuple{Vararg{T,N} where T}}}, +) where {N} = error("$N-dimensional unzip not implemented.") +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 function _expand_limits(lims, x) @@ -173,11 +227,11 @@ function _expand_limits(lims, x) nothing end -expand_data(v, n::Integer) = [_cycle(v, i) for i=1:n] +expand_data(v, n::Integer) = [_cycle(v, i) for i in 1:n] # if the type exists in a list, replace the first occurence. otherwise add it to the end function addOrReplace(v::AbstractVector, t::DataType, args...; kw...) - for (i,vi) in enumerate(v) + for (i, vi) in enumerate(v) if isa(vi, t) v[i] = t(args...; kw...) return @@ -205,29 +259,42 @@ function replaceAliases!(plotattributes::AKW, aliases::Dict{Symbol,Symbol}) end end -createSegments(z) = collect(repeat(reshape(z,1,:),2,1))[2:end] - +createSegments(z) = collect(repeat(reshape(z, 1, :), 2, 1))[2:end] sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes))) -function _heatmap_edges(v::AVec, isedges::Bool = false) - length(v) == 1 && return v[1] .+ [-0.5, 0.5] - if isedges return v end +function _heatmap_edges(v::AVec, isedges::Bool = false, ispolar::Bool = false) + length(v) == 1 && return v[1] .+ [ispolar ? max(-v[1], -0.5) : -0.5, 0.5] + if isedges + return v + end # `isedges = true` means that v is a vector which already describes edges # and does not need to be extended. vmin, vmax = ignorenan_extrema(v) - extra_min = (v[2] - v[1]) / 2 + extra_min = ispolar ? min(v[1], (v[2] - v[1]) / 2) : (v[2] - v[1]) / 2 extra_max = (v[end] - v[end - 1]) / 2 - vcat(vmin-extra_min, 0.5 * (v[1:end-1] + v[2:end]), vmax+extra_max) + vcat(vmin - extra_min, 0.5 * (v[1:(end - 1)] + v[2:end]), vmax + extra_max) end "create an (n+1) list of the outsides of heatmap rectangles" -function heatmap_edges(v::AVec, scale::Symbol = :identity, isedges::Bool = false) +function heatmap_edges( + v::AVec, + scale::Symbol = :identity, + isedges::Bool = false, + ispolar::Bool = false, +) f, invf = RecipesPipeline.scale_func(scale), RecipesPipeline.inverse_scale_func(scale) - map(invf, _heatmap_edges(map(f,v), isedges)) + map(invf, _heatmap_edges(map(f, v), isedges, ispolar)) end -function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size::Tuple{Int, Int}) +function heatmap_edges( + x::AVec, + xscale::Symbol, + y::AVec, + yscale::Symbol, + z_size::Tuple{Int,Int}, + ispolar::Bool = false, +) nx, ny = length(x), length(y) # ismidpoints = z_size == (ny, nx) # This fails some tests, but would actually be # the correct check, since (4, 3) != (3, 4) and a missleading plot is produced. @@ -238,12 +305,11 @@ function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size: Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") end - x, y = heatmap_edges(x, xscale, isedges), - heatmap_edges(y, yscale, isedges) + x, y = heatmap_edges(x, xscale, isedges), heatmap_edges(y, yscale, isedges, ispolar) # special handle for `r` in polar plots return x, y end -function is_uniformly_spaced(v; tol=1e-6) +function is_uniformly_spaced(v; tol = 1e-6) dv = diff(v) maximum(dv) - minimum(dv) < tol * mean(abs.(dv)) end @@ -251,15 +317,17 @@ end function convert_to_polar(theta, r, r_extrema = ignorenan_extrema(r)) rmin, rmax = r_extrema r = (r .- rmin) ./ (rmax .- rmin) - x = r.*cos.(theta) - y = r.*sin.(theta) + x = r .* cos.(theta) + y = r .* sin.(theta) x, y end -function fakedata(sz...) +fakedata(sz::Int...) = fakedata(Random.seed!(PLOTS_SEED), sz...) + +function fakedata(rng::AbstractRNG, sz...) y = zeros(sz...) - for r in 2:size(y,1) - y[r,:] = 0.95 * vec(y[r-1,:]) + randn(size(y,2)) + for r in 2:size(y, 1) + y[r, :] = 0.95 * vec(y[r - 1, :]) + randn(rng, size(y, 2)) end y end @@ -278,20 +346,19 @@ isscalar(::Any) = false is_2tuple(v) = typeof(v) <: Tuple && length(v) == 2 - -isvertical(plotattributes::AKW) = get(plotattributes, :orientation, :vertical) in (:vertical, :v, :vert) +isvertical(plotattributes::AKW) = + get(plotattributes, :orientation, :vertical) in (:vertical, :v, :vert) isvertical(series::Series) = isvertical(series.plotattributes) +ticksType(ticks::AVec{T}) where {T<:Real} = :ticks +ticksType(ticks::AVec{T}) where {T<:AbstractString} = :labels +ticksType(ticks::Tuple{T,S}) where {T<:Union{AVec,Tuple},S<:Union{AVec,Tuple}} = + :ticks_and_labels +ticksType(ticks) = :invalid -ticksType(ticks::AVec{T}) where {T<:Real} = :ticks -ticksType(ticks::AVec{T}) where {T<:AbstractString} = :labels -ticksType(ticks::Tuple{T,S}) where {T<:Union{AVec,Tuple},S<:Union{AVec,Tuple}} = :ticks_and_labels -ticksType(ticks) = :invalid - -limsType(lims::Tuple{T,S}) where {T<:Real,S<:Real} = :limits -limsType(lims::Symbol) = lims == :auto ? :auto : :invalid -limsType(lims) = :invalid - +limsType(lims::Tuple{T,S}) where {T<:Real,S<:Real} = :limits +limsType(lims::Symbol) = lims == :auto ? :auto : :invalid +limsType(lims) = :invalid # recursively merge kw-dicts, e.g. for merging extra_kwargs / extra_plot_kwargs in plotly) recursive_merge(x::AbstractDict...) = merge(recursive_merge, x...) @@ -310,9 +377,9 @@ function nansplit(v::AVec) push!(vs, v) break elseif idx > 1 - push!(vs, v[1:idx-1]) + push!(vs, v[1:(idx - 1)]) end - v = v[idx+1:end] + v = v[(idx + 1):end] end vs end @@ -329,7 +396,7 @@ end # returns the array of indices (znew) and a vector of unique values (vals) function indices_and_unique_values(z::AbstractArray) vals = sort(unique(z)) - vmap = Dict([(v,i) for (i,v) in enumerate(vals)]) + vmap = Dict([(v, i) for (i, v) in enumerate(vals)]) newz = map(zi -> vmap[zi], z) newz, vals end @@ -337,16 +404,14 @@ end handle_surface(z) = z handle_surface(z::Surface) = permutedims(z.surf) -function ok(x::Number, y::Number, z::Number = 0) - isfinite(x) && isfinite(y) && isfinite(z) -end +ok(x::Number, y::Number, z::Number = 0) = isfinite(x) && isfinite(y) && isfinite(z) ok(tup::Tuple) = ok(tup...) # compute one side of a fill range from a ribbon function make_fillrange_side(y::AVec, rib) frs = zeros(axes(y)) for (i, yi) in pairs(y) - frs[i] = yi + _cycle(rib,i) + frs[i] = yi + _cycle(rib, i) end frs end @@ -362,16 +427,14 @@ function make_fillrange_from_ribbon(kw::AKW) end #turn tuple of fillranges to one path -function concatenate_fillrange(x,y::Tuple) +function concatenate_fillrange(x, y::Tuple) rib1, rib2 = first(y), last(y) - yline = vcat(rib1,(rib2)[end:-1:1]) - xline = vcat(x,x[end:-1:1]) + yline = vcat(rib1, (rib2)[end:-1:1]) + xline = vcat(x, x[end:-1:1]) return xline, yline end -function get_sp_lims(sp::Subplot, letter::Symbol) - axis_limits(sp, letter) -end +get_sp_lims(sp::Subplot, letter::Symbol) = axis_limits(sp, letter) """ xlims([plt]) @@ -401,79 +464,6 @@ xlims(sp_idx::Int = 1) = xlims(current(), sp_idx) ylims(sp_idx::Int = 1) = ylims(current(), sp_idx) zlims(sp_idx::Int = 1) = zlims(current(), sp_idx) -# These functions return an operator for use in `get_clims(::Seres, op)` -process_clims(lims::Tuple{<:Number,<:Number}) = (zlims -> ifelse.(isfinite.(lims), lims, zlims)) ∘ ignorenan_extrema -process_clims(s::Union{Symbol,Nothing,Missing}) = ignorenan_extrema -# don't specialize on ::Function otherwise python functions won't work -process_clims(f) = f - -function get_clims(sp::Subplot, op=process_clims(sp[:clims])) - zmin, zmax = Inf, -Inf - for series in series_list(sp) - if series[:colorbar_entry] - zmin, zmax = _update_clims(zmin, zmax, get_clims(series, op)...) - end - end - return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) -end - -function get_clims(sp::Subplot, series::Series, op=process_clims(sp[:clims])) - zmin, zmax = if series[:colorbar_entry] - get_clims(sp, op) - else - get_clims(series, op) - end - return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) -end - -""" - get_clims(::Series, op=Plots.ignorenan_extrema) - -Finds the limits for the colorbar by taking the "z-values" for the series and passing them into `op`, -which must return the tuple `(zmin, zmax)`. The default op is the extrema of the finite -values of the input. -""" -function get_clims(series::Series, op=ignorenan_extrema) - zmin, zmax = Inf, -Inf - z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface, :hexbin) - for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) - if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, op(vals.surf)...) - elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, op(vals)...) - end - end - return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) -end - -_update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax) - -@enum ColorbarStyle cbar_gradient cbar_fill cbar_lines - -function colorbar_style(series::Series) - colorbar_entry = series[:colorbar_entry] - if !(colorbar_entry isa Bool) - @warn "Non-boolean colorbar_entry ignored." - colorbar_entry = true - end - - if !colorbar_entry - nothing - elseif isfilledcontour(series) - cbar_fill - elseif iscontour(series) - cbar_lines - elseif series[:seriestype] ∈ (:heatmap,:surface) || - any(series[z] !== nothing for z ∈ [:marker_z,:line_z,:fill_z]) - cbar_gradient - else - nothing - end -end - -hascolorbar(series::Series) = colorbar_style(series) !== nothing -hascolorbar(sp::Subplot) = sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp)) - iscontour(series::Series) = series[:seriestype] in (:contour, :contour3d) isfilledcontour(series::Series) = iscontour(series) && series[:fillrange] !== nothing @@ -482,18 +472,15 @@ function contour_levels(series::Series, clims) zmin, zmax = clims levels = series[:levels] if levels isa Integer - levels = range(zmin, stop=zmax, length=levels+2) + levels = range(zmin, stop = zmax, length = levels + 2) if !isfilledcontour(series) - levels = levels[2:end-1] + levels = levels[2:(end - 1)] end end levels end - - for comp in (:line, :fill, :marker) - compcolor = string(comp, :color) get_compcolor = Symbol(:get_, compcolor) comp_z = string(comp, :_z) @@ -502,7 +489,6 @@ for comp in (:line, :fill, :marker) get_compalpha = Symbol(:get_, compalpha) @eval begin - function $get_compcolor(series, cmin::Real, cmax::Real, i::Int = 1) c = series[$Symbol($compcolor)] z = series[$Symbol($comp_z)] @@ -513,7 +499,8 @@ for comp in (:line, :fill, :marker) end end - $get_compcolor(series, clims, i::Int = 1) = $get_compcolor(series, clims[1], clims[2], i) + $get_compcolor(series, clims, i::Int = 1) = + $get_compcolor(series, clims[1], clims[2], i) function $get_compcolor(series, i::Int = 1) if series[$Symbol($comp_z)] === nothing @@ -535,7 +522,7 @@ function get_colorgradient(series::Series) series[:linecolor] elseif series[:marker_z] !== nothing series[:markercolor] - elseif series[:line_z] !== nothing + elseif series[:line_z] !== nothing series[:linecolor] elseif series[:fill_z] !== nothing series[:fillcolor] @@ -549,65 +536,48 @@ get_gradient(c) = cgrad() get_gradient(cg::ColorGradient) = cg get_gradient(cp::ColorPalette) = cgrad(cp, categorical = true) -function get_linewidth(series, i::Int = 1) - _cycle(series[:linewidth], i) -end - -function get_linestyle(series, i::Int = 1) - _cycle(series[:linestyle], i) -end - -function get_fillstyle(series, i::Int = 1) - _cycle(series[:fillstyle], i) -end +get_linewidth(series, i::Int = 1) = _cycle(series[:linewidth], i) +get_linestyle(series, i::Int = 1) = _cycle(series[:linestyle], i) +get_fillstyle(series, i::Int = 1) = _cycle(series[:fillstyle], i) function get_markerstrokecolor(series, i::Int = 1) msc = series[:markerstrokecolor] isa(msc, ColorGradient) ? msc : _cycle(msc, i) end -function get_markerstrokealpha(series, i::Int = 1) - _cycle(series[:markerstrokealpha], i) -end +get_markerstrokealpha(series, i::Int = 1) = _cycle(series[:markerstrokealpha], i) +get_markerstrokewidth(series, i::Int = 1) = _cycle(series[:markerstrokewidth], i) -function get_markerstrokewidth(series, i::Int = 1) - _cycle(series[:markerstrokewidth], i) -end +const _segmenting_vector_attributes = ( + :seriescolor, + :seriesalpha, + :linecolor, + :linealpha, + :linewidth, + :linestyle, + :fillcolor, + :fillalpha, + :fillstyle, + :markercolor, + :markeralpha, + :markersize, + :markerstrokecolor, + :markerstrokealpha, + :markerstrokewidth, + :markershape, +) + +const _segmenting_array_attributes = :line_z, :fill_z, :marker_z function has_attribute_segments(series::Series) # we want to check if a series needs to be split into segments just because # of its attributes - for letter in (:x, :y, :z) - # If we have NaNs in the data they define the segments and - # SegmentsIterator is used - series[letter] !== nothing && NaN in collect(series[letter]) && return false - end series[:seriestype] == :shape && return false - # ... else we check relevant attributes if they have multiple inputs + # check relevant attributes if they have multiple inputs return any( - (typeof(series[attr]) <: AbstractVector && length(series[attr]) > 1) - for - attr in [ - :seriescolor, - :seriesalpha, - :linecolor, - :linealpha, - :linewidth, - :linestyle, - :fillcolor, - :fillalpha, - :fillstyle, - :markercolor, - :markeralpha, - :markersize, - :markerstrokecolor, - :markerstrokealpha, - :markerstrokewidth, - :markershape, - ] - ) || any( - typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z) - ) + series[attr] isa AbstractVector && length(series[attr]) > 1 for + attr in _segmenting_vector_attributes + ) || any(series[attr] isa AbstractArray for attr in _segmenting_array_attributes) end function get_aspect_ratio(sp) @@ -623,10 +593,10 @@ function get_aspect_ratio(sp) return aspect_ratio end +get_size(series::Series) = get_size(series.plotattributes[:subplot]) get_size(kw) = get(kw, :size, default(:size)) get_size(plt::Plot) = get_size(plt.attr) get_size(sp::Subplot) = get_size(sp.plt) -get_size(series::Series) = get_size(series.plotattributes[:subplot]) get_thickness_scaling(kw) = get(kw, :thickness_scaling, default(:thickness_scaling)) get_thickness_scaling(plt::Plot) = get_thickness_scaling(plt.attr) @@ -635,7 +605,6 @@ get_thickness_scaling(series::Series) = get_thickness_scaling(series.plotattributes[:subplot]) # --------------------------------------------------------------- - makekw(; kw...) = KW(kw) wraptuple(x::Tuple) = x @@ -644,18 +613,23 @@ wraptuple(x) = (x,) trueOrAllTrue(f::Function, x::AbstractArray) = all(f, x) trueOrAllTrue(f::Function, x) = f(x) -allLineTypes(arg) = trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) -allStyles(arg) = trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) -allShapes(arg) = trueOrAllTrue(a -> is_marker_supported(get(_markerAliases, a, a)), arg) || - trueOrAllTrue(a -> isa(a, Shape), arg) -allAlphas(arg) = trueOrAllTrue(a -> (typeof(a) <: Real && a > 0 && a < 1) || - (typeof(a) <: AbstractFloat && (a == zero(typeof(a)) || a == one(typeof(a)))), arg) -allReals(arg) = trueOrAllTrue(a -> typeof(a) <: Real, arg) -allFunctions(arg) = trueOrAllTrue(a -> isa(a, Function), arg) +allLineTypes(arg) = trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) +allStyles(arg) = trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) +allShapes(arg) = ( + trueOrAllTrue(a -> is_marker_supported(get(_markerAliases, a, a)), arg) || + trueOrAllTrue(a -> isa(a, Shape), arg) +) +allAlphas(arg) = trueOrAllTrue( + a -> + (typeof(a) <: Real && a > 0 && a < 1) || ( + typeof(a) <: AbstractFloat && (a == zero(typeof(a)) || a == one(typeof(a))) + ), + arg, +) +allReals(arg) = trueOrAllTrue(a -> typeof(a) <: Real, arg) +allFunctions(arg) = trueOrAllTrue(a -> isa(a, Function), arg) # --------------------------------------------------------------- -# --------------------------------------------------------------- - """ Allows temporary setting of backend and defaults for Plots. Settings apply only for the `do` block. Example: @@ -689,7 +663,6 @@ function with(f::Function, args...; kw...) oldbackend = CURRENT_BACKEND.sym for arg in args - # change backend? if arg in backends() backend(arg) @@ -750,10 +723,7 @@ mutable struct DebugMode end const _debugMode = DebugMode(false) -function debugplots(on = true) - _debugMode.on = on -end - +debugplots(on = true) = _debugMode.on = on debugshow(io, x) = show(io, x) debugshow(io, x::AbstractArray) = print(io, summary(x)) @@ -773,9 +743,7 @@ end DD(io::IO, plotattributes::AKW, prefix = "") = dumpdict(io, plotattributes, prefix, true) DD(plotattributes::AKW, prefix = "") = DD(stdout, plotattributes, prefix) -function dumpcallstack() - error() # well... you wanted the stacktrace, didn't you?!? -end +dumpcallstack() = error() # well... you wanted the stacktrace, didn't you?!? # ------------------------------------------------------- # NOTE: backends should implement the following methods to get/set the x/y/z data objects @@ -807,17 +775,17 @@ function setxyz!(plt::Plot, xyz::Tuple{X,Y,Z}, i::Integer) where {X,Y,Z} _series_updated(plt, series) end -function setxyz!(plt::Plot, xyz::Tuple{X,Y,Z}, i::Integer) where {X,Y,Z<:AbstractMatrix} - setxyz!(plt, (xyz[1], xyz[2], Surface(xyz[3])), i) -end - +setxyz!(plt::Plot, xyz::Tuple{X,Y,Z}, i::Integer) where {X,Y,Z<:AbstractMatrix} = + (setxyz!(plt, (xyz[1], xyz[2], Surface(xyz[3])), i)) # ------------------------------------------------------- # indexing notation # Base.getindex(plt::Plot, i::Integer) = getxy(plt, i) -Base.setindex!(plt::Plot, xy::Tuple{X,Y}, i::Integer) where {X,Y} = (setxy!(plt, xy, i); plt) -Base.setindex!(plt::Plot, xyz::Tuple{X,Y,Z}, i::Integer) where {X,Y,Z} = (setxyz!(plt, xyz, i); plt) +Base.setindex!(plt::Plot, xy::Tuple{X,Y}, i::Integer) where {X,Y} = + (setxy!(plt, xy, i); plt) +Base.setindex!(plt::Plot, xyz::Tuple{X,Y,Z}, i::Integer) where {X,Y,Z} = + (setxyz!(plt, xyz, i); plt) # ------------------------------------------------------- # operate on individual series @@ -871,16 +839,15 @@ function extend_to_length!(v::AbstractVector, n) extend_by_data!(v, vmax .+ (1:(n - length(v)))) end extend_by_data!(v::AbstractVector, x) = isimmutable(v) ? vcat(v, x) : push!(v, x) -function extend_by_data!(v::AbstractVector, x::AbstractVector) +extend_by_data!(v::AbstractVector, x::AbstractVector) = isimmutable(v) ? vcat(v, x) : append!(v, x) -end # ------------------------------------------------------- function attr!(series::Series; kw...) plotattributes = KW(kw) RecipesPipeline.preprocess_attributes!(plotattributes) - for (k,v) in plotattributes + for (k, v) in plotattributes if haskey(_series_defaults, k) series[k] = v else @@ -894,7 +861,7 @@ end function attr!(sp::Subplot; kw...) plotattributes = KW(kw) RecipesPipeline.preprocess_attributes!(plotattributes) - for (k,v) in plotattributes + for (k, v) in plotattributes if haskey(_subplot_defaults, k) sp[k] = v else @@ -924,24 +891,22 @@ Base.append!(plt::Plot, i::Integer, t::Tuple) = append!(plt, i, t...) # push y[i] to the ith series function Base.push!(plt::Plot, y::AVec) ny = length(y) - for i in 1:plt.n - push!(plt, i, y[mod1(i,ny)]) + for i in 1:(plt.n) + push!(plt, i, y[mod1(i, ny)]) end plt end # push y[i] to the ith series # same x for each series -function Base.push!(plt::Plot, x::Real, y::AVec) - push!(plt, [x], y) -end +Base.push!(plt::Plot, x::Real, y::AVec) = push!(plt, [x], y) # push (x[i], y[i]) to the ith series function Base.push!(plt::Plot, x::AVec, y::AVec) nx = length(x) ny = length(y) - for i in 1:plt.n - push!(plt, i, x[mod1(i,nx)], y[mod1(i,ny)]) + for i in 1:(plt.n) + push!(plt, i, x[mod1(i, nx)], y[mod1(i, ny)]) end plt end @@ -951,107 +916,105 @@ function Base.push!(plt::Plot, x::AVec, y::AVec, z::AVec) nx = length(x) ny = length(y) nz = length(z) - for i in 1:plt.n - push!(plt, i, x[mod1(i,nx)], y[mod1(i,ny)], z[mod1(i,nz)]) + for i in 1:(plt.n) + push!(plt, i, x[mod1(i, nx)], y[mod1(i, ny)], z[mod1(i, nz)]) end plt end - - - # --------------------------------------------------------------- - # Some conversion functions # note: I borrowed these conversion constants from Compose.jl's Measure -const PX_PER_INCH = 100 -const DPI = PX_PER_INCH -const MM_PER_INCH = 25.4 -const MM_PER_PX = MM_PER_INCH / PX_PER_INCH - -inch2px(inches::Real) = float(inches * PX_PER_INCH) -px2inch(px::Real) = float(px / PX_PER_INCH) -inch2mm(inches::Real) = float(inches * MM_PER_INCH) -mm2inch(mm::Real) = float(mm / MM_PER_INCH) -px2mm(px::Real) = float(px * MM_PER_PX) -mm2px(mm::Real) = float(mm / MM_PER_PX) +const PX_PER_INCH = 100 +const DPI = PX_PER_INCH +const MM_PER_INCH = 25.4 +const MM_PER_PX = MM_PER_INCH / PX_PER_INCH +inch2px(inches::Real) = float(inches * PX_PER_INCH) +px2inch(px::Real) = float(px / PX_PER_INCH) +inch2mm(inches::Real) = float(inches * MM_PER_INCH) +mm2inch(mm::Real) = float(mm / MM_PER_INCH) +px2mm(px::Real) = float(px * MM_PER_PX) +mm2px(mm::Real) = float(mm / MM_PER_PX) "Smallest x in plot" -xmin(plt::Plot) = ignorenan_minimum([ignorenan_minimum(series.plotattributes[:x]) for series in plt.series_list]) +xmin(plt::Plot) = ignorenan_minimum([ + ignorenan_minimum(series.plotattributes[:x]) for series in plt.series_list +]) "Largest x in plot" -xmax(plt::Plot) = ignorenan_maximum([ignorenan_maximum(series.plotattributes[:x]) for series in plt.series_list]) +xmax(plt::Plot) = ignorenan_maximum([ + ignorenan_maximum(series.plotattributes[:x]) for series in plt.series_list +]) "Extrema of x-values in plot" ignorenan_extrema(plt::Plot) = (xmin(plt), xmax(plt)) - # --------------------------------------------------------------- # 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], +plottitlefont(p::Plot) = font(; + family = p[:plot_titlefontfamily], + pointsize = p[:plot_titlefontsize], + valign = p[:plot_titlefontvalign], + halign = p[:plot_titlefonthalign], + rotation = p[:plot_titlefontrotation], + color = 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], +colorbartitlefont(sp::Subplot) = font(; + family = sp[:colorbar_titlefontfamily], + pointsize = sp[:colorbar_titlefontsize], + valign = sp[:colorbar_titlefontvalign], + halign = sp[:colorbar_titlefonthalign], + rotation = sp[:colorbar_titlefontrotation], + color = sp[:colorbar_titlefontcolor], ) -titlefont(sp::Subplot) = font( - sp[:titlefontfamily], - sp[:titlefontsize], - sp[:titlefontvalign], - sp[:titlefonthalign], - sp[:titlefontrotation], - sp[:titlefontcolor], +titlefont(sp::Subplot) = font(; + family = sp[:titlefontfamily], + pointsize = sp[:titlefontsize], + valign = sp[:titlefontvalign], + halign = sp[:titlefonthalign], + rotation = sp[:titlefontrotation], + color = sp[:titlefontcolor], ) -legendfont(sp::Subplot) = font( - sp[:legendfontfamily], - sp[:legendfontsize], - sp[:legendfontvalign], - sp[:legendfonthalign], - sp[:legendfontrotation], - sp[:legendfontcolor], +legendfont(sp::Subplot) = font(; + family = sp[:legendfontfamily], + pointsize = sp[:legendfontsize], + valign = sp[:legendfontvalign], + halign = sp[:legendfonthalign], + rotation = sp[:legendfontrotation], + color = sp[:legendfontcolor], ) -legendtitlefont(sp::Subplot) = font( - sp[:legendtitlefontfamily], - sp[:legendtitlefontsize], - sp[:legendtitlefontvalign], - sp[:legendtitlefonthalign], - sp[:legendtitlefontrotation], - sp[:legendtitlefontcolor], +legendtitlefont(sp::Subplot) = font(; + family = sp[:legendtitlefontfamily], + pointsize = sp[:legendtitlefontsize], + valign = sp[:legendtitlefontvalign], + halign = sp[:legendtitlefonthalign], + rotation = sp[:legendtitlefontrotation], + color = sp[:legendtitlefontcolor], ) -tickfont(ax::Axis) = font( - ax[:tickfontfamily], - ax[:tickfontsize], - ax[:tickfontvalign], - ax[:tickfonthalign], - ax[:tickfontrotation], - ax[:tickfontcolor], +tickfont(ax::Axis) = font(; + family = ax[:tickfontfamily], + pointsize = ax[:tickfontsize], + valign = ax[:tickfontvalign], + halign = ax[:tickfonthalign], + rotation = ax[:tickfontrotation], + color = ax[:tickfontcolor], ) -guidefont(ax::Axis) = font( - ax[:guidefontfamily], - ax[:guidefontsize], - ax[:guidefontvalign], - ax[:guidefonthalign], - ax[:guidefontrotation], - ax[:guidefontcolor], +guidefont(ax::Axis) = font(; + family = ax[:guidefontfamily], + pointsize = ax[:guidefontsize], + valign = ax[:guidefontvalign], + halign = ax[:guidefonthalign], + rotation = ax[:guidefontrotation], + color = ax[:guidefontcolor], ) # --------------------------------------------------------------- @@ -1060,18 +1023,18 @@ guidefont(ax::Axis) = font( function convert_sci_unicode(label::AbstractString) unicode_dict = Dict( - '⁰' => "0", - '¹' => "1", - '²' => "2", - '³' => "3", - '⁴' => "4", - '⁵' => "5", - '⁶' => "6", - '⁷' => "7", - '⁸' => "8", - '⁹' => "9", - '⁻' => "-", - "×10" => "×10^{", + '⁰' => "0", + '¹' => "1", + '²' => "2", + '³' => "3", + '⁴' => "4", + '⁵' => "5", + '⁶' => "6", + '⁷' => "7", + '⁸' => "8", + '⁹' => "9", + '⁻' => "-", + "×10" => "×10^{", ) for key in keys(unicode_dict) label = replace(label, key => unicode_dict[key]) @@ -1106,11 +1069,14 @@ function straightline_data(series, expansion_factor = 1) xdata, ydata = fill(NaN, n), fill(NaN, n) for i in 1:k inds = (3 * i - 2):(3 * i - 1) - xdata[inds], ydata[inds] = straightline_data(xl, yl, x[inds], y[inds], expansion_factor) + xdata[inds], ydata[inds] = + straightline_data(xl, yl, x[inds], y[inds], expansion_factor) end xdata, ydata else - error("Misformed data. `straightline_data` either accepts vectors of length 2 or 3k. The provided series has length $n") + error( + "Misformed data. `straightline_data` either accepts vectors of length 2 or 3k. The provided series has length $n", + ) end end @@ -1132,7 +1098,10 @@ function straightline_data(xl, yl, x, y, expansion_factor = 1) b = y[1] - (y[1] - y[2]) * x[1] / (x[1] - x[2]) a = (y[1] - y[2]) / (x[1] - x[2]) # get the data values - xdata = [clamp(x[1] + (x[1] - x[2]) * (ylim - y[1]) / (y[1] - y[2]), xl...) for ylim in yl] + xdata = [ + clamp(x[1] + (x[1] - x[2]) * (ylim - y[1]) / (y[1] - y[2]), xl...) for + ylim in yl + ] xdata, a .* xdata .+ b end @@ -1173,40 +1142,75 @@ function shape_data(series, expansion_factor = 1) return x, y end -function construct_categorical_data(x::AbstractArray, axis::Axis) - map(xi -> axis[:discrete_values][searchsortedfirst(axis[:continuous_values], xi)], x) -end +construct_categorical_data(x::AbstractArray, axis::Axis) = + (map(xi -> axis[:discrete_values][searchsortedfirst(axis[:continuous_values], xi)], x)) -_fmt_paragraph(paragraph::AbstractString;kwargs...) = _fmt_paragraph(IOBuffer(),paragraph,0;kwargs...) - -function _fmt_paragraph(io::IOBuffer, - remaining_text::AbstractString, - column_count::Integer; - fillwidth=60, - leadingspaces=0) +_fmt_paragraph(paragraph::AbstractString; kwargs...) = + _fmt_paragraph(IOBuffer(), paragraph, 0; kwargs...) +function _fmt_paragraph( + io::IOBuffer, + remaining_text::AbstractString, + column_count::Integer; + fillwidth = 60, + leadingspaces = 0, +) kwargs = (fillwidth = fillwidth, leadingspaces = leadingspaces) - m = match(r"(.*?) (.*)",remaining_text) - if isa(m,Nothing) + m = match(r"(.*?) (.*)", remaining_text) + if isa(m, Nothing) if column_count + length(remaining_text) ≤ fillwidth - print(io,remaining_text) + print(io, remaining_text) String(take!(io)) else - print(io,"\n"*" "^leadingspaces*remaining_text) + print(io, "\n" * " "^leadingspaces * remaining_text) String(take!(io)) end else if column_count + length(m[1]) ≤ fillwidth - print(io,"$(m[1]) ") - _fmt_paragraph(io,m[2],column_count + length(m[1]) + 1;kwargs...) + print(io, "$(m[1]) ") + _fmt_paragraph(io, m[2], column_count + length(m[1]) + 1; kwargs...) else - print(io,"\n"*" "^leadingspaces*"$(m[1]) ") - _fmt_paragraph(io,m[2],leadingspaces;kwargs...) + print(io, "\n" * " "^leadingspaces * "$(m[1]) ") + _fmt_paragraph(io, m[2], leadingspaces; kwargs...) end end end -function _document_argument(S::AbstractString) - _fmt_paragraph("`$S`: "*_arg_desc[Symbol(S)],leadingspaces = 6 + length(S)) +_document_argument(S::AbstractString) = + _fmt_paragraph("`$S`: " * _arg_desc[Symbol(S)], leadingspaces = 6 + length(S)) + +function mesh3d_triangles(x, y, z, cns) + if typeof(cns) <: Tuple{Array,Array,Array} + ci, cj, ck = cns + if !(length(ci) == length(cj) == length(ck)) + throw( + ArgumentError("Argument connections must consist of equally sized arrays."), + ) + end + else + throw(ArgumentError("Argument connections has to be a tuple of three arrays.")) + end + X = zeros(eltype(x), 4length(ci)) + Y = zeros(eltype(y), 4length(cj)) + Z = zeros(eltype(z), 4length(ck)) + @inbounds for I in 1:length(ci) + i = ci[I] + 1 # connections are 0-based + j = cj[I] + 1 + k = ck[I] + 1 + m = 4(I - 1) + 1 + n = m + 1 + o = m + 2 + p = m + 3 + X[m] = X[p] = x[i] + Y[m] = Y[p] = y[i] + Z[m] = Z[p] = z[i] + X[n] = x[j] + Y[n] = y[j] + Z[n] = z[j] + X[o] = x[k] + Y[o] = y[k] + Z[o] = z[k] + end + return X, Y, Z end diff --git a/test/imgcomp.jl b/test/imgcomp.jl index 3a0af3ca..589dbd11 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -3,17 +3,17 @@ import Plots._current_plots_version # 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 + for arg in ex.args + replace_rand!(arg) + end + if ex.head === :call && ex.args[1] ∈ (:rand, :randn, :(Plots.fakedata)) + pushfirst!(ex.args, ex.args[1]) + ex.args[2] = :rng + end end function fix_rand!(ex) replace_rand!(ex) - pushfirst!(ex.args[1].args, :(rng = StableRNG(1234))) + pushfirst!(ex.args[1].args, :(rng = StableRNG(PLOTS_SEED))) end function image_comparison_tests( @@ -35,6 +35,7 @@ function image_comparison_tests( fn = "ref$idx.png" reffn = reference_file(pkg, idx, _current_plots_version) newfn = joinpath(reference_path(pkg, _current_plots_version), fn) + @debug example.exprs # test function func = (fn, idx) -> begin @@ -58,7 +59,7 @@ function image_comparison_facts( sigma = [1, 1], # number of pixels to "blur" tol = 1e-2, ) # acceptable error (percent) - for i = 1:length(Plots._examples) + for i in 1:length(Plots._examples) i in skip && continue if only === nothing || i in only @test image_comparison_tests(pkg, i, debug = debug, sigma = sigma, tol = tol) |> diff --git a/test/integration_dates.jl b/test/integration_dates.jl index 6a5756c7..48aa5b94 100644 --- a/test/integration_dates.jl +++ b/test/integration_dates.jl @@ -1,16 +1,60 @@ using Plots, Test, Dates @testset "Limits" begin - y=[1.0*i*i for i in 1:10] - x=[Date(2019,11,i) for i in 1:10] + 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]] + rx = [x[3], x[5]] - p = plot(x,y, widen = false) - vspan!(p, rx, label="", alpha=0.2) + p = plot(x, y, widen = false) + vspan!(p, rx, label = "", alpha = 0.2) ref_ylims = (y[1], y[end]) ref_xlims = (x[1].instant.periods.value, x[end].instant.periods.value) @test Plots.ylims(p) == ref_ylims @test Plots.xlims(p) == ref_xlims + #@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI")) + @static if haskey(ENV, "APPVEYOR") + @info "Skipping display tests on AppVeyor" + else + @test isa(display(p), Nothing) == true + closeall() + end +end # testset + +@testset "Date xlims" begin + y = [1.0 * i * i for i in 1:10] + x = [Date(2019, 11, i) for i in 1:10] + span = (Date(2019, 10, 31), Date(2019, 11, 11)) + + ref_xlims = map(date -> date.instant.periods.value, span) + + p = plot(x, y, xlims = span, widen = false) + + @test Plots.xlims(p) == ref_xlims + #@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI")) + @static if haskey(ENV, "APPVEYOR") + @info "Skipping display tests on AppVeyor" + else + @test isa(display(p), Nothing) == true + closeall() + end +end # testset + +@testset "DateTime xlims" begin + y = [1.0 * i * i for i in 1:10] + x = [DateTime(2019, 11, i, 11) for i in 1:10] + span = (DateTime(2019, 10, 31, 11, 59, 59), DateTime(2019, 11, 11, 12, 01, 15)) + + ref_xlims = map(date -> date.instant.periods.value, span) + + p = plot(x, y, xlims = span, widen = false) + @test Plots.xlims(p) == ref_xlims + #@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI")) + @static if haskey(ENV, "APPVEYOR") + @info "Skipping display tests on AppVeyor" + else + @test isa(display(p), Nothing) == true + closeall() + end end # testset diff --git a/test/runtests.jl b/test/runtests.jl index be680676..24931870 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,17 +1,18 @@ +using Plots: guidefont, series_annotations, PLOTS_SEED import ImageMagick using VisualRegressionTests using Plots using Random using StableRNGs using Test +using TestImages using FileIO using Gtk using LibGit2 -import GeometryTypes, GeometryBasics +import GeometryBasics using Dates using RecipesBase - @testset "Plotly standalone" begin @test_nowarn Plots._init_ijulia_plotting() @test Plots.plotly_local_file_path[] === nothing @@ -28,14 +29,18 @@ using RecipesBase end # testset include("test_defaults.jl") +include("test_pipeline.jl") include("test_axes.jl") include("test_axis_letter.jl") +include("test_components.jl") +include("test_shorthands.jl") +include("integration_dates.jl") include("test_recipes.jl") include("test_hdf5plots.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...) function reference_file(backend, i, version) refdir = reference_dir("Plots", string(backend)) @@ -58,35 +63,38 @@ reference_path(backend, version) = reference_dir("Plots", string(backend), strin if !isdir(reference_dir()) mkpath(reference_dir()) - LibGit2.clone("https://github.com/JuliaPlots/PlotReferenceImages.jl.git", reference_dir()) + LibGit2.clone( + "https://github.com/JuliaPlots/PlotReferenceImages.jl.git", + reference_dir(), + ) end include("imgcomp.jl") # don't actually show the plots -Random.seed!(1234) -default(show=false, reuse=true) +Random.seed!(PLOTS_SEED) +default(show = false, reuse = true) is_ci() = get(ENV, "CI", "false") == "true" -const IMG_TOL = VERSION < v"1.4" && Sys.iswindows() ? 1e-1 : is_ci() ? 1e-2 : 1e-3 +const PLOTS_IMG_TOL = parse(Float64, get(ENV, "PLOTS_IMG_TOL", is_ci() ? "1e-4" : "1e-5")) ## Uncomment the following lines to update reference images for different backends # @testset "GR" begin -# image_comparison_facts(:gr, tol=IMG_TOL, skip = Plots._backend_skips[:gr]) +# image_comparison_facts(:gr, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:gr]) # end # # plotly() # @testset "Plotly" begin -# image_comparison_facts(:plotly, tol=IMG_TOL, skip = Plots._backend_skips[:plotlyjs]) +# image_comparison_facts(:plotly, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:plotlyjs]) # end # # pyplot() # @testset "PyPlot" begin -# image_comparison_facts(:pyplot, tol=IMG_TOL, skip = Plots._backend_skips[:pyplot]) +# image_comparison_facts(:pyplot, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pyplot]) # end # # pgfplotsx() # @testset "PGFPlotsX" begin -# image_comparison_facts(:pgfplotsx, tol=IMG_TOL, skip = Plots._backend_skips[:pgfplotsx]) +# image_comparison_facts(:pgfplotsx, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pgfplotsx]) # end # 10 Histogram2D @@ -94,7 +102,6 @@ const IMG_TOL = VERSION < v"1.4" && Sys.iswindows() ? 1e-1 : is_ci() ? 1e-2 : 1e ## @testset "Backends" begin - @testset "GR" begin ENV["PLOTS_TEST"] = "true" ENV["GKSwstype"] = "100" @@ -104,7 +111,11 @@ const IMG_TOL = VERSION < v"1.4" && Sys.iswindows() ? 1e-1 : is_ci() ? 1e-2 : 1e @static if haskey(ENV, "APPVEYOR") @info "Skipping GR image comparison tests on AppVeyor" else - image_comparison_facts(:gr, tol=IMG_TOL, skip = Plots._backend_skips[:gr]) + image_comparison_facts( + :gr, + tol = PLOTS_IMG_TOL, + skip = Plots._backend_skips[:gr], + ) end end @@ -130,12 +141,20 @@ const IMG_TOL = VERSION < v"1.4" && Sys.iswindows() ? 1e-1 : is_ci() ? 1e-2 : 1e @test isa(p, Plots.Plot) == true @test isa(display(p), Nothing) == true p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4]) - annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))]) + annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, :auto)]) hline!(p, [3.1]) @test isa(p, Plots.Plot) == true @test isa(display(p), Nothing) == true end + @testset "PlotlyJS" begin + @test plotlyjs() == Plots.PlotlyJSBackend() + @test backend() == Plots.PlotlyJSBackend() + + p = plot(rand(10)) + @test isa(p, Plots.Plot) == true + @test_broken isa(display(p), Nothing) == true + end end @testset "Axes" begin @@ -144,25 +163,41 @@ end @test typeof(axis) == Plots.Axis @test Plots.discrete_value!(axis, "HI") == (0.5, 1) @test Plots.discrete_value!(axis, :yo) == (1.5, 2) - @test Plots.ignorenan_extrema(axis) == (0.5,1.5) - @test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1) + @test Plots.ignorenan_extrema(axis) == (0.5, 1.5) + @test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1) - Plots.discrete_value!(axis, ["x$i" for i=1:5]) - Plots.discrete_value!(axis, ["x$i" for i=0:2]) + Plots.discrete_value!(axis, ["x$i" for i in 1:5]) + Plots.discrete_value!(axis, ["x$i" for i in 0:2]) @test Plots.ignorenan_extrema(axis) == (0.5, 7.5) end @testset "NoFail" begin - plots = [histogram([1, 0, 0, 0, 0, 0]), - plot([missing]), - plot([missing; 1:4]), - plot([fill(missing,10); 1:4]), - plot([1 1; 1 missing]), - plot(["a" "b"; missing "d"], [1 2; 3 4])] - for plt in plots - display(plt) + #ensure backend with tested display + @test unicodeplots() == Plots.UnicodePlotsBackend() + @test backend() == Plots.UnicodePlotsBackend() + + @testset "Plot" begin + plots = [ + histogram([1, 0, 0, 0, 0, 0]), + plot([missing]), + plot([missing, missing]), + plot(fill(missing, 10)), + plot([missing; 1:4]), + plot([fill(missing, 10); 1:4]), + plot([1 1; 1 missing]), + plot(["a" "b"; missing "d"], [1 2; 3 4]), + ] + for plt in plots + display(plt) + end + @test_nowarn plot(x -> x^2, 0, 2) + end + + @testset "Bar" begin + p = bar([3, 2, 1], [1, 2, 3]) + @test isa(p, Plots.Plot) + @test isa(display(p), Nothing) == true end - @test_nowarn plot(x->x^2,0,2) end @testset "EmptyAnim" begin @@ -172,39 +207,42 @@ end @test_throws ArgumentError gif(anim) end -@testset "Segments" begin - function segments(args...) - segs = UnitRange{Int}[] - for seg in iter_segments(args...) - push!(segs,seg) - end - segs - end +@testset "NaN-separated Segments" begin + segments(args...) = collect(iter_segments(args...)) - nan10 = fill(NaN,10) + nan10 = fill(NaN, 10) @test segments(11:20) == [1:10] @test segments([NaN]) == [] @test segments(nan10) == [] @test segments([nan10; 1:5]) == [11:15] - @test segments([1:5;nan10]) == [1:5] + @test segments([1:5; nan10]) == [1:5] @test segments([nan10; 1:5; nan10; 1:5; nan10]) == [11:15, 26:30] @test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10] @test segments([nan10; 1:15], [1:15; nan10]) == [11:15] end @testset "Utils" begin - zipped = ([(1,2)], [("a","b")], [(1,"a"),(2,"b")], - [(1,2),(3,4)], [(1,2,3),(3,4,5)], [(1,2,3,4),(3,4,5,6)], - [(1,2.0),(missing,missing)], [(1,missing),(missing,"a")], - [(missing,missing)], [(missing,missing,missing),("a","b","c")]) + zipped = ( + [(1, 2)], + [("a", "b")], + [(1, "a"), (2, "b")], + [(1, 2), (3, 4)], + [(1, 2, 3), (3, 4, 5)], + [(1, 2, 3, 4), (3, 4, 5, 6)], + [(1, 2.0), (missing, missing)], + [(1, missing), (missing, "a")], + [(missing, missing)], + [(missing, missing, missing), ("a", "b", "c")], + ) for z in zipped @test isequal(collect(zip(Plots.unzip(z)...)), z) - @test isequal(collect(zip(Plots.unzip(GeometryTypes.Point.(z))...)), z) @test isequal(collect(zip(Plots.unzip(GeometryBasics.Point.(z))...)), z) end op1 = Plots.process_clims((1.0, 2.0)) op2 = Plots.process_clims((1, 2.0)) data = randn(100, 100) @test op1(data) == op2(data) - @test Plots.process_clims(nothing) == Plots.process_clims(missing) == Plots.process_clims(:auto) + @test Plots.process_clims(nothing) == + Plots.process_clims(missing) == + Plots.process_clims(:auto) end diff --git a/test/test_axes.jl b/test/test_axes.jl index 07db6102..4d714c86 100644 --- a/test/test_axes.jl +++ b/test/test_axes.jl @@ -9,6 +9,57 @@ using Plots, Test end @testset "Magic axis" begin - @test plot(1, axis=nothing)[1][:xaxis][:ticks] == [] - @test plot(1, axis=nothing)[1][:yaxis][:ticks] == [] + @test plot(1, axis = nothing)[1][:xaxis][:ticks] == [] + @test plot(1, axis = nothing)[1][:yaxis][:ticks] == [] end # testset + +@testset "Categorical ticks" begin + p1 = plot('A':'M', 1:13) + p2 = plot('A':'Z', 1:26) + p3 = plot('A':'Z', 1:26, ticks = :all) + @test Plots.get_ticks(p1[1], p1[1][:xaxis])[2] == string.('A':'M') + @test Plots.get_ticks(p2[1], p2[1][:xaxis])[2] == string.('C':3:'Z') + @test Plots.get_ticks(p3[1], p3[1][:xaxis])[2] == string.('A':'Z') +end + +@testset "Ticks getter functions" begin + ticks1 = ([1, 2, 3], ("a", "b", "c")) + ticks2 = ([4, 5], ("e", "f")) + p1 = plot(1:5, 1:5, 1:5, xticks = ticks1, yticks = ticks1, zticks = ticks1) + p2 = plot(1:5, 1:5, 1:5, xticks = ticks2, yticks = ticks2, zticks = ticks2) + p = plot(p1, p2) + @test xticks(p) == yticks(p) == zticks(p) == [ticks1, ticks2] + @test xticks(p[1]) == yticks(p[1]) == zticks(p[1]) == ticks1 +end + +@testset "Axis limits" begin + pl = plot(1:5, xlims = :symmetric, widen = false) + @test Plots.xlims(pl) == (-5, 5) + + pl = plot(1:3) + @test Plots.xlims(pl) == Plots.widen(1, 3) + + pl = plot([1.05, 2.0, 2.95], ylims = :round) + @test Plots.ylims(pl) == (1, 3) + + pl = plot(1:3, xlims = (1, 5)) + @test Plots.xlims(pl) == (1, 5) + + pl = plot(1:3, xlims = (1, 5), widen = true) + @test Plots.xlims(pl) == Plots.widen(1, 5) +end + +@testset "3D Axis" begin + ql = quiver([1, 2], [2, 1], [3, 4], quiver = ([1, -1], [0, 0], [1, -0.5]), arrow = true) + @test ql[1][:projection] == "3d" +end + +@testset "twinx" begin + pl = plot(1:10, margin = 2Plots.cm) + twpl = twinx(pl) + pl! = plot!(twinx(), -(1:10)) + @test twpl[:right_margin] == 2Plots.cm + @test twpl[:left_margin] == 2Plots.cm + @test twpl[:top_margin] == 2Plots.cm + @test twpl[:bottom_margin] == 2Plots.cm +end diff --git a/test/test_axis_letter.jl b/test/test_axis_letter.jl index 691034b8..e0b6462c 100644 --- a/test/test_axis_letter.jl +++ b/test/test_axis_letter.jl @@ -9,12 +9,15 @@ using Plots, Test 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} + @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") + @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" diff --git a/test/test_components.jl b/test/test_components.jl new file mode 100644 index 00000000..31b643e3 --- /dev/null +++ b/test/test_components.jl @@ -0,0 +1,160 @@ +using Plots, Test + +@testset "Shapes" begin + @testset "Type" begin + square = Shape([(0, 0.0), (1, 0.0), (1, 1.0), (0, 1.0)]) + @test isa(square, Shape{Int64,Float64}) + @test coords(square) isa Tuple{Vector{S},Vector{T}} where {T,S} + end + + @testset "Copy" begin + square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)]) + square2 = Shape(square) + @test square2.x == square.x + @test square2.y == square.y + end + + @testset "Center" begin + square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)]) + @test Plots.center(square) == (0.5, 0.5) + end + + @testset "Translate" begin + square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)]) + squareUp = Shape([(0, 1), (1, 1), (1, 2), (0, 2)]) + squareUpRight = Shape([(1, 1), (2, 1), (2, 2), (1, 2)]) + + @test Plots.translate(square, 0, 1).x == squareUp.x + @test Plots.translate(square, 0, 1).y == squareUp.y + + @test Plots.center(translate!(square, 1)) == (1.5, 1.5) + end + + @testset "Rotate" begin + # 2 radians rotation matrix + R2 = [cos(2) sin(2); -sin(2) cos(2)] + coords = [0 0; 1 0; 1 1; 0 1]' + coordsRotated2 = R2 * (coords .- 0.5) .+ 0.5 + + square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)]) + + # make a new, rotated square + square2 = Plots.rotate(square, -2) + @test square2.x ≈ coordsRotated2[1, :] + @test square2.y ≈ coordsRotated2[2, :] + + # unrotate the new square in place + rotate!(square2, 2) + @test square2.x ≈ coords[1, :] + @test square2.y ≈ coords[2, :] + end + + @testset "Plot" begin + ang = range(0, 2π, length = 60) + ellipse(x, y, w, h) = Shape(w * sin.(ang) .+ x, h * cos.(ang) .+ y) + myshapes = [ellipse(x, rand(), rand(), rand()) for x in 1:4] + @test coords(myshapes) isa Tuple{Vector{Vector{S}},Vector{Vector{T}}} where {T,S} + local p + @test_nowarn p = plot(myshapes) + @test p[1][1][:seriestype] == :shape + end +end + +@testset "Brush" begin + @testset "Colors" begin + baseline = brush(1, RGB(0, 0, 0)) + @test brush(:black) == baseline + @test brush("black") == baseline + end + @testset "Weight" begin + @test brush(10).size == 10 + @test brush(0.1).size == 1 + end + @testset "Alpha" begin + @test brush(0.4).alpha == 0.4 + @test brush(20).alpha == nothing + end + @testset "Bad Argument" begin + # using test_logs because test_warn seems to not work anymore + @test_logs (:warn, "Unused brush arg: nothing (Nothing)") begin + brush(nothing) + end + end +end + +@testset "Fonts" begin + @testset "Scaling" begin + sizesToCheck = [ + :titlefontsize, + :legendfontsize, + :legendtitlefontsize, + :xtickfontsize, + :ytickfontsize, + :ztickfontsize, + :xguidefontsize, + :yguidefontsize, + :zguidefontsize, + ] + # get inital font sizes + initialSizes = [Plots.default(s) for s in sizesToCheck] + + #scale up font sizes + scalefontsizes(2) + + # get inital font sizes + doubledSizes = [Plots.default(s) for s in sizesToCheck] + + @test doubledSizes == initialSizes * 2 + + # reset font sizes + resetfontsizes() + + finalSizes = [Plots.default(s) for s in sizesToCheck] + + @test finalSizes == initialSizes + end +end + +@testset "Series Annotations" begin + square = Shape([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)]) + @test_logs (:warn, "Unused SeriesAnnotations arg: triangle (Symbol)") begin + p = plot( + [1, 2, 3], + series_annotations = ( + ["a"], + 2, # pass a scale factor + (1, 4), # pass two scale factors (overwrites first one) + square, # pass a shape + font(:courier), # pass an annotation font + :triangle, # pass an incorrect argument + ), + ) + sa = p.series_list[1].plotattributes[:series_annotations] + @test only(sa.strs).str == "a" + @test sa.font.family == "courier" + @test sa.baseshape == square + @test sa.scalefactor == (1, 4) + end + spl = scatter( + 4.53 .* [1 / 1 1 / 2 1 / 3 1 / 4 1 / 5], + [0 0 0 0 0], + layout = (5, 1), + ylims = (-1.1, 1.1), + xlims = (0, 5), + series_annotations = permutedims([["1/1"], ["1/2"], ["1/3"], ["1/4"], ["1/5"]]), + ) + for i in 1:5 + @test only(spl.series_list[i].plotattributes[:series_annotations].strs).str == + "1/$i" + end + + p = plot([1, 2], annotations = (1.5, 2, text("foo", :left))) + x, y, txt = only(p.subplots[end][:annotations]) + @test (x, y) == (1.5, 2) + @test txt.str == "foo" + + p = plot([1, 2], annotations = ((0.1, 0.5), :auto)) + pos, txt = only(p.subplots[end][:annotations]) + @test pos == (0.1, 0.5) + @test txt.str == "(a)" +end diff --git a/test/test_defaults.jl b/test/test_defaults.jl index 96c0ac44..9ce50738 100644 --- a/test/test_defaults.jl +++ b/test/test_defaults.jl @@ -1,10 +1,12 @@ using Plots, Test -const PLOTS_DEFAULTS = Dict(:theme => :wong2) +const PLOTS_DEFAULTS = Dict(:theme => :wong2, :fontfamily => :palantino) Plots.__init__() @testset "Loading theme" begin - @test plot(1:5)[1][1][:seriescolor] == RGBA(colorant"black") + pl = plot(1:5) + @test pl[1][1][:seriescolor] == RGBA(colorant"black") + @test guidefont(pl[1][:xaxis]).family == "palantino" end empty!(PLOTS_DEFAULTS) diff --git a/test/test_hdf5plots.jl b/test/test_hdf5plots.jl index 2c106025..a948c677 100644 --- a/test/test_hdf5plots.jl +++ b/test/test_hdf5plots.jl @@ -1,21 +1,20 @@ using Plots, HDF5 - @testset "HDF5_Plots" begin - fname = "tmpplotsave.hdf5" - hdf5() + fname = "tmpplotsave.hdf5" + hdf5() - x = 1:10 - psrc=plot(x, x.*x); #Create some plot - Plots.hdf5plot_write(psrc, fname) + x = 1:10 + psrc = plot(x, x .* x) #Create some plot + Plots.hdf5plot_write(psrc, fname) - #Read back file: - gr() #Choose some fast backend likely to work in test environment. - pread = Plots.hdf5plot_read(fname) + #Read back file: + gr() #Choose some fast backend likely to work in test environment. + pread = Plots.hdf5plot_read(fname) - #Make sure data made it through: - @test psrc.subplots[1].series_list[1][:x] == pread.subplots[1].series_list[1][:x] - @test psrc.subplots[1].series_list[1][:y] == pread.subplots[1].series_list[1][:y] + #Make sure data made it through: + @test psrc.subplots[1].series_list[1][:x] == pread.subplots[1].series_list[1][:x] + @test psrc.subplots[1].series_list[1][:y] == pread.subplots[1].series_list[1][:y] - #display(pread) #Don't display. Regression env might not support + #display(pread) #Don't display. Regression env might not support end #testset diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index b105de42..21144db4 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -2,410 +2,407 @@ using Plots, Test pgfplotsx() function create_plot(args...; kwargs...) - pgfx_plot = plot(args...; kwargs...) - return pgfx_plot, repr("application/x-tex", pgfx_plot) + pgfx_plot = plot(args...; kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) end function create_plot!(args...; kwargs...) - pgfx_plot = plot!(args...; kwargs...) - return pgfx_plot, repr("application/x-tex", pgfx_plot) + pgfx_plot = plot!(args...; kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) end @testset "PGFPlotsX" begin - pgfx_plot = plot(1:5) - Plots._update_plot_object(pgfx_plot) - @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument - @test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing - axis = Plots.pgfx_axes(pgfx_plot.o)[1] - @test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 1 - @test !haskey(axis.contents[1].options.dict, "fill") + pgfx_plot = plot(1:5) + Plots._update_plot_object(pgfx_plot) + @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument + @test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing + axis = Plots.pgfx_axes(pgfx_plot.o)[1] + @test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 1 + @test !haskey(axis.contents[1].options.dict, "fill") - @testset "Legends" begin - legends_plot = plot(rand(5, 2), lab = ["1" ""]) - scatter!(legends_plot, rand(5)) - Plots._update_plot_object(legends_plot) - axis_contents = Plots.pgfx_axes(legends_plot.o)[1].contents - leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents) - series = filter(x -> x isa PGFPlotsX.Plot, axis_contents) - @test length(leg_entries) == 2 - @test !haskey(series[1].options.dict, "forget plot") - @test haskey(series[2].options.dict, "forget plot") - @test !haskey(series[3].options.dict, "forget plot") - end # testset + @testset "Legends" begin + legends_plot = plot(rand(5, 2), lab = ["1" ""]) + scatter!(legends_plot, rand(5)) + Plots._update_plot_object(legends_plot) + axis_contents = Plots.pgfx_axes(legends_plot.o)[1].contents + leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents) + series = filter(x -> x isa PGFPlotsX.Plot, axis_contents) + @test length(leg_entries) == 2 + @test !haskey(series[1].options.dict, "forget plot") + @test haskey(series[2].options.dict, "forget plot") + @test !haskey(series[3].options.dict, "forget plot") + end # testset - @testset "3D docs example" begin - n = 100 - ts = range(0, stop = 8π, length = n) - x = ts .* map(cos, ts) - y = (0.1ts) .* map(sin, ts) - z = 1:n - pl = plot( - x, - y, - z, - zcolor = reverse(z), - m = (10, 0.8, :blues, Plots.stroke(0)), - leg = false, - cbar = true, - w = 5, - ) - pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w = 10) - Plots._update_plot_object(pgfx_plot) - if @test_nowarn( - haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true - ) - @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing - end - end # testset - @testset "Color docs example" begin - y = rand(100) - plot( - 0:10:100, - rand(11, 4), - lab = "lines", - w = 3, - palette = :grays, - fill = 0, - α = 0.6, - ) - pl = scatter!( - y, - zcolor = abs.(y .- 0.5), - m = (:hot, 0.8, Plots.stroke(1, :green)), - ms = 10 * abs.(y .- 0.5) .+ 4, - lab = ["grad", "", "ient"], - ) - Plots._update_plot_object(pl) - axis = Plots.pgfx_axes(pl.o)[1] - @test count(x -> x isa PGFPlotsX.LegendEntry, axis.contents) == 6 - @test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 108 # each marker is its own plot, fillranges create 2 plot-objects - marker = axis.contents[15] - @test marker isa PGFPlotsX.Plot - @test marker.options["mark"] == "*" - @test marker.options["mark options"]["color"] == - RGBA{Float64}(colorant"green", 0.8) - @test marker.options["mark options"]["line width"] == 0.75 # 1px is 0.75pt - end # testset - @testset "Plot in pieces" begin - pic = plot(rand(100) / 3, reg = true, fill = (0, :green)) - scatter!(pic, rand(100), markersize = 6, c = :orange) - Plots._update_plot_object(pic) - axis_contents = Plots.pgfx_axes(pic.o)[1].contents - leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents) - series = filter(x -> x isa PGFPlotsX.Plot, axis_contents) - @test length(leg_entries) == 2 - @test length(series) == 4 - @test haskey(series[1].options.dict, "forget plot") - @test !haskey(series[2].options.dict, "forget plot") - @test haskey(series[3].options.dict, "forget plot") - @test !haskey(series[4].options.dict, "forget plot") - end # testset - @testset "Marker types" begin - markers = filter((m -> begin - m in Plots.supported_markers() - end), Plots._shape_keys) - markers = reshape(markers, 1, length(markers)) - n = length(markers) - x = (range(0, stop = 10, length = n + 2))[2:(end-1)] - y = repeat(reshape(reverse(x), 1, :), n, 1) - scatter( - x, - y, - m = (8, :auto), - lab = map(string, markers), - bg = :linen, - xlim = (0, 10), - ylim = (0, 10), - ) - end # testset - @testset "Layout" begin - plot( - Plots.fakedata(100, 10), - layout = 4, - palette = [:grays :blues :hot :rainbow], - bg_inside = [:orange :pink :darkblue :black], - ) - end # testset - @testset "Polar plots" begin - Θ = range(0, stop = 1.5π, length = 100) - r = abs.(0.1 * randn(100) + sin.(3Θ)) - plot(Θ, r, proj = :polar, m = 2) - end # testset - @testset "Drawing shapes" begin - verts = [ - (-1.0, 1.0), - (-1.28, 0.6), - (-0.2, -1.4), - (0.2, -1.4), - (1.28, 0.6), - (1.0, 1.0), - (-1.0, 1.0), - (-0.2, -0.6), - (0.0, -0.2), - (-0.4, 0.6), - (1.28, 0.6), - (0.2, -1.4), - (-0.2, -1.4), - (0.6, 0.2), - (-0.2, 0.2), - (0.0, -0.2), - (0.2, 0.2), - (-0.2, -0.6), - ] - x = 0.1:0.2:0.9 - y = 0.7 * rand(5) .+ 0.15 - plot( - x, - y, - line = (3, :dash, :lightblue), - marker = (Shape(verts), 30, RGBA(0, 0, 0, 0.2)), - bg = :pink, - fg = :darkblue, - xlim = (0, 1), - ylim = (0, 1), - leg = false, - ) - end # testset - @testset "Histogram 2D" begin - histogram2d(randn(10000), randn(10000), nbins = 20) - end # testset - @testset "Heatmap-like" begin - xs = [string("x", i) for i = 1:10] - ys = [string("y", i) for i = 1:4] - z = float((1:4) * reshape(1:10, 1, :)) - pgfx_plot = heatmap(xs, ys, z, aspect_ratio = 1) - Plots._update_plot_object(pgfx_plot) - if @test_nowarn( - haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true - ) - @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing - @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" - end + @testset "3D docs example" begin + n = 100 + ts = range(0, stop = 8π, length = n) + x = ts .* map(cos, ts) + y = (0.1ts) .* map(sin, ts) + z = 1:n + pl = plot( + x, + y, + z, + zcolor = reverse(z), + m = (10, 0.8, :blues, Plots.stroke(0)), + leg = false, + cbar = true, + w = 5, + ) + pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w = 10) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn( + haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true + ) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing + end + end # testset + @testset "Color docs example" begin + y = rand(100) + plot( + 0:10:100, + rand(11, 4), + lab = "lines", + w = 3, + palette = :grays, + fill = 0, + α = 0.6, + ) + pl = scatter!( + y, + zcolor = abs.(y .- 0.5), + m = (:hot, 0.8, Plots.stroke(1, :green)), + ms = 10 * abs.(y .- 0.5) .+ 4, + lab = ["grad", "", "ient"], + ) + Plots._update_plot_object(pl) + axis = Plots.pgfx_axes(pl.o)[1] + @test count(x -> x isa PGFPlotsX.LegendEntry, axis.contents) == 6 + @test count(x -> x isa PGFPlotsX.Plot, axis.contents) == 108 # each marker is its own plot, fillranges create 2 plot-objects + marker = axis.contents[15] + @test marker isa PGFPlotsX.Plot + @test marker.options["mark"] == "*" + @test marker.options["mark options"]["color"] == RGBA{Float64}(colorant"green", 0.8) + @test marker.options["mark options"]["line width"] == 0.75 # 1px is 0.75pt + end # testset + @testset "Plot in pieces" begin + pic = plot(rand(100) / 3, reg = true, fill = (0, :green)) + scatter!(pic, rand(100), markersize = 6, c = :orange) + Plots._update_plot_object(pic) + axis_contents = Plots.pgfx_axes(pic.o)[1].contents + leg_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis_contents) + series = filter(x -> x isa PGFPlotsX.Plot, axis_contents) + @test length(leg_entries) == 2 + @test length(series) == 4 + @test haskey(series[1].options.dict, "forget plot") + @test !haskey(series[2].options.dict, "forget plot") + @test haskey(series[3].options.dict, "forget plot") + @test !haskey(series[4].options.dict, "forget plot") + end # testset + @testset "Marker types" begin + markers = filter((m -> begin + m in Plots.supported_markers() + end), Plots._shape_keys) + markers = reshape(markers, 1, length(markers)) + n = length(markers) + x = (range(0, stop = 10, length = n + 2))[2:(end - 1)] + y = repeat(reshape(reverse(x), 1, :), n, 1) + scatter( + x, + y, + m = (8, :auto), + lab = map(string, markers), + bg = :linen, + xlim = (0, 10), + ylim = (0, 10), + ) + end # testset + @testset "Layout" begin + plot( + Plots.fakedata(100, 10), + layout = 4, + palette = [:grays :blues :hot :rainbow], + bg_inside = [:orange :pink :darkblue :black], + ) + end # testset + @testset "Polar plots" begin + Θ = range(0, stop = 1.5π, length = 100) + r = abs.(0.1 * randn(100) + sin.(3Θ)) + plot(Θ, r, proj = :polar, m = 2) + end # testset + @testset "Drawing shapes" begin + verts = [ + (-1.0, 1.0), + (-1.28, 0.6), + (-0.2, -1.4), + (0.2, -1.4), + (1.28, 0.6), + (1.0, 1.0), + (-1.0, 1.0), + (-0.2, -0.6), + (0.0, -0.2), + (-0.4, 0.6), + (1.28, 0.6), + (0.2, -1.4), + (-0.2, -1.4), + (0.6, 0.2), + (-0.2, 0.2), + (0.0, -0.2), + (0.2, 0.2), + (-0.2, -0.6), + ] + x = 0.1:0.2:0.9 + y = 0.7 * rand(5) .+ 0.15 + plot( + x, + y, + line = (3, :dash, :lightblue), + marker = (Shape(verts), 30, RGBA(0, 0, 0, 0.2)), + bg = :pink, + fg = :darkblue, + xlim = (0, 1), + ylim = (0, 1), + leg = false, + ) + end # testset + @testset "Histogram 2D" begin + histogram2d(randn(10000), randn(10000), nbins = 20) + end # testset + @testset "Heatmap-like" begin + xs = [string("x", i) for i in 1:10] + ys = [string("y", i) for i in 1:4] + z = float((1:4) * reshape(1:10, 1, :)) + pgfx_plot = heatmap(xs, ys, z, aspect_ratio = 1) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn( + haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true + ) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" + end - pgfx_plot = wireframe(xs, ys, z, aspect_ratio = 1) - # TODO: clims are wrong - end # testset - @testset "Contours" begin - x = 1:0.5:20 - y = 1:0.5:10 - f(x, y) = begin - (3x + y^2) * abs(sin(x) + cos(y)) - end - X = repeat(reshape(x, 1, :), length(y), 1) - Y = repeat(y, 1, length(x)) - Z = map(f, X, Y) - p2 = contour(x, y, Z) - p1 = contour(x, y, f, fill = true) - plot(p1, p2) - # TODO: colorbar for filled contours - end # testset - @testset "Varying colors" begin - t = range(0, stop = 1, length = 100) - θ = (6π) .* t - x = t .* cos.(θ) - y = t .* sin.(θ) - p1 = plot(x, y, line_z = t, linewidth = 3, legend = false) - p2 = scatter( - x, - y, - marker_z = ((x, y) -> begin + pgfx_plot = wireframe(xs, ys, z, aspect_ratio = 1) + # TODO: clims are wrong + end # testset + @testset "Contours" begin + x = 1:0.5:20 + y = 1:0.5:10 + f(x, y) = begin + (3x + y^2) * abs(sin(x) + cos(y)) + end + X = repeat(reshape(x, 1, :), length(y), 1) + Y = repeat(y, 1, length(x)) + Z = map(f, X, Y) + p2 = contour(x, y, Z) + p1 = contour(x, y, f, fill = true) + plot(p1, p2) + # TODO: colorbar for filled contours + end # testset + @testset "Varying colors" begin + t = range(0, stop = 1, length = 100) + θ = (6π) .* t + x = t .* cos.(θ) + y = t .* sin.(θ) + p1 = plot(x, y, line_z = t, linewidth = 3, legend = false) + p2 = scatter(x, y, marker_z = ((x, y) -> begin x + y - end), - color = :bwr, - legend = false, - ) - plot(p1, p2) - end # testset - @testset "Framestyles" begin - scatter( - fill(randn(10), 6), - fill(randn(10), 6), - framestyle = [:box :semi :origin :zerolines :grid :none], - title = [":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], - color = permutedims(1:6), - layout = 6, - label = "", - markerstrokewidth = 0, - ticks = -2:2, - ) - # TODO: support :semi - end # testset - @testset "Quiver" begin - x = (-2pi):0.2:(2*pi) - y = sin.(x) + end), color = :bwr, legend = false) + plot(p1, p2) + end # testset + @testset "Framestyles" begin + scatter( + fill(randn(10), 6), + fill(randn(10), 6), + framestyle = [:box :semi :origin :zerolines :grid :none], + title = [":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], + color = permutedims(1:6), + layout = 6, + label = "", + markerstrokewidth = 0, + ticks = -2:2, + ) + # TODO: support :semi + end # testset + @testset "Quiver" begin + x = (-2pi):0.2:(2 * pi) + y = sin.(x) - u = ones(length(x)) - v = cos.(x) - arrow_plot = plot(x, y, quiver = (u, v), arrow = true) - # TODO: could adjust limits to fit arrows if too long, but how? - # TODO: get latex available on CI - # mktempdir() do path - # @test_nowarn savefig(arrow_plot, path*"arrow.pdf") - # end - end # testset - @testset "Annotations" begin - y = rand(10) - pgfx_plot = plot( - y, - annotations = (3, y[3], Plots.text("this is \\#3", :left)), - leg = false, - ) - Plots._update_plot_object(pgfx_plot) - axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents - nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) - @test length(nodes) == 1 - mktempdir() do path - file_path = joinpath(path, "annotations.tex") - @test_nowarn savefig(pgfx_plot, file_path) - open(file_path) do io - lines = readlines(io) - @test count(s -> occursin("node", s), lines) == 1 - end - end - annotate!([ - (5, y[5], Plots.text("this is \\#5", 16, :red, :center)), - (10, y[10], Plots.text("this is \\#10", :right, 20, "courier")), - ]) - Plots._update_plot_object(pgfx_plot) - axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents - nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) - @test length(nodes) == 3 - mktempdir() do path - file_path = joinpath(path, "annotations.tex") - @test_nowarn savefig(pgfx_plot, file_path) - open(file_path) do io - lines = readlines(io) - @test count(s -> occursin("node", s), lines) == 3 - end - end - annotation_plot = scatter!( - range(2, stop = 8, length = 6), - rand(6), - marker = (50, 0.2, :orange), - series_annotations = [ - "series", - "annotations", - "map", - "to", - "series", - Plots.text("data", :green), - ], - ) - Plots._update_plot_object(annotation_plot) - axis_content = Plots.pgfx_axes(annotation_plot.o)[1].contents - nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) - @test length(nodes) == 9 - mktempdir() do path - file_path = joinpath(path, "annotations.tex") - @test_nowarn savefig(annotation_plot, file_path) - open(file_path) do io - lines = readlines(io) - @test count(s -> occursin("node", s), lines) == 9 - 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 # testset - @testset "Ribbon" begin - aa = rand(10) - bb = rand(10) - cc = rand(10) - conf = [aa - cc bb - cc] - ribbon_plot = - plot(collect(1:10), fill(1, 10), ribbon = (conf[:, 1], conf[:, 2])) - Plots._update_plot_object(ribbon_plot) - axis = Plots.pgfx_axes(ribbon_plot.o)[1] - plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents) - @test length(plots) == 3 - @test haskey(plots[1].options.dict, "fill") - @test haskey(plots[2].options.dict, "fill") - @test !haskey(plots[3].options.dict, "fill") - @test ribbon_plot.o !== nothing - @test ribbon_plot.o.the_plot !== nothing - end # testset - @testset "Markers and Paths" begin - 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 + u = ones(length(x)) + v = cos.(x) + arrow_plot = plot(x, y, quiver = (u, v), arrow = true) + # TODO: could adjust limits to fit arrows if too long, but how? + # TODO: get latex available on CI + # mktempdir() do path + # @test_nowarn savefig(arrow_plot, path*"arrow.pdf") + # end + end # testset + @testset "Annotations" begin + y = rand(10) + pgfx_plot = + plot(y, annotations = (3, y[3], Plots.text("this is \\#3", :left)), leg = false) + Plots._update_plot_object(pgfx_plot) + axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents + nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) + @test length(nodes) == 1 + mktempdir() do path + file_path = joinpath(path, "annotations.tex") + @test_nowarn savefig(pgfx_plot, file_path) + open(file_path) do io + lines = readlines(io) + @test count(s -> occursin("node", s), lines) == 1 + end + end + annotate!([ + (5, y[5], Plots.text("this is \\#5", 16, :red, :center)), + (10, y[10], Plots.text("this is \\#10", :right, 20, "courier")), + ]) + Plots._update_plot_object(pgfx_plot) + axis_content = Plots.pgfx_axes(pgfx_plot.o)[1].contents + nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) + @test length(nodes) == 3 + mktempdir() do path + file_path = joinpath(path, "annotations.tex") + @test_nowarn savefig(pgfx_plot, file_path) + open(file_path) do io + lines = readlines(io) + @test count(s -> occursin("node", s), lines) == 3 + end + end + annotation_plot = scatter!( + range(2, stop = 8, length = 6), + rand(6), + marker = (50, 0.2, :orange), + series_annotations = [ + "series", + "annotations", + "map", + "to", + "series", + Plots.text("data", :green), + ], + ) + Plots._update_plot_object(annotation_plot) + axis_content = Plots.pgfx_axes(annotation_plot.o)[1].contents + nodes = filter(x -> !isa(x, PGFPlotsX.Plot), axis_content) + @test length(nodes) == 9 + mktempdir() do path + file_path = joinpath(path, "annotations.tex") + @test_nowarn savefig(annotation_plot, file_path) + open(file_path) do io + lines = readlines(io) + @test count(s -> occursin("node", s), lines) == 9 + 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 # testset + @testset "Ribbon" begin + aa = rand(10) + bb = rand(10) + cc = rand(10) + conf = [aa - cc bb - cc] + ribbon_plot = plot(collect(1:10), fill(1, 10), ribbon = (conf[:, 1], conf[:, 2])) + Plots._update_plot_object(ribbon_plot) + axis = Plots.pgfx_axes(ribbon_plot.o)[1] + plots = filter(x -> x isa PGFPlotsX.Plot, axis.contents) + @test length(plots) == 3 + @test haskey(plots[1].options.dict, "fill") + @test haskey(plots[2].options.dict, "fill") + @test !haskey(plots[3].options.dict, "fill") + @test ribbon_plot.o !== nothing + @test ribbon_plot.o.the_plot !== nothing + end # testset + @testset "Markers and Paths" begin + 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 + @testset "Groups and Subplots" begin + group = rand(map((i -> begin + "group $(i)" + end), 1:4), 100) + pl = plot( + rand(100), + layout = @layout([a b; c]), + group = group, + linetype = [:bar :scatter :steppre], + linecolor = :match, + ) + Plots._update_plot_object(pl) + axis = Plots.pgfx_axes(pl.o)[1] + legend_entries = filter(x -> x isa PGFPlotsX.LegendEntry, axis.contents) + @test length(legend_entries) == 2 + end end # testset @testset "Extra kwargs" begin - pl = plot(1:5, test = "me") - @test pl[1][1].plotattributes[:extra_kwargs][:test] == "me" - pl = plot(1:5, test = "me", extra_kwargs = :subplot) - @test pl[1].attr[:extra_kwargs][:test] == "me" - pl = plot(1:5, test = "me", extra_kwargs = :plot) - @test pl.attr[:extra_plot_kwargs][:test] == "me" - pl = plot( - 1:5, - extra_kwargs = Dict( - :plot => Dict(:test => "me"), - :series => Dict(:and => "me too"), - ), - ) - @test pl.attr[:extra_plot_kwargs][:test] == "me" - @test pl[1][1].plotattributes[:extra_kwargs][:and] == "me too" - pl = plot( - plot(1:5, title = "Line"), - scatter( - 1:5, - title = "Scatter", - extra_kwargs = Dict(:subplot => Dict("axis line shift" => "10pt")), - ), - ) - Plots._update_plot_object(pl) - axes = Plots.pgfx_axes(pl.o) - @test !haskey(axes[1].options.dict, "axis line shift") - @test haskey(axes[2].options.dict, "axis line shift") - pl = plot( - x -> x, - -1:1; - add = raw"\node at (0,0.5) {\huge hi};", - extra_kwargs = :subplot, - ) - @test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};") - Plots._update_plot_object(pl) - axes = Plots.pgfx_axes(pl.o) - @test filter(x -> x isa String, axes[1].contents)[1] == - raw"\node at (0,0.5) {\huge hi};" - plot!(pl) - @test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};") - Plots._update_plot_object(pl) - axes = Plots.pgfx_axes(pl.o) - @test filter(x -> x isa String, axes[1].contents)[1] == - raw"\node at (0,0.5) {\huge hi};" + pl = plot(1:5, test = "me") + @test pl[1][1].plotattributes[:extra_kwargs][:test] == "me" + pl = plot(1:5, test = "me", extra_kwargs = :subplot) + @test pl[1].attr[:extra_kwargs][:test] == "me" + pl = plot(1:5, test = "me", extra_kwargs = :plot) + @test pl.attr[:extra_plot_kwargs][:test] == "me" + pl = plot( + 1:5, + extra_kwargs = Dict( + :plot => Dict(:test => "me"), + :series => Dict(:and => "me too"), + ), + ) + @test pl.attr[:extra_plot_kwargs][:test] == "me" + @test pl[1][1].plotattributes[:extra_kwargs][:and] == "me too" + pl = plot( + plot(1:5, title = "Line"), + scatter( + 1:5, + title = "Scatter", + extra_kwargs = Dict(:subplot => Dict("axis line shift" => "10pt")), + ), + ) + Plots._update_plot_object(pl) + axes = Plots.pgfx_axes(pl.o) + @test !haskey(axes[1].options.dict, "axis line shift") + @test haskey(axes[2].options.dict, "axis line shift") + pl = + plot(x -> x, -1:1; add = raw"\node at (0,0.5) {\huge hi};", extra_kwargs = :subplot) + @test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};") + Plots._update_plot_object(pl) + axes = Plots.pgfx_axes(pl.o) + @test filter(x -> x isa String, axes[1].contents)[1] == + raw"\node at (0,0.5) {\huge hi};" + plot!(pl) + @test pl[1][:extra_kwargs] == Dict(:add => raw"\node at (0,0.5) {\huge hi};") + Plots._update_plot_object(pl) + axes = Plots.pgfx_axes(pl.o) + @test filter(x -> x isa String, axes[1].contents)[1] == + raw"\node at (0,0.5) {\huge hi};" end # testset @testset "Titlefonts" begin - pl = plot(1:5, title = "Test me", titlefont = (2, :left)) - @test pl[1][:title] == "Test me" - @test pl[1][:titlefontsize] == 2 - @test pl[1][:titlefonthalign] == :left - Plots._update_plot_object(pl) - ax_opt = Plots.pgfx_axes(pl.o)[1].options - @test ax_opt["title"] == "Test me" - @test(haskey(ax_opt.dict, "title style")) isa Test.Pass - pl = plot(1:5, plot_title = "Test me", plot_titlefont = (2, :left)) - @test pl[:plot_title] == "Test me" - @test pl[:plot_titlefontsize] == 2 - @test pl[:plot_titlefonthalign] == :left - pl = heatmap( - rand(3, 3), - colorbar_title = "Test me", - colorbar_titlefont = (12, :right), - ) - @test pl[1][:colorbar_title] == "Test me" - @test pl[1][:colorbar_titlefontsize] == 12 - @test pl[1][:colorbar_titlefonthalign] == :right + 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 diff --git a/test/test_pipeline.jl b/test/test_pipeline.jl new file mode 100644 index 00000000..ac6876f8 --- /dev/null +++ b/test/test_pipeline.jl @@ -0,0 +1,19 @@ +using Plots, Test +using RecipesPipeline + +@testset "plot" begin + pl = plot(1:5) + pl2 = plot(pl, tex_output_standalone = true) + @test pl[:tex_output_standalone] == false + @test pl2[:tex_output_standalone] == true + plot!(pl, tex_output_standalone = true) + @test pl[:tex_output_standalone] == true +end + +@testset "get_axis_limits" begin + x = [0.1, 5] + p1 = plot(x, [5, 0.1], yscale = :log10) + p2 = plot!(identity) + @test all(RecipesPipeline.get_axis_limits(p1, :x) .== x) + @test all(RecipesPipeline.get_axis_limits(p2, :x) .== x) +end diff --git a/test/test_recipes.jl b/test/test_recipes.jl index 3c5718a4..418e4465 100644 --- a/test/test_recipes.jl +++ b/test/test_recipes.jl @@ -1,25 +1,49 @@ using Plots, Test +using OffsetArrays + @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) + 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) + @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) + vsp = vspan([1, 3], widen = false) + @test Plots.xlims(vsp) == (1, 3) + @test Plots.ylims(vsp) == (0, 1) # TODO: might be problematic on log-scales + vsp = vspan([1, 3], xlims = (-2, 5), widen = false) + @test Plots.xlims(vsp) == (-2, 5) + vsp = vspan([1, 3], ylims = (-2, 5), widen = false) + @test Plots.ylims(vsp) == (-2, 5) end # testset + +@testset "offset axes" begin + tri = OffsetVector(vcat(1:5, 4:-1:1), 11:19) + sticks = plot(tri, seriestype = :sticks) + @test length(sticks) == 1 +end + +@testset "framestyle axes" begin + pl = plot(-1:1, -1:1, -1:1) + sp = pl.subplots[1] + defaultret = Plots.axis_drawing_info_3d(sp, :x) + for letter in [:x, :y, :z] + for fr in [:box :semi :origin :zerolines :grid :none] + prevha = UInt64(0) + push!(sp.attr, :framestyle => fr) + ret = Plots.axis_drawing_info_3d(sp, letter) + ha = hash(string(ret)) + @test ha != prevha + prevha = ha + end + end +end diff --git a/test/test_shorthands.jl b/test/test_shorthands.jl new file mode 100644 index 00000000..116548ca --- /dev/null +++ b/test/test_shorthands.jl @@ -0,0 +1,48 @@ +using Plots, Test + +@testset "Shorthands" begin + @testset "Set Lims" begin + p = plot(rand(10)) + + xlims!((1, 20)) + @test xlims(p) == (1, 20) + + ylims!((-1, 1)) + @test ylims(p) == (-1, 1) + + zlims!((-1, 1)) + @test zlims(p) == (-1, 1) + + xlims!(-1, 11) + @test xlims(p) == (-1, 11) + + ylims!((-10, 10)) + @test ylims(p) == (-10, 10) + + zlims!((-10, 10)) + @test zlims(p) == (-10, 10) + end + + @testset "Set Ticks" begin + p = plot([0, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + + xticks = 2:6 + xticks!(xticks) + @test Plots.get_subplot(current(), 1).attr[:xaxis][:ticks] == xticks + + yticks = 0.2:0.1:0.7 + yticks!(yticks) + @test Plots.get_subplot(current(), 1).attr[:yaxis][:ticks] == yticks + + xticks = [5, 6, 7.5] + xlabels = ["a", "b", "c"] + + xticks!(xticks, xlabels) + @test Plots.get_subplot(current(), 1).attr[:xaxis][:ticks] == (xticks, xlabels) + + yticks = [0.5, 0.6, 0.75] + ylabels = ["z", "y", "x"] + yticks!(yticks, ylabels) + @test Plots.get_subplot(current(), 1).attr[:yaxis][:ticks] == (yticks, ylabels) + end +end