Compare commits

..

1628 Commits

Author SHA1 Message Date
Simon Christ 06220420a3 1.28.0 2022-04-29 12:57:16 +02:00
Simon Christ d8da3c60d9 update anshul's data 2022-04-28 09:05:49 +02:00
t-bltg 9e92ada61a Update examples.jl 2022-04-26 16:29:08 +02:00
t-bltg cebca5174b UnicodePlots: support polarplot (#4185) 2022-04-26 15:36:23 +02:00
Stephan Antholzer e3e86aa6cd merge series extra_kwargs for plotly_series (#4172) 2022-04-22 11:12:55 +02:00
Simon Christ add8364bbd 1.27.6 2022-04-20 17:39:10 +02:00
github-actions[bot] 09abf2e40f Update precompile_*.jl file [skip ci] (#4174)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-04-20 09:12:50 +02:00
Benoit Pasquier 182d4683e6 Add areaplot example to gallery (#4178)
* Add areaplot example to gallery

Not sure this is the right way to add example to the gallery but hopefully this is helpful :)

* format files

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2022-04-19 16:03:50 +02:00
t-bltg a681f3e307 Update SnoopCompile.yml 2022-04-16 15:17:41 +02:00
t-bltg 1c59b19343 Update SnoopCompile.yml 2022-04-16 15:13:29 +02:00
t-bltg 6773666549 Update SnoopCompile.yml 2022-04-16 14:59:00 +02:00
t-bltg 42bf100ad3 Update precompile_Plots.jl 2022-04-16 14:53:10 +02:00
t-bltg e826c87114 Update SnoopCompile.yml 2022-04-16 14:27:59 +02:00
Jeff Bezanson 616d72476a Add version check for 1.8 precompiles (#4179)
Co-authored-by: t-bltg <tf.bltg@gmail.com>
2022-04-14 13:32:59 +02:00
Simon Christ 4f9a708f66 fix empty segments in plotly (#4177)
* fix empty segment case

* fix failure on 1.6
2022-04-08 16:39:37 +02:00
t-bltg 4b73b8b5d5 Update docs build (#4175) 2022-04-05 20:08:31 +02:00
t-bltg 99ad317590 1.27.5 2022-04-05 16:27:46 +02:00
github-actions[bot] 90975d95f8 Update precompile_*.jl file [skip ci] (#4173)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-04-05 16:27:15 +02:00
t-bltg f0a1ef8a0c Update gaston.jl 2022-04-05 15:26:17 +02:00
t-bltg 49aee2d204 Update unicodeplots.jl 2022-04-05 15:02:56 +02:00
t-bltg 02351a45b4 UnicodePlots: rework png output (#4171) 2022-04-05 14:56:47 +02:00
Simon Christ e691a42b90 add docs to scale, rotate 2022-04-05 14:52:51 +02:00
Simon Christ 8a584ceab4 add/ rearrange docstrings 2022-04-05 13:43:19 +02:00
t-bltg cc1bd28ccd Disable warnings on experimental backends (#4169) 2022-04-05 00:52:49 +02:00
t-bltg 4446a63135 Update docs CI (font) 2022-04-05 00:15:39 +02:00
github-actions[bot] 412a8993ad Update precompile_*.jl file [skip ci] (#4167)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-04-05 00:03:07 +02:00
Fons van der Plas d9fb8b8ef3 Remove Main.Plots dependency (#4168) 2022-04-04 23:36:52 +02:00
github-actions[bot] 37eb1db8d2 Update precompile_*.jl file [skip ci] (#4165)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-04-04 18:14:58 +02:00
t-bltg dc3e3176f2 UnicodePlots: fix internal change 2022-04-04 18:10:58 +02:00
github-actions[bot] 2cd3331f30 Update precompile_*.jl file [skip ci] (#4163)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-04-01 11:22:07 +02:00
github-actions[bot] db932d62f6 CompatHelper: bump compat for PlotThemes to 3, (keep existing compat) (#4162)
Co-authored-by: CompatHelper Julia <compathelper_noreply@julialang.org>
2022-04-01 11:17:47 +02:00
Simon Christ caf4d1857c 1.27.4 2022-03-30 16:35:47 +02:00
github-actions[bot] bbde8ad1b1 Update precompile_*.jl file [skip ci] (#4154)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-30 15:43:45 +02:00
Simon Christ d3449331c9 remove Shape from _pgfplotsx_marker 2022-03-30 15:38:11 +02:00
Ian Butterworth eb746d1641 Sort supported args (#4156)
* sort supported args

* Update src/args.jl

* sort all supported* functions

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2022-03-29 17:42:23 +02:00
Steve Leung a33c0205b2 Restored plotly hover functionality for plots with multidimensional data (#4159)
* Restored hover functionality for plots with multidimensional data

* Renamed plotly_hover!() to plotly_adjust_hover_label!()

* Updated contributors list

* Update src/backends/plotly.jl [skip ci]

Co-authored-by: t-bltg <tf.bltg@gmail.com>

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: t-bltg <tf.bltg@gmail.com>
2022-03-29 17:42:01 +02:00
Simon Christ 65ab68c3b5 fix legends for arrows (#4161)
* fix legends for arrows

* Apply suggestions from code review [skip ci]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* raise tolerance on windows

* Update test/runtests.jl [skip ci]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-03-29 17:41:25 +02:00
t-bltg 0f4a0c7154 fix examples 2022-03-27 12:09:54 +02:00
t-bltg 02d08beb1e improve coverage (#4155) 2022-03-27 01:42:05 +01:00
Simon Christ d3817796a4 1.27.3 2022-03-25 17:41:01 +01:00
Simon Christ dbe81dabd5 fix #4151 (#4153)
* letter and Set the consts

* use julia-code-style-suggesters

* remove superfluous name

* edit by copy of code-style-suggesters

* delete stuff

* remove using

* Apply suggestions from code review

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-03-25 17:39:54 +01:00
t-bltg 5c2cc926a6 docs: more verbosity 2022-03-24 13:13:38 +01:00
t-bltg bcc66caf7d 1.27.2 [skip ci] 2022-03-23 20:07:36 +01:00
t-bltg 0686461686 UnicodePlots: png output (#4149) 2022-03-23 20:06:57 +01:00
github-actions[bot] 5c4fbc5e1a Update precompile_*.jl file [skip ci] (#4143)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-22 10:35:19 +01:00
Simon Christ 5872bdefc4 1.27.1 2022-03-17 14:02:50 +01:00
Simon Christ a4849da775 format [skip ci] 2022-03-17 12:07:54 +01:00
Simon Christ afe24f46bc fix example 25 2022-03-17 12:04:47 +01:00
Simon Christ 79638b7789 Update examples.jl 2022-03-17 09:12:02 +01:00
github-actions[bot] e82e95c8e3 Update precompile_*.jl file [skip ci] (#4140)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-17 09:05:56 +01:00
Simon Christ 843226bfe1 Revert "annotations over marksers in pgfplotsx backend (#3957)" (#4142)
This reverts commit 06bc99ef68.
2022-03-17 09:05:29 +01:00
Simon Christ 317bfc918a 1.27.0 2022-03-11 20:52:22 +01:00
Simon Christ 4665f5caab fix compat check 2022-03-11 20:51:43 +01:00
Simon Christ 1520705fa7 add z_order (#4139)
* add z_order

* format

* add missing ,

* fix testss

* this time for real

* format [skip ci]
2022-03-11 15:57:06 +01:00
Simon Christ b60cf3cc53 1.26.1 [skip ci] 2022-03-11 11:35:22 +01:00
Simon Christ 092fb67017 Actually check if the loaded backend version mets the compat entries (#4137)
* implement checking backend compat

* format

* handle backends without compat entry

* get version for julia 1.6
2022-03-11 10:49:40 +01:00
github-actions[bot] 4ebadb7612 Update precompile_*.jl file [skip ci] (#4132)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-07 11:23:57 +01:00
Simon Christ fcd3246e4a Update .zenodo.json 2022-03-04 13:36:14 +01:00
Simon Christ 5f858fe6f6 1.26.0 2022-03-02 09:45:32 +01:00
github-actions[bot] 8a4aea1fc7 Update precompile_*.jl file [skip ci] (#4126)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-02 09:44:48 +01:00
Simon Christ 3483799cfc add compat entries (#4122) 2022-03-01 16:36:41 +01:00
Simon Christ a5f52be5c2 1.25.12 2022-03-01 15:38:29 +01:00
t-bltg 2b7e304c7e revert constant legend box (#4117) 2022-03-01 14:53:45 +01:00
github-actions[bot] 6c77801835 Update precompile_*.jl file [skip ci] (#4124)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-03-01 14:28:27 +01:00
Simon Christ b34f8b87c1 check loaded_modules instead of Main for warnings about StatsPlots recipes (#4123)
* check loaded_modules instead of Main

* format
2022-03-01 09:23:10 +01:00
github-actions[bot] 5130da5a40 Update precompile_*.jl file [skip ci] (#4121)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-02-26 18:26:28 +01:00
Simon Christ 95fd48ed9b Bbs/legendfontx (#4119)
* revert legendfont being determant

* format

* fix precompiles
2022-02-26 17:26:14 +01:00
Simon Christ e31d056820 1.25.11 2022-02-20 14:43:34 +01:00
github-actions[bot] afe85207e1 Update precompile_*.jl file [skip ci] (#4110)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-02-20 14:42:57 +01:00
Simon Christ 204b2178d0 better line (#4085) 2022-02-18 21:13:16 +01:00
Simon Christ 51358717ee add slicing of tuples of matrices for plotattributes (#4109)
* add slicing of tuples of matrices

* remove dot

* format files
2022-02-18 21:12:44 +01:00
github-actions[bot] ed9f0bcab3 Update precompile_*.jl file [skip ci] (#4101)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-02-18 13:55:22 +01:00
t-bltg d342672dd2 Allow color on txt io (#4102) 2022-02-17 22:33:09 +01:00
github-actions[bot] 64d275e7cb CompatHelper: bump compat for NaNMath to 1 (#4104)
Co-authored-by: CompatHelper Julia <compathelper_noreply@julialang.org>
2022-02-17 15:27:00 +01:00
t-bltg a919fe59d3 Center :image axes ticks (#4088) 2022-02-16 22:05:50 +01:00
Josef Heinen 88cd04b46a Bump Plots version
Bump Plots version to 1.25.10
2022-02-15 16:45:19 +01:00
Josef Heinen 325d60e8b8 Bump GR version
Bump GR version to 0.64
2022-02-15 15:24:04 +01:00
Simon Christ 20f576211c 1.25.9 2022-02-11 17:45:18 +01:00
github-actions[bot] bb99e7a5ce Update precompile_*.jl file [skip ci] (#4096)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-02-11 17:44:40 +01:00
Simon Christ 0813b18d69 Fix regression in legend font size setting (#4100)
* take legend font attributes from existing font

* "format" file

* format remaining files

* better in the error box
2022-02-11 15:26:01 +01:00
t-bltg 6c67908a3a UnicodePlots: allow setting width / height 2022-02-09 16:04:22 +01:00
t-bltg a361ba60b8 UnicodePlots: support zoom (#4099) 2022-02-09 14:30:51 +01:00
t-bltg 34c22970f2 UnicodePlots: update hack for png 2022-02-08 23:41:12 +01:00
t-bltg 5d8acf5189 UnicodePlots: add more extra_kwargs (#4097) 2022-02-08 20:56:54 +01:00
t-bltg 59cd5c180e temporarily disable nightly precomp (#4095) 2022-02-08 13:20:11 +01:00
t-bltg 77e465a453 1.25.8 [skip ci] 2022-02-07 21:52:56 +01:00
github-actions[bot] eb3e10ffa6 Update precompile_*.jl file [skip ci] (#4074)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-02-07 21:51:24 +01:00
t-bltg bf5d1aa060 Fix plotattributes in _add_plot_title! (#4090)
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2022-02-07 21:21:22 +01:00
t-bltg ce70ec26a6 UnicodePlots: 3d support (#4089) 2022-02-07 20:22:39 +01:00
t-bltg 6e4cb5fedc Fix example 41 (#4093) 2022-02-06 22:32:40 +01:00
Michael Krabbe Borregaard 2a7d2d710e Merge pull request #4076 from JuliaPlots/mkb/fix_wand
fix the wand binning
2022-01-30 08:24:58 +01:00
t-bltg e3ea97199f Precompilation statements for nightly (#4082)
* enable precompilation on nightly

* update CompileBot, add precompile statements for nightly
2022-01-28 22:00:26 +01:00
t-bltg 2896c5a25a Rework warn_on_unsupported (#4081) 2022-01-28 15:32:15 +01:00
t-bltg 824dbe9948 UnicodePlots: use more extra_kwargs (#4080) 2022-01-28 11:30:42 +01:00
t-bltg 3e8db4532b UnicodePlots: toggle canvas blend with extra_kwargs 2022-01-28 10:30:27 +01:00
Michael Krabbe Borregaard 0ba580bcaa fix the wand binning 2022-01-26 17:28:56 +01:00
t-bltg 46e19d9ad5 Update docs.yml 2022-01-26 15:35:06 +01:00
t-bltg b204918b23 Update docs.yml 2022-01-26 15:03:25 +01:00
Tom Gillam 5d5239834c Example for vspan and hspan (#4062)
* Example for vspan and hspan

* Format

* First time contributor
2022-01-26 13:21:46 +01:00
github-actions[bot] 2ddedf97bf Update precompile_*.jl file [skip ci] (#4071)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-01-26 11:12:38 +01:00
Simon Christ 5facd2bf55 1.25.7 2022-01-25 22:45:39 +01:00
Simon Christ 915df5d3ee Fix ribbon slicing (#4068)
* move ribbon handling after slicing

* format file
2022-01-25 21:20:18 +01:00
Simon Christ 2eaf9f3b15 fix plotting empty plot for plotly (#4067) 2022-01-25 17:14:07 +01:00
github-actions[bot] 91bb983c08 Update precompile_*.jl file [skip ci] (#4056)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-01-25 11:06:47 +01:00
t-bltg 311831ca4e UnicodePlots: do not show blank plots (on layouts) (#4058) 2022-01-22 18:26:13 +01:00
t-bltg ab698da5a4 Add format check, reduce format PR frequency (#4053) 2022-01-22 16:10:28 +01:00
Tianyi Pu 34e581ff3f Fix default docstring (#4057) 2022-01-22 15:58:30 +01:00
Zhanibek acb5d5ac4b gr-constant-legendbox (#4055) 2022-01-22 02:52:46 +09:00
Zhanibek e8ac74a390 Revert "gr-constant-legendbox (#4043)" (#4054)
This reverts commit 806e769185.
2022-01-22 01:27:28 +09:00
Zhanibek 806e769185 gr-constant-legendbox (#4043) 2022-01-22 01:27:01 +09:00
github-actions[bot] bcd98737bb Update precompile_*.jl file [skip ci] (#4050)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-01-19 21:13:01 +01:00
t-bltg f333cb284a UnicodePlots: basic quiver and contour support (#4031)
* basic quiver support

* toggle grid

* add contour

* add colorbar

* toggle contour example

* rework keywords
2022-01-19 18:58:11 +01:00
github-actions[bot] 1f49839529 Format .jl files [skip ci] (#4042)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-01-17 12:50:54 +01:00
Simon Christ 536712359c Update README.md 2022-01-15 10:48:21 +01:00
Simon Christ b13f3d5021 direct docs link to stable [skip ci] 2022-01-13 10:51:09 +01:00
Simon Christ 2e4344b9b5 Update Project.toml 2022-01-13 09:42:41 +01:00
Josef Heinen 16e5a49800 Bump GR version 2022-01-13 06:29:50 +01:00
Simon Christ 67bd08614a 1.25.6 2022-01-12 16:31:04 +01:00
Simon Christ a24fb93ab1 Move fillrange and ribbon logic from RecipesPipeline and add tests for default function (#4030)
* add tests for default function

* remove fillrange and ribbon handling from RecipesPipeline

* adjust compat
2022-01-12 15:30:52 +01:00
github-actions[bot] b1c11cca33 Update precompile_*.jl file [skip ci] (#4032)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-01-12 15:30:26 +01:00
Pearl Li cffeba7609 Check if plot title already exists before adding again (#4027)
* Check if plot title already exists before adding again

* Add plot title tests
2022-01-12 14:52:43 +01:00
github-actions[bot] 2872c7a345 Update precompile_*.jl file [skip ci] (#4029)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2022-01-12 13:57:25 +01:00
Simon Christ 3313780b4e add Downloads badge 2022-01-11 20:37:10 +01:00
t-bltg 47ca50d037 1.25.5 [skip ci] 2022-01-11 11:18:42 +01:00
github-actions[bot] 1014b8f494 Update precompile_*.jl file [skip ci] (#4022)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-01-05 14:17:55 +01:00
github-actions[bot] ece53c5fd1 Format .jl files [skip ci] (#4023)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2022-01-05 14:17:40 +01:00
t-bltg c34d4e950e UnicodePlots: fix ansi regex 2022-01-01 10:35:55 +01:00
t-bltg b6d7bd82e6 UnicodePlots: enhance display / show (#4021) 2021-12-31 16:04:02 +01:00
t-bltg e5883a3447 1.25.4 [skip ci] 2021-12-29 16:17:50 +01:00
github-actions[bot] ead9d87942 Update precompile_*.jl file [skip ci] (#4018)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-29 15:24:32 +01:00
t-bltg 0beba9d1c8 Update and rename SnoopCompile.yml to CompileBot.yml 2021-12-29 14:16:23 +01:00
t-bltg 6e79cf4a3e Run SnoopCompile on master only 2021-12-29 14:04:38 +01:00
github-actions[bot] 693391e135 Update precompile_*.jl file [skip ci] (#4015)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-29 14:03:04 +01:00
Chris Elrod 95d1fa0001 Set max_methods=1 (#4010) 2021-12-29 13:31:29 +01:00
Diego Javier Zea 30d2f01d9d Update boxplot doc (#4014)
Update and improve whisker_width documentation (boxplots).
2021-12-29 13:30:00 +01:00
Zhanibek 834a1523af add extrakw for colorbar positioning control in 3d 2021-12-27 23:44:37 +09:00
Josef Heinen e0bc4b1406 [GR] bump version
bump GR version
2021-12-22 12:59:42 +01:00
Simon Christ 492f94bf10 Fix fillranges with OffsetVectors for plotly (#4006)
* don't mutate the Plot object

* remove show

* collect vectors to workaround vcat issue
2021-12-20 21:24:58 +01:00
Simon Christ cb359c0d4e 1.25.3 [skip ci] 2021-12-20 21:01:25 +01:00
Yuval 3af92908ee Merge pull request #3988 from yha/yha/boxplot-whisker-range
boxplots docs update: rename range->whisker_range
2021-12-20 18:48:36 +02:00
github-actions[bot] 5d97de1345 Format .jl files [skip ci] (#4012)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-19 23:21:41 +01:00
Simon Christ f784010c29 add text/latex mimetype 2021-12-17 17:50:07 +01:00
Yuval d618f2e2ca Merge pull request #3998 from yha/yha/Unzip2
Use Unzip.unzip
2021-12-16 17:13:21 +02:00
github-actions[bot] d970a6568e Format .jl files [skip ci] (#3997)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-12 13:04:15 +01:00
yha 7de50f91de Undo unrelated change 2021-12-12 11:26:05 +02:00
yha 15ce6ebfeb Use Unzip.unzip 2021-12-12 11:16:42 +02:00
Simon Christ 75938bf747 give TagBot its own key [skip ci] 2021-12-10 14:59:14 +01:00
github-actions[bot] b3e6e92698 Update precompile_*.jl file [skip ci] (#3995)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-12-09 16:23:45 +01:00
Simon Christ b3002c5457 add manual trigger 2021-12-09 15:56:20 +01:00
Simon Christ 6b44955bc4 1.25.2 [skip ci] 2021-12-09 13:55:48 +01:00
Simon Christ c28bf96c4a Merge branch 'master' of github.com:JuliaPlots/Plots.jl 2021-12-09 11:54:21 +01:00
Simon Christ 096d293550 fix gr fontcolor setting 2021-12-09 11:54:15 +01:00
Simon Christ cab76f67e2 fix scale warnings for layouts (#3992)
* fix scale warnings for layouts

* don't run ci twice on PR

* use broadcasting for scalar case
2021-12-09 10:32:06 +01:00
github-actions[bot] 461476f4ed Update precompile_*.jl file [skip ci] (#3990)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-12-08 16:53:39 +01:00
Simon Christ 11eea2453f check ref in docs action 2021-12-08 16:08:58 +01:00
Simon Christ b51cddceb5 add DOCUMENTER_KEY to TagBot action 2021-12-08 15:53:32 +01:00
yha 60222095b6 boxplots: rename range->whisker_range 2021-12-07 19:13:32 +02:00
Simon Christ 5dd0ca27a5 1.25.1 [skip ci] 2021-12-07 17:37:39 +01:00
github-actions[bot] 249ce48cb4 Update precompile_*.jl file [skip ci] (#3987)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-12-07 17:24:53 +01:00
Simon Christ 5f7c2a5eae Fix #3984 2021-12-07 17:05:40 +01:00
github-actions[bot] 9e23082a7d Format .jl files [skip ci] (#3981)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-05 10:36:34 +01:00
github-actions[bot] ef3038314d Update precompile_*.jl file [skip ci] (#3979)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-12-02 20:58:24 +01:00
Jks Liu c4752b786b Fix #3967 (#3978)
Pluto do not use require.js, so Plotly is not renamed to Plotly2
2021-12-02 16:33:52 +01:00
t-bltg a75b17e42f Bump version to 1.25.0 (#3977) [skip ci]
* bump version
* deprecate NEWS.md
2021-12-02 13:40:25 +01:00
github-actions[bot] c7e3049dac Update precompile_*.jl file [skip ci] (#3976)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-12-02 12:03:05 +01:00
t-bltg 3405d2991a Versioned precompile script - drop 1.5 - support 1.6 and 1.7 (#3972)
* versioned precompile script

* add explicit minor version in CI

* revert to supporting 1.5 - 1.7

* update precompile_includer

* drop support for 1.5, bump to 1.6

* Update ci.yml

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-12-02 11:38:45 +01:00
Simon Christ ca0e52b622 test on 1.6 also (#3966)
* test on 1.6 also

* Update ci.yml

* Update ci.yml

* Update ci.yml

* Update ci.yml

live up to the claimed `[compat]`

* change matrix

* remove ifs

* update include

* split include array

Co-authored-by: Jerry Ling <proton@jling.dev>
2021-12-01 22:24:57 +01:00
t-bltg b1c56126fb Fix missing examples backend 2021-12-01 17:43:52 +01:00
t-bltg e1f507b77f Update doc examples 2021-12-01 17:30:24 +01:00
t-bltg 0b1ca841cd 1.24.4 [skip ci] 2021-12-01 14:31:41 +01:00
github-actions[bot] b341df1cb8 Update precompile_*.jl file [skip ci] (#3963)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-12-01 14:30:42 +01:00
Jks Liu 79cf62cf91 Upgrade plotly.js to v2.6.3 (#3958)
* Upgrade plotly.js to version 2.6.3

* plotly polar support, api changed in plotly.js v2.x.x

https://plotly.com/javascript/polar-chart/
https://community.plotly.com/t/announcing-plotly-js-2-0/53675
2021-12-01 13:45:23 +01:00
Simon Christ c32dbeef8a 1.24.3[skip ci] 2021-11-29 09:46:26 +01:00
chwons 06bc99ef68 annotations over marksers in pgfplotsx backend (#3957) 2021-11-29 09:36:08 +01:00
t-bltg 9305cd41ab PGFPlotsX: fix log scale power with custom ticks (#3961) 2021-11-29 09:31:47 +01:00
github-actions[bot] 7427a85661 Update precompile_*.jl file [skip ci] (#3956)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-11-29 09:23:18 +01:00
t-bltg 8abae0c575 Formatter: use latest CSTParser tagged version 2021-11-28 13:40:49 +01:00
github-actions[bot] 3963957e70 Format .jl files [skip ci] (#3960)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-11-28 10:27:13 +01:00
Simon Christ 58381822d9 1.24.2 [skip ci] 2021-11-26 14:23:03 +01:00
github-actions[bot] 2472ce164b Update precompile_*.jl file [skip ci] (#3955)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-26 13:34:09 +01:00
Simon Christ c94cf1855d fix plotly 2021-11-26 13:32:29 +01:00
Simon Christ 6baa120245 fix transposing in plotlyjs (#3953)
* fix transposing

* fix plotly_series
2021-11-26 09:59:44 +01:00
Simon Christ 7e5ba301fd add documentation for legend_column 2021-11-26 09:47:59 +01:00
Simon Christ 138589bb61 1.24.1 [skip ci] 2021-11-25 14:38:34 +01:00
Simon Christ c2af71756e add missing get_clims in GR (#3950) 2021-11-25 14:34:15 +01:00
Simon Christ c1e88d0360 1.24.0 [skip ci] 2021-11-25 12:17:23 +01:00
github-actions[bot] e0ea601239 Update precompile_*.jl file [skip ci] (#3949)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-25 12:15:50 +01:00
Simon Christ e471ce8d28 rework layout macro to use Base types (#3943)
* @layout -> Base types except for `grid` call

* add layout conversion of namedtuples, vectors and matrices

* add missing method

* rip it out

* fix slicing

* adjust compat

* add Measure conversion
2021-11-25 11:40:25 +01:00
Simon Christ 1bdec476c3 add missing docstrings 2021-11-25 10:23:44 +01:00
github-actions[bot] b23c620d77 Format .jl files [skip ci] (#3941)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-11-15 09:56:31 +01:00
Simon Christ 21c3ac4c45 1.23.6 [skip ci] 2021-11-11 10:30:39 +01:00
github-actions[bot] 861f537736 Update precompile_*.jl file [skip ci] (#3939)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-11 10:27:14 +01:00
Simon Christ e9ae75dfa4 Fix setting of legend font via legend_font (#3934)
* find pipeline spot

* better spot

* construct font

* set font and matching

* respect defaults
2021-11-11 09:48:29 +01:00
github-actions[bot] 07bcecd47c Update precompile_*.jl file [skip ci] (#3937)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-10 21:18:39 +01:00
Simon Christ af3ebe9936 split looops (#3931) 2021-11-10 20:34:49 +01:00
github-actions[bot] 9d3ce54c37 Format .jl files [skip ci] (#3927)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-11-09 16:13:21 +01:00
Josef Heinen 6df1f38492 gr: fix text problems 2021-11-03 14:43:06 +01:00
Simon Christ c4b7757e22 1.23.4 [skip ci] 2021-11-03 10:53:01 +01:00
t-bltg d1309c6c7b Fix LaTeXStrings support for UnicodePlots and InspectDR (#3879)
* fix LaTeXStrings support for UnicodePlots and InspectDR

* rename & fix
2021-11-03 09:22:37 +01:00
github-actions[bot] 58ed4a60de Update precompile_*.jl file [skip ci] (#3919)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-02 20:39:32 +01:00
Lukas Hauertmann 70dec42308 Add :log10-colorbar_scale support in GR (#3915)
* Add `:log10`-`colorbar_scale` support in GR

* Change `clims` behaviour (gr heatmap)
2021-11-02 19:08:10 +01:00
Simon Christ fdbd2c397c GR compat and 1.23.3 [skip ci] 2021-11-02 13:46:23 +01:00
github-actions[bot] c337f15e18 Update precompile_*.jl file [skip ci] (#3916)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-11-01 14:16:28 +01:00
Simon Christ 1fe9a9f536 update gaston backend 2021-11-01 13:52:03 +01:00
github-actions[bot] 41cf64b400 Format .jl files [skip ci] (#3914)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-11-01 12:46:08 +01:00
Josef Heinen 19b70c06ff Update gr.jl
Use new text functionality. GR v0.62+ can handle multiline strings and inline math expressions.
2021-10-29 15:22:37 +02:00
Josef Heinen 40fe8eed9a Update Project.toml
add GR v0.62.0
2021-10-29 13:33:04 +02:00
Simon Christ 4b94384c7d support axis flip (#3908) 2021-10-29 12:01:07 +02:00
Simon Christ 35e96a5302 1.23.2 [skip ci] 2021-10-28 16:13:37 +02:00
Simon Christ e84905c2a0 detect aliases in recipes (#3904)
* detect aliases in recipes

* remove doubled tests
2021-10-28 16:12:59 +02:00
Simon Christ 1c621feacc 1.23.1 [skip ci] 2021-10-26 09:17:12 +02:00
Simon Christ e8356965e9 fix pyplot backend 2021-10-26 09:15:46 +02:00
Nicholas Bauer 72428000cc Moved clims into plot/series attributes (#3897)
* Moved limits into plot/series attributes

* Moved const to args
2021-10-26 09:09:23 +02:00
Simon Christ d9116d577f 1.23.0 [skip ci] 2021-10-25 15:02:58 +02:00
github-actions[bot] 96dbd07627 Update precompile_*.jl file [skip ci] (#3889)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-10-25 09:00:09 +02:00
github-actions[bot] 804fab45ad Format .jl files [skip ci] (#3896)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-10-25 08:57:08 +02:00
Simon Christ 2e67e84361 Legend overhaul including horizontal legends (#2854)
* prototype

* use add_attributes macro with modification

* add Colors back

* fix convertLegendValue

* fix legendtitlefontsize

* fix gr legend position

* fix aliases

* symbolic color is okay

* remove redundant legend_forground_color aliases

* legend -> legend_postion

* fix inspectdr

* add legendtitlefont pointsize and color

* fix symbol cache

* fix rebase woes

* Update precompile_*.jl file [skip ci] (#3885)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

* fix gr

* more fixes

* add match_table to `@add_attributes`

* fix match_map

* Update src/backends/pgfplotsx.jl

Co-authored-by: t-bltg <tf.bltg@gmail.com>

* fix font calls

* apply formatter

* readd descriptions

* more missing descriptions

* adjust pyplot to master

* fix pgfplotsx

* Revert "Merge branch 'bbs/horizontal-legends' of https://github.com/JuliaPlots/Plots.jl into bbs/horizontal-legends"

This reverts commit d880d89ef6.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
Co-authored-by: t-bltg <tf.bltg@gmail.com>
2021-10-22 15:09:14 +02:00
Simon Christ b298711379 1.22.7 [skip ci] 2021-10-22 15:04:30 +02:00
t-bltg bacf2d2f06 Update SnoopCompile.yml 2021-10-20 13:47:07 +02:00
t-bltg bb9cd718a5 Fix formatting src/precompile_includer.jl 2021-10-20 13:08:56 +02:00
Simon Christ 0af22a8fe6 fix name [skip ci] 2021-10-20 10:59:59 +02:00
Yuval 3b0950f915 Fix vector attributes to bar plots (#3751) 2021-10-19 21:21:20 +02:00
github-actions[bot] 31d3bf3e06 Format .jl files [skip ci] (#3882)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-10-18 09:39:08 +02:00
Simon Christ c487a10f79 use codecov-action v2 2021-10-13 17:23:39 +02:00
github-actions[bot] ef3417617c Update precompile_*.jl file [skip ci] (#3876)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-10-13 13:06:08 +02:00
Simon Christ 0d2d516ca6 1.22.6 [skip ci] 2021-10-13 11:37:48 +02:00
Lukas Hauertmann 12a1d83595 Use GR.polygonmesh3d for :mesh3d seriestype (#3868)
* Use `GR.polygonmesh3d` for `:mesh3d` seriestype

* Remove unecessary code

* Update GR version dependency

* Add drawing of edges in `:mesh3d` with GR
2021-10-13 11:35:06 +02:00
Simon Christ 9eba5964d9 1.22.5 [skip ci] 2021-10-12 20:18:58 +02:00
Nicholas Bauer d74ee63710 Fix for regression with colorbar limits (#3874)
* Fix for regression

* Remove call

* Refactored to dispatching

* Fixes

* Unrolling loop

* Change to IdDict in case objects mutated
2021-10-12 20:18:12 +02:00
github-actions[bot] 9941563b0b Update precompile_*.jl file [skip ci] (#3849)
Co-authored-by: isentropic <isentropic@users.noreply.github.com>
2021-10-11 17:18:56 +02:00
github-actions[bot] fb82722dd3 Format .jl files [skip ci] (#3872)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-10-11 17:18:02 +02:00
Jack Dunn 86a9b8bf6d Fix PyCall deprecations (#3864)
Fixes #3818
2021-10-11 18:55:52 +09:00
Josef Heinen 5a19673eaf Update Project.toml 2021-10-09 09:04:26 +02:00
Josef Heinen c26561eab3 Update Project.toml
Bump GR version
2021-10-06 20:51:21 +02:00
Simon Christ f0ad66da36 1.22.4 [skip ci] 2021-10-05 19:25:45 +02:00
Nicholas Bauer aca2aa49b8 Generalize GR tick label rotations (#3782)
* gr tick rotations

* consistency

* start of angle offset work

* Working!

* simplify logic

* gr tick rotations

* consistency

* start of angle offset work

* Working!

* simplify logic

* all offsets

* Rebase

* tick factor reversion

* Fix for 3d plots

* simplification

* offset update

* bump offset

* Remove conflict error

* Resolve merge conflict error.

* Resolve merge conflict error

* 3d done

* remove excess

* adjust offset

* restore offset

* fix sign check

Co-authored-by: t-bltg <tf.bltg@gmail.com>
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-10-05 13:44:12 +02:00
t-bltg 9d56e72f6a Update .zenodo.json
Fix broken .json
2021-10-05 09:43:40 +02:00
Lee Phillips f06225655d Allow styling of magnification shape in lens!() (#3860)
* Allow styling of magnification shape in lens!()

The guide lines that indicate the region of the plot magnified in the
inset lens plot, called the magnification shape, are hard-coded with
the :lightgray color and are drawn with the default other line
attributes. This is often too light to be seen clearly and could be a
problem for publication. This commit allows the user to set the
linecolor, linewidth, and linestyle in the call to lens!().

* Update src/recipes.jl

Co-authored-by: t-bltg <tf.bltg@gmail.com>

* Update .zenodo.json

Co-authored-by: t-bltg <tf.bltg@gmail.com>
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-10-04 17:38:59 +02:00
github-actions[bot] 4f0f84f400 Format .jl files [skip ci] (#3861)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-10-04 13:23:01 +02:00
Jan Schneider a65cda8b7e change docs link to httpS (#3852)
always bugs me to get a warning from my browser about the not secure connection.
Could someone also update the About section at the right of the Github page to a https URL?
2021-09-28 16:15:26 +02:00
Simon Christ 37744d7b6a 1.22.3 [skip ci] 2021-09-27 19:24:47 +02:00
Jan Schneider 09a66224ce Update Plots.jl's colorbar_titel maps to PGFPlotsX's color bar style={ylabel} (#3848)
* Update PGFPlotsX colorbar_titel map to ylabel

For most of the backends supported by Polts.jl the `colorbar_title` attribute maps to the attribute in the backend that ultimately is displayed on the vertical axis of the colorbar, which is vertically aligned. Not for PGFPlotsX as in this backend the `title` attribute is displayed on top of the colorbar while the `ylabel` is shown on the vertical bar.

* Update .zenodo.json

added my name to the contributors list
2021-09-27 16:16:16 +02:00
Nicholas Bauer 405bc0820b Speed up get_clims (#3839)
* For Shape type, cut off process

* Remove fillcolor for now

* Address type inference failure instead

* Store value instead of re-evaluating

* Works, but not ideal

* Unnecessary to update here, I think

* return type

* Remove unnecessary default arg

* Typo

* Change to clims

* missed one

* reconfigured to free up clims property

* fix

* Remove debug println, add hook for updating clims after series added

* restore docstring

* typo

* Change to _update_subplot_colorbars
2021-09-27 14:01:18 +02:00
github-actions[bot] 1c89bd8727 Update precompile_*.jl file [skip ci] (#3841)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-26 15:44:10 +02:00
github-actions[bot] 8e17a182f9 Format .jl files [skip ci] (#3846)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-26 15:42:31 +02:00
t-bltg 032c5d1638 UnicodePlots: support markers (#3845) 2021-09-25 12:18:41 +02:00
BerndR 8d95333d1e Legend positioning for 3d plots in plotly (#3840)
* Remove hardoced numbers, shift for 3d plots

* Revert changes

* Fixed some missed reverts
2021-09-23 19:14:55 +02:00
github-actions[bot] 7bfc97285c Update precompile_*.jl file [skip ci] (#3828)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-09-23 10:26:58 +02:00
Simon Christ acca707f34 1.22.2 [skip ci] 2021-09-22 21:21:13 +02:00
Nicholas Bauer 6fa3dae166 Fix type inference failure in get_clims (#3838)
* For Shape type, cut off process

* Remove fillcolor for now

* NaN

* Address type inference failure instead
2021-09-22 19:18:57 +02:00
Lukas Hauertmann 866cb0c335 Add :mesh3d seriesstyle for PyPlot backend (#3835)
* Add `:mesh3d` seriesstyle for PyPlot backend

via `Poly3DCollection`.

* Add `:connections` to lists of supported keywords

for the backends which support `:mesh3d` as series type.

* Remove #47 from list of skipping examples for PyPlot

* Add support for only-triangle syntax for `:connections` kw

for PyPlot

* Add 1-based indexing syntax for `connections` kw in `:mesh3d`

* Update description for example `#47` (`:mesh3d`)

* Hotfix 1-based indexing for mesh3d in pgfplotsx
2021-09-22 17:12:11 +02:00
t-bltg 4d40bae9cc Update bug.md
update supported backends
2021-09-21 00:28:51 +02:00
github-actions[bot] 5a48002d31 Format .jl files [skip ci] (#3829)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-20 16:10:29 +02:00
t-bltg 0cd81243ad UnicodePlots: compact plots 2021-09-18 14:13:37 +02:00
t-bltg ed3bab0e6f 1.22.1 [skip ci] 2021-09-17 22:11:50 +02:00
github-actions[bot] 4621c18b23 Update precompile_*.jl file [skip ci] (#3822)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-17 22:10:48 +02:00
BerndR 4f8a265c6a Fix generic aliases (#3824) 2021-09-17 21:43:26 +02:00
t-bltg e2539a3d19 UnicodePlots: adjust layout width per column (#3825) 2021-09-17 21:42:50 +02:00
t-bltg 85739932f0 Negate condition on :warn_on_unsupported (#3816) 2021-09-17 14:55:43 +02:00
t-bltg 9d84e53bcb Test cleanup (#3821) 2021-09-17 12:00:40 +02:00
zhanibek 82f31c48b7 pyplot fixing ticks=:native 2021-09-17 16:30:22 +09:00
zhanibek 81571fe534 fix typos 2021-09-17 14:44:16 +09:00
zhanibek 293b8b112e instructions for matplotlib update 2021-09-17 14:38:24 +09:00
t-bltg d988d4c9d1 1.22.0 [skip ci] 2021-09-15 12:54:42 +02:00
github-actions[bot] 85bd3ea53f Update precompile_*.jl file [skip ci] (#3810)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-15 12:53:58 +02:00
t-bltg cd6a8c87b6 GR: fix NaN tick size (#3813) 2021-09-15 12:28:53 +02:00
t-bltg 175c87cec6 Avoid Vararg usage (#3809) 2021-09-15 12:28:24 +02:00
t-bltg c3f45dd712 UnicodePlots: minor fixes (#3812) 2021-09-15 11:21:41 +02:00
t-bltg 198a59b621 UnicodePlots: propagate xyscale (#3811) 2021-09-15 01:29:23 +02:00
t-bltg c5d7283473 Update examples.jl
UnicodePlots: annotations are supported
2021-09-14 21:02:30 +02:00
t-bltg 7a1bc88f66 Use hyphens to specify version ranges 2021-09-14 20:27:44 +02:00
github-actions[bot] ad5cd2f1da Update precompile_*.jl file [skip ci] (#3807)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-14 19:01:40 +02:00
t-bltg 6cf01229bb UnicodePlots: support :annotations (#3804) 2021-09-14 18:46:46 +02:00
t-bltg 0a9d30f7ac Fix invalid axes aliases (#3803)
* Fix invalid axes aliases

* Add test

* Enhance testing
2021-09-14 18:00:23 +02:00
github-actions[bot] 7da990b23f Format .jl files [skip ci] (#3801)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-13 09:18:59 +02:00
github-actions[bot] 942fb38dcd Update precompile_*.jl file [skip ci] (#3797)
Co-authored-by: isentropic <isentropic@users.noreply.github.com>
2021-09-13 09:18:18 +02:00
Zhanibek 7ba99d1b06 handling fonts better, moving to stable 3.4 (#3793)
* handling fonts better, moving to stable 3.4

* better math parent font matching
2021-09-11 13:43:42 +09:00
t-bltg 6b82a82d04 Update examples.jl 2021-09-06 13:18:22 +02:00
t-bltg 7c882a7288 Update Project.toml 2021-09-06 12:48:26 +02:00
github-actions[bot] 5343873f72 Update precompile_*.jl file [skip ci] (#3752)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-06 12:47:06 +02:00
t-bltg e3a5f2b11e UnicodePlots: support log scales (#3796) 2021-09-06 12:45:29 +02:00
github-actions[bot] 34758c82a3 Format .jl files [skip ci] (#3795)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-09-06 11:52:32 +02:00
t-bltg 748104c807 UnicodePlots: fix NaN segments plot (#3794) 2021-09-04 12:46:34 +02:00
t-bltg 0d2bc3f227 UnicodePlots: Update URL 2021-09-02 22:20:54 +02:00
t-bltg c45352d153 fix UnicodePlots.jl/issues/125 (#3791) 2021-09-02 17:59:02 +02:00
Josef Heinen b833b6582a Update Project.toml
Bump GR version
2021-09-01 16:55:16 +02:00
t-bltg b28a261b39 1.21.3 [skip ci] 2021-09-01 14:06:42 +02:00
t-bltg 1a1cc08992 UnicodePlots: fixes 2021-09-01 13:10:09 +02:00
t-bltg 31d33e6be4 UnicodePlots: Allow simple nesting 2021-09-01 12:48:31 +02:00
t-bltg 2dc812aa15 UnicodePlots: support layout (#3787) 2021-09-01 11:26:29 +02:00
t-bltg bdbe300412 Pyplot: fix building docs (#3775) 2021-09-01 11:24:16 +02:00
Nicholas Bauer 70b635dbe1 Cache axis args in a dictionary (#3775)
Co-authored-by: t-bltg <tf.bltg@gmail.com>
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-08-31 21:36:58 +02:00
t-bltg 1e44dd7035 Unicodeplots: "join" subplots 2021-08-31 00:21:11 +02:00
t-bltg 4744152f86 Add newline between subplots 2021-08-30 23:25:19 +02:00
t-bltg dc51f2c159 v1.21.2 [skip ci] 2021-08-30 22:22:05 +02:00
t-bltg cc1f662b3a UnicodePlots: rm forced width/height (arbitrary) 2021-08-30 17:50:41 +02:00
t-bltg 7b77527f80 UnicodePlots: display fix, simplify axis labels 2021-08-30 14:04:00 +02:00
github-actions[bot] 8b6073c088 Format .jl files [skip ci] (#3780)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-08-29 10:53:46 +02:00
t-bltg 09d35d7b9f UnicodePlots: heatmap support (#3774)
* UnicodePlots: heatmap support

* Fix type check
2021-08-28 21:29:04 +02:00
Simon Christ 0a9da21443 sanitize axis strings (#3772) 2021-08-28 21:08:21 +02:00
Simon Christ ea686c331b improve axis decorations (#3756)
* improve handling of LaTeXStrings in tick labels

* respect guidefonthalign
2021-08-28 21:08:03 +02:00
t-bltg 25a36bab85 merge root codecov.yml [skip ci] 2021-08-28 17:05:13 +02:00
t-bltg b227fb8943 move codecov.yml 2021-08-28 00:12:43 +02:00
t-bltg 22651e8728 UnicodePlots: disable some unsupported examples 2021-08-26 19:54:58 +02:00
Nicholas Bauer 5acf967a9e v1.21.1 | No exception thrown in apply_recipe fallback (#3765)
* No exception thrown in `apply_recipe` fallback

Throwing an exception here can vastly slow down plotting, as it happens frequently. Returning an error value instead, which the calling function can check, can speed up plotting 2x. An accompanying change is necessary in RecipesPipeline.jl, assuming this value is suitable.

* Bumped compat for RecipesPipeline, tentative

* Bump patch version

* Fix wrong versioning

Co-authored-by: t-bltg <tf.bltg@gmail.com>
2021-08-26 17:46:28 +02:00
Simon Christ 5afeba656b check if .zenodo.json is valid 2021-08-26 17:17:26 +02:00
LukasKrumwiede 7b8bd5b253 Implementation of filling the space between and under curves for gaston (#3755) 2021-08-26 16:58:05 +02:00
Pearl Li ded808477d Add hatched fill for GR and PyPlot (#3107) 2021-08-26 16:55:56 +02:00
Simon Christ 854d5ba5c9 1.21.0 [skip ci] 2021-08-26 16:21:47 +02:00
t-bltg 07a619e5ae Replace deprecated Base.download with Downloads.download (#3766)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-08-26 00:12:33 +02:00
t-bltg 1426c95fd4 fix formatting action 2021-08-25 22:42:23 +02:00
Andy Nowacki 52ec432cfa Plotly: Enable specified contour values for ranges; warn otherwise (#3757) 2021-08-25 13:40:54 +02:00
t-bltg 0742d475bc CI: julia-uploadcodecov is deprecated (#3761) 2021-08-22 12:00:12 +02:00
Josef Heinen 10802baf6e Added support for 3d surface meshes 2021-08-22 09:17:42 +02:00
t-bltg c67da7d7b8 UnicodePlots: allow passing arbitrary colors (RGBA, symbols, integers, ...) (#3758) 2021-08-19 22:19:38 +02:00
t-bltg f85f668f18 Merge pull request #3759 from t-bltg/fmt
CI: run JuliaFormatter on schedule
2021-08-19 22:17:47 +02:00
Simon Christ c4208c7560 fix broken file 2021-08-19 21:07:04 +02:00
t-bltg 35fd604e07 run JuliaFormatter on schedule 2021-08-19 17:51:53 +02:00
t-bltg 214663aa4b Merge pull request #3750 from t-bltg/col
UnicodePlots: fix setting linecolor
2021-08-15 12:40:19 +02:00
t-bltg d56a03975f UnicodePlots: fix setting linecolor 2021-08-15 00:39:04 +02:00
t-bltg ede106073f 1.20.1 [skip ci] 2021-08-12 21:58:21 +02:00
t-bltg 6e8228826d Merge pull request #3747 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles [skip ci]
2021-08-12 21:57:16 +02:00
t-bltg 8147c59b2f Update precompile_*.jl file [skip ci] 2021-08-12 17:16:25 +00:00
t-bltg 54a6518d59 Merge pull request #3749 from t-bltg/format
Code style - format
2021-08-12 18:48:42 +02:00
t-bltg c5db139bbb run format(["src", "test"]) 2021-08-11 08:14:51 +02:00
t-bltg a3eca8244e disable formatting on exports 2021-08-11 07:54:35 +02:00
t-bltg 9164ee09cb fix wrong method signature 2021-08-08 23:18:30 +02:00
t-bltg ffca3c1305 update JuliaFormatter config file 2021-08-08 20:38:23 +02:00
t-bltg 1c84704a81 move format to separate action 2021-08-08 20:24:18 +02:00
t-bltg 9e824367bb add configuration file 2021-08-08 20:23:22 +02:00
t-bltg 10e9325635 avoid ambiguous += 2021-08-08 20:23:22 +02:00
t-bltg 13141feb4f Fix #3462 2021-08-04 13:11:15 +02:00
t-bltg f9833214ce Merge pull request #3740 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles [skip ci]
2021-08-03 22:02:32 +02:00
t-bltg a67a006501 Update precompile_*.jl file [skip ci] 2021-08-03 19:20:52 +00:00
t-bltg 40b5df38f4 Merge pull request #3743 from t-bltg/ann
Allow passing collection of tuples to series_annotations
2021-08-03 20:58:12 +02:00
t-bltg c171cd0cf5 Merge pull request #3745 from t-bltg/mesh3d
Move mesh3d triangle to utils - gaston: implement :mesh3d
2021-08-03 20:57:45 +02:00
t-bltg b7b4c850b6 move mesh3d triangle to utils - gaston: implement :mesh3d 2021-08-03 20:07:56 +02:00
t-bltg ba4c4d7bfb Update backends.jl 2021-08-03 17:58:50 +02:00
t-bltg 62b6075407 Gaston: support :arrow for :quiver 2021-08-03 17:56:54 +02:00
t-bltg c0ff6e3dee Gaston: initial :quiver support 2021-08-03 17:55:52 +02:00
t-bltg 67f441f152 Gaston: swap :image axes 2021-08-03 17:54:49 +02:00
t-bltg ed7b6f7f64 examples, missing number 2021-08-03 17:26:23 +02:00
t-bltg 1ccd4ae699 Gaston: remove :histogram2d 2021-08-03 17:19:40 +02:00
t-bltg bd70951afa Gaston: flip y for :image series 2021-08-03 17:19:09 +02:00
t-bltg 39cb596868 allow passing vectors/tuples of vectors to series_annotations 2021-08-03 13:39:20 +02:00
t-bltg 5c13f00716 cleanup 2021-08-03 10:37:05 +02:00
t-bltg f331bfa010 allow passing tuple to series_annotations 2021-08-03 10:34:53 +02:00
Simon Christ c4681682a1 1.20.0 [skip ci] 2021-08-03 09:58:28 +02:00
t-bltg a72b4a3481 specify relative coordinates 2021-08-02 23:30:54 +02:00
t-bltg ff2ae4fe4f typo 2021-08-02 21:54:35 +02:00
t-bltg 2df85eb0fd Update examples.jl 2021-08-02 20:14:40 +02:00
t-bltg 508c47895c Merge pull request #3634 from t-bltg/annotate
Allow relative positioning of annotations
2021-08-02 17:28:30 +02:00
t-bltg 07d32197a1 add regression test 2021-08-02 16:55:51 +02:00
t-bltg d6878a8ea0 remove the need for Plots.pct in annotations 2021-08-02 13:06:02 +02:00
Daniel Schwabeneder b79a2d32fe fix series_annotations for bar (#3742)
* fix series_annotations for bar

* fix my typos in bar recipe

* fix fillrange of annotation series for groupedbar

* fix series_annotations for bar

* fix my typos in bar recipe

* fix fillrange of annotation series for groupedbar

* fix series_annotations for bar

* fix my typos in bar recipe

* fix fillrange of annotation series for groupedbar

* fix series_annotations for bar

* fix fillrange of annotation series for groupedbar
2021-08-02 12:58:16 +02:00
t-bltg 7b1941b129 Typo 2021-08-01 18:04:10 +02:00
t-bltg c6d9332cf1 Gaston: fix polar ticks 2021-08-01 18:03:44 +02:00
t-bltg 670fba56a7 Update examples.jl 2021-08-01 17:55:35 +02:00
t-bltg 9985157eb8 Update backends.jl 2021-08-01 17:54:54 +02:00
t-bltg 9308dd74a8 Update gaston.jl 2021-08-01 17:54:15 +02:00
t-bltg 52be7387f2 Gaston: support polar 2021-08-01 17:53:08 +02:00
t-bltg a94c49ab95 Gaston: remove unsupported :line, :vline markers 2021-08-01 16:19:16 +02:00
t-bltg b7c6a65921 Gaston: remove :vline, :hline markers 2021-08-01 16:18:19 +02:00
t-bltg d8a40f5400 Gaston: remove debug show(...) 2021-08-01 16:12:07 +02:00
t-bltg e4c8921ae9 Gaston: remove more key entries (e.g. :shape) 2021-08-01 16:11:17 +02:00
t-bltg fe8d08123c Gaston: fix wrong series_list causing segfault 2021-08-01 16:00:43 +02:00
t-bltg defe808619 Gaston: update attributes 2021-08-01 15:23:42 +02:00
t-bltg 85fa05464d Gaston: reset key on contours 2021-08-01 15:16:46 +02:00
t-bltg a9a24841fe Gaston: remove debug 2021-08-01 15:04:52 +02:00
t-bltg 0b989cd33e Gaston: rework multiplot 2021-08-01 15:04:09 +02:00
t-bltg 773c7a90b4 Gaston: conditional add_to_legend 2021-08-01 14:16:07 +02:00
t-bltg f49f5d1638 Update gaston.jl 2021-08-01 09:47:36 +02:00
t-bltg 478868a6a2 Merge pull request #3741 from t-bltg/scalefontsizes
Rework fontscales - cleanup
2021-08-01 09:31:34 +02:00
t-bltg 806dc3aa43 rework fontscales - cleanup 2021-08-01 09:07:29 +02:00
t-bltg 0f54c86865 Gaston: update examples 2021-08-01 08:46:38 +02:00
t-bltg 5a5864d087 Gaston: rework margins, terminal fontsize and size 2021-08-01 08:35:16 +02:00
t-bltg baac498532 Merge pull request #3739 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles [skip ci]
2021-08-01 08:07:35 +02:00
t-bltg 9fba70db5e Update precompile_*.jl file [skip ci] 2021-08-01 06:00:06 +00:00
t-bltg af610735eb Gaston: fix legend font 2021-08-01 07:38:28 +02:00
t-bltg 204adc3e36 Gaston: add flip - add :log2, :ln scales 2021-08-01 07:22:20 +02:00
t-bltg 603dc10788 Gaston: fix broken multiplot 2021-08-01 01:23:44 +02:00
t-bltg bf16a97cd5 Gaston: fix legendtitle 2021-08-01 01:16:41 +02:00
t-bltg 8ebe9e8204 Gaston: allow additional series 2021-08-01 00:59:02 +02:00
t-bltg 40cc74bea6 Gaston: fix :steppre, :steppost, add histeps 2021-08-01 00:32:33 +02:00
t-bltg 92cad5376b Update gaston.jl 2021-08-01 00:21:13 +02:00
t-bltg a3e1a43358 Merge pull request #3738 from t-bltg/segments
Gaston: add support for img - rework fonts - fix undef
2021-08-01 00:09:28 +02:00
t-bltg 2fcd907165 Gaston: add support for img - rework fonts - fix undef 2021-08-01 00:08:24 +02:00
t-bltg 2769702687 Merge pull request #3734 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles [skip ci]
2021-07-31 22:13:31 +02:00
t-bltg bf43b9ecec Update precompile_*.jl file [skip ci] 2021-07-31 19:31:14 +00:00
t-bltg 80748eb5e9 Merge pull request #3735 from JuliaPlots/t-bltg-patch-1
GR: remove obsolete method
2021-07-31 21:13:59 +02:00
t-bltg 7863ab9b3b Update gaston.jl 2021-07-31 20:46:03 +02:00
t-bltg 5bc96cfe68 GR: remove obsolete method 2021-07-31 20:31:58 +02:00
t-bltg 2938950bda Gaston: missing markers 2021-07-31 20:30:05 +02:00
t-bltg 88b86be17a Gaston: :hline and :vline are now valid markers 2021-07-31 20:28:37 +02:00
t-bltg aa6b636793 Gaston: add support for :hline, :vline markers 2021-07-31 20:27:26 +02:00
t-bltg dc3d302353 Gaston: typo 2021-07-31 19:44:57 +02:00
t-bltg 4ed13644c4 Gaston: minor fixes 2021-07-31 19:21:55 +02:00
t-bltg 34bf55c033 Gaston: blank plot fixes 2021-07-31 19:09:26 +02:00
t-bltg 982c79baa7 Gaston: drop setting termopts in _create_backend_figure 2021-07-31 19:02:29 +02:00
t-bltg e9b3208d41 Gaston: typo on eval _show 2021-07-31 18:59:49 +02:00
t-bltg 77a9fe3b47 Gaston: add support for background color 2021-07-31 18:50:35 +02:00
t-bltg 4078424f3c Gaston: add support for annotations 2021-07-31 18:14:40 +02:00
t-bltg b45400b1d3 Merge pull request #3731 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/t-bltg-patch-1
[AUTO] Update precompiles [skip ci]
2021-07-31 16:43:54 +02:00
t-bltg dc3e15b4c9 Merge pull request #3730 from JuliaPlots/t-bltg-patch-1
gr_draw_minorgrid should read minorgrid not grid
2021-07-31 16:06:30 +02:00
t-bltg 1e3cb4b4ea Update precompile_*.jl file [skip ci] 2021-07-31 13:07:29 +00:00
t-bltg 57b48da670 Gaston: conditional label in legend 2021-07-31 15:02:40 +02:00
t-bltg e9e95968a9 GR: code style 2021-07-31 14:50:16 +02:00
t-bltg 1889f5b7f9 Gaston: add support for major/minor grids 2021-07-31 14:44:34 +02:00
t-bltg 2c72882865 gr_draw_minorgrid should read minorgrid not grid 2021-07-31 14:40:51 +02:00
t-bltg 36a9e3b386 Merge pull request #3729 from t-bltg/minor_ticks
Gaston: add minor ticks
2021-07-31 14:35:51 +02:00
t-bltg 03fbc25b33 Gaston: add minor ticks 2021-07-31 14:35:30 +02:00
t-bltg cbb83e9820 Merge pull request #3728 from t-bltg/markers
Gaston: rework markers (filled, empty) - cleanup
2021-07-31 13:57:04 +02:00
t-bltg 4420e2009f Gaston: rework markers (filled, empty) - cleanup 2021-07-31 13:54:32 +02:00
t-bltg f394698458 Typo, cleanup 2021-07-31 13:05:23 +02:00
t-bltg 3ec86e983a Gaston: swap pos and size 2021-07-30 13:29:59 +02:00
t-bltg 5dab21e9ba Gaston: multiplot, add position 2021-07-30 13:28:22 +02:00
t-bltg 330d3231f6 Gaston: gaston_init_subplot should accept nothing 2021-07-30 13:11:39 +02:00
t-bltg 74b70fc039 Gaston: handle multiple colors 2021-07-30 13:09:59 +02:00
t-bltg 01d5ff1580 Gaston: move update ratios to _update_plot_object 2021-07-30 00:20:38 +02:00
t-bltg 95804039f4 Gaston: Recursive update width/heights from layout 2021-07-29 23:57:58 +02:00
t-bltg 2dec8c1192 Gaston: typo 2021-07-29 22:18:31 +02:00
t-bltg d3380f4ee8 Gaston: try to respect the layout ratio 2021-07-29 22:16:37 +02:00
t-bltg cbc0417cea Gaston: disable legends in contour plots 2021-07-29 21:49:10 +02:00
t-bltg 914ea027d0 Gaston: Unset set size for subplots - Follow Plots.DPI - Cleanup 2021-07-29 19:13:00 +02:00
t-bltg 434656def6 Merge pull request #3727 from t-bltg/debug_mplot
Gaston: debug mplot
2021-07-29 18:42:06 +02:00
t-bltg e16e46db47 Gaston: debug mplot 2021-07-29 18:40:55 +02:00
t-bltg 9e66eb5737 Merge pull request #3725 from johnnychen94/patch-1
add "no changelog" label for SnoopCompile CI
2021-07-29 15:48:56 +02:00
Johnny Chen 5c02648cdd add "no changelog" label for SnoopCompile CI
This excludes PRs created by SnoopCompile CI from the release notes.
2021-07-29 13:57:04 +08:00
t-bltg fd46fd4add 1.19.4 [skip ci] 2021-07-28 19:21:13 +02:00
t-bltg ac6c7fda11 Merge pull request #3724 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles [skip ci]
2021-07-28 19:09:51 +02:00
t-bltg 4755635fbd Update precompile_*.jl file [skip ci] 2021-07-28 17:08:56 +00:00
t-bltg c82a3c35ee Update SnoopCompile.yml 2021-07-28 18:47:15 +02:00
t-bltg 83bce6e895 Update SnoopCompile.yml 2021-07-28 18:45:27 +02:00
t-bltg 07c5019259 Merge pull request #3719 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-28 18:36:57 +02:00
t-bltg 093181d358 Merge pull request #3721 from t-bltg/inset2
Gaston: update inset_subplots
2021-07-28 18:18:14 +02:00
t-bltg 0085706f6f Gaston: update inset_subplots 2021-07-28 18:17:43 +02:00
t-bltg 31359610bd Merge pull request #3720 from t-bltg/inset
Gaston: fix lens example
2021-07-28 18:03:45 +02:00
t-bltg 34c6c76cb8 Gaston: fix lens example 2021-07-28 18:02:41 +02:00
t-bltg 734b301abc Update precompile_*.jl file 2021-07-28 15:38:02 +00:00
t-bltg e2907b973f Gaston: change @assert to @error 2021-07-28 17:17:44 +02:00
t-bltg 9e3ff15522 Skip more Gaston unsupported examples 2021-07-28 17:01:05 +02:00
t-bltg ce8255a462 Merge pull request #3717 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-28 16:53:53 +02:00
t-bltg aedb1fbb0b Update precompile_*.jl file 2021-07-28 13:12:51 +00:00
t-bltg cebcdfb3b5 Merge pull request #3711 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-28 14:52:57 +02:00
t-bltg b4632c8b48 Update precompile_*.jl file 2021-07-28 11:37:41 +00:00
t-bltg cd4ab0fd24 Merge pull request #3713 from bernd1995/bernd1995-gr-cbarfont
Added colorbar font attributes for GR
2021-07-28 13:18:25 +02:00
BerndR e3cd14944c Also added supported args 2021-07-28 12:54:11 +02:00
t-bltg cac0c8d8d3 Gaston: Remove missing debug leftovers 2021-07-28 12:38:49 +02:00
t-bltg 4f352d8e7c Update docs.yml 2021-07-28 12:07:52 +02:00
t-bltg aa32561fe8 Merge pull request #3709 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-28 11:59:22 +02:00
t-bltg f470e6a590 Update precompile_*.jl file 2021-07-28 09:53:56 +00:00
t-bltg ca0041639b Merge pull request #3699 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-28 11:32:17 +02:00
t-bltg 73208ac3bd Update precompile_*.jl file 2021-07-28 09:24:48 +00:00
t-bltg 0112e78c50 Merge pull request #3667 from t-bltg/gaston_add
Add new gnuplot capabilities (surface, contour, contour3d, scatter3d, wireframe, heatmap, ...)
2021-07-28 11:04:57 +02:00
t-bltg a3f209b100 Merge pull request #3681 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-27 21:19:02 +02:00
t-bltg 573c0cf1bf Merge pull request #3695 from bernd1995/bernd1995-gr-cbarfont
Added colorbar font settings for GR
2021-07-27 21:18:36 +02:00
t-bltg a0c939b7c7 Update gr.jl 2021-07-27 20:42:29 +02:00
BerndR f4ed35c3b6 Added colorbar font settings 2021-07-27 13:10:25 +02:00
t-bltg 50b0ae3b0f Update precompile_*.jl file 2021-07-27 10:04:34 +00:00
t-bltg f049f56e0b Fix building docs (JuliaPlots/Plots.jl/issues/3664) 2021-07-27 11:41:07 +02:00
t-bltg 6a459d4c22 Update docs.yml 2021-07-27 11:27:19 +02:00
t-bltg f576456617 Update docs.yml 2021-07-27 11:21:02 +02:00
t-bltg a7c4eef861 Update docs.yml 2021-07-26 22:28:25 +02:00
t-bltg 741684251c Update docs.yml 2021-07-26 22:11:21 +02:00
t-bltg 75bd9dbd01 Update docs.yml 2021-07-26 21:54:16 +02:00
t-bltg 42c60a4fd6 Update docs.yml 2021-07-26 21:47:57 +02:00
t-bltg 92caf2e15f Update docs.yml 2021-07-26 21:25:14 +02:00
t-bltg 99188f7a7e Update docs.yml 2021-07-26 20:56:29 +02:00
t-bltg a9d11cb2be Update docs.yml 2021-07-26 19:15:26 +02:00
t-bltg 8a3fd8f77e Merge pull request #3679 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-26 12:02:39 +02:00
t-bltg bb29abb8a4 Update precompile_*.jl file 2021-07-26 09:52:21 +00:00
t-bltg b801b2b272 explicit function return, decl - add comments - cleanup 2021-07-26 11:52:13 +02:00
t-bltg 371d9f8dd7 Merge pull request #3677 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-26 11:27:34 +02:00
t-bltg 49f8e48399 Update precompile_*.jl file 2021-07-25 22:25:42 +00:00
t-bltg dbc14ac761 Merge pull request #3675 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-26 00:04:03 +02:00
t-bltg c0e35f2358 add new gnuplot capabilities (surface, scatter3d, wireframe, ...) 2021-07-25 23:21:09 +02:00
t-bltg 3ce4e23f1b Update precompile_*.jl file 2021-07-25 19:05:52 +00:00
t-bltg d4d4d5732b Update docs.yml 2021-07-25 20:45:59 +02:00
t-bltg 86a732e9c5 Update docs.yml 2021-07-25 19:42:38 +02:00
t-bltg 530768064e Update docs.yml 2021-07-25 19:33:20 +02:00
t-bltg 89f59532c1 Merge pull request #3672 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-25 18:53:50 +02:00
t-bltg c41e586385 revert tol changes [skip ci] 2021-07-25 18:52:45 +02:00
t-bltg 8cbfe74863 Update docs.yml 2021-07-25 18:51:46 +02:00
t-bltg 27032a3e21 Update precompile_*.jl file 2021-07-25 16:33:31 +00:00
t-bltg 07a786a946 Update runtests.jl 2021-07-25 18:05:54 +02:00
t-bltg ad0f623386 Merge pull request #3670 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-25 17:59:45 +02:00
t-bltg 4fa567aa5b Update docs.yml 2021-07-25 17:58:39 +02:00
t-bltg c5ae99374a Update runtests.jl 2021-07-25 17:54:52 +02:00
t-bltg e79740d3bd Update precompile_*.jl file 2021-07-25 15:49:34 +00:00
t-bltg dbe6c8dc57 Update docs.yml 2021-07-25 17:47:15 +02:00
t-bltg 9bd075d06b Merge pull request #3655 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-25 17:29:39 +02:00
t-bltg 1c68a13d2c Update docs.yml 2021-07-25 17:24:17 +02:00
t-bltg 86d3097123 Merge pull request #3659 from daschw/gr-tickmarks
Make tickmarks the same length for both axes in GR 2D plots
2021-07-25 17:16:12 +02:00
t-bltg 6c2d969316 Update precompile_*.jl file 2021-07-25 12:54:31 +00:00
t-bltg 30e728213e Merge pull request #3666 from t-bltg/gaston_sp
Fix Gaston layout
2021-07-25 14:32:25 +02:00
t-bltg 4c9fd4e4b7 fix gaston layout 2021-07-25 10:52:20 +02:00
Daniel Schwabeneder 458d72b36b reduce tickmark length 2021-07-24 10:59:06 +02:00
t-bltg 26ddb62a27 Merge pull request #3665 from t-bltg/tol2
More strict on tolerance - drop tol for obsolete version
2021-07-23 20:41:49 +02:00
t-bltg 4aa9d74a28 more strict on tolerance - drop tol for obsolete version 2021-07-23 20:07:08 +02:00
t-bltg 878e590125 Merge pull request #3661 from t-bltg/rng
Use a stable RNG in fakedata
2021-07-23 19:50:54 +02:00
Daniel Schwabeneder 4e5b490b6c make tick length independent of plot size 2021-07-23 19:38:04 +02:00
t-bltg f3aa61293b change fakedata rng in tests 2021-07-23 14:47:16 +02:00
t-bltg cd06648ec3 Switch to Random.GLOBAL_RNG
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-07-23 11:02:22 +02:00
t-bltg fe7d957be3 use a stable RNG in fakedata 2021-07-22 13:00:07 +02:00
t-bltg a39582c06e Preempt IMG_TOL with env variable 2021-07-22 02:05:48 +02:00
t-bltg 86fbb39723 Merge pull request #3660 from t-bltg/anim_glob
Avoid using global variables in animation.jl
2021-07-22 01:57:03 +02:00
t-bltg 6f49ec112c avoid using global variables 2021-07-22 01:31:59 +02:00
t-bltg 6594b93126 Add gnuplot to the system dependencies (docs) 2021-07-21 23:49:13 +02:00
Daniel Schwabeneder f9a1e2e92d Merge pull request #3656 from JuliaPlots/compathelper/new_version/2021-07-21-00-05-42-160-4162151670
CompatHelper: bump compat for "GeometryBasics" to "0.4"
2021-07-21 22:52:16 +02:00
Daniel Schwabeneder e58bd8b657 fix minor tick length 2021-07-21 22:39:48 +02:00
Daniel Schwabeneder 5f31ab7169 fix gr tickmarks lengths for 2D plots 2021-07-21 22:30:56 +02:00
t-bltg b85468162c Skip failing gaston examples 2021-07-21 21:38:33 +02:00
t-bltg 0550033065 Prepare gaston (gnuplot) for PlotDocs.jl 2021-07-21 19:34:32 +02:00
t-bltg 89db9025c5 1.19.3 [skip ci] 2021-07-21 12:10:19 +02:00
t-bltg 10ed39cf83 Merge pull request #3644 from t-bltg/marker_log
Fix computing marker coordinates with log scales
2021-07-21 12:09:34 +02:00
github-actions[bot] 237fa4be7b CompatHelper: bump compat for "GeometryBasics" to "0.4" 2021-07-21 00:05:47 +00:00
t-bltg 192eb6ffbb Debugging docs generation 2021-07-20 15:20:03 +02:00
t-bltg 4fc0f85cf1 Merge pull request #3654 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-20 09:59:27 +02:00
t-bltg aecce08a0f Update precompile_*.jl file 2021-07-19 21:37:24 +00:00
t-bltg 3ad2e0674a Merge pull request #3653 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-07-19 23:17:39 +02:00
t-bltg 05f585f8ad Update precompile_*.jl file 2021-07-19 19:25:33 +00:00
t-bltg c6ba6dd899 Merge pull request #3652 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/t-bltg-patch-1
[AUTO] Update precompiles
2021-07-19 21:05:57 +02:00
t-bltg fcf75a195a Merge pull request #3651 from JuliaPlots/t-bltg-patch-1
Take series alpha into account when drawing contours
2021-07-19 14:31:02 +02:00
t-bltg 3195a67915 Update precompile_*.jl file 2021-07-19 12:22:01 +00:00
t-bltg aa837bb027 Take series alpha into account when drawing contours 2021-07-19 14:04:01 +02:00
Simon Christ 7bb2a29356 1.19.2 [skip ci] 2021-07-16 12:18:26 +02:00
github-actions[bot] f0afadf43a Update precompile_*.jl file (#3648)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-16 12:02:04 +02:00
github-actions[bot] 0525ade990 Update precompile_*.jl file (#3647)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-16 10:52:29 +02:00
Daniel Schwabeneder 6b22f45dd5 fix dpi for GR (#3646) 2021-07-16 10:30:41 +02:00
Jks Liu fc0e9a1245 Fix #3440 subplots attributes out of order (#3645) 2021-07-16 10:29:50 +02:00
Josef Heinen 2ec78be9a1 Update Project.toml
bump GR version
2021-07-16 10:28:49 +02:00
github-actions[bot] 4449398614 Update precompile_*.jl file (#3627)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-16 10:26:39 +02:00
t-bltg 946f90d3e4 fix computing marker coordinates with log scales 2021-07-15 12:08:53 +02:00
Simon Christ c046e6461f 1.19.1 [skip ci] 2021-07-15 09:33:28 +02:00
t-bltg 411de69765 fix plot_title for pyplot (#3642)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-14 22:01:20 +02:00
Simon Christ 4bc6412b46 1.19.0 [skip ci] 2021-07-14 15:51:23 +02:00
Simon Christ 798de8b17c add the plot_title (#2690)
* add the plot_title

* Update bbs/plot_title (#3604)

* add the plot_title

* update plot_title for multiple subplots, fix GR warning

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>

* Update plot_title (#3608)

* add the plot_title

* update plot_title for multiple subplots, fix GR warning

* update plot_title

* consistency with _subplot_defaults

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>

* custom implementation for pgfplotsx backend

* remove `@show`

* remove superfluous plot_titleindex

Co-authored-by: t-bltg <13423344+t-bltg@users.noreply.github.com>
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-14 15:45:53 +02:00
t-bltg b0ff0e58b3 InspectDR: Skip more unsupported examples 2021-07-11 21:43:39 +02:00
t-bltg 5cca5e9148 GR: mesh3d, take into account series line attributes 2021-07-11 04:36:22 +02:00
t-bltg 90e0074f44 1.18.2 [skip ci] 2021-07-10 00:55:01 +02:00
t-bltg 3e14a47e17 Update examples.jl
Update skipped examples for auto-gen in PlotDocs
2021-07-09 23:40:17 +02:00
t-bltg 5d608d1e77 Merge pull request #3612 from t-bltg/mesh3d
GR: add support for mesh3d
2021-07-09 23:15:17 +02:00
t-bltg 20e24cfa8d Merge pull request #3636 from t-bltg/ins_uni
Autogen unicodeplots and inspectdr
2021-07-09 22:11:38 +02:00
t-bltg 2d0191cd70 autogen unicodeplots and inspectdr 2021-07-09 21:40:21 +02:00
t-bltg 12d5accf0a Update pgfplotsx.jl
Typo
2021-07-09 21:27:48 +02:00
t-bltg c02dbca31d Merge pull request #3628 from anowacki/an/annotation-docs
Document use of tuples in annotations attribute
2021-07-08 19:09:22 +02:00
t-bltg bb493a872a allow relative positioning of annotations 2021-07-08 18:50:46 +02:00
Andy Nowacki 0e25767cd3 Document use of tuples in annotate! shorthand
Include a description of the use of vectors of plain tuples in
the docstring for `annotate!`.
2021-07-08 11:22:44 +01:00
Andy Nowacki 5d935d29c5 Document use of tuples in annotations attribute
The `annotations` attribute (and `annotate!` function) has supported
the use of plain tuples containing arguments which are passed to
`text` since v0.22.2.  Document this option in the list of SubPlot
attributes and in example 20.

Closes (mostly) https://github.com/JuliaPlots/RecipesBase.jl/issues/72
but note that `series_annotations` does not yet support passing tuples
of arguments for `Plots.text`.
2021-07-08 11:04:51 +01:00
t-bltg f5e6ae9f98 add warning - enhance example 2021-07-08 11:26:49 +02:00
Simon Christ 4a18098944 1.18.1 [skip ci] 2021-07-07 15:58:45 +02:00
Michael Krabbe Borregaard 3994e47d3c add mkborregaard orcid 2021-07-07 14:26:20 +02:00
github-actions[bot] 39d52a5c57 Update precompile_*.jl file (#3622)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-07 13:03:49 +02:00
t-bltg 91e91ac821 Reduce number of warnings on invalid log values 2021-07-07 00:45:53 +02:00
t-bltg e9949251a6 Merge pull request #3577 from t-bltg/log_bis
GR: rework automatic major/minor ticks for log scales
2021-07-06 20:49:06 +02:00
t-bltg 16e41f0690 rework phantom ticks for log scales - add minorgrid to ex5 2021-07-06 19:15:34 +02:00
t-bltg 6f4400411e Merge pull request #3619 from t-bltg/pipeline
Don't propagate widening axis limits for pipeline recipes
2021-07-06 17:21:44 +02:00
github-actions[bot] 1bba6afde5 Update precompile_*.jl file (#3617)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-06 13:53:03 +02:00
t-bltg 909ad3314a fix test 2021-07-05 22:59:22 +02:00
t-bltg 68a56fee91 fix when ticks is nothing - format - minor updates 2021-07-05 22:47:21 +02:00
t-bltg 9f4e32aa4d add regression test 2021-07-05 22:29:38 +02:00
t-bltg 434e189f1e fix JuliaPlots/Plots.jl/issues/3451 2021-07-05 22:12:09 +02:00
Simon Christ c9f7c6b45d 1.18.0 [skip ci] 2021-07-05 17:53:42 +02:00
Zhanibek e58fdf970f Gnuplot (GASTON) backend testing (#3177)
* gnuplot

* minimal working gnuplot

* more params

* new series and axis params

* saving figures

* gnuplot version 0.1
2021-07-05 17:52:59 +02:00
github-actions[bot] c97900f7ee Update precompile_*.jl file (#3616)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-05 15:19:03 +02:00
Simon Christ 1b881619e3 1.17.0 [skip ci] 2021-07-05 15:16:19 +02:00
t-bltg fbd5d79d49 Merge pull request #3590 from t-bltg/warn
GR: 3D, warn on invalid rotation or tilt
2021-07-05 15:01:53 +02:00
Simon Christ db7420fd5f fix dispatches for plot and plot! (#3602)
* fix dispatches

* fix tests
2021-07-05 13:25:20 +02:00
t-bltg 09356ee3b5 Merge pull request #3609 from t-bltg/simplify_layouts
Simplify build_layout logic
2021-07-05 12:50:14 +02:00
t-bltg 0122d70640 Merge pull request #3601 from t-bltg/warn_log
Warn on invalid value for log scale based series
2021-07-05 12:13:36 +02:00
t-bltg 5974d0ac31 revert fix for failing CI (#3611)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-05 11:24:22 +02:00
t-bltg 81170b4342 GR: add support for mesh3d 2021-07-05 02:15:51 +02:00
t-bltg ee316e2913 GR: rework automatic major/minor ticks for log scales 2021-07-04 21:58:13 +02:00
t-bltg ef93aa87be Merge pull request #3610 from t-bltg/dist_bug
Bypass JuliaStats/Distributions.jl/issues/1358
2021-07-04 19:22:33 +02:00
t-bltg 88ebb8152d bypass JuliaStats/Distributions.jl/issues/1358 2021-07-04 19:00:28 +02:00
t-bltg 124d2d6aa3 issue warning only once - apply to other backends 2021-07-04 15:48:16 +02:00
t-bltg cdbafd60c8 Merge pull request #3598 from t-bltg/legend
Fix Latex sub/super-scripts in legends
2021-07-04 15:34:44 +02:00
t-bltg 5eb62abb25 simplify build_layout logic 2021-07-04 15:07:09 +02:00
t-bltg 3f110d6a6c Merge pull request #3591 from t-bltg/surf_opts
GR: expose surface(...) display options, fix hardcoded constants
2021-07-04 12:50:55 +02:00
t-bltg 293b43013b allow spacing via extra_kwargs 2021-07-03 20:05:53 +02:00
t-bltg 3536acbcc8 warn on invalid value for log scale based series 2021-07-03 14:44:53 +02:00
Simon Christ 0ca5bc9124 1.16.8 [skip ci] 2021-07-02 21:27:21 +02:00
t-bltg 14b38354da fix #3558 2021-07-02 20:26:24 +02:00
t-bltg 06c551ba51 Skip example 55 for PyPlot, Plotlyjs and Plotly
PgfPlotsX looks ok
2021-07-02 16:57:35 +02:00
t-bltg f63ee6d79e enhance example 55 (#3596)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-07-02 15:06:36 +02:00
github-actions[bot] b3f698c460 Update precompile_*.jl file (#3592)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-02 09:42:25 +02:00
Simon Christ 829860fa2d use sinc in example 55 2021-07-02 09:17:56 +02:00
Simon Christ 1523ef67d5 simplify example 55 2021-07-01 21:41:35 +02:00
github-actions[bot] e049b082f3 [AUTO] Update precompiles (#3573)
* add tests for series_annotations in layouts

* add methods for matrices of annotations

* defensive copy on plot(plots)

* seperate in plot(plots) and plot!(plots)

* Update precompile_*.jl file

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-07-01 18:40:58 +02:00
Simon Christ f78899a1ef return plot object 2021-07-01 18:28:50 +02:00
t-bltg e42b4ad34d GR: surface, add the possibility to override the hardcoded nx and ny in GR.gridit(...) 2021-07-01 16:54:07 +02:00
t-bltg a7c629f775 GR: expose surface(...) display options 2021-07-01 15:08:36 +02:00
t-bltg 1ddc673201 GR: 3D, warn on invalid rotation or tilt 2021-07-01 14:02:30 +02:00
t-bltg bba971f7ea GR: fix axis flip / mirror in 3D plots (#3584)
* fix axis flip in 3D plots

* add mwe as example - fix needs_3d_axes

* fix major / minor grids when mirroring

Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-06-30 22:50:09 +02:00
Simon Christ 3f9105054c 1.16.7 [skip ci] 2021-06-30 11:30:37 +02:00
t-bltg a64ae3d13c GR: fix alignment of ticks label when rotating (#3587)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-06-30 09:30:55 +02:00
t-bltg 7b0066c433 simplify major / minor grid segments (#3586)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-06-25 21:10:35 +02:00
Simon Christ d657c0cb33 1.16.6 [skip ci] 2021-06-25 16:57:10 +02:00
t-bltg 50f63cf1eb Ignore :blank plots (#3585) 2021-06-25 15:40:49 +02:00
Simon Christ 2b22dae757 Handle matrices of annotations and copy for plot(plots) (#3572)
* add tests for series_annotations in layouts

* add methods for matrices of annotations

* defensive copy on plot(plots)

* seperate in plot(plots) and plot!(plots)
2021-06-17 09:29:39 +02:00
Simon Christ 7ca32b5edd show ekwargs on show (#3567) 2021-06-12 09:38:10 +02:00
Simon Christ 3f5a1287be 1.16.5[skip ci] 2021-06-10 15:48:03 +02:00
Simon Christ 990e0f3f7f Better twinx (#3564)
* improve twinx

* add tests, disable gridlines of twinx
2021-06-10 15:00:19 +02:00
Simon Christ 849d31d57f markers -> mark for older pgfplots version 2021-06-09 16:54:55 +02:00
Simon Christ cfe5ba24a6 1.16.4 [skip ci] 2021-06-09 15:54:34 +02:00
Simon Christ be1c263df9 no markers on fillranges (#3563) 2021-06-09 15:53:52 +02:00
Fons van der Plas 203af856cd embeddable_html (#3559) 2021-06-09 09:01:40 +02:00
Fred Callaway 019a742c84 Respect :widen when passing :lims (#3552)
* Respect :widen when passing :lims

Previously, the limits were not widened when passing a tuple or
:round to lims (ignoring the widen argument). Fixes #3339

* Add default widen=:auto, which matches default before 43e9a342

* If widen is a Bool, it always determines whether widening occurs.
* If widen is :auto (the defualt), widening occurs for appropriate
  seriestypes, unless lims were set manually

* Update test/test_axes.jl

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

* fix docs for lims and widen interaction

* Update .zenodo.json

* Update test/test_axes.jl

xlims != ylims

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2021-06-07 20:46:49 +02:00
Simon Christ 5330776040 1.16.3 [skip ci] 2021-06-07 19:56:24 +02:00
Simon Christ fcdb3c1c0d remove markers from fillranges (#3553) 2021-06-07 18:29:36 +02:00
Simon Christ cc290818d7 fix setting marker = :none without seriestype (#3550) 2021-06-07 15:55:43 +02:00
Simon Christ 14b3852060 add :symmetric docs 2021-06-04 22:09:51 +02:00
Simon Christ 387f918080 [skip ci] 2021-06-04 17:29:13 +02:00
Simon Christ d0d95c6cc7 1.16.2 [skip ci] 2021-06-04 17:09:25 +02:00
Simon Christ d51059f0e9 set projection for 3dquivers (#3544)
* set projection for 3dquivers

* fix test
2021-06-04 17:08:33 +02:00
Simon Christ 4723c513be 1.16.1 [skip ci] 2021-06-04 15:39:51 +02:00
Simon Christ d1373d8b89 fix fontfamily (#3542)
* fix fontfamily

* Update test_defaults.jl
2021-06-04 15:36:40 +02:00
Simon Christ 9f51b96269 1.16.0 [skip ci] 2021-06-03 19:00:39 +02:00
t-bltg 601df0c9a9 GR: allow explicit guidefontrotation (#3529)
Co-authored-by: t-bltg <t-bltg@users.noreply.github.com>
2021-06-03 19:00:06 +02:00
github-actions[bot] 700b5782ec Update precompile_*.jl file (#3536)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-06-03 17:36:51 +02:00
Simon Christ 6a62d96751 axis limits = :symmetric (#2600)
* allow axis-lims = :symmetric

* remove show

* add test
2021-06-03 17:35:42 +02:00
Simon Christ 25b57cfb55 Run tests of GraphRecipes and StatsPlots (#3519)
* run tests of StatsPlots and GraphRecipes

* one environment each

* correct paths
2021-06-03 11:08:37 +02:00
github-actions[bot] fb390d1872 Update precompile_*.jl file (#3535)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-06-03 10:58:38 +02:00
Simon Christ 5fafddb995 fix fontrotation being interpreted as fontsize (#3533)
* fix convenience font functions

* correct size argument
2021-06-02 22:12:30 +02:00
Simon Christ 697e5a87cf 1.15.3 [skip ci] 2021-06-02 16:29:59 +02:00
github-actions[bot] 77ba81de19 Update precompile_*.jl file (#3530) [skip ci]
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-06-02 16:14:02 +02:00
Simon Christ e43f3ee373 Drop compat for older GR versions (#3526) 2021-06-02 08:24:42 +02:00
Simon Christ 8f055fef3d 1.15.2 [skip ci] 2021-05-20 20:43:29 +02:00
Simon Christ ce530ef518 fix vector of shapes (#3517) 2021-05-20 20:42:31 +02:00
BerndR 827462dc21 NaN checking in backends/gr.jl (#3514)
* Updated .zenodo.json infos

* resolved NaN-checking
2021-05-19 20:33:33 +02:00
github-actions[bot] 1ecec912a1 Update precompile_*.jl file (#3508) [skip ci]
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-05-19 08:53:17 +02:00
Simon Christ ca8e775b83 1.15.1[skip ci] 2021-05-19 08:29:08 +02:00
Fons van der Plas c0e50588d3 Minor cleanup plotlyjs (#3510) 2021-05-19 08:28:03 +02:00
Simon Christ de7717b85f Fix too many legend entries (#3511)
* add test

* fix legend entries
2021-05-19 08:27:41 +02:00
Simon Christ a1311e5c60 all the names [skip ci] 2021-05-18 18:21:45 +02:00
Simon Christ 4069b73563 Update .zenodo.json 2021-05-17 17:58:12 +02:00
Simon Christ a7d6e93af3 1.15.0 [skip ci] 2021-05-17 09:57:18 +02:00
Simon Christ 058983165e change DOI [skip ci] 2021-05-17 09:55:47 +02:00
Simon Christ 97036e689e Create .zenodo.json (#3482)
* Create .zenodo.json

* Update .zenodo.json

Co-authored-by: Daniel Schwabeneder <daschw@disroot.org>

* add members, classify contributors

* Apply suggestions from code review

Co-authored-by: Daniel Schwabeneder <daschw@disroot.org>

* add all names

Co-authored-by: Daniel Schwabeneder <daschw@disroot.org>
2021-05-17 09:43:23 +02:00
github-actions[bot] d3589db840 Update precompile_*.jl file (#3484)
Co-authored-by: daschw <daschw@users.noreply.github.com>
2021-05-14 22:03:29 +02:00
Simon Christ 15bd9c537d Create docs on pushing to master (#3494)
* Create docs.yml

* Update docs.yml

* Update docs.yml

* Create docs.yml

* Update docs.yml

* [skip ci]

* [skip ci]

* [skip ci]

* [skip ci]

* Update docs.yml

* Update docs.yml

* Update docs.yml

* Update docs.yml

* fix pgfplotsx

* fix pyplot

* remove push workflow (should work without)

* conditionally fix pyplot

* change env-vars

* fix

* fix ref

* clean up and cache artifacts

* add Documenter_key to environment

* fix parentheses

* "one last fix"

* dev => add

* fix marker example

* exclude 50 for plotly

* install ms fonts

* only trigger on master

* remove REF pretending
2021-05-14 22:00:09 +02:00
Daniel Schwabeneder 27764bbc67 Merge pull request #3497 from giordano/mg/animate-while
Allow `while`-block in at-animate macro
2021-05-14 19:19:05 +02:00
Mosè Giordano 788e28d18a Allow while-block in at-animate macro 2021-05-13 10:14:03 +01:00
Asim H Dar d544647b1b Update plotly.jl (#3491)
Tiny typo
2021-05-12 18:36:14 +02:00
Simon Christ 3cb81d6d04 fix alpha for surface (#3489) 2021-05-12 18:35:19 +02:00
Yuval 61f2d825b6 Merge pull request #3468 from yha/several-nans-fix
Fix for plotting a vector of (at least two) NaNs
2021-05-11 17:56:33 +03:00
Daniel Schwabeneder 5df64bd45b Merge pull request #3463 from gustaphe/fontdefaults
Add annotation font defaults/settings
2021-05-11 01:03:09 +02:00
Simon Christ 7e997da6bd 1.14.0 [skip ci] 2021-05-10 19:53:10 +02:00
Simon Christ 35658bf4fe fix tests 2021-05-07 08:14:37 +02:00
Simon Christ f355ff9904 clean up pgfx-legends duplications 2021-05-06 21:27:24 +02:00
github-actions[bot] 8893782b13 [AUTO] Update precompiles (#3471)
* add legend stylings

* fix center and default case

* Update precompile_*.jl file

Co-authored-by: Simon Christ <simonchrist@gmx.de>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-05-04 20:54:43 +02:00
Simon Christ 78f7db138f add legend stylings (#3470)
* add legend stylings

* fix center and default case
2021-05-04 20:54:11 +02:00
yha 23567964e7 undo accidental change 2021-05-03 19:45:48 +03:00
yha 0c7f7ba011 Fix for plotting a vector of (at least two) NaNs 2021-05-03 19:44:11 +03:00
David Gustavsson 4731477920 Add annotation font defaults 2021-05-01 20:39:55 +02:00
Daniel Schwabeneder 57ba6aa5a9 Merge pull request #3458 from daschw/tickmarks
add `tick_direction=:none` option to hide tick marks
2021-04-29 10:54:54 +02:00
Simon Christ 3c472f24b5 add DOI badge 2021-04-28 22:20:34 +02:00
Daniel Schwabeneder 5a4651a0ec clean changes in recipes.jl 2021-04-28 20:35:00 +02:00
Daniel Schwabeneder 7bb2132b18 add tick_direction=:none option to hide tick labels 2021-04-28 20:27:50 +02:00
Daniel Schwabeneder fd50469e20 Merge pull request #3430 from ma-laforge/idr_layout
Update plot areas for the given font sizes.
2021-04-28 18:42:14 +02:00
Daniel Schwabeneder e3d13aa17a Merge pull request #3436 from gustaphe/master
Generalize Shape
2021-04-28 18:40:57 +02:00
Simon Christ 476de3d2a2 1.13.2 [skip ci] 2021-04-28 09:52:54 +02:00
Yuval c986bfa1e6 Merge pull request #3443 from yha/plotly-shapes-fix
Fix shapes series on plotly
2021-04-27 13:05:32 +03:00
github-actions[bot] dfd8fada9d [AUTO] Update precompiles (#3455)
* incorporate colorbar ticks and ticklabel styles

* fix colorbar showing

* Update precompile_*.jl file

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2021-04-27 10:35:28 +02:00
Simon Christ d4298bf1cc 1.13.1 [skip ci] 2021-04-27 10:35:12 +02:00
Simon Christ 02437562a7 colorbar improvements for pgfplotsx (#3441)
* incorporate colorbar ticks and ticklabel styles

* fix colorbar showing
2021-04-27 09:50:49 +02:00
Benoit Pasquier 8cf268a390 Add ticks getter functions (#3435)
* Add ticks getter functions

* Add tick-getter functions for Plot objects

* Fix boiler-plate code in get_ticks

* Bump minor version + add tests

* Remove kwargs and add subplot test

* Add docstrings

* bump minor version
2021-04-23 08:52:17 +02:00
Simon Christ fbf3878ca5 1.12.0 [skip ci] 2021-04-20 11:21:54 +02:00
yha e449d3221c Fix shapes series on plotly 2021-04-18 13:41:10 +03:00
David Gustavsson a359f21325 Generalize Shape 2021-04-14 09:34:06 +02:00
MA Laforge 9da550ba3b Update plot areas for the given font sizes.
Also:
Layout changes are made to defaults instead of user-overwrites.
2021-04-10 14:57:39 -04:00
Daniel Schwabeneder 0a7035979f Merge pull request #3412 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-04-10 12:59:18 +02:00
Daniel Schwabeneder 6376d40ae2 Merge pull request #3423 from matthieugomez/master
correct scatterpath + add linearfit
2021-04-10 12:58:26 +02:00
matthieugomez 67f4d79c4a simpler formula for yhat 2021-04-08 10:11:09 -07:00
matthieugomez 50adb6cd9c Update recipes.jl 2021-04-07 14:42:12 -07:00
matthieugomez 64f3d589b6 correct scatterpath + add linearfit
correct scatterpath so that color does not change (see https://github.com/JuliaPlots/Plots.jl/issues/1495). Add linearfit.
2021-04-07 14:39:41 -07:00
isentropic 07b05e075e Update precompile_*.jl file 2021-04-05 05:16:17 +00:00
Zhanibek 1ceb3a561f pyplot, rawticklabels extra_kwarg added 2021-04-05 13:56:00 +09:00
Daniel Schwabeneder e1e0f8d1c9 Merge pull request #3411 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-04-01 19:59:59 +02:00
Daniel Schwabeneder f39ba03da5 Merge pull request #3409 from daschw/bar
fix multiple legend in pgfplotsx bar plots
2021-04-01 19:59:06 +02:00
daschw 7d7212ba3e Update precompile_*.jl file 2021-04-01 17:56:06 +00:00
Daniel Schwabeneder 17a942998d Merge pull request #3407 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-04-01 19:29:45 +02:00
Daniel Schwabeneder 6a829e2b1a Merge pull request #3405 from JuliaPlots/compathelper/new_version/2021-04-01-00-46-46-673-1268091602
CompatHelper: bump compat for "Latexify" to "0.15"
2021-04-01 19:29:28 +02:00
Daniel Schwabeneder 011591ff55 Merge branch 'master' into compathelper/new_version/2021-04-01-00-46-46-673-1268091602 2021-04-01 19:29:06 +02:00
Daniel Schwabeneder c56654c6cf fix multiple legend in pgfplotsx bar plots 2021-04-01 17:21:29 +02:00
daschw 90255913a4 Update precompile_*.jl file 2021-04-01 15:09:56 +00:00
Daniel Schwabeneder 67d7b4d771 Merge pull request #3406 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/compathelper/new_version/2021-04-01-00-46-46-673-1268091602
[AUTO] Update precompiles
2021-04-01 16:52:44 +02:00
Daniel Schwabeneder 3051ce9e57 Merge pull request #3402 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-04-01 16:52:29 +02:00
daschw 09e90c0ca6 Update precompile_*.jl file 2021-04-01 01:04:15 +00:00
github-actions[bot] dbe9a2c52b CompatHelper: bump compat for "Latexify" to "0.15" 2021-04-01 00:46:50 +00:00
Daniel Schwabeneder 56a0673713 Merge pull request #3403 from daschw/release
new release [skip ci]
2021-03-31 15:44:38 +02:00
Daniel Schwabeneder 22f1dd72c9 new release [skip ci] 2021-03-31 15:43:05 +02:00
daschw 9ad3654d4f Update precompile_*.jl file 2021-03-31 12:29:51 +00:00
Daniel Schwabeneder d2c85bdff9 Merge pull request #3398 from hustf/fix#3397
Bugfix and test, issue #3397
2021-03-31 14:12:22 +02:00
Daniel Schwabeneder ec7a912b58 Merge pull request #3395 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-03-31 14:10:53 +02:00
jheinen b63e41904b Update precompile_*.jl file 2021-03-31 10:00:08 +00:00
Josef Heinen 78f078ccc2 Update Project.toml 2021-03-31 11:42:35 +02:00
hustf 727ced25f1 modified: src/axes.jl #3397 fix varname
modified:   test/test_recipes.jl #3397 test all framestyles effect
2021-03-29 12:29:47 +02:00
Daniel Schwabeneder 378cabcb73 Merge pull request #3394 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-03-29 01:27:14 +02:00
daschw f4fb0862ea Update precompile_*.jl file 2021-03-28 23:23:17 +00:00
Daniel Schwabeneder cda8dae829 Merge pull request #3392 from daschw/release
bugfix release
2021-03-29 01:12:54 +02:00
Daniel Schwabeneder 86c400500e Merge pull request #3393 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-03-29 01:06:05 +02:00
daschw 23f8ba1db8 Update precompile_*.jl file 2021-03-28 23:02:09 +00:00
Daniel Schwabeneder 014b86a44c bugfix release 2021-03-29 00:50:05 +02:00
Daniel Schwabeneder 0ac71c6b1e Merge pull request #3391 from daschw/actions
update github actions
2021-03-29 00:48:30 +02:00
Daniel Schwabeneder 29604fd7f2 don't test on 1.5 2021-03-29 00:47:41 +02:00
Daniel Schwabeneder 53272b8a9d test on 1.5 2021-03-29 00:32:25 +02:00
Daniel Schwabeneder a0b104f563 run CompileBot on 1.6 2021-03-29 00:31:41 +02:00
Daniel Schwabeneder 9581a7cc49 Merge pull request #3388 from RPigott/spines
Fix PyPlot spines iteration
2021-03-29 00:27:42 +02:00
Daniel Schwabeneder 7d22d84595 support both MPL 3.3 and 3.4 2021-03-29 00:21:15 +02:00
Daniel Schwabeneder bf23b8f7a1 Merge pull request #3390 from daschw/gr-guides
fix guide positions in GR
2021-03-28 23:50:40 +02:00
Daniel Schwabeneder 005dcbc77a Merge pull request #3387 from olegshtch/webio-plotlyjs-integration
Use PlotlyJS's integration with WebIO
2021-03-28 23:50:19 +02:00
Daniel Schwabeneder ad1216639a Merge branch 'master' into webio-plotlyjs-integration 2021-03-28 23:31:32 +02:00
Daniel Schwabeneder ce778ff7be add test image 2021-03-28 23:20:09 +02:00
Daniel Schwabeneder 711a8448dc fix guidepostitions in GR 2021-03-28 23:09:52 +02:00
Daniel Schwabeneder 0a84ff8caf Merge pull request #3377 from mmikhasenko/master
guide label alignment
2021-03-28 21:29:04 +02:00
Daniel Schwabeneder 23cbfe9378 Merge pull request #3382 from david-macmahon/stepmid-branch
Add support for `seriestype=:stepmid`
2021-03-28 21:27:12 +02:00
Daniel Schwabeneder 1cb434ac26 Merge pull request #3374 from ma-laforge/idr_layout
Conform to InspectDR's new layout API in v0.4.0.
2021-03-28 21:03:49 +02:00
Daniel Schwabeneder 138a2fa34a Merge pull request #3359 from daschw/pyplot
fix line_z on pyplot
2021-03-28 21:02:19 +02:00
Daniel Schwabeneder 60c59a4be0 Merge pull request #3385 from pgagarinov/master
ADD: happy-path test for #3365
2021-03-28 20:04:36 +02:00
Ronan Pigott bea1378ff1 fix PyPlot spines iteration 2021-03-27 14:00:15 -07:00
Oleg Shchelykalnov d46f59e4be Add tests for PlotlyJS backend 2021-03-27 14:45:38 +03:00
Oleg Shchelykalnov 52da386df1 Use PlotlyJS's integration with WebIO 2021-03-27 14:00:18 +03:00
Peter Gagarinov bb26bb0557 ADD: happy-path test for #3365 2021-03-27 00:34:15 +03:00
David MacMahon b3bf5db9bc Add new "Steps Types" example/test plot 53
This new example/test plot showcases the various step-like
`seriestype`s: `:steppre`, `:stepmid`, and `:steppost`.
2021-03-26 11:12:14 -07:00
David MacMahon 074c56867d Revert "Add :stepmid to line types example plot"
This reverts commit 0d528b7c82.
2021-03-26 10:49:19 -07:00
Daniel Schwabeneder 71fd38fe26 Merge pull request #3367 from daschw/bar
fix bar for unsorted x input
2021-03-26 18:31:00 +01:00
Misha Mikhasenko 4841c13311 typo: axis 2021-03-25 17:36:23 +01:00
Misha Mikhasenko 89dea71874 Merge branch 'master' of https://github.com/mmikhasenko/Plots.jl 2021-03-25 14:44:07 +01:00
Misha Mikhasenko 1a9532f9fc merged 2021-03-25 14:42:45 +01:00
Misha Mikhasenko 2b3fa980ee alighment 2021-03-25 14:34:52 +01:00
David MacMahon 0d528b7c82 Add :stepmid to line types example plot 2021-03-24 23:27:16 -07:00
David MacMahon c2cb60ff12 Make Plots backends aware of new :stepmid option 2021-03-24 23:25:57 -07:00
David MacMahon ddf6aa9760 Make Plots framework aware of new :stepmid option 2021-03-24 23:24:31 -07:00
David MacMahon 50f1106cd7 Add recipe for seriestype=:stepmid 2021-03-24 20:47:14 -07:00
David MacMahon 3bb406e0ea Add :mid support to make_steps 2021-03-24 20:35:08 -07:00
David MacMahon 10fa36cdd9 Use even to tweak length of make_steps output
If `even` in false, `make_steps` returns an odd-length (2n-1) Vector as
it did before.  If even is `true`, `make_steps` now returns an
even-length (2n) Vector whose first (2n-1) elements are the same as
before and whose final element is the same as the final element of the
input Vector.
2021-03-24 20:21:12 -07:00
David MacMahon 0508d05299 Remove conditional from make_steps for loop 2021-03-24 20:16:53 -07:00
David MacMahon 59a1faf590 Add even arg to make_steps
This is in preparation for `:stepmid` support.
2021-03-24 19:56:29 -07:00
Zhanibek c0824bdc62 Colorbar enhancements (#3346)
* CompatHelper: bump compat for "Showoff" to "1.0"

* fix series-segments for empty series

* fix wireframe on pyplot

* colorbar redesign

* minimal working version

* reduce code duplication for colorbar ticks

* fix aspect_ratio in GR with legend=:outertopright

* fix GR test failure

* new release [skip ci]

* colorbar scale supported

* Added weights example to ? histogram

Helps to clarify the use of weights (which differs from StatsBase functions)

* Update precompile_*.jl file

* minor version bump [skip ci]

* working prototype

* fixed formatting, added colorbar docs

* colorbar redesign

* minimal working version

* reduce code duplication for colorbar ticks

* fix GR test failure

* colorbar scale supported

* working prototype

* fixed formatting, added colorbar docs

Co-authored-by: Daniel Schwabeneder <daschw@disroot.org>
2021-03-25 11:22:07 +09:00
MA Laforge 606b86c962 Conform to InspectDR's new layout API in v0.4.0. 2021-03-24 19:28:52 -04:00
Daniel Schwabeneder a50661dd44 fix bar for unsorted x input 2021-03-23 22:11:16 +01:00
Daniel Schwabeneder 34f4d318ea fix line_z on pyplot 2021-03-20 11:13:39 +01:00
Daniel Schwabeneder 9fc1d574cd Merge pull request #3333 from JuliaPlots/compathelper/new_version/2021-03-05-00-27-43-476-2803635382
CompatHelper: bump compat for "Showoff" to "1.0"
2021-03-20 09:14:58 +01:00
Daniel Schwabeneder 9300dffcc3 Merge pull request #3352 from daschw/release
new release
2021-03-18 22:10:54 +01:00
Daniel Schwabeneder 796f9ef47b Merge pull request #3354 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-03-18 22:10:22 +01:00
Daniel Schwabeneder da2dc2cb1b minor version bump [skip ci] 2021-03-18 22:01:46 +01:00
Daniel Schwabeneder f76390c20d Merge pull request #3350 from daschw/gr-aspect
fix aspect_ratio in GR with legend=:outertopright
2021-03-16 10:39:23 +01:00
mkborregaard ef82e53eef Update precompile_*.jl file 2021-03-15 14:56:12 +00:00
Michael Krabbe Borregaard 219939525c Merge pull request #3353 from jo-fleck/histogram_doc_weights
Added weights example to ? histogram
2021-03-15 15:38:29 +01:00
jo-fleck ae99ed2588 Added weights example to ? histogram
Helps to clarify the use of weights (which differs from StatsBase functions)
2021-03-15 14:09:24 +01:00
Daniel Schwabeneder 8e13bb4ccc new release [skip ci] 2021-03-14 19:20:45 +01:00
Daniel Schwabeneder 66db3ceae0 fix aspect_ratio in GR with legend=:outertopright 2021-03-14 17:41:54 +01:00
Daniel Schwabeneder 060162c356 Merge pull request #3344 from daschw/py-wireframe
fix wireframe on pyplot
2021-03-12 21:49:42 +01:00
Daniel Schwabeneder 271d93c1ed Merge pull request #3340 from daschw/series-segments
fix series-segments for empty series
2021-03-12 21:49:26 +01:00
Daniel Schwabeneder 664af999cd fix wireframe on pyplot 2021-03-10 22:15:06 +01:00
Daniel Schwabeneder a1ace08d22 Merge pull request #3332 from korsbo/nk/pgfplotsx_dpi
Enable `dpi`  option for `pgfplotsx()` PNGs.
2021-03-06 12:39:31 +01:00
Daniel Schwabeneder 4d5f76b80d Merge pull request #3330 from yha/segment-example-no-cycle
No implicit cycling in example
2021-03-06 12:38:30 +01:00
Daniel Schwabeneder b8c2d62c32 Merge pull request #3329 from gustaphe/annotations
Bar chart series_annotations
2021-03-06 12:38:07 +01:00
Daniel Schwabeneder 6201dfe580 Merge pull request #3324 from gustaphe/legendangle
[WIP] position legend at angle
2021-03-06 12:37:35 +01:00
Daniel Schwabeneder d44b7e89e7 fix series-segments for empty series 2021-03-06 12:03:50 +01:00
github-actions[bot] 08e3224f8f CompatHelper: bump compat for "Showoff" to "1.0" 2021-03-05 00:27:46 +00:00
Niklas Korsbo e9b78e7191 Enable dpi option for pgfplotsx() PNGs. 2021-03-03 10:46:24 +01:00
yha f418acf387 No implicit cycling in example 2021-03-03 00:00:25 +02:00
Yuval f097549e3b Merge pull request #3320 from yha/segments-nan-attr
Fix for "segmented" attributes with NaNs
2021-03-02 23:21:57 +02:00
yha c8b882d17a rename local var 2021-03-02 22:56:56 +02:00
Yuval dbbece413c Merge branch 'master' into segments-nan-attr 2021-03-02 15:29:43 +02:00
David Gustavsson 9cee7a2c47 Documentation for legend angle 2021-03-02 11:53:47 +01:00
David Gustavsson d6a72a5df5 Add legend angle to pyplot 2021-03-02 10:19:26 +01:00
David Gustavsson 37252ec562 Correct anchor order 2021-03-02 10:07:49 +01:00
David Gustavsson 1d3e0a5d5d Better legend anchor algorithm 2021-03-02 08:02:39 +01:00
Yuval a85c10dcdd Merge pull request #13 from yha/Test_SnoopCompile_AutoPR_refs/heads/segments-nan-attr
[AUTO] Update precompiles
2021-03-01 03:37:27 +02:00
yha 97caa18fb4 Update precompile_*.jl file 2021-03-01 01:33:16 +00:00
yha 6af91c7f71 warning and hint on mismatched attr lengths 2021-03-01 03:23:19 +02:00
yha e9cd69ea2f Fix Shape vector recipe 2021-03-01 02:17:42 +02:00
David Gustavsson 6724a3a2fe Centralize utility functions, add legend-angle to plotly, pgfplotsx 2021-02-28 23:40:06 +01:00
David Gustavsson a75d309d20 Labels for horizontal bars 2021-02-28 09:20:20 +01:00
David Gustavsson 5cc08a17b6 Series annotations for bar plots 2021-02-28 08:57:54 +01:00
Daniel Schwabeneder 2220dbc465 Merge pull request #3326 from daschw/release
release
2021-02-25 20:16:03 +01:00
Daniel Schwabeneder 66250acfaa release 2021-02-25 19:38:08 +01:00
Daniel Schwabeneder 395cc9294b Merge pull request #3316 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-25 19:36:51 +01:00
jheinen 3f13a186e7 Update precompile_*.jl file 2021-02-25 18:13:34 +00:00
Josef Heinen 2d8b2332fb Update Project.toml
Add GR v0.55.0
2021-02-25 18:56:00 +01:00
David Gustavsson 2cee039dbc Add polar legend position 2021-02-25 15:08:33 +01:00
David Gustavsson 6193519b1f Correct erroneous offset for legend=:outerbottom 2021-02-25 12:20:59 +01:00
Yuval 65dac58338 Merge pull request #12 from yha/Test_SnoopCompile_AutoPR_refs/heads/segments-nan-attr
[AUTO] Update precompiles
2021-02-25 02:57:19 +02:00
yha 164725079d Update precompile_*.jl file 2021-02-25 00:53:00 +00:00
yha 42b3c5625f Fix for "segmented" attributes with NaNs 2021-02-25 02:33:11 +02:00
Daniel Schwabeneder cd851df28a Merge pull request #3314 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-20 17:05:36 +01:00
daschw 57b0a81c1c Update precompile_*.jl file 2021-02-19 21:51:22 +00:00
Daniel Schwabeneder 1ef15934cc Merge pull request #3313 from daschw/surface
Surface fixes
2021-02-19 22:35:31 +01:00
Daniel Schwabeneder 0a6edd5d60 fix gr test example 2021-02-19 22:08:02 +01:00
Daniel Schwabeneder e8437d76fd fix fillalpha for surface on pgfplotsx 2021-02-19 21:22:57 +01:00
Daniel Schwabeneder 2e2f7044e2 fix surface on pgfplotsx 2021-02-19 21:20:51 +01:00
Daniel Schwabeneder 100da5ccae fix fillalpha for surface on pyplot 2021-02-19 20:59:48 +01:00
Daniel Schwabeneder d59f6c96d5 fix surface for pyplot 2021-02-19 20:26:18 +01:00
Daniel Schwabeneder 0628fb9dc3 enable transparency for surface with GR 2021-02-19 18:59:47 +01:00
Daniel Schwabeneder 6b71bd961d Merge pull request #3308 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-19 12:48:15 +01:00
daschw 9569f34ae0 Update precompile_*.jl file 2021-02-16 21:16:45 +00:00
Daniel Schwabeneder d830f64cbc Merge pull request #3307 from daschw/release
up version
2021-02-16 21:59:02 +01:00
Daniel Schwabeneder dd785c3bd3 up version 2021-02-16 21:57:58 +01:00
Daniel Schwabeneder 663d556a06 Merge pull request #3306 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-16 21:56:36 +01:00
Daniel Schwabeneder e06a51b420 Merge pull request #3299 from fhagemann/master
Implement non-uniform polar heatmaps with the GR backend
2021-02-16 21:54:58 +01:00
daschw da3e0294cd Update precompile_*.jl file 2021-02-16 20:03:15 +00:00
Daniel Schwabeneder 57e98ac12d Merge pull request #3302 from sethaxen/hexbinextrakws
Support extra_kwargs in hexbins for PyPlot
2021-02-16 20:46:24 +01:00
Daniel Schwabeneder 740f231d5f Merge pull request #3300 from isentropic/master
twin, mirror fixes
2021-02-16 20:45:18 +01:00
Daniel Schwabeneder cf96ddcd30 fix typo in polar heatmap test example 2021-02-16 20:41:32 +01:00
Daniel Schwabeneder ec532b2cbb update test example for polar heatmaps 2021-02-16 20:09:13 +01:00
Seth Axen 7989673eb4 Allow mincnt 2021-02-15 14:53:50 -08:00
Seth Axen 897a5eee87 Allow edgecolors to override linewidth 2021-02-15 14:53:40 -08:00
Seth Axen 0665ff907c Use semicolon 2021-02-15 14:53:22 -08:00
Seth Axen 1fc0892551 Allow extrakws for hexbin 2021-02-15 14:53:10 -08:00
zhanibek 8d7375dc4f twin, mirror fixes 2021-02-15 15:21:26 +09:00
Felix Hagemann 2594b577d7 Adjust heatmap_edges for polar heatmaps 2021-02-14 00:02:49 +01:00
Felix Hagemann 9b174084f7 Implement non-uniform polar heatmaps with the GR backend 2021-02-13 17:56:03 +01:00
Daniel Schwabeneder d196952571 Merge pull request #3292 from daschw/gr-surface
remove black lines from GR surface with equal-length x, y, and z input
2021-02-10 21:22:07 +01:00
Daniel Schwabeneder df8fe4d28b remove black lines from GR surface with equal-length x, y, and z input 2021-02-10 18:42:04 +01:00
Daniel Schwabeneder 76cf8f0f3d Merge pull request #3291 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-09 19:55:33 +01:00
daschw 748a913ce2 Update precompile_*.jl file 2021-02-09 18:49:13 +00:00
Daniel Schwabeneder 10f0e83a38 Merge pull request #3290 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-09 19:32:49 +01:00
daschw 9531fdd122 Update precompile_*.jl file 2021-02-09 18:30:24 +00:00
Daniel Schwabeneder 65a84a7215 Merge pull request #3288 from jebej/nospec
add `@nospecialize` annotations
2021-02-09 18:44:07 +01:00
Jeremy Bejanin a6d42d3e0f add @nospecialize annotations 2021-02-09 10:27:17 -05:00
Daniel Schwabeneder 23ae2c5a17 Merge pull request #3283 from daschw/limits
use existing limits for functions
2021-02-09 00:04:46 +01:00
Daniel Schwabeneder 0e03d7ff95 use existing limits for functions 2021-02-08 22:52:40 +01:00
Daniel Schwabeneder f656179d54 Merge pull request #3281 from daschw/release
RecipesPipeline compat
2021-02-08 14:47:30 +01:00
Daniel Schwabeneder 33c734a60b RecipesPipeline compact 2021-02-07 19:58:40 +01:00
Daniel Schwabeneder 781e6d2a16 Merge pull request #3273 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-07 19:40:31 +01:00
Daniel Schwabeneder 4f270fc6dc Merge pull request #3274 from briochemc/patch-1
Fix typos in plot docstring
2021-02-07 19:39:48 +01:00
Daniel Schwabeneder 19bb7340f1 Merge pull request #3277 from jebej/no-early-stringify
don't stringify argument to `warn_on_recipe_aliases!` early
2021-02-07 19:38:05 +01:00
Jeremy Bejanin 4ac81d12df don't stringify argument to warn_on_recipe_aliases! early
needs matching RecipesPipeline changes
2021-02-07 12:07:04 -05:00
Benoit Pasquier 8bd76ee4bd Fix typos in plot docstring 2021-02-06 10:39:15 +11:00
daschw 8ae0d8c808 Update precompile_*.jl file 2021-02-05 16:39:50 +00:00
Daniel Schwabeneder b66e134838 Merge pull request #3272 from daschw/release
bugfix release
2021-02-05 17:23:49 +01:00
Daniel Schwabeneder 6dbf004d5f bugfix release 2021-02-05 17:22:37 +01:00
Daniel Schwabeneder 928c6d5e6c Merge pull request #3253 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-02-05 17:19:13 +01:00
daschw c478c3c9f0 Update precompile_*.jl file 2021-02-01 19:39:11 +00:00
Daniel Schwabeneder a04946e832 Merge pull request #3262 from ma-laforge/idr_ticks
Add support for custom tick labels
2021-02-01 20:24:59 +01:00
Daniel Schwabeneder f9ff2c8962 Merge pull request #3267 from sefffal/master
Fix typo preventing minor ticks from working in 3D plots
2021-02-01 20:21:06 +01:00
Daniel Schwabeneder 8190d1fdfc Merge pull request #3268 from ianshmean/ib/benchmark_tweaks
Benchmark CI tweaks
2021-02-01 19:40:25 +01:00
Ian cc005c6246 limit plot and display tests to one run 2021-01-31 23:09:23 -05:00
William Thompson 97c43eb031 Fix typo to allow minor ticks in 3D plots 2021-01-31 11:47:15 -08:00
MA Laforge 3907ae7f21 Add support for custom tick labels
Also:
 - Correctly register changes to "plot.layout"
 - Fix deprecated use of series[:marker[stroke][color/alpha]].
2021-01-30 13:36:16 -05:00
Josef Heinen c402161845 Update Project.toml 2021-01-27 16:20:25 +01:00
Daniel Schwabeneder 6fb0d69cb3 Merge pull request #3252 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-01-26 21:34:33 +00:00
daschw 1a4bceace7 Update precompile_*.jl file 2021-01-26 21:32:50 +00:00
Daniel Schwabeneder 651548526a Merge pull request #3250 from daschw/release
bugfix release
2021-01-26 21:18:24 +00:00
Daniel Schwabeneder 1f6089d715 Merge pull request #3251 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-01-26 21:18:14 +00:00
daschw 5dde27eb08 Update precompile_*.jl file 2021-01-26 20:35:13 +00:00
Daniel Schwabeneder 52ba52f4e4 Merge pull request #3249 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-01-26 20:17:19 +00:00
daschw 60dbf77a96 Update precompile_*.jl file 2021-01-26 19:57:14 +00:00
Daniel Schwabeneder 880190cea1 Merge pull request #3246 from aminya/Single_CompileBot
CompileBot use default precompile path
2021-01-26 10:30:58 +00:00
Amin Yahyaabadi e591332b71 Let the bot generate the includer file 2021-01-26 03:08:16 -06:00
Amin Yahyaabadi 2b44cb5a35 Delete old precompiles 2021-01-26 02:53:30 -06:00
Amin Yahyaabadi d538c4387f CompileBot use default precompile path 2021-01-26 02:49:10 -06:00
Daniel Schwabeneder 60bc127925 bugfix release 2021-01-25 18:09:27 +01:00
Daniel Schwabeneder e6cc826174 Merge pull request #3229 from jks-liu/pr_requirejs_plotlyjs
Proper Plotly JavaScript setup in IJulia
2021-01-25 17:06:48 +00:00
Daniel Schwabeneder f257c563fb Merge pull request #3243 from daschw/tests
fix tests
2021-01-25 16:39:43 +00:00
Daniel Schwabeneder 8a2a41f75b Merge pull request #3242 from KristofferC/kc/reenable_precompilation
reenable precompiles
2021-01-25 16:39:18 +00:00
Daniel Schwabeneder da1b9adc17 env as string 2021-01-25 16:28:17 +01:00
Daniel Schwabeneder 9d3514224e use GKSwstype environment variable to avoid GKS warnings in tests 2021-01-25 16:16:28 +01:00
Kristoffer Carlsson 142bb8cc56 Update benchmark.yml 2021-01-25 16:11:28 +01:00
Daniel Schwabeneder fb27704d2b fix tests 2021-01-25 16:10:09 +01:00
KristofferC 96ed4b2616 reenable precompiles 2021-01-25 14:49:30 +01:00
Daniel Schwabeneder 6d4353d0b1 Merge pull request #3234 from daschw/spy
fix defaults in spy recipe
2021-01-25 08:28:47 +00:00
Daniel Schwabeneder a2be60b5d1 Merge pull request #3240 from ianshmean/ib/ci_benchmark_2
Add basic CI Benchmarking via BenchmarkCI - Pt. 2
2021-01-25 08:27:56 +00:00
Ian d92990a5f0 tweaks to benchmarks order-insensitive 2021-01-24 16:49:09 -05:00
Daniel Schwabeneder 99ca1074de Merge pull request #3239 from ianshmean/ib/ci_benchmark
Add basic CI Benchmarking via BenchmarkCI
2021-01-24 21:02:02 +00:00
Ian 8a908c0de8 do load test in separate session 2021-01-24 15:54:18 -05:00
Ian 3c9580fb2f fixes 2021-01-24 15:45:49 -05:00
Ian 309f2db3b1 run entire load_plot_display in separate julia instance 2021-01-24 15:21:23 -05:00
Ian 0b8755db4b add benchmark gitignores 2021-01-24 14:48:37 -05:00
Ian ac2fbadc07 add missing GKS_ENCODING env var 2021-01-24 14:31:27 -05:00
Ian 535d95334c fix to use Ubuntu TESTCMD 2021-01-24 14:24:11 -05:00
Ian 6332aecc60 Update Project.toml 2021-01-24 14:18:18 -05:00
Ian 8efe35f5f8 add benchmark/Project.toml 2021-01-24 14:14:04 -05:00
Ian 493ab0c6b4 add basic CI Benchmarking 2021-01-24 14:01:04 -05:00
Daniel Schwabeneder fa8d437836 widen axis limits 2021-01-22 18:16:13 +01:00
Daniel Schwabeneder e95ddc3ef8 fix defaults in spy recipe 2021-01-22 18:05:40 +01:00
Jks Liu 50a6dd9fb3 let plotly config and use in same cell in case of config cell re-run or is deleted 2021-01-20 22:51:17 +08:00
Jks Liu 509a8cdc7e Config plotly.js during init
plotly.js will be loaded only once, only when first time used

plots show correctly when page re-load or re-open
2021-01-18 22:59:16 +08:00
Jks Liu 672b3a6038 Merge branch 'pr_fix_plotly_file_name' into pr_requirejs_plotlyjs
Const variable for filename of plotly.js
2021-01-18 21:03:09 +08:00
Jks Liu 4bcafe3f51 const variable for plotly JavaScript file name 2021-01-12 22:09:48 +08:00
Daniel Schwabeneder 49eba0bf2f Merge pull request #3218 from daschw/gr_guides
Increase the margins between axes and guides on GR
2021-01-12 09:49:42 +01:00
Jks Liu d0e01a8d88 Correct version string of plotly cache file name 2021-01-11 22:48:04 +08:00
Daniel Schwabeneder eb1c126dbc remove unnecessary line 2021-01-09 21:51:30 +01:00
Daniel Schwabeneder 6c8fb87635 increase gr guide margins on 3d plots 2021-01-09 21:50:54 +01:00
Daniel Schwabeneder 7b8609ea1a Merge pull request #3189 from isentropic/pyplot
various pyplot fixes
2021-01-09 19:17:42 +01:00
Daniel Schwabeneder f478a649a0 Merge pull request #3213 from daschw/release
release 1.10.1
2021-01-07 00:25:14 +01:00
Daniel Schwabeneder 85ca402790 release 1.10.1 2021-01-06 23:02:48 +01:00
Lia Siegelman 2ebc97d92a fix for [BUG] #3135 mp4/mov animations can't be opened with QuickTime or Safari (#3209)
* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

* try a fix for codec animate function

Co-authored-by: Lia Siegelman <lsiegelman@ucsd.edu>
2021-01-05 21:40:21 +01:00
Daniel Schwabeneder 2bda216d8a Merge pull request #3207 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-01-04 17:57:26 +01:00
daschw ca7f69eaa3 Update precompile_*.jl file 2021-01-01 22:08:33 +00:00
Daniel Schwabeneder fcbfda10fb Merge pull request #3206 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2021-01-01 22:54:37 +01:00
Daniel Schwabeneder 51df476015 Merge pull request #3205 from daschw/pgfx-legendfont
respect legendfontcolor in pgfplotsx
2021-01-01 22:53:12 +01:00
daschw c08555a638 Update precompile_*.jl file 2020-12-31 08:35:42 +00:00
Daniel Schwabeneder 93825e2c86 Merge pull request #3201 from JuliaPlots/compathelper/new_version/2020-12-26-00-35-02-072-2106613790
CompatHelper: bump compat for "Reexport" to "1.0"
2020-12-31 09:21:30 +01:00
Daniel Schwabeneder c64bbf826c Merge pull request #3191 from daschw/datetimelims
allow more types in `lims!` functions
2020-12-31 09:20:52 +01:00
Daniel Schwabeneder 91608a6eab respect legendfontcolor in pgfplotsx 2020-12-31 09:17:39 +01:00
Simon Christ 8cc6d9d487 1.10.0 2020-12-29 22:03:03 +01:00
Daniel Schwabeneder 17f3faf672 simplify signature 2020-12-29 11:36:59 +01:00
github-actions[bot] 2e25d86daa CompatHelper: bump compat for "Reexport" to "1.0" 2020-12-26 00:35:07 +00:00
Rik Huijzer 0f349be952 Avoid comparing findfirst to nothing (#3200) 2020-12-23 23:35:11 +01:00
Daniel Schwabeneder 8f0d4c4145 Merge pull request #3184 from ThatcherC/component-tests
WIP: More component tests and some shorthands tests
2020-12-17 19:01:58 +01:00
Daniel Schwabeneder d61bbcce56 allow more types in lims! functions 2020-12-17 18:20:56 +01:00
Thatcher Chamberlin 2b376a0e4a Merge branch 'master' of https://github.com/JuliaPlots/Plots.jl into component-tests 2020-12-12 13:49:30 -05:00
zhanibek 62af64f08a various pyplot fixes 2020-12-10 18:48:17 +09:00
Daniel Schwabeneder 882bb1b517 Merge pull request #3178 from jks-liu/pr_extra_mime_only_html
Set extra mime only when HTML format
2020-12-09 13:19:51 +01:00
Daniel Schwabeneder a403f9e44b Merge pull request #3180 from ThatcherC/date-xlims
Fix #1531, Let xlims be set to Dates or DateTimes
2020-12-09 13:18:00 +01:00
jaakkor2 0c4623873c Handle basex, basey, linthreshx, linthreshy deprecated in matplotlib 3.3 (#3183)
See https://matplotlib.org/3.3.0/api/api_changes.html
2020-12-08 17:50:30 +09:00
Thatcher Chamberlin d1671ea6f0 recheck coverage 2020-12-07 22:01:29 -05:00
Thatcher Chamberlin f905d6b697 Fixed rotate test and added series_annotation tests 2020-12-07 21:23:26 -05:00
Thatcher Chamberlin bc144b64c8 Added Shape rotation tests 2020-12-07 20:52:46 -05:00
Thatcher Chamberlin 10c94c739d Merge branch 'component-tests' of https://github.com/ThatcherC/Plots.jl into component-tests 2020-12-07 20:01:50 -05:00
Thatcher Chamberlin 38ada46a43 Added an auto-label test 2020-12-07 20:01:09 -05:00
Thatcher Chamberlin 0e73bcdc4e Added some tests for shorthands.jl 2020-12-07 20:00:55 -05:00
Thatcher Chamberlin e57a9349f6 Added font scaling tests 2020-12-07 11:21:51 -05:00
Thatcher Chamberlin 120d63f53f Merge branch 'date-xlims' of https://github.com/ThatcherC/Plots.jl into date-xlims 2020-12-07 10:53:55 -05:00
Thatcher Chamberlin b885687187 Now closing plots after display calls 2020-12-07 10:52:48 -05:00
Thatcher Chamberlin 80285061c9 Removed CI env check in Dates tests 2020-12-07 10:52:48 -05:00
Thatcher Chamberlin fa48e5c490 Moved Dates tests to be before backend tests 2020-12-07 10:52:48 -05:00
Thatcher Chamberlin 1fcdac4c9e Added second condition to skip display checks 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin 352df39026 Added checks around display checks to see if we're in CI 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin 9ab4c31d5c Added comments about possible alternate solutions 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin e9e6750481 Removed a println 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin bb3e053eb3 Added fix for case where lims are Date/DateTime s 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin 0bc41f22bb Added display checks to Date/DateTime tests to ensure they are able to be displayed 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin de03c3bca8 Added tests for plots where xlims are Dates and DateTimes 2020-12-07 10:51:49 -05:00
Thatcher Chamberlin f2b8e8512e Added font scaling tests 2020-12-07 10:10:43 -05:00
Daniel Schwabeneder 4c95ca5089 Merge pull request #3182 from ThatcherC/component-tests
WIP: Units Tests and Code Coverage for src/components.jl
2020-12-07 16:03:47 +01:00
Thatcher Chamberlin 9ba633bb59 retrigger checks 2020-12-07 08:26:48 -05:00
Thatcher Chamberlin 0b932ecb17 Added unit tests for src/components.jl 2020-12-06 22:39:56 -05:00
Thatcher Chamberlin f6627f3c5c Now closing plots after display calls 2020-12-06 18:54:53 -05:00
Thatcher Chamberlin 06a823a3be Removed CI env check in Dates tests 2020-12-06 15:21:15 -05:00
Thatcher Chamberlin 8c49652add Moved Dates tests to be before backend tests 2020-12-06 15:20:11 -05:00
Thatcher Chamberlin 0849471bf6 Added second condition to skip display checks 2020-12-06 14:50:16 -05:00
Thatcher Chamberlin e9a4231a5f Added checks around display checks to see if we're in CI 2020-12-06 14:30:11 -05:00
Thatcher Chamberlin c9b1de33f6 Added comments about possible alternate solutions 2020-12-06 13:35:25 -05:00
Thatcher Chamberlin 2013215ef2 Removed a println 2020-12-06 13:35:00 -05:00
Thatcher Chamberlin 8a3ee7bb75 Added fix for case where lims are Date/DateTime s 2020-12-06 13:30:14 -05:00
Thatcher Chamberlin eea73202e2 Added display checks to Date/DateTime tests to ensure they are able to be displayed 2020-12-06 13:27:30 -05:00
Thatcher Chamberlin cd450f49d4 Added tests for plots where xlims are Dates and DateTimes 2020-12-06 13:26:26 -05:00
Jks Liu 4b0d69b6a4 Set extra mine only when HTML format
Extra mine is not used by other format
2020-12-04 23:41:36 +08:00
wg030 02008284aa Update hdf5.jl (#3175) 2020-12-01 23:50:59 +01:00
Daniel Schwabeneder c857d59400 Merge pull request #3169 from JuliaPlots/Test_SnoopCompile_AutoPR_refs/heads/master
[AUTO] Update precompiles
2020-11-27 18:30:58 +01:00
Daniel Schwabeneder b5c8474e3f Merge pull request #3167 from jmert/offsetarrays_sticks
Support plotting `OffsetArray`s for `:sticks` series type
2020-11-27 18:27:06 +01:00
BeastyBlacksmith aafb34f5f5 Update precompile_*.jl file 2020-11-27 12:26:52 +00:00
Amin Yahyaabadi 8451b8da0f Fix CI + Use the triggering branch name in the SnoopCompile branch (#3082)
* Use the triggering branch name in the SnoopCompile branch

* fix set-env deprecation
2020-11-27 13:12:30 +01:00
Justin Willmert 94ca183a5b Support plotting OffsetArrays for :sticks series type 2020-11-26 12:54:37 -06:00
Simon Christ 2774b155b4 1.9.1 [skip ci] 2020-11-16 10:04:47 +01:00
willtebbutt 99dff99504 pgfplotsx, no font size (#3154)
Co-authored-by: Will Tebbutt <will.tebbutt@invenialabs.co.uk>
2020-11-16 10:03:28 +01:00
Simon Christ 10e83b63b6 fix grid for 3d quivers (#3150) 2020-11-13 22:00:32 +01:00
Simon Christ 2ef9bb1c0b 1.9.0 [skip ci] 2020-11-13 13:05:27 +01:00
Simon Christ a955ded5c8 add 3dquiver to pgfplotsx (#3146)
* add 3dquiver to pgfplotsx

* fix 3d quiver

* remove skip from examples
2020-11-13 11:54:46 +01:00
Daniel Schwabeneder 5861b1f11f Merge pull request #3134 from kellertuer/quiver3
Proposes a 3D quiver
2020-11-13 11:38:42 +01:00
Ronny Bergmann 7e8eb5af31 Merge branch 'quiver3' of github.com:kellertuer/Plots.jl into quiver3 2020-11-13 09:30:56 +01:00
Ronny Bergmann abebbdd54a fixes two checks for 3D to work properly. 2020-11-13 09:29:43 +01:00
Daniel Schwabeneder d1aa2097be Merge branch 'master' into quiver3 2020-11-13 09:26:26 +01:00
Daniel Schwabeneder 9c0b2ea090 add 3d quiver test example 2020-11-13 08:38:52 +01:00
daschw 60a7e41442 Update precompile_*.jl file 2020-11-13 08:38:52 +01:00
daschw a38e4734ac Update precompile_*.jl file 2020-11-13 08:38:52 +01:00
Daniel Schwabeneder 40e13793e8 add new test example 2020-11-13 08:38:52 +01:00
Daniel Schwabeneder 5d26068eae fix limits in GR image 2020-11-13 08:38:52 +01:00
Simon Christ ac8e1d7f21 add linestyle to contour plots (#3139)
* add linestyle to contour plots

* Update precompile_*.jl file (#3140)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-11-13 08:38:52 +01:00
Josef Heinen f3b6221daa Update Project.toml
Bump version
2020-11-13 08:38:52 +01:00
Josef Heinen 501f33f5c1 Fix SVG scaling problem 2020-11-13 08:38:52 +01:00
Daniel Schwabeneder 967bc89a6d Merge pull request #3143 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-11-12 23:38:33 +01:00
daschw 3b367f8759 Update precompile_*.jl file 2020-11-12 14:40:16 +00:00
Daniel Schwabeneder c43c19a24f Merge pull request #3131 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-11-12 15:27:11 +01:00
daschw 445f27a525 Update precompile_*.jl file 2020-11-12 14:24:11 +00:00
Daniel Schwabeneder e7212961dd Merge pull request #3142 from daschw/gr-image
Fix plotting images with custom axes in GR
2020-11-12 15:08:22 +01:00
Daniel Schwabeneder 1402ff5ea0 add new test example 2020-11-12 14:34:18 +01:00
Simon Christ 693c014064 add linestyle to contour plots (#3139)
* add linestyle to contour plots

* Update precompile_*.jl file (#3140)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-11-12 13:53:42 +01:00
Daniel Schwabeneder 32e681d158 fix limits in GR image 2020-11-12 12:48:49 +01:00
Josef Heinen d3315a5dae Update Project.toml
Bump version
2020-11-10 18:37:41 +01:00
Josef Heinen 591d485e09 Fix SVG scaling problem 2020-11-10 18:34:14 +01:00
Ronny Bergmann d3f2a55b59 adds 3d quiver if z component is present. 2020-11-10 11:24:24 +01:00
Daniel Schwabeneder 092c7376c8 Merge pull request #3129 from daschw/tagbot
Tagbot & minor release
2020-11-09 23:35:14 +01:00
Daniel Schwabeneder dafd0a620f Merge pull request #3130 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-11-09 23:21:04 +01:00
daschw e9970637e0 Update precompile_*.jl file 2020-11-09 22:19:00 +00:00
Daniel Schwabeneder 405daa3cfd minor version bump 2020-11-09 23:13:22 +01:00
Daniel Schwabeneder d77899c5a1 update tagbot action 2020-11-09 23:11:35 +01:00
Daniel Schwabeneder 711754edbc Merge pull request #3128 from daschw/pgf-nothing
fix 'no method matching any(::Function, ::Nothing)' error in pgfplotsx
2020-11-09 23:07:21 +01:00
Daniel Schwabeneder 3725a8d387 Merge pull request #3115 from daschw/inference
`@nospecialize`
2020-11-09 23:05:03 +01:00
Daniel Schwabeneder 93998fee00 fix 'no method matching any(::Function, ::Nothing)' error in pgfplotsx 2020-11-09 18:21:00 +01:00
Josef Heinen 9ee2e65225 Update Project.toml
add GR 0.53.0
2020-11-06 16:39:40 +01:00
Daniel Schwabeneder e5d9b8ba48 Merge pull request #3113 from daschw/plotly-legend
Switch to plotly-latest
2020-10-31 23:25:52 +01:00
Daniel Schwabeneder d9c2b7bf37 change to plotly v1.57.1 2020-10-31 22:49:37 +01:00
Daniel Schwabeneder dee3ed263c bump RecipesPipeline compat 2020-10-31 21:26:00 +01:00
Daniel Schwabeneder dc7bdc6f69 add some @nospecialize 2020-10-31 21:07:31 +01:00
Daniel Schwabeneder e21f40bd9a move warn_on_recipe_aliases to RecipesPipeline 2020-10-31 18:51:33 +01:00
Daniel Schwabeneder fe2bae37f3 Merge pull request #3112 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-10-31 13:39:51 +01:00
Daniel Schwabeneder e7c7daff0c use plotly-latest 2020-10-31 13:37:11 +01:00
daschw 6df6b40d3d Update precompile_*.jl file 2020-10-31 12:36:21 +00:00
Daniel Schwabeneder 6286c67c01 add legendtitle to plotly 2020-10-31 13:27:19 +01:00
Daniel Schwabeneder d89b93fe8f Merge pull request #3109 from daschw/compilebot
Simplify CompileBot
2020-10-31 13:24:00 +01:00
Daniel Schwabeneder e5959d97e4 Merge pull request #46 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-10-28 23:04:40 +01:00
daschw 7a809697c4 Update precompile_*.jl file 2020-10-28 22:02:41 +00:00
Daniel Schwabeneder 2a4f00b80a Merge pull request #3105 from daschw/discrete-ticks
more regular automatic categorical ticks
2020-10-28 22:59:22 +01:00
Daniel Schwabeneder a18809b922 Merge pull request #45 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-10-28 22:48:52 +01:00
daschw dcae18cde2 Update precompile_*.jl file 2020-10-28 21:47:21 +00:00
Daniel Schwabeneder 059fbdfb6d else_os and else_version 2020-10-28 22:31:22 +01:00
Daniel Schwabeneder 978ffb799b use only yml_path in BotConfig 2020-10-28 22:14:17 +01:00
Daniel Schwabeneder ec97ec3994 only run compilebot on linux with julia 1.5 2020-10-28 22:09:05 +01:00
Daniel Schwabeneder 6cbdd696cd add unit tests 2020-10-28 21:59:05 +01:00
Daniel Schwabeneder e15da664b0 Merge pull request #3104 from daschw/geometrybasics
remove dependency on discontinued GeometryTypes
2020-10-28 09:52:25 +01:00
Daniel Schwabeneder 16b9fc08ac more regular automatic categorical ticks 2020-10-27 20:16:45 +01:00
Daniel Schwabeneder 5660ea9501 remove dependency on discontinued GeometryTypes 2020-10-27 11:19:50 +01:00
Daniel Schwabeneder 8ce603d3eb Merge pull request #3097 from daschw/gr-clims
ensure non-identical clims for gr
2020-10-24 21:13:25 +02:00
Daniel Schwabeneder 54fdd4e177 update spy recipe 2020-10-24 00:02:47 +02:00
Daniel Schwabeneder 9b24b38767 Merge pull request #3092 from fhagemann/pyplot
fix missing z for 3d markerplots in PyPlot
2020-10-23 22:22:12 +02:00
Daniel Schwabeneder 00351ebcf1 hopefully more type-stable in general 2020-10-23 22:16:19 +02:00
Daniel Schwabeneder d3343c43a1 ensure non-identical clims for gr 2020-10-23 22:12:10 +02:00
Daniel Schwabeneder c0b375a153 Merge pull request #3096 from daschw/gr-fonts
add more fonts for gr backend
2020-10-23 21:33:33 +02:00
Daniel Schwabeneder f5cb54f223 add more fonts for gr backend 2020-10-23 20:56:56 +02:00
Simon Christ e95b2a2a8f 1.7.3 2020-10-23 09:29:04 +02:00
Fredrik Bagge Carlson 8ee5ee062e Safeguard against nothing arg to isfile in standalone_html_window (#3094)
Fixes #3093
2020-10-23 09:27:22 +02:00
Simon Christ d34b33b4ae 1.7.2 2020-10-23 00:06:07 +02:00
Simon Christ fdbeace33a fix jupyter (#3090)
* fix jupyter

* Update runtests.jl

* Update runtests.jl
2020-10-23 00:05:40 +02:00
Felix Hagemann 26f877ec47 fix missing z for 3d markerplots in PyPlot 2020-10-22 22:27:23 +02:00
Daniel Schwabeneder 8dc3d9805a Merge pull request #3088 from daschw/pyplot-polar
fix pyplot polar heatmap size
2020-10-22 08:55:15 +02:00
Daniel Schwabeneder 08932633d0 fix pyplot polar heatmap size 2020-10-21 23:20:34 +02:00
Simon Christ 959fee92a6 1.7.1 2020-10-21 13:19:37 +02:00
Benjamin Lungwitz 70c4954e16 fixed concatinations of string and nothing (#3087) 2020-10-21 13:18:51 +02:00
Simon Christ dffb699fca add compat for Scratch [skip ci] 2020-10-21 09:38:51 +02:00
Simon Christ 08f993a67f 1.7.0 [skip ci] 2020-10-20 21:28:25 +02:00
github-actions[bot] c4ee343ef2 Update precompile_*.jl file (#3041)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-10-20 21:27:02 +02:00
Simon Christ 17acb45653 Replace artifact by scratchspace (#3067)
* replace build.jl by Artifacts.toml

* check ENV

* fix it

* fix condition

* restore ===

* replace Artifact by Scratchspace

* correct Project.toml

* update CI

* Update ci.yml

* Update SnoopCompile.yml

* add tests

* improve tests

* fix
2020-10-20 17:54:08 +02:00
Simon Christ 842b8fa70d add add_attributes macro (#3069)
* add add_attributes macro

* add underscore

* add non_underscore and plural aliases
2020-10-20 17:53:44 +02:00
Simon Christ e236005d72 add mesh3d support (#3076)
* add mesh3d support

* correct example string
2020-10-17 21:40:11 +02:00
Daniel Schwabeneder c7955420e3 Merge pull request #3074 from daschw/gr-guides
fix guide position in 3d plots in GR
2020-10-17 09:08:58 +02:00
Daniel Schwabeneder c9b186c6ac Merge pull request #3075 from aminya/CompileBot
use CompileBot 1
2020-10-17 08:49:13 +02:00
Daniel Schwabeneder 072b6f42f6 add test example 2020-10-17 08:35:49 +02:00
aminya 86bec68b42 use CompileBot 1 2020-10-16 19:34:40 -05:00
Daniel Schwabeneder 2a09bd8266 fix z axis rotation 2020-10-16 18:35:47 +02:00
Daniel Schwabeneder 2be5756cb8 fix guide position in 3d plots in GR 2020-10-16 18:19:31 +02:00
Simon Christ 015b48eede fix attributes passing (#3073) 2020-10-16 16:58:35 +02:00
Daniel Schwabeneder 7fe6a69a21 Merge pull request #3066 from daschw/gr-polar
Fix polar heatmap on GR
2020-10-15 10:04:59 +02:00
Daniel Schwabeneder 60dcfa9a90 up version 2020-10-15 09:32:20 +02:00
Daniel Schwabeneder 3d2f7571a0 add polar heatmap example 2020-10-15 09:06:41 +02:00
Daniel Schwabeneder 86c26085b3 fix polar heatmap on GR 2020-10-15 09:01:12 +02:00
Daniel Schwabeneder 2d5ad2828b Merge pull request #3064 from daschw/pyplot-fixes
Pyplot fixes
2020-10-14 21:33:13 +02:00
Daniel Schwabeneder bae04d05a3 up version 2020-10-14 21:31:48 +02:00
Daniel Schwabeneder bd287f4656 fix pyplot image 2020-10-14 21:30:04 +02:00
Jinay Jain 638fe6d245 Fix typo in grid layout documentation comment (#3061) 2020-10-14 14:52:07 +02:00
Daniel Schwabeneder 3f05dc3570 Merge pull request #3060 from daschw/py-surface
fix pyplot
2020-10-14 07:43:10 +02:00
Daniel Schwabeneder 44150ccbe4 fix 3d plotting in pyplot 2020-10-13 23:47:45 +02:00
Daniel Schwabeneder c15483d593 Merge pull request #3056 from daschw/transpose_z
Remove `transpose_z` and simplify integration of Surfaces in backends
2020-10-12 22:21:10 +02:00
Simon Christ 363f401474 Fix loading of themes (#3057)
* Fix loading of themes

Fix #3053 

Needs test

* Create test_defaults.jl

* Update runtests.jl

* Update test_defaults.jl

* Update test_defaults.jl

* Update test_defaults.jl

* Update test_defaults.jl

* Update test_defaults.jl
2020-10-12 17:25:40 +02:00
Daniel Schwabeneder a532c97ce2 remove transpose_z from precompiles 2020-10-12 12:08:15 +02:00
Daniel Schwabeneder df07dc9377 actually remove transpose_z 2020-10-12 01:16:59 +02:00
Daniel Schwabeneder 9cf9edffe0 remove transpose_z 2020-10-12 01:10:56 +02:00
Daniel Schwabeneder 2ef13c19ea Merge pull request #3047 from daschw:pyplot-3d
Fix 3d plotting with pyplot
2020-10-07 23:20:28 +02:00
Daniel Schwabeneder 103f0b28ac up version 2020-10-07 23:12:51 +02:00
Daniel Schwabeneder f157c8dc3f fix 3d plotting with pyplot 2020-10-07 23:11:51 +02:00
Daniel Schwabeneder ade0a2dfdc Merge pull request #3027 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-10-06 13:00:10 +02:00
Daniel Schwabeneder 71189e113e Merge pull request #3040 from daschw/release
minor release [skip-ci]
2020-10-06 12:59:31 +02:00
Daniel Schwabeneder 9fe1f55410 minor release [skip-ci] 2020-10-06 12:57:18 +02:00
daschw 827dba1991 Update precompile_*.jl file 2020-10-06 09:23:24 +00:00
Daniel Schwabeneder 6ac7b41eb0 Merge pull request #3039 from daschw/plotly-marker
fix plotly not showing the second marker
2020-10-06 10:52:20 +02:00
Daniel Schwabeneder 4c7156ca5e fix plotly not showing the second marker 2020-10-06 10:28:08 +02:00
Daniel Schwabeneder 9dfc33dc12 Merge pull request #3037 from JuliaPlots/compathelper/new_version/2020-10-06-00-29-10-104-1364269850
CompatHelper: add new compat entry for "Latexify" at version "0.14"
2020-10-06 09:51:44 +02:00
github-actions[bot] 317069e2a8 CompatHelper: add new compat entry for "Latexify" at version "0.14" 2020-10-06 00:29:15 +00:00
Daniel Schwabeneder cb54dc071f Merge pull request #3034 from isentropic/pyplot-deprecations
matplotlib warnings
2020-10-06 00:35:18 +02:00
Daniel Schwabeneder b413f0d44e Merge pull request #3025 from Moelf/lims_warning
warn against `lims` being AbstractRange
2020-10-06 00:34:48 +02:00
Daniel Schwabeneder 1784d6179a Merge pull request #3033 from daschw/minor-fixes
Minor clean-up
2020-10-06 00:34:23 +02:00
Daniel Schwabeneder 954f002dfe Merge pull request #3020 from JuliaPlots/bbs/latexify
latexify unicode
2020-10-06 00:33:55 +02:00
Moelf 083fe89905 alternative approach 2020-10-05 00:54:48 -04:00
zhanibek 5906d1c8a5 matplotlib warnings 2020-10-05 12:07:29 +09:00
Daniel Schwabeneder bd46b51b94 remove some more type piracies and use === when comparing to nothing 2020-10-04 18:10:52 +02:00
Daniel Schwabeneder 63e73bc9f0 Merge pull request #3032 from daschw/gr-heatmap
fix heatmap with x and y specifying edges in gr
2020-10-04 17:06:50 +02:00
Daniel Schwabeneder 915eafcea0 move operation definitions for pct to PlotMeasures module 2020-10-04 16:10:51 +02:00
Daniel Schwabeneder 63d9363505 Revert "move operation definitions for pct to PlotMeasures module"
This reverts commit 8e85bdb32f20e1c7e0d508e04e9442caa92bfc8a.
2020-10-04 16:10:51 +02:00
Daniel Schwabeneder 721b4b1312 move operation definitions for pct to PlotMeasures module 2020-10-04 16:10:51 +02:00
Daniel Schwabeneder f96e239bc0 remove Measures type piracy 2020-10-04 16:10:51 +02:00
Daniel Schwabeneder a13e137770 !== nothing 2020-10-04 16:10:41 +02:00
Daniel Schwabeneder 6a1af1c888 add explanation 2020-10-04 15:02:38 +02:00
Daniel Schwabeneder 729219f5a0 fix heatmap with x and y specifying edges in gr 2020-10-04 14:56:41 +02:00
Moelf bdcc8cdb8d Alternative approach 2020-10-03 15:33:19 -04:00
Daniel Schwabeneder 23b852da8f Merge pull request #3030 from daschw/plotly-3d
fix multiple subplots with 3d in plotly
2020-10-03 13:40:45 +02:00
Daniel Schwabeneder 8255096bce fix multiple subplots with 3d in plotly 2020-10-03 12:51:34 +02:00
github-actions[bot] abde25efe0 Update precompile_*.jl file (#3026)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-10-02 23:26:20 +02:00
Simon Christ efb5816bc1 replace build.jl by Artifacts.toml (#3023)
* replace build.jl by Artifacts.toml

* check ENV

* fix it
2020-10-02 22:10:53 +02:00
Moelf 994b543add add slice_arg for AbstractRange 2020-10-02 15:08:59 -04:00
Simon Christ bb11c62413 latexify unicode 2020-10-02 10:27:20 +02:00
Simon Christ b8222b46fe 1.6.8 [skip ci] 2020-10-01 22:10:52 +02:00
Amin Yahyaabadi 1f6244195a Rename SnoopCompileBot to CompileBot (#3018) 2020-10-01 21:16:42 +02:00
BerndR f4fe4b8a05 Changed labeling-behaviour of :sticks (#3017)
* Changed labeling-behaviour of :sticks

* Further adaptions to make sticks-label behavior as expected

* Fixed for linecolor-attribute

* Deleted some debugging println()

* Changed primary-ness in sticks+marker

Co-authored-by: bernd_uni <bernd.riederer@student.tugraz.at>
2020-10-01 20:55:12 +02:00
Daniel Schwabeneder 514a7c4fff Merge pull request #3016 from bernd1995/bernd1995-plotly-marker_z
Fixed plotly_colorbar_hack() to avoid additional marker
2020-09-30 12:04:01 +02:00
bernd_uni 75e65bff8c Fixed plotly_colorbar_hack() to avoid additional marker 2020-09-30 11:19:49 +02:00
Daniel Schwabeneder f03e8bbc83 Merge pull request #3015 from alusiani/fixhspan
fix horizontal range of hspan()
2020-09-29 14:15:02 +02:00
isentropic fc54177029 text.usetex option hack pyplot (#2893)
* text.usetex option hack

* pyplot ticklabel fixes
2020-09-29 14:26:58 +09:00
Alberto Lusiani 5a932146cf fix horizontal range of hspan() 2020-09-28 23:37:38 +02:00
Simon Christ ba09334845 1.6.7 [skip ci] 2020-09-28 14:12:56 +02:00
Simon Christ 5ccf1e965e fix NaNs in heatmaps (#3007)
* fix NaNHeatmaps

* fix histogram2D

* remove show

* Update precompile_*.jl file (#3008)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

* add a dimensionalty check

* Update precompile_*.jl file (#3010)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-27 21:22:43 +02:00
Daniel Schwabeneder e932c76d93 Merge pull request #2962 from Moelf/master
fix error bars in log scale
2020-09-25 09:47:27 +02:00
Daniel Schwabeneder 078a675d1a Merge pull request #3002 from bernd1995/bernd1995-sticks3d
Added support for 3d-plots of seriestype sticks
2020-09-24 08:59:36 +02:00
bernd_uni 408aad6e35 Added support for 3d-plots of seriestype sticks 2020-09-23 15:39:03 +02:00
Simon Christ f4c15b4b5b 1.6.6 [skip ci] 2020-09-22 00:46:26 +02:00
Daniel Schwabeneder d0c709a014 Merge pull request #2999 from daschw/plotly-offset
fix ribbon/fillrange with OffsetArrays in plotly
2020-09-21 23:13:35 +02:00
Daniel Schwabeneder bf8b828957 Merge pull request #2998 from daschw/gr-ticks
GR: handle tick labels for `ticks == nothing`
2020-09-21 22:19:20 +02:00
Daniel Schwabeneder 3964cc19a6 fix ribbon/fillrange with OffsetArrays in plotly 2020-09-21 22:15:47 +02:00
Daniel Schwabeneder 3e14a0db95 gr: handle tick labels for ticks == nothing 2020-09-21 21:37:07 +02:00
Daniel Schwabeneder 11f3715453 Merge pull request #2997 from daschw/plotlybase
Replace ORCA with Plotlybase
2020-09-21 21:35:07 +02:00
Daniel Schwabeneder e7ab664120 add src/backends/plotlybase.jl 2020-09-21 19:58:52 +02:00
Daniel Schwabeneder 2aa3e1a5fc replace ORCA with PlotlyBase 2020-09-21 19:57:04 +02:00
Daniel Schwabeneder f58100b400 Merge pull request #2995 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-21 13:25:30 +03:00
daschw b918c509ac Update precompile_*.jl file 2020-09-21 09:05:51 +00:00
Daniel Schwabeneder 08a4b34c22 Merge pull request #2994 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-21 11:40:20 +03:00
daschw becd95b9b5 Update precompile_*.jl file 2020-09-20 21:51:32 +00:00
Daniel Schwabeneder f0612ad1b3 Merge pull request #2993 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-20 23:49:43 +03:00
BeastyBlacksmith 46fbff72db Update precompile_*.jl file 2020-09-20 19:24:38 +00:00
Simon Christ 0536be3bf7 add arrow support (#2989)
* add arrow support

* correctly handle arrow.side = :both
2020-09-20 20:59:06 +02:00
Daniel Schwabeneder 86561b0af0 Merge pull request #2991 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-20 21:50:04 +03:00
daschw 747181c370 Update precompile_*.jl file 2020-09-19 08:49:29 +00:00
Daniel Schwabeneder c3f8710175 Merge pull request #2987 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-19 11:25:24 +03:00
daschw 4cfcef1066 Update precompile_*.jl file 2020-09-19 08:20:09 +00:00
Daniel Schwabeneder ab0cfd09a4 Merge pull request #2960 from daschw/gr-cleanup
reorganize GR backend code
2020-09-19 10:55:04 +03:00
Moelf cef5b0293e fix error bars in log scale 2020-09-18 09:27:58 -04:00
Daniel Schwabeneder 363c842ab4 redo #2988 2020-09-18 10:23:12 +02:00
Simon Christ 33832fef70 1.6.5 [skip ci] 2020-09-18 10:07:15 +02:00
Daniel Schwabeneder 51527705de extract gr_draw_<seriestype> functions 2020-09-18 09:43:53 +02:00
Daniel Schwabeneder 44bd1812e0 don't run optimize_ticks multiple times 2020-09-18 09:43:53 +02:00
Daniel Schwabeneder 1e536dda4b reorganize axes drawing 2020-09-18 09:43:21 +02:00
Daniel Schwabeneder 6a03da5837 extract legend functions and viewport updating from gr_display 2020-09-18 09:38:29 +02:00
Daniel Schwabeneder 9df962fcce clean up gr_set_tickfont 2020-09-18 09:38:28 +02:00
Jerry Ling b46e460d12 fine tune distance between axis and ticks text (#2988) 2020-09-18 09:26:04 +02:00
github-actions[bot] e1755dcee7 [AUTO] Update precompiles (#2984)
* add tests

* fix vline, vspan with dates

* add limit tests for vline and vspan

* fix 1.3 tests

* Update precompile_*.jl file

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-17 17:50:25 +02:00
Simon Christ 87c44e231b fix vline & vspan (#2985)
* add tests

* fix vline, vspan with dates

* add limit tests for vline and vspan

* fix 1.3 tests
2020-09-17 17:34:16 +02:00
github-actions[bot] c81fe1ea76 Update precompile_*.jl file (#2981)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-16 15:56:37 +02:00
Simon Christ 49555ecc2f Letterswap (#2979)
* Fix vline, histogram, barhist, stephist axis letter

* Fix vspan + move vline y values to shorthands

* Fix histograms with @one_arg_shorthands + fix vspan

* Add tests for axis letter

* move swap to _plot

* use RecipesBase approach

* restore formatters

* fix and format pgfx-tests

* update compat

* Update precompile_*.jl file (#2982)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

Co-authored-by: Benoit Pasquier <briochemc@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-16 14:37:26 +02:00
github-actions[bot] 0425f656ae Update precompile_*.jl file (#2978)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-16 10:03:55 +02:00
Simon Christ 8fabc5f861 delete precompiles 2020-09-16 09:33:19 +02:00
github-actions[bot] 0deb8f6469 Update precompile_*.jl file (#2977)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 23:37:59 +02:00
github-actions[bot] df12ddb629 Update precompile_*.jl file (#2976)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 23:04:42 +02:00
github-actions[bot] 33f2f75b00 Update precompile_*.jl file (#2975)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 22:31:12 +02:00
github-actions[bot] 12e0616712 Update precompile_*.jl file (#2974)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 22:00:46 +02:00
github-actions[bot] a9eeb451fc Update precompile_*.jl file (#2973)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 21:24:56 +02:00
github-actions[bot] b854f1cc16 Update precompile_*.jl file (#2972)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 20:13:28 +02:00
github-actions[bot] 31fb9f09b4 [AUTO] Update precompiles (#2950)
* fix segments

* Update precompile_*.jl file

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-15 18:15:56 +02:00
Simon Christ 3ba712dde0 pgfx fix segments (#2970) 2020-09-15 18:13:46 +02:00
Simon Christ d38379defb 1.6.4 [skip ci] 2020-09-14 09:17:58 +02:00
jaakkor2 3431833a9d bump compat for "GeometryBasics" to "0.3.1" (#2968)
CompatHelper PR to add "0.3" failed https://github.com/JuliaPlots/Plots.jl/pull/2935, but should be fixed in https://github.com/JuliaGeometry/GeometryBasics.jl/pull/83, after which GeometryBasics 0.3.1 was released.
2020-09-14 09:16:51 +02:00
Simon Christ 9c4890d794 Backend refactor (#2965)
* isolate :path

* factor out legend addition

* ported series coordinates code

* fix 3d-like seriestypes

* common add_series

* fix bar

* fix contour

* fix scatter

* Update precompile_*.jl file (#2966)

Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-09-13 19:29:49 +02:00
Yuval 52cb6fbd3a Merge pull request #2958 from yha/txt-no-prepare
Don't prepare_output for text/plain MIME
2020-09-07 19:05:37 +03:00
yha b91aa2bbfc Don't prepare_output for text/plain MIME 2020-09-07 17:33:36 +03:00
Josef Heinen c392cc1227 Update Project.toml 2020-09-03 19:28:07 +02:00
Josef Heinen a5cd06f3de Merge pull request #2953 from jheinen/master
bump compat for "GR" to "0.52.0"
2020-09-03 19:16:03 +02:00
Josef Heinen f2e128e8b6 bump compat for "GR" to "0.52.0" 2020-09-03 19:13:58 +02:00
Daniel Schwabeneder a87a5db6d9 Merge pull request #2949 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-02 17:30:46 +02:00
daschw 744f4d3db9 Update precompile_*.jl file 2020-09-02 14:12:02 +00:00
Daniel Schwabeneder d2c6b800d8 Merge pull request #2948 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-02 15:21:45 +02:00
daschw 1f4a471340 Update precompile_*.jl file 2020-09-02 08:05:20 +00:00
Daniel Schwabeneder 6b57149619 Merge pull request #2947 from daschw/gr-ticks
fix gr_text for non-string input
2020-09-02 09:29:25 +02:00
Daniel Schwabeneder 94e4005b0b Merge pull request #14 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-02 09:27:42 +02:00
daschw 5e15ef8ccb Update precompile_*.jl file 2020-09-01 23:11:50 +00:00
Daniel Schwabeneder b1d509cba0 patch release 2020-09-01 23:48:31 +02:00
Daniel Schwabeneder 6a3d5202e6 fix gr_text for non-string input 2020-09-01 23:47:32 +02:00
Daniel Schwabeneder ea25f373bd Merge pull request #2946 from daschw/tests
reduce animation test examples size
2020-09-01 23:39:42 +02:00
Daniel Schwabeneder e223e9c736 Merge pull request #9 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-09-01 23:38:14 +02:00
daschw f9053ae06f Update precompile_*.jl file 2020-09-01 20:18:47 +00:00
Daniel Schwabeneder 46b4a202e5 number examples 2020-09-01 21:18:25 +02:00
Daniel Schwabeneder 79e6096142 make animation examples in tests smaller 2020-09-01 20:35:09 +02:00
Daniel Schwabeneder 08ca46748a Merge pull request #2942 from daschw/version
fix version
2020-08-31 21:21:11 +02:00
Daniel Schwabeneder 5b5e298b84 fix version 2020-08-31 21:20:22 +02:00
Daniel Schwabeneder 773f364e0d Merge pull request #2941 from daschw/marker-segments
update apple precompiles
2020-08-31 21:02:48 +02:00
Daniel Schwabeneder 531e705301 Merge pull request #7 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-31 21:00:42 +02:00
Daniel Schwabeneder b7fedc42d3 Merge pull request #2940 from daschw/marker-segments
Fix marker shapes with segments
2020-08-31 20:57:38 +02:00
Daniel Schwabeneder 3301c4b9e0 patch release [skip ci] 2020-08-31 20:57:01 +02:00
daschw 312661aae5 Update precompile_*.jl file 2020-08-31 18:41:06 +00:00
Daniel Schwabeneder 977838b573 Merge pull request #6 from daschw/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-31 20:04:52 +02:00
daschw 4052ce83a2 Update precompile_*.jl file 2020-08-31 17:45:22 +00:00
Daniel Schwabeneder 3136c8f999 add new test example 2020-08-31 19:21:42 +02:00
Daniel Schwabeneder 0b91d51a40 fix marker shapes with segments on gr, pyplot and plotly 2020-08-31 18:55:17 +02:00
Daniel Schwabeneder 8ffac4d20e Merge pull request #2933 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-27 01:32:37 +02:00
daschw 85bdca8f1a Update precompile_*.jl file 2020-08-26 23:21:27 +00:00
Daniel Schwabeneder 6ae2d8a291 Merge pull request #2932 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-26 23:58:11 +02:00
daschw 9334711e19 Update precompile_*.jl file 2020-08-26 16:51:18 +00:00
Daniel Schwabeneder aa6712c9df Merge pull request #2931 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-26 18:26:34 +02:00
yha 7515491698 Update precompile_*.jl file 2020-08-26 15:58:43 +00:00
Yuval 0230e29c62 Merge pull request #2898 from yha/tick-format
Tick formating fixes
2020-08-26 18:33:43 +03:00
Yuval d1cfdd7d3d Merge branch 'master' into tick-format 2020-08-26 17:47:27 +03:00
github-actions[bot] 293fd6caaf Update precompile_*.jl file (#2928)
Co-authored-by: BeastyBlacksmith <BeastyBlacksmith@users.noreply.github.com>
2020-08-24 18:57:06 +02:00
Simon Christ f97bfbba9d 1.6.1 [skip ci] 2020-08-24 18:32:00 +02:00
ma-laforge 76429cde7a HDF5-Plots Clean up: Easier to understand/maintain. (#2924)
* Clean up code: Easier to understand/maintain.

Also:
Reduce line count for code.
Add namespace (module) to use shorter function/variable names.
Improve auto-generation of readers/writers for arbitrary structs.
Remove a few manually-written readers/writers for simple structs.
Write Plots.jl version -> VERSION_INFO to help user identify reader of outdated file formats.
Add support for:
 - Arrow
 - ColorScheme, ColorPalette
 - ContinuousColorGradient, CategoricalColorGradient
 - datetimeformatter

* Update precompile_*.jl file

Co-authored-by: ma-laforge <ma-laforge@users.noreply.github.com>
2020-08-24 18:22:54 +02:00
Yuval 66986a0cbd Merge pull request #7 from aminya/SnoopCompile_AutoPR
Snoop compile auto pr
2020-08-23 10:38:43 +03:00
aminya ccec5053b3 Update precompile_*.jl file 2020-08-23 04:30:04 +00:00
Amin Yahyaabadi 72e3cac531 remove old precompiles 2020-08-22 17:26:49 -05:00
Amin Yahyaabadi 24267ed286 Merge pull request #20 from yha/tick-format 2020-08-22 17:26:10 -05:00
Yuval c9b8475a9c Merge pull request #5 from yha/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-23 00:15:21 +03:00
yha a90ec5975d Update precompile_*.jl file 2020-08-22 19:21:01 +00:00
Yuval 71ee8d362f Merge pull request #4 from yha/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-08-22 21:58:25 +03:00
yha abb7eb04a6 Update precompile_*.jl file 2020-08-22 18:56:02 +00:00
yha bd7f0dc8d4 Merge branch 'tick-format' of https://github.com/yha/Plots.jl into tick-format 2020-08-22 21:26:35 +03:00
yha f23e6c224d precompiles 2020-08-22 21:26:35 +03:00
yha 449d35ebf2 Tick label formatting fixes 2020-08-22 21:26:35 +03:00
Simon Christ 1b70fb18e4 fix extra series in lens! (#2919)
* fix extra series in lens!

* include tests
2020-08-18 12:42:14 +02:00
Daniel Schwabeneder 960e7dbcd9 Merge pull request #2918 from aminya/pin_upload
pin upload action version
2020-08-18 11:38:31 +02:00
Amin Yahyaabadi 2dee74a3c5 pin upload action version 2020-08-17 10:07:40 -05:00
Daniel Schwabeneder 9d78772660 Merge pull request #2913 from aminya/xfvb
Fixing xfvb issues
2020-08-17 15:38:35 +02:00
Amin Yahyaabadi b44735830a xfvb --auto-servernum 2020-08-17 05:44:58 -05:00
Daniel Schwabeneder 448589413b Merge pull request #2910 from aminya/SnoopCompile2
SnoopCompileBot 2
2020-08-17 12:21:45 +02:00
Amin Yahyaabadi f870b01245 temporary: rev master 2020-08-14 19:13:42 -05:00
Amin Yahyaabadi 48de7e33a5 use SnoopCompile 2 2020-08-14 19:12:13 -05:00
Simon Christ d6bebe1ce2 1.6.0 2020-08-14 14:31:34 +02:00
Adrian Dawid e2c387894f Add :mesh3d series type for Plotly (#2909)
* Add :mesh3d seriestype (in theory)

* Make it work in practice

* Clean up code

* Add support for arbitrary 3d mesh

* Add fallback for other backends

* Add shorthand

* Change i,j,k to series keyword

* Small bugfix

* Update shorthands example

* Add mesh3d example

* Add some documentation to example

* Make color work

* Move mesh3d example and add to skip list

* Update fallback recipie

* Update example

* Update src/args.jl

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

* Update src/backends/plotly.jl

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

* Update src/examples.jl

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

* Cosmetic changes

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2020-08-14 14:26:16 +02:00
Simon Christ bf85afe9d6 unite titlefonts (#2363)
* change default `plot_title`

* add fontkwargs for colorbar_title, plot_title and window_title

* add utility functions

* adjust default colorbar title fontsize

* remove window-title attributes and edit description

* add match_map entries

* remove plot_fontfamily add match for colorbar_fontfamily

* add process_any_label

* add tests

* add magic arguments

* adjust tests

* fix subplot args
2020-08-13 11:31:17 +02:00
Simon Christ 217e67fb7f 1.5.9 [skip ci] 2020-08-11 10:58:03 +02:00
ztangent 3053bb4cc2 Fix error when setting animation loop count (#2904)
When creating an animation with a custom loop count, via, e.g., `gif(anim; loop=-1)`, so `mov(anim; loop=-1)`, FFMPEG throws the following error:

```
[image2 demuxer @ 000001fdf77ec280] Unable to parse option value "-1" as boolean
[image2 demuxer @ 000001fdf77ec280] Error setting option loop to value -1. 
```

This PR fixes the error by moving the `-loop` flag to after the `-i` input flag in the call to `ffmpeg_exe`. I believe the error is caused because the `-loop` flag occuring before `-i` controls how the input is interpreted, whereas the `-loop` flag occuring after `-i` controls how many loops are in the output.
2020-08-11 10:31:29 +02:00
Simon Christ 8dcff1f73d Update SnoopCompile.yml (#2902) 2020-08-07 22:36:29 +02:00
Simon Christ c73a5aaabc fix saving as .tikz (#2901) 2020-08-07 12:45:50 +02:00
github-actions[bot] 806d4671ce CompatHelper: bump compat for "FFMPEG" to "0.4" (#2891)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-08-05 10:18:47 +02:00
Simon Christ c4a64351ca set version to 1.5.8 [skip ci] 2020-08-04 11:05:28 +02:00
Simon Christ 345bceb526 conserve extra_kwargs (#2885)
* conserve extra_kwargs

* Update test_pgfplotsx.jl

* remove wraptuples

* Update test_pgfplotsx.jl

* Update test_pgfplotsx.jl

* Update test_pgfplotsx.jl

* Update test_pgfplotsx.jl

* Revert "remove wraptuples"

This reverts commit 6d66d69692.

* Auto stash before revert of "remove wraptuples"
2020-08-01 00:34:04 +02:00
Simon Christ 5673ced5d7 set version to 1.5.7 [skip ci] 2020-07-28 10:23:15 +02:00
Simon Christ a929903a63 Update SnoopCompile.yml (#2873)
* Update SnoopCompile.yml

I don't think we need to run on all branches and nightly.
Also we don't have benchmarks, right?

* Update SnoopCompile.yml
2020-07-27 09:34:32 +02:00
Maaz Bin Tahir Saeed b9cf8c3928 Fix guides not being considered in calculating plot area (#2878) 2020-07-26 21:43:22 +02:00
Simon Christ 9b573dce49 set version to 1.5.6 [skip ci] 2020-07-23 11:59:08 +02:00
isentropic c2bb17cece pyplot fonts fixed (#2858) 2020-07-23 11:57:24 +02:00
Maaz Bin Tahir Saeed 7e122bdfea Fix #2848: Legend :top should start below axis spine (#2870)
* Account for adding dy to ymax in legend pos

* Subtract x legend offset from :right symbols
2020-07-23 09:48:14 +02:00
Yuval 1ee999af33 Merge pull request #2867 from yha/animation-no-yuv
Don't use `-pix_fmt yuv420p` when calling ffmpeg
2020-07-22 19:49:03 +03:00
Daniel Schwabeneder 381f14b657 Merge pull request #2869 from MLH-Fellowship/diaga-2808
Fix #2808: Make legend width proportional to plot size
2020-07-22 14:02:15 +02:00
Diaga 3fec5ae1cf Include legend width changes for shapes and increase width 2020-07-21 18:27:06 +05:00
Diaga b154a1a3e4 Make white space and marker pos dynamic 2020-07-21 14:19:20 +05:00
Yuval cef0a55870 Merge pull request #2866 from yha/offset-fillrange
Support offset vectors as fillrange and ribbon
2020-07-20 12:35:00 +03:00
yha 61e80e96cf Don't use yuv240p format for video 2020-07-20 01:05:14 +03:00
yha 0db321aecc Support offset vectors as fillrange and ribbon 2020-07-20 00:12:47 +03:00
Daniel Schwabeneder 8b7f87506a Merge pull request #2865 from daschw/pyplot-image
fix wrong image limits in pyplot (fix #2864)
2020-07-16 23:36:45 +02:00
Simon Christ f9f6e0ff57 remove show comments 2020-07-16 21:25:46 +02:00
Daniel Schwabeneder 6f36d0998f fix wrong image limits in pyplot (fix #2864) 2020-07-16 20:17:02 +02:00
Josef Heinen 943bdca05e Update Project.toml 2020-07-15 21:19:28 +02:00
Josef Heinen bece65e922 Update Project.toml 2020-07-15 21:17:25 +02:00
Simon Christ 2fb315af0e fix typo 2020-07-13 10:09:43 +02:00
Simon Christ 849c2911a7 fix ribbon, fillbetween distinction 2020-07-09 22:07:04 +02:00
Simon Christ fa720d6ad4 patch release [skip ci] 2020-07-09 12:32:04 +02:00
Simon Christ 1ab681f509 fix ribbons (#2853)
* fix ribbons

* fix tests
2020-07-09 12:23:27 +02:00
Daniel Schwabeneder 0d776fd09d Merge pull request #2850 from daschw/gr-error
fix yerror and marker_z
2020-07-08 08:58:12 +02:00
Daniel Schwabeneder 45e33f5b6f fix yerror and marker_z 2020-07-07 21:44:47 +02:00
Daniel Schwabeneder 1c4910f90e Merge pull request #2807 from MLH-Fellowship/diaga-issue-2202-2330
Fix #2330, #2202: Position legends closer to the borders
2020-07-07 20:55:00 +02:00
Simon Christ 2f4eb7b558 change z buffer for surface plots (#2843) 2020-07-04 19:37:42 +02:00
Daniel Schwabeneder 07ed5e7162 Merge pull request #2846 from daschw/release
patch release
2020-07-04 12:17:23 +02:00
Daniel Schwabeneder 03716289c3 patch release [skip ci] 2020-07-04 12:16:13 +02:00
Daniel Schwabeneder 0d38f34e54 Merge pull request #2844 from daschw/errorbar
fix errorbar color
2020-07-03 17:09:17 +02:00
Daniel Schwabeneder 2544808000 update errorbar example 2020-07-03 16:31:03 +02:00
Diaga 02ca049bc6 Remove static offsets for ypos 2020-07-03 18:52:54 +05:00
Daniel Schwabeneder cd20518323 fix errorbar color for scatter 2020-07-03 15:40:46 +02:00
Diaga ff7235e9b8 Remove constant offsets for xpos 2020-07-03 17:56:13 +05:00
Daniel Schwabeneder fb5307ace6 Merge pull request #2840 from daschw/release
patch release
2020-07-02 16:42:47 +02:00
Lakshya Khatri e3512b0f0d Add label for label=0 kwarg (#2837)
* Add label for `label=0` kwarg

* Fix ambiguous comparision of label with 0

* Add methods for handling plot labels

* Remove type annotations for series indexes

* Replace label conversion code with shorter version

* Handel symbol args for labels in more consistent manner

* Broadcast label_to_string to handle Array of labels

Co-authored-by: Simon Christ <SimonChrist@gmx.de>

Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2020-07-02 16:32:37 +02:00
Diaga 376fae0d79 Make legend offset calculation dynamic 2020-07-02 18:12:23 +05:00
Daniel Schwabeneder e0e240bfd2 bump version [skip ci] 2020-07-02 14:41:04 +02:00
Daniel Schwabeneder 079152a69a Merge pull request #2839 from daschw/precompile
include precompile_includer.jl
2020-07-02 14:39:20 +02:00
Daniel Schwabeneder ffed7ebc21 undo version change in SnoopCompile.jl 2020-07-02 13:55:10 +02:00
Daniel Schwabeneder cc7c0f1251 change julia 1.5.0 version 2020-07-02 13:51:57 +02:00
Daniel Schwabeneder 30c683b201 include prercompile_includer.jl manually 2020-07-02 13:50:26 +02:00
Daniel Schwabeneder c3fa7c8941 Merge pull request #2836 from daschw/windows-tests
Make tests pass on windows julia 1.3
2020-07-01 12:07:20 +02:00
Daniel Schwabeneder ddc89e54f1 fix undefined is_ci 2020-07-01 10:32:04 +02:00
Simon Christ ed2d5be538 patch version [skip ci] 2020-07-01 10:28:22 +02:00
Moritz Schauer c0adba6615 Update arg_desc.jl (#2830)
Mention aspect_ratio = :none
2020-07-01 10:23:28 +02:00
Simon Christ 22cf3e127e keep size when plotting in juno (#2826) 2020-07-01 10:22:52 +02:00
Daniel Schwabeneder 0a929d6022 try to fix tests on windows julia 1.3 2020-07-01 09:44:27 +02:00
Daniel Schwabeneder 698f9d8c9e Merge pull request #2835 from JuliaPlots/SnoopCompile_AutoPR
[AUTO] Update precompiles
2020-07-01 09:44:00 +02:00
github-actions[bot] f97a5153b0 Update precompile_*.jl file 2020-07-01 07:40:42 +00:00
Daniel Schwabeneder 065089a1a3 Merge pull request #2832 from daschw/snoopibot
Use SnoopCompileBot
2020-07-01 09:16:54 +02:00
Daniel Schwabeneder 79fac7a85e use '1.5.0-rc1' until 1.5 is released 2020-07-01 00:27:59 +02:00
Daniel Schwabeneder a46ffbe218 update 1.5 version specification in SnoopCompile.yml 2020-07-01 00:06:38 +02:00
Daniel Schwabeneder dc81c6aa8c Update .github/workflows/SnoopCompile.yml 2020-06-30 23:43:55 +02:00
Daniel Schwabeneder fc89578536 Update .github/workflows/SnoopCompile.yml
Co-authored-by: Amin Yahyaabadi <aminyahyaabadi74@gmail.com>
2020-06-30 23:35:51 +02:00
Daniel Schwabeneder 6425ff8f4c Update deps/SnoopCompile/snoop_bot.jl
Co-authored-by: Amin Yahyaabadi <aminyahyaabadi74@gmail.com>
2020-06-30 23:22:35 +02:00
Daniel Schwabeneder 032f76c69b Update deps/SnoopCompile/snoop_bench.jl
Co-authored-by: Amin Yahyaabadi <aminyahyaabadi74@gmail.com>
2020-06-30 23:22:22 +02:00
Daniel Schwabeneder ebaa965604 Merge pull request #2833 from daschw/compathelper
update compathelper config
2020-06-30 22:00:08 +02:00
Daniel Schwabeneder fa44e39030 update compathelper config 2020-06-30 21:57:17 +02:00
Daniel Schwabeneder a2aad6be66 don't run on 1.5 2020-06-30 21:23:00 +02:00
Daniel Schwabeneder 3f521b3322 multios and run on 1.5 2020-06-30 21:18:04 +02:00
Daniel Schwabeneder 16618430ed be explicit about julia versions 2020-06-30 19:25:59 +02:00
Daniel Schwabeneder 4f791a394e don't display plotly plots 2020-06-30 18:37:32 +02:00
Daniel Schwabeneder cfab4e35cc skip statsplots testimages 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder 3ea521793b add env variables for GR 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder 2511d2128b actually use xvfb-run 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder d0920ac919 add GKS_ENCODING env variable 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder acd6cfabc1 string instead of versionnumber 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder 86b92698cc xvfb-run and update versions 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder fb402d9901 don't include precompile_loader 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder ddcf443f89 remove nightly in snoop_bot.jl 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder 3dd3808895 don't run snoopcompilebot on nightly 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder 12df81f390 automate updating of precompilation files using SnoopCompileBot 2020-06-30 18:28:44 +02:00
Daniel Schwabeneder dbd28bc57b Merge pull request #2829 from daschw/ci
update versions in github actions ci
2020-06-30 18:25:51 +02:00
Daniel Schwabeneder 171c2f8e33 Merge pull request #2828 from daschw/grays
fix recipe for arrays of grays
2020-06-30 17:22:29 +02:00
Daniel Schwabeneder 88c94e11b9 update versions in github actions ci 2020-06-30 17:03:55 +02:00
Daniel Schwabeneder 949e245e15 fix recipe for arrays of grays 2020-06-30 16:28:09 +02:00
Daniel Schwabeneder f1db5d6502 Merge pull request #2827 from KristofferC/patch-1
allow JSON 1.0
2020-06-30 15:56:41 +02:00
Kristoffer Carlsson 94086a0ed1 allow JSON 1.0 2020-06-30 14:48:52 +02:00
Simon Christ 8d67577711 minor bump [skip ci] 2020-06-29 23:06:12 +02:00
Daniel Schwabeneder 657f6224d1 Merge pull request #2799 from isentropic/fixedlayouts
layouts fixed
2020-06-29 18:22:53 +02:00
Daniel Schwabeneder d98481fca8 Merge pull request #2821 from daschw/juliaversion
Update julia version
2020-06-29 18:21:57 +02:00
Daniel Schwabeneder 1c694ca81c don't test twice for julia v1 2020-06-27 14:15:50 +02:00
Daniel Schwabeneder c52d5e44c7 allow failures on julia 1.3 windows 2020-06-27 13:08:22 +02:00
Daniel Schwabeneder f2a2797c34 require julia 1.3 2020-06-27 12:56:59 +02:00
Daniel Schwabeneder d14fac5d1e try julia 1.3 2020-06-27 12:14:49 +02:00
Daniel Schwabeneder 2f8e27ab01 use matrix.julia_version for naming ci jobs 2020-06-27 11:09:41 +02:00
Daniel Schwabeneder 2dce036477 require julia 1.2 and update ci 2020-06-27 11:06:43 +02:00
Simon Christ f98ef14f15 bump version [skip ci] 2020-06-26 17:08:03 +02:00
Daniel Schwabeneder c1ccf16830 Merge pull request #2815 from daschw/test-nightly
Fix nightly tests
2020-06-25 23:36:48 +02:00
Daniel Schwabeneder 0b31e26007 use StableRNGs for testing 2020-06-25 22:14:52 +02:00
Daniel Schwabeneder 96ec035811 Merge pull request #2813 from JuliaPlots/compathelper/new_version/2020-06-25-10-06-52-376-899956638
CompatHelper: add new compat entry for "GeometryBasics" at version "0.2"
2020-06-25 14:25:36 +02:00
github-actions[bot] 474f0f922d CompatHelper: add new compat entry for "GeometryBasics" at version "0.2" 2020-06-25 10:06:53 +00:00
Yuval 2fcbb093ac Merge pull request #2800 from yha/geometry-basics
Recipe for GeometryBasics.Point
2020-06-25 13:06:19 +03:00
Josef Heinen 8e3f76cb6f gr: fix problem with ugly exponents (#2810) 2020-06-24 16:38:57 +02:00
isentropic 07146e84e5 line caps, legendbox (#2802) 2020-06-24 14:34:02 +09:00
Rashika Karki 47590b2538 Fix position of legend (#2806)
* Fix position of legend

* Fix var name
2020-06-23 10:59:27 +09:00
Diaga d036794576 Fix #2330, #2202: Position legends closer to the borders 2020-06-22 17:45:23 +05:00
Daniel Schwabeneder b6234a9ea0 Merge pull request #2805 from MLH-Fellowship/rashika-issue-2775
Add outer legend for Plotly
2020-06-22 10:40:01 +02:00
Rashika d1b2c7f751 Add outer legend for Plotly 2020-06-22 09:39:24 +05:45
yha d353dca531 Recipe for GeometryBasics.Point 2020-06-18 21:18:34 +03:00
Simon Christ 709a8a9609 bump version [skip ci] 2020-06-18 14:33:13 +02:00
Zhanibek 0942b14905 layouts fixed 2020-06-18 14:17:10 +09:00
Rashika Karki d6af1da35a Fix #2771: Add aliases (#2791)
* Fix #2771: Add aliases

* Added function to add aliases from vector
2020-06-17 14:37:01 +02:00
Daniel Schwabeneder bbbee44c66 Merge pull request #2793 from daschw/gr-3d
add legend line in GR for 3d paths
2020-06-17 14:25:37 +02:00
Daniel Schwabeneder 9499cef25d add legend line in GR for 3d paths 2020-06-17 11:54:53 +02:00
Simon Christ 7c8952fadf bump version [skip ci] 2020-06-17 11:19:26 +02:00
isentropic 8b2d3e926a better exopnents (#2786) 2020-06-17 11:18:03 +02:00
Fons van der Plas fb40ed1f59 Plotly fixed version (#2779)
* Fixed version for plotly.js dependency

* Fixed version for plotly.js dependency - .gitignore update
2020-06-17 11:17:37 +02:00
isentropic e88654cca5 pyplot colorbar positioning (#2772) 2020-06-17 11:17:18 +02:00
Maaz Bin Tahir Saeed a9b9b3c357 Fix #2377, #2785, #2369: Legend positioning fix for multiple plots (#2784)
* Fix 2377: Legend positioning fix for multiple vertical plots

* Fix #2785: Legend positioning for multiple horizontal plots
2020-06-17 11:16:37 +02:00
Simon Christ 99c8bfe12d bump version [skip ci] 2020-06-16 09:44:37 +02:00
Simon Christ 3eb2b783dc keep LaTeXStrings to be LaTeXStrings (#2781) 2020-06-16 09:39:07 +02:00
Daniel Schwabeneder a20b275eaf Merge pull request #2788 from jheinen/master
gr: fix polar heatmap problem
2020-06-16 09:23:43 +02:00
Josef Heinen c29694ae70 gr: fix polar heatmap problem 2020-06-15 12:53:57 +02:00
Simon Christ ebc93b6935 remove Pkg (#2776)
* remove Pkg

* remove using Pkg
2020-06-10 12:03:13 +02:00
isentropic 7dcbe911b1 Legends documentation and some todos (#2770)
* improve legends documentation

* todo additional legend positions

* Update plotly.jl

removed todo
2020-06-09 13:30:06 +02:00
Simon Christ c2df99cc66 remove showgradient and showlibrary (#2769) 2020-06-09 08:38:43 +02:00
isentropic a992effa5e scalefontsize fixed (#2765) 2020-06-09 08:37:39 +02:00
Simon Christ e49eb9bc83 update badges (#2761)
* update badges

* Update README.md
[skip ci]
2020-06-06 10:13:25 +02:00
Daniel Schwabeneder f2d7d394bb Merge pull request #2760 from daschw/gr-heatmap
improve nonuniform heatmap performance on GR
2020-06-05 19:55:16 +02:00
Daniel Schwabeneder 87d40cd34d improve nonuniform heatmap performance on GR 2020-06-05 18:23:48 +02:00
Daniel Schwabeneder 5f24f88f12 Merge pull request #2757 from daschw/release
bump version [skip ci]
2020-06-04 13:34:07 +02:00
Daniel Schwabeneder 9c465b58db bump version [skip ci] 2020-06-04 13:33:15 +02:00
Daniel Schwabeneder ad4a00c055 Merge pull request #2755 from jamblejoe/fix/spy
Plots.findnz for sparse and non-sparse matrices
2020-06-04 13:31:30 +02:00
Daniel Schwabeneder 54671c15d7 Merge pull request #2751 from isentropic/plotly-legends
plotly legend fixes
2020-06-04 11:42:20 +02:00
Daniel Schwabeneder fff8f84acf Merge pull request #2748 from daschw/tests
Remove travis and appveyour config files
2020-06-04 00:25:17 +02:00
Daniel Schwabeneder 4d8ea50f69 Merge pull request #2754 from daschw/current-stable
Add missing commits
2020-06-04 00:24:19 +02:00
Goran Nakerst 43f31cbc98 Plots.findnz for sparse and non-sparse matrices 2020-06-03 23:06:23 +01:00
Daniel Schwabeneder d98e76e36d Merge remote-tracking branch 'origin/master' into current-stable 2020-06-03 23:29:41 +02:00
Zhanibek e2a5e40019 plotly legend fixes 2020-06-03 16:08:53 +09:00
Daniel Schwabeneder 3c2c2c18d7 Remove travis and appveyour config files 2020-06-01 09:58:22 +02:00
Daniel Schwabeneder 0ee1d867c9 Merge pull request #2745 from aminya/GitHubActions
GitHub actions
2020-06-01 09:46:34 +02:00
Amin Yahyaabadi b145ea9ef5 typo 2020-05-31 02:38:38 -05:00
Daniel Schwabeneder 73971896ee Merge pull request #2744 from giordano/patch-1
Remove duplicate entries in the Project file
2020-05-31 09:29:42 +02:00
Amin Yahyaabadi f5f4128e30 Add ci.yml 2020-05-30 20:41:23 -05:00
Mosè Giordano 70dfa52a9a Remove duplicate entries in the Project files 2020-05-31 01:05:04 +01:00
Josef Heinen 2e53c57114 bump GR version 2020-05-29 16:49:51 +02:00
Simon Christ 0485b1313a bump version [skip ci] 2020-05-29 15:16:15 +02:00
Daniel Schwabeneder f0f28086a9 Merge pull request #2740 from daschw/vline
fix infinite objects with log scale
2020-05-29 10:50:04 +02:00
Daniel Schwabeneder 580ac8a9d1 fix infinite objects with log scale 2020-05-29 09:42:44 +02:00
Daniel Schwabeneder 84fc6b0be0 Merge pull request #2739 from mileslucas/patch-1
fix type restriction in process_clims
2020-05-28 08:37:13 +02:00
Miles Lucas de81220c01 fix namespace 2020-05-27 12:16:20 -10:00
Miles Lucas ee1f948448 add process_clims tests 2020-05-27 12:00:53 -10:00
Miles Lucas 995c7d349e fix type restriction in process_clims 2020-05-27 11:55:49 -10:00
Simon Christ 4389160a6a bumb version [skip ci] 2020-05-27 15:23:48 +02:00
Simon Christ 8c6295658b fix showaxis fix (#2737)
* also replace axis syms

* process showaxis

* fix axis keyword
2020-05-27 15:23:02 +02:00
Simon Christ a270e342b7 bump version [skip ci] 2020-05-26 20:41:45 +02:00
Simon Christ 42e2266530 Fix showaxis (#2733)
* also replace axis syms

* include test_axes [skip ci]

* Create test_axes.jl

* process showaxis
2020-05-26 20:40:44 +02:00
Cornelius-G 02e6d729c1 add attribute fillalpha to contourf seriestype for pyplot backend (#2732) 2020-05-26 18:37:58 +02:00
Tim Holy baac9a0578 Remove explicit Revise.track from atsign-require blocks (#2734)
* Remove explicit Revise.track from atsign-require blocks

Since Revise 2.4, it has no longer been necessary to explicitly call
Revise.track, as Revise handles this internally.

Also related: https://github.com/timholy/Revise.jl/pull/487,
which checks to see whether Revise.track was called via atsign-require
and if so return without doing anything.

* Bump Requires [compat] to 1
2020-05-26 18:37:13 +02:00
Simon Christ b73dd46521 bump version [skip ci] 2020-05-25 15:01:42 +02:00
isentropic 7bbb2070a7 pyplot colorbar fixes (#2722)
* pyplot colorbar fixes

* pyplot colorbar fixes

* pyplot: sligtly reworked colorbars

* pyplot 3d color bar fixes

* pyplot 3d color bar fixes
2020-05-25 15:00:56 +02:00
Simon Christ 8859518f2d update compat bounds (#2727) 2020-05-25 10:05:33 +02:00
Simon Christ 7f063c71b5 bump version [skip ci] 2020-05-21 12:35:16 +02:00
hhaensel 1e9691a7c0 Add support for mathjax (latex) and extra_plot_kwargs in plotly backend (#2719)
* support mathjax header in plotly backend

* support extra_plot_kwargs in plotly backend

* correct local file parameter to `file:///`

* corrections proposed by @BeastyBlacksmith

* include extra_kwargs for subplots

* don't merge subplot extra_kwargs

Co-authored-by: Helmut Haensel <M136270@eu.merckgroup.com>
Co-authored-by: Simon Christ <SimonChrist@gmx.de>
2020-05-21 12:32:25 +02:00
Simon Christ e5269bcf95 bump version [skip ci] 2020-05-20 15:56:25 +02:00
Simon Christ fdd76a6ca1 Update bug.md 2020-05-20 15:55:52 +02:00
Simon Christ d19525c269 improve title- and legendlocation (#2718)
* improve titlelocation

* fix default case

* improve legend position
2020-05-20 14:55:19 +02:00
Simon Christ 593331dec2 change default alignment in legends (#2714) 2020-05-19 21:20:14 +02:00
Simon Christ b780d90097 minor bump [skip ci] 2020-05-19 13:04:49 +02:00
Simon Christ 2f9ce790e4 deprecate pgfplots (#2711)
* deprecate pgfplots

* Update backends.jl

* Update backends.jl

* Rename src/backends/pgfplots.jl to src/backends/deprecated/pgfplots.jl

* Update init.jl
2020-05-19 13:03:54 +02:00
Simon Christ d8f4519b0c bump version [skip ci] 2020-05-17 10:29:13 +02:00
Simon Christ 702e41f55d add all guide_positions (#2710)
* add all guide_positions

* remove show
2020-05-17 10:28:21 +02:00
Simon Christ 682ac29fcd fix clims (#2709) 2020-05-16 20:10:39 +02:00
Simon Christ c6ce23d0af bump version [skip ci] 2020-05-14 14:45:00 +02:00
Daniel Schwabeneder 9ae7d2dd9d Merge pull request #2700 from daschw/pgfx-colorbar
pgfplotsx colorbar improvements
2020-05-14 14:17:41 +02:00
isentropic 6ec05628d5 python depthshade (#2703)
* python depthshade

* python depthshade
2020-05-14 12:26:18 +02:00
Daniel Schwabeneder f26ebdc2f1 remove unused color strings 2020-05-13 17:21:18 +02:00
Daniel Schwabeneder c97255fc08 don't make colorbars thinner 2020-05-13 17:03:52 +02:00
Daniel Schwabeneder 9d1ede016b make colorbars thinner 2020-05-13 17:03:52 +02:00
Daniel Schwabeneder 7eb8f2452c colorbar positions :top, :bottom and :left and colorbar tickfont fixes 2020-05-13 17:03:52 +02:00
Daniel Schwabeneder 0a6e691222 allow disabling the colorbar in pgfplotsx 2020-05-13 17:03:52 +02:00
jamblejoe 238aca6a78 added description for argument legendtitle (#2697) 2020-05-12 18:32:21 +02:00
Simon Christ 1f039b3adc bump version [skip ci] 2020-05-11 16:52:42 +02:00
Simon Christ 219465d599 fix contours (#2692)
* fix 2d-contour

* fix filled contours (colorbar is off)

* activate fixed examples
2020-05-11 16:52:00 +02:00
Simon Christ 1963cee94a fix it again (#2694) 2020-05-11 16:51:38 +02:00
Simon Christ ae43e05f6f bump version [skip ci] 2020-05-09 13:10:32 +02:00
Simon Christ 5cd2ba7296 Delete tmpplotsave.hdf5 2020-05-09 13:09:53 +02:00
isentropic 4a00018f25 pyplot hexbin (#2679)
* pyplot hexbin

* pyplot hexbin changes
2020-05-09 13:07:32 +02:00
Simon Christ 32c725e770 error bars behind in scatterplots (#2677)
* errors behind for :scatter

* fix plots with no seriestype
2020-05-09 13:05:15 +02:00
Daniel Schwabeneder 4e2ee35125 Merge pull request #2684 from daschw/gr-ticklabel
fix numeric gr ticklabels
2020-05-08 10:15:04 +02:00
Daniel Schwabeneder 35b0751714 fix numeric gr ticklabels 2020-05-07 18:17:47 +02:00
Zh 28ebc0ccd8 pyplot hexbin 2020-05-07 03:02:00 +09:00
Simon Christ 3d693d88e0 Change color handling of error recipes (#2675)
* fix iteration of segments

* fix error vector arg detection

* change color handling of recipes
2020-05-06 18:21:54 +02:00
Daniel Schwabeneder 6ddf31d465 Merge pull request #2673 from komi1230/master
Removed arrow3d from gr.jl in backends/
2020-05-05 20:50:40 +02:00
Yusuke Kominami 5c1ea707ca removed unnecessary args 2020-05-06 01:24:20 +09:00
Yusuke Kominami a6669f89a0 removed arrow3d 2020-05-05 23:18:03 +09:00
Simon Christ 2a2d509c36 Version bump
[skip ci]
2020-05-05 10:26:56 +02:00
isentropic fd4efb3f33 PyPlot: z-axis guidefontrotation only works for short labels Fix 2641 (#2667) 2020-05-05 10:26:01 +02:00
isentropic e90ab0b898 PyPlot fix contour labels (#2668) 2020-05-05 10:25:12 +02:00
Simon Christ 44367c54da fix quiver (#2670) 2020-05-05 10:24:15 +02:00
Daniel Schwabeneder 3273a65889 Merge pull request #2657 from mileslucas/climsfunc
allow passing a function to `clims`
2020-05-05 08:18:07 +02:00
Miles Lucas 0aa606d835 fix typo in get_clims function docstring 2020-05-04 11:05:53 -10:00
Simon Christ 40848e7432 fix error recipes (#2665)
* fix scatterbins

* fix zerror
2020-05-04 18:16:29 +02:00
Michael Krabbe Borregaard fe4cc4d58c update patch version 2020-05-04 18:12:20 +02:00
Daniel Schwabeneder 56f90ffaf3 Merge pull request #2663 from dietercastel/webm
Added webm support for animations.
2020-05-03 19:28:49 +02:00
Daniel Schwabeneder dfb556339f Merge pull request #2662 from daschw/plotarea
GR size fixes
2020-05-03 15:54:56 +02:00
Daniel Schwabeneder 61f5a7f437 fix extra_kwargs docs string 2020-05-03 15:39:51 +02:00
Daniel Schwabeneder 3be9b8d076 fix outer legend font size 2020-05-03 15:37:12 +02:00
Daniel Schwabeneder 2a138dee40 fix get_size and get_thickness_scaling for series 2020-05-03 15:37:12 +02:00
Daniel Schwabeneder 712ef74b81 remove const _gr_plot_size, _gr_point_mult and _gr_thickness_scaling 2020-05-03 15:37:12 +02:00
Daniel Schwabeneder ba8ca424cf remove gloabal viewport_plotarea in gr 2020-05-03 15:37:12 +02:00
Dieter Castel c6784a779b Added webm support for animations. 2020-05-03 15:31:55 +02:00
Simon Christ d667cb7e57 update documentation of extra_kwargs 2020-05-03 15:10:34 +02:00
Miles Lucas 10a5c2ed1d fix bug with Tuple clims and fix typos 2020-05-01 00:10:27 -10:00
Miles Lucas 8cce78c890 fix typos 2020-04-30 23:38:52 -10:00
Miles Lucas 294ade8aad refactor get_clims calls to use operators 2020-04-30 23:32:30 -10:00
Miles Lucas a59e8411c9 update clims arg description 2020-04-30 22:30:03 -10:00
Daniel Schwabeneder d973f437ef Merge pull request #2653 from daschw/segments
make segments for vectors of markersize and markerstrokewidth
2020-04-30 14:05:45 +02:00
Josef Heinen d5ce2c1431 Merge remote-tracking branch 'upstream/master' 2020-04-30 13:25:06 +02:00
Josef Heinen 834e2a99e3 add actual GR version 2020-04-30 13:18:32 +02:00
Daniel Schwabeneder f8e9e33347 Merge pull request #2650 from daschw/pyplot
pyplot legend marker fixes
2020-04-30 13:17:53 +02:00
Daniel Schwabeneder a0c7781296 make segments for vectors of markersize and markerstrokewidth 2020-04-30 13:16:33 +02:00
Daniel Schwabeneder 2ea998983d fix legend marker for vector of markersizes [skip ci] 2020-04-30 10:04:04 +02:00
Daniel Schwabeneder e44b220b84 fix legend marker linewidth for steppre and steppost [skip ci] 2020-04-30 10:03:21 +02:00
Daniel Schwabeneder 756cccb114 remove lines in legend markers for scatter plots in pyplot [skip ci] 2020-04-30 09:46:13 +02:00
Simon Christ af9982b804 minor bump [skip ci] 2020-04-29 11:47:54 +02:00
Simon Christ 1b946a18d2 passing of extra keywords to pgfplotsx (#2200)
* transfer commit

* extra_kwargs gets populated

* make extra_kwargs a series kw.

* turn extra_kwargs into Dict of Dicts

* pass to pgfplotsx-backend

* add test

* change to dict

* it even works

* cleanup

* undo pgfplots changes

* all of them

* fix tests

* add pgfplotsx tests and special handling of :add

Co-authored-by: Simon Christ <Simon.Christ@mpikg.mpg.de>
2020-04-29 11:43:57 +02:00
Simon Christ a397bfd549 bump version [skip ci]
@JuliaRegistrator register
2020-04-29 11:33:36 +02:00
isentropic d276ac6857 pyplot: legend marker scales independently (#2616)
* pyplot: legend marker scales independently

* pyplot: marker size scales correctly

* pyplot: marker size scales correctly

* pyplot: marker size scales correctly

* pyplot: lw in legend scales with legendfont

* pyplot: legendmarker size 0.8
2020-04-29 11:32:22 +02:00
Daniel Schwabeneder 475d1c2398 Merge pull request #2646 from daschw/release
bump version [skip ci]
2020-04-28 22:06:42 +02:00
Daniel Schwabeneder d6ae848aec bump version [skip ci] 2020-04-28 22:05:36 +02:00
Daniel Schwabeneder 8976fc4ae4 Merge pull request #2644 from daschw/pie
Implement pie as series recipe
2020-04-28 22:01:42 +02:00
Daniel Schwabeneder 095191f8e6 Merge pull request #2645 from daschw/zulip
add zulip chat link to readme
2020-04-28 21:58:55 +02:00
Daniel Schwabeneder 83ad031c13 add zulip chat link to readme 2020-04-28 21:44:24 +02:00
Daniel Schwabeneder 2b1673df6f Merge pull request #2643 from daschw/legendmarker
(Legend) marker scaling for GR
2020-04-28 21:17:10 +02:00
Daniel Schwabeneder b867ad58f8 update precompiles 2020-04-28 20:48:09 +02:00
Daniel Schwabeneder 8b897c3460 implement pie series recipe 2020-04-28 20:48:09 +02:00
Daniel Schwabeneder e5cb36af7a fix legend linewidth 2020-04-28 20:46:44 +02:00
Daniel Schwabeneder cdaa10be27 update precompile file 2020-04-28 19:40:30 +02:00
Daniel Schwabeneder fe3813b5af scale GR markers with thickness_scaling 2020-04-28 19:20:18 +02:00
Daniel Schwabeneder 311bbdc99b scale GR legend markers and lines with legend fontsize 2020-04-28 19:15:42 +02:00
Daniel Schwabeneder c90fa4d63c Merge pull request #2639 from daschw/inspectdr
fix inspectdr
2020-04-27 15:44:22 +02:00
Daniel Schwabeneder 04c1c6c0ed fix inspectdr 2020-04-27 15:17:41 +02:00
Daniel Schwabeneder 47a8294d99 Merge pull request #2637 from daschw/const
Fix most redefining constant warnings in backend code.
2020-04-26 22:13:11 +02:00
Daniel Schwabeneder f3cf8d884a bump version 2020-04-26 21:48:54 +02:00
Daniel Schwabeneder fe2d46d1eb fix pgfx_get_ functions 2020-04-26 21:43:55 +02:00
Daniel Schwabeneder a0ba0e232e remove unused dict 2020-04-26 21:25:49 +02:00
Daniel Schwabeneder 6565515446 update precompiles 2020-04-26 20:59:56 +02:00
Daniel Schwabeneder 65b0f44626 move missing hdf5 type to backends 2020-04-26 20:57:56 +02:00
Daniel Schwabeneder b80ba99100 move remaining const to backends.jl 2020-04-26 20:49:02 +02:00
Daniel Schwabeneder 60980f7f7f remove const in pyplot 2020-04-26 20:25:38 +02:00
Daniel Schwabeneder 5132bebc7f remove const in plotlyjs 2020-04-26 20:16:31 +02:00
Daniel Schwabeneder 275738e7ea remove const in plotly 2020-04-26 20:15:14 +02:00
Daniel Schwabeneder 5759fd61ea remove const in pgfplotsx - 1 more left 2020-04-26 20:03:19 +02:00
Daniel Schwabeneder 577acbdeb6 remove const in ORCA 2020-04-26 19:38:47 +02:00
Daniel Schwabeneder 4d94725797 remove const in inspectdr 2020-04-26 19:37:20 +02:00
Daniel Schwabeneder ad4f92e36d remove some const in hdf5 - 4 more left 2020-04-26 19:30:22 +02:00
Daniel Schwabeneder 577ac33826 remove some const in gr 2020-04-26 19:15:16 +02:00
Simon Christ 3275719f12 fix topleft legend 2020-04-26 15:20:00 +02:00
Daniel Schwabeneder f636edf4c0 Merge pull request #2635 from daschw/colorschemes
fix _as_gradient(::Colorant)
2020-04-26 10:47:13 +02:00
Daniel Schwabeneder 84039a79de bump version 2020-04-26 10:46:26 +02:00
Daniel Schwabeneder d64ba707e9 fix _as_gradient(::Colorant) 2020-04-25 10:43:09 +02:00
Daniel Schwabeneder 703bdf6cfe Merge pull request #2564 from daschw/colorschemes
Switch to ColorSchemes
2020-04-24 22:16:14 +02:00
Daniel Schwabeneder e7f79e9144 fix vector of colors as gradient 2020-04-24 21:32:25 +02:00
Daniel Schwabeneder 79fd7f282d generate precompiles 2020-04-24 21:21:23 +02:00
Daniel Schwabeneder 3078a44fce fix nonuniform heatmap in GR 2020-04-24 21:21:23 +02:00
Daniel Schwabeneder ba4f2665e0 fix range on julia 1.0 2020-04-24 21:21:23 +02:00
Daniel Schwabeneder 5504f59098 remove ColorSchemes dep and bump version 2020-04-24 21:21:12 +02:00
Daniel Schwabeneder 265439fb2b update colorschemes integration 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder 450b36bdde small cleanup in utils 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder f1e7e3a4de integrate colorpalettes in pgfplotsx 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder becfa33ee8 pyplot and plotly integration of ColorPalettes 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder ec5fa44f2a fix plotly ColorSchemes integration 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder 3152d4b4fe fix tests for gr 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder 66d2e4746a implement ColorSchemes integration in PlotUtils 2020-04-24 21:20:07 +02:00
Daniel Schwabeneder 39b10f05b9 Merge pull request #2625 from daschw/unsupported
Add option to suppress `warn_on_unsupported`
2020-04-24 20:52:15 +02:00
Daniel Schwabeneder 5739acd044 Merge pull request #2624 from daschw/default
don't reset defaults with backend()
2020-04-24 20:28:55 +02:00
Daniel Schwabeneder d1fb11ce97 add option to avoid warning on unsupported arguments 2020-04-24 20:10:17 +02:00
Daniel Schwabeneder aa46f584b6 don't warn on unsupported args for unicodeplots 2020-04-24 20:10:17 +02:00
Daniel Schwabeneder 7c87cbb425 don't reset defaults with backend() 2020-04-24 20:01:38 +02:00
isentropic 09de2ebc0e Minorgrid and minorticks for pyplot (#2621)
* Minor grids for pyplot

* Minorgrid and minorticks setup for pyplot
2020-04-24 17:15:00 +02:00
Simon Christ 64f7dc1aed Issue templates (#2623)
* Create bug.md

* Rename .github/ISSUE_TEMPLATES/bug.md to .github/ISSUE_TEMPLATE/bug.md

* Create feature request

* Rename feature request to feature request.md

* add inspectdr
2020-04-24 14:17:39 +02:00
Daniel Schwabeneder 122b4d91a8 Merge pull request #2619 from jamblejoe/patch-titlelocation
changed title_location -> titlelocation
2020-04-23 21:08:39 +02:00
Daniel Schwabeneder d9efbbcf5b Merge pull request #2622 from daschw/errorbar
fix errorbars with string axes
2020-04-23 21:07:37 +02:00
Daniel Schwabeneder d3629f3cfe remove show 2020-04-23 20:37:02 +02:00
Daniel Schwabeneder a9c659aa21 fix errorbars with string axes 2020-04-23 20:35:32 +02:00
Goran Nakerst 5d37264487 changed title_location -> titlelocation 2020-04-23 13:48:42 +01:00
Daniel Schwabeneder 2fc6f9220d Merge pull request #2614 from jamblejoe/patch-1
Add documentation for legend=(x,y)
2020-04-23 08:44:53 +02:00
jamblejoe c976a6de83 Add documentation for legend=(x,y)
Added documentation in arg_desc.jl for placing legends via legend=(x,y) where x,y are Real.
2020-04-23 00:07:28 +01:00
Daniel Schwabeneder 08c0f6d9a3 Merge pull request #2612 from daschw/savefig
fix savefig extensions
2020-04-23 00:01:58 +02:00
Daniel Schwabeneder fafb0d9510 format code to tab length of 4 2020-04-22 23:43:38 +02:00
Daniel Schwabeneder df6fa6fd68 fix double extensions in savefig 2020-04-22 23:37:31 +02:00
Daniel Schwabeneder 8b5fc95443 bump version 2020-04-22 19:30:02 +02:00
Daniel Schwabeneder 4e877a206e fix double extensions in savefig 2020-04-22 19:28:12 +02:00
Daniel Schwabeneder c428dcdb3e Merge pull request #2611 from daschw/default
Fix `default()`
2020-04-22 19:01:24 +02:00
Daniel Schwabeneder 77b5951037 fix savefig for .tex extension 2020-04-22 19:00:20 +02:00
Daniel Schwabeneder a1c59b7904 fix default 2020-04-22 18:20:22 +02:00
Simon Christ 8ae8d74c42 bump version
[skip ci]
2020-04-21 18:53:52 +02:00
Simon Christ eba4d2442c don't add .tex to .tikz (#2607)
* don't add .tex to .tikz

If we reach this point, we already checked if the extension is existent.
This used to append `.tex` if saving as `.tikz` file, which is unwanted.

* Update output.jl

* convert symbol to string
2020-04-21 17:47:28 +02:00
Daniel Schwabeneder d1938c5e94 Merge pull request #2608 from isentropic/isen-dev2
Make the legendbox square as in GR in pyplot
2020-04-21 16:53:28 +02:00
Zh 3dbe5cc3a2 Make the legendbox square as in GR 2020-04-21 21:35:37 +09:00
Daniel Schwabeneder 7a6617efe3 Merge pull request #2605 from isentropic/isen-dev
Tick marks now scale according to thickness_scaling
2020-04-20 19:30:32 +02:00
Zh 123eb15434 Merge remote-tracking branch 'origin/isen-dev' into isen-dev 2020-04-21 01:35:07 +09:00
Zh df13011bd3 Tick marks now scale properly with thickness_scaling 2020-04-21 01:34:11 +09:00
Zh 3368fd2c98 Tick marks now scale properly with thickness_scaling 2020-04-21 01:33:52 +09:00
Daniel Schwabeneder 5a78c492bc Merge pull request #2602 from daschw/release
bump version
2020-04-19 23:01:33 +02:00
Daniel Schwabeneder 8e98d1dfde bump version [skip ci] 2020-04-19 23:00:24 +02:00
Simon Christ 2373dda3c4 allow :auto as limit (#2599) 2020-04-19 17:05:04 +02:00
Daniel Schwabeneder 0456ddfe3a Merge pull request #2594 from isentropic/isen-dev2
[pyplot] marker adjustments in the legend
2020-04-19 10:33:35 +02:00
Daniel Schwabeneder fe0858ebcf Merge pull request #2597 from daschw/annotations
fix annotate! shorthands
2020-04-18 19:26:31 +02:00
Daniel Schwabeneder 6bc38eaea3 fix annotate! shorthands 2020-04-18 19:01:42 +02:00
Zh 43456b09f6 [pyplot] marker adjustments 2020-04-18 14:20:24 +09:00
Daniel Schwabeneder fae1cb4884 Merge pull request #2588 from daschw/webio
fix WebIO error for PlotlyJS
2020-04-16 16:54:40 +02:00
Simon Christ 9b4c66be9a adjust markersize (#2589)
* fix px to pt conversion for markers

* fix test

* bump version [skip ci]

@JuliaRegistrator register
2020-04-16 15:13:21 +02:00
Daniel Schwabeneder 2d29ab7017 fix WebIO error for PlotlyJS 2020-04-16 13:22:36 +02:00
Daniel Schwabeneder 3b3a09302f Merge pull request #2584 from isentropic/isen-dev2
Isen dev2
2020-04-16 09:59:29 +02:00
Simon Christ fe92a384b7 fix point meta for colorbars (#2586) 2020-04-16 00:09:28 +02:00
Daniel Schwabeneder befe20700a Merge pull request #2585 from daschw/span
fix vspan and hspan
2020-04-15 22:07:01 +02:00
Daniel Schwabeneder 41b34e59c7 fix vspan and hspan (copy in shape_data) 2020-04-15 19:53:31 +02:00
Zh c01ee17d88 pyplot markercolor 2020-04-16 01:21:05 +09:00
Zh 8c9422f470 py_get<component>color removal;
marker stroke, adjustments
2020-04-16 00:32:33 +09:00
Zh 7c88256ca4 Merge branch 'master' into isen-dev2 2020-04-15 23:33:39 +09:00
Zh f5fe2692e2 Merge branch 'master' into isen-dev 2020-04-15 23:33:26 +09:00
Josef Heinen d00920ca0e Update gr.jl 2020-04-15 15:16:00 +02:00
Daniel Schwabeneder ef36c6bd0a Merge pull request #2581 from daschw/pgfplotsx
add legendtitle for pgfplotsx
2020-04-15 10:53:08 +02:00
Daniel Schwabeneder a64d84ae70 bump version 2020-04-15 10:36:25 +02:00
Daniel Schwabeneder 9c1b30f774 add legendtitle for pgfplotsx 2020-04-15 10:35:29 +02:00
Daniel Schwabeneder ebfe97a692 Merge pull request #2578 from isentropic/isen-dev
fixing default guidefontrotation direction for pyplot
2020-04-15 08:59:51 +02:00
Zh d8c4210e8f fixing default guidefontrotation direction for pyplot 2020-04-14 20:10:39 +09:00
Daniel Schwabeneder a9c0073aff Merge pull request #2571 from JuliaPlots/as/minorchecks
Check finiteness of upper and lower limit in minor ticks
2020-04-13 19:11:28 +02:00
Anshul Singhvi d04bb42f7b Check finiteness of upper and lower limit in minor ticks 2020-04-13 14:49:23 +05:30
Daniel Schwabeneder bf849d90a7 Merge pull request #2569 from daschw/pyplot
fix pyplot shape markers
2020-04-12 17:26:30 +02:00
Daniel Schwabeneder 95157004b6 fix pyplot shape markers 2020-04-12 17:20:46 +02:00
Daniel Schwabeneder c861664aea Merge pull request #2566 from daschw/release
bump version
2020-04-12 10:10:17 +02:00
Daniel Schwabeneder 72983102e3 bump version 2020-04-12 09:40:24 +02:00
Daniel Schwabeneder 693aaa51d7 Merge pull request #2565 from isentropic/isen-dev
guidefontrotation fix for pyplot
2020-04-12 09:39:17 +02:00
Zh 41a32f7782 guidefontrotation fix for pyplot 2020-04-12 16:01:52 +09:00
Daniel Schwabeneder 5d99c19de1 Merge pull request #2562 from daschw/plotly
fix scale_func for plotly
2020-04-11 17:03:44 +02:00
Daniel Schwabeneder d942660f91 fix scale_func for plotly 2020-04-11 17:01:23 +02:00
Josef Heinen c238d42e83 gr: added initial support for GR vector fonts 2020-04-11 09:50:59 +02:00
Josef Heinen 03a27994d5 Merge remote-tracking branch 'upstream/master' 2020-04-11 09:42:47 +02:00
Daniel Schwabeneder 1f7773ae4c Merge pull request #2561 from mbfstudios/pgfplotsx-fix-minor-ticks
Fix error when setting minor ticks. See #2560
2020-04-10 23:52:16 +02:00
Mats 4a5c82ec7f Fix error when setting minor ticks
Fix type error when specifying number of minor ticks for PGFPlotsX backend.
2020-04-10 22:44:31 +02:00
Daniel Schwabeneder 70f207f5cc Merge pull request #2557 from JuliaPlots/ds/rewrite
Use RecipesPipeline
2020-04-10 20:46:38 +02:00
Daniel Schwabeneder a1cd3d8f95 don't require julia 1.1 2020-04-10 19:47:09 +02:00
Daniel Schwabeneder 848b53e7d7 fix 3d plots 2020-04-10 19:45:11 +02:00
Daniel Schwabeneder 987456760c update precompiles 2020-04-10 19:22:45 +02:00
Daniel Schwabeneder 4c43f0ea2f be explicit about RecipesPipeline imports 2020-04-10 19:06:53 +02:00
Daniel Schwabeneder 7d69795364 require julia version 1.1 2020-04-10 16:14:59 +02:00
Daniel Schwabeneder 059985c91c revert travis test command 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 9fe3428a55 update Project.toml 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 92d8bd7836 move some recipes to recipepipeline 2020-04-10 16:09:49 +02:00
Sebastian Micluța-Câmpeanu 2a88ab7726 Rename to RecipesPipeline 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder d8f516a456 fix recipepipeline url in travis 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 28ce7d7995 add recipepipeline manually in travis 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder b6139e2403 remove include 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 80ec6f03b4 depend on RecipePipeline 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 330739298c update and enable precompiles 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder bd9cd64e7a move remaining user recipes in series.jl to recipes.jl 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder f73b281996 extract the recipe pipeline into separate submodule 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder f180c666d2 rename some functions 2020-04-10 16:09:49 +02:00
Daniel Schwabeneder 908779f0c6 Merge pull request #2559 from daschw/gr-box
Fix axis arguments in PLOTS_DEFAULTS
2020-04-10 16:07:11 +02:00
Daniel Schwabeneder 345c3bc928 bump version 2020-04-10 16:05:06 +02:00
Daniel Schwabeneder bbdf1dcc0e fix axis agruments in PLOTS_DEFAULTS 2020-04-10 16:04:17 +02:00
Daniel Schwabeneder 5da2d85420 Merge pull request #2558 from daschw/gr-box
fix axis limits with GR framestyle border
2020-04-10 16:02:46 +02:00
Daniel Schwabeneder 5f524d039f fix axis limits with GR framestyle border 2020-04-10 15:15:36 +02:00
Daniel Schwabeneder 824d502c37 Merge pull request #2556 from daschw/gr-box
Gr box
2020-04-10 08:49:07 +02:00
Daniel Schwabeneder 36ff017c4f bump version 2020-04-10 08:31:03 +02:00
Daniel Schwabeneder 3ef9fe142c fix box and semi framestyle for GR 2020-04-10 08:05:36 +02:00
Daniel Schwabeneder 4bf0c496d8 Merge pull request #2553 from daschw/pgfplotsx
minorgrid, minorticks and framestyle zerolines fix for pgfplotsx
2020-04-09 21:37:52 +02:00
Daniel Schwabeneder 9bf4bda852 fix zerolines framestyle and don't draw tick marks for zerolines and grid framestyle 2020-04-09 18:13:28 +02:00
Daniel Schwabeneder fa7f10a6e9 implement minorgrid for pgfplotsx 2020-04-09 17:56:54 +02:00
Simon Christ 483e45db8a fix topleft 2020-04-09 16:11:02 +02:00
Simon Christ e6097f4534 all the legend positions (#2550)
* all the legend positions

* fix default
2020-04-09 14:18:15 +02:00
Daniel Schwabeneder 749f56084a Merge pull request #2551 from daschw/webio
fix webio error for plotlyjs
2020-04-09 10:57:32 +02:00
Daniel Schwabeneder 2fa4a63f02 fix webio error for plotlyjs 2020-04-09 10:55:33 +02:00
Michael Krabbe Borregaard 9b1249abce Merge pull request #2512 from JuliaPlots/compathelper/new_version/2020-03-28-15-04-44-941-2889142658
CompatHelper: bump compat for "StatsBase" to "0.33"
2020-04-08 14:24:28 +02:00
Simon Christ bbfc0bc77a Update Project.toml 2020-04-08 10:09:36 +02:00
Simon Christ 5a416e51d2 fix warning 2020-04-08 10:09:06 +02:00
Daniel Schwabeneder 67ba06cd77 Merge pull request #2548 from daschw/surface
Implement zerror and surface type recipe fixes
2020-04-07 17:50:32 +02:00
Daniel Schwabeneder aa61d681d9 bump version 2020-04-07 16:27:33 +02:00
Daniel Schwabeneder c8e6b967e5 add errorbar test example 2020-04-07 16:27:02 +02:00
Daniel Schwabeneder 819e91aa37 add zerror recipe 2020-04-07 16:06:12 +02:00
Daniel Schwabeneder 7f835cf7cb Merge pull request #2546 from isentropic/isen-dev
new aliases
2020-04-07 13:51:10 +02:00
Daniel Schwabeneder 43571e6d40 Merge pull request #2547 from Libbum/empty-fix
Fix 'isempy' check
2020-04-07 13:50:55 +02:00
Tim DuBois dd3666b6d3 Fix 'isempy' check 2020-04-07 13:33:16 +02:00
Simon Christ f98b191616 Layouting (#2486)
* distances very big

* better default

* respect margins

* remove failing example
2020-04-07 10:44:22 +02:00
Zhanibek 9fdcf0db74 new aliases 2020-04-07 17:23:05 +09:00
Daniel Schwabeneder 7abab41f2b add letter in surface type recipe 2020-04-07 09:52:32 +02:00
Josef Heinen a05d31a472 Merge remote-tracking branch 'upstream/master' 2020-04-07 09:21:52 +02:00
Daniel Schwabeneder 45569c0d4d Merge pull request #2544 from JeffBezanson/jb/optlevel1
use -O1 for code in Plots.jl
2020-04-06 22:59:32 +02:00
Simon Christ ca653c5bec Merge pull request #2541 from JuliaPlots/bbs/sani
special case LaTeXStrings in sanitation
2020-04-06 22:33:13 +02:00
Simon Christ 6c0539bac6 Merge pull request #2545 from JuliaPlots/bbs/annotations
fix annotations
2020-04-06 22:28:06 +02:00
Simon Christ 65c9a46c8d rely on require 2020-04-06 22:00:51 +02:00
Simon Christ 7bd97558dc fix annotations 2020-04-06 21:41:11 +02:00
Jeff Bezanson 6807f53a7e use -O1 for code in Plots.jl 2020-04-06 15:01:33 -04:00
Daniel Schwabeneder ae396ef576 Merge pull request #2543 from daschw/typesurface
allow type recipes for numbers in surfaces
2020-04-06 18:06:56 +02:00
Daniel Schwabeneder 3dd1c500cf fix ambiguity 2020-04-06 17:40:31 +02:00
Daniel Schwabeneder 59e4129194 skip maybestrings 2020-04-06 17:25:18 +02:00
Daniel Schwabeneder 54d441b62a bump versio 2020-04-06 17:10:27 +02:00
Daniel Schwabeneder f8d36363b4 allow type recipes for numbers in surfaces 2020-04-06 17:09:00 +02:00
Daniel Schwabeneder c32c7fda58 Merge pull request #2542 from harryscholes/splatted_annotations
Fix #2487
2020-04-06 16:32:44 +02:00
harryscholes 87b220e747 Fix #2487 2020-04-06 15:15:55 +01:00
Simon Christ 57a6f4303b special case LaTeXStrings 2020-04-06 15:44:06 +02:00
Josef Heinen 9f7474476a Merge remote-tracking branch 'upstream/master' 2020-04-05 17:09:49 +02:00
Josef Heinen 5f744dac68 Merge remote-tracking branch 'upstream/master' 2020-04-02 17:31:20 +02:00
Josef Heinen c3a9eb8866 Merge remote-tracking branch 'upstream/master' 2020-03-31 11:50:03 +02:00
Josef Heinen a6aa39e3cc Merge remote-tracking branch 'upstream/master' 2020-03-30 10:37:53 +02:00
Josef Heinen 1c66f4bf90 Merge remote-tracking branch 'upstream/master' 2020-03-29 10:45:41 +02:00
github-actions[bot] dc5ae4ef96 CompatHelper: bump compat for "StatsBase" to "0.33" 2020-03-28 15:04:45 +00:00
Josef Heinen d9dba5091b Merge remote-tracking branch 'upstream/master' 2020-03-26 12:57:48 +01:00
Josef Heinen c94746f3f2 Merge remote-tracking branch 'upstream/master' 2020-03-24 10:41:52 +01:00
Josef Heinen b6dddcb15b Merge remote-tracking branch 'upstream/master' 2020-03-22 09:10:11 +01:00
Josef Heinen 2849082f1f Merge remote-tracking branch 'upstream/master' 2020-03-19 10:35:14 +01:00
Josef Heinen 038cf2b133 Merge remote-tracking branch 'upstream/master' 2020-03-18 16:16:21 +01:00
Josef Heinen a9e2a5f639 Merge remote-tracking branch 'upstream/master' 2020-03-18 08:38:35 +01:00
Josef Heinen c9421be214 Merge pull request #10 from jheinen/compathelper/new_version/2020-03-13-16-05-59-376-460145100
CompatHelper: bump compat for "GR" to "0.48"
2020-03-13 17:07:18 +01:00
github-actions[bot] 9fc707bd94 CompatHelper: bump compat for "GR" to "0.48" 2020-03-13 16:06:00 +00:00
Josef Heinen 236cc4671e Merge remote-tracking branch 'upstream/master' 2020-03-10 12:02:49 +01:00
Josef Heinen a301366ef6 Merge remote-tracking branch 'upstream/master' 2020-03-07 10:53:02 +01:00
Josef Heinen c1959cb993 Merge remote-tracking branch 'upstream/master' 2020-02-29 12:16:47 +01:00
Josef Heinen ecf71a43d3 Merge pull request #8 from jheinen/compathelper/new_version/2020-02-27-15-07-43-107-2999057488
CompatHelper: bump compat for "GR" to "0.47"
2020-02-27 17:51:30 +01:00
github-actions[bot] b65dfc6767 CompatHelper: bump compat for "GR" to "0.47" 2020-02-27 15:07:44 +00:00
89 changed files with 16279 additions and 9958 deletions
+12
View File
@@ -0,0 +1,12 @@
always_for_in = true
import_to_using = false
align_pair_arrow = true
align_assignment = true
align_conditional = true
always_use_return = false
conditional_to_if = false
whitespace_in_kwargs = true
remove_extra_newlines = true
whitespace_ops_in_indices = true
short_to_long_function_def = false
annotate_untyped_fields_with_any = false
+6
View File
@@ -0,0 +1,6 @@
# Set default behaviour to automatically normalize line endings.
* text=auto
# Force bash scripts to always use lf line endings so that if a repo is accessed
# in Unix via a file share from Windows, the scripts will work.
*.sh text eol=lf
+33
View File
@@ -0,0 +1,33 @@
---
name: Bug report
about: Create a bug report
title: "[BUG]"
labels: bug
assignees: ''
---
<!-- Please search existing issues to avoid duplicates. -->
## Details
### Backends
This bug occurs on ( insert `x` below )
Backend | yes | no | untested
-------------|-----|-----|---------
gr (default) | | |
pyplot | | |
plotlyjs | | |
pgfplotsx | | |
unicodeplots | | |
inspectdr | | |
gaston | | |
### Versions
Plots.jl version:
Backend version (`]st -m <backend(s)>`):
Output of `versioninfo()`:
+10
View File
@@ -0,0 +1,10 @@
---
name: Feature request
about: Suggest a feature or enhancement
title: "[FR]"
labels: feature request
assignees: ''
---
Please search existing issues to avoid duplicates.
+3 -10
View File
@@ -2,23 +2,16 @@ name: CompatHelper
on:
schedule:
- cron: '00 * * * *'
- cron: '00 00 * * *'
jobs:
CompatHelper:
runs-on: ${{ matrix.os }}
strategy:
matrix:
julia-version: [1.2.0]
julia-arch: [x86]
os: [ubuntu-latest]
runs-on: ubuntu-latest
steps:
- uses: julia-actions/setup-julia@latest
with:
version: ${{ matrix.julia-version }}
- name: Pkg.add("CompatHelper")
run: julia -e 'using Pkg; Pkg.add("CompatHelper")'
- name: CompatHelper.main()
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMPATHELPER_PRIV: ${{ secrets.COMPATHELPER_PRIV }} # optional
run: julia -e 'using CompatHelper; CompatHelper.main()'
+107
View File
@@ -0,0 +1,107 @@
# NOTE: this file should be named 'SnoopCompile.yml', cf github.com/aminya/CompileBot.jl/blob/master/src/CompileBot.jl#L57
name: SnoopCompile
on:
push:
branches:
- master # NOTE: to run the bot only on pushes to master
defaults:
run:
shell: bash
jobs:
SnoopCompile:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
env:
GKS_ENCODING: "utf8"
GKSwstype: "nul"
PLOTS_TEST: "true"
runs-on: ${{matrix.os}}
strategy:
fail-fast: false
matrix:
version: # NOTE: the versions below should match those in your botconfig
- '1.6' # ⎤
- '1.7' # |
- '~1.8.0-0' # |
# - 'nightly' # ⎦ <<< keep these versions in sync with deps/SnoopCompile/snoop_bot_config.jl
# ^^^^^^^^^ for 'nightly', see github.com/JuliaPlots/Plots.jl/issues/4079
os: # NOTE: should match the os setting of your botconfig
- ubuntu-latest
arch:
- x64
steps:
# Setup environment
- uses: actions/checkout@v2
- uses: julia-actions/setup-julia@latest
with:
version: ${{matrix.version}}
- name: Set Swap Space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10 # required (not enough memory on github actions virtual machine)
- name: Install dependencies
run: |
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/swaps
free
df -h
julia --project -e 'using Pkg; Pkg.instantiate()'
julia -e 'using Pkg; Pkg.add(PackageSpec(name="CompileBot", version="1")); Pkg.develop(PackageSpec(; path=pwd())); using CompileBot; CompileBot.addtestdep()'
# TESTCMD
- name: Default TESTCMD
run: echo "TESTCMD=julia" >> $GITHUB_ENV
- name: Ubuntu TESTCMD
if: startsWith(matrix.os,'ubuntu')
run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
# Generate precompile files
- name: Generating precompile files
run: $TESTCMD --project -e 'include("deps/SnoopCompile/snoop_bot.jl")' # NOTE: must match path
# Run benchmarks
- name: Running Benchmark
run: $TESTCMD --project -e 'include("deps/SnoopCompile/snoop_bench.jl")' # NOTE: optional, if have benchmark file
- name: Upload all
uses: actions/upload-artifact@v2.0.1
with:
path: ./
Create_PR:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
needs: SnoopCompile
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Download all
uses: actions/download-artifact@v2
- name: CompileBot postprocess
run: |
if ! grep -m1 -q 'format: off' artifact/src/precompile_includer.jl; then sed -i '1 i\#! format: off' artifact/src/precompile_includer.jl; fi
julia -e 'using Pkg; Pkg.add(PackageSpec(name="CompileBot", version="1")); using CompileBot; CompileBot.postprocess()'
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Update precompile_*.jl file [skip ci]
title: "[AUTO] Update precompiles [skip ci]"
labels: |
SnoopCompile
no changelog
branch: "Test_SnoopCompile_AutoPR_${{ github.ref }}"
Skip:
if: "contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- name: Skip CI 🚫
run: echo skip ci
+6 -2
View File
@@ -1,11 +1,15 @@
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
with:
token: ${{ secrets.GITHUB_TOKEN }}
ssh: ${{ secrets.TAGBOT_KEY }}
+31
View File
@@ -0,0 +1,31 @@
name: benchmarks
on:
pull_request:
jobs:
Benchmark:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: julia-actions/setup-julia@latest
with:
version: '1.7'
# Setup
- name: Ubuntu TESTCMD
run: echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
- name: Install Plots dependencies
uses: julia-actions/julia-buildpkg@latest
- name: Install Benchmarking dependencies
run: julia -e 'using Pkg; pkg"add PkgBenchmark BenchmarkCI@0.1"'
- name: Run benchmarks
run: $TESTCMD -e 'using BenchmarkCI; BenchmarkCI.judge()'
- name: Print judgement
run: julia -e 'using BenchmarkCI; BenchmarkCI.displayjudgement()'
- name: Post results
run: julia -e 'using BenchmarkCI; BenchmarkCI.postjudge()'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+93
View File
@@ -0,0 +1,93 @@
name: ci
on:
push:
branches:
- master
pull_request:
defaults:
run:
shell: bash
jobs:
CI:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
env:
GKS_ENCODING: "utf8"
GKSwstype: "nul"
name: Julia ${{ matrix.version }} - ${{ matrix.os }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.version == 'nightly' }}
strategy:
fail-fast: false
matrix:
version:
- '1.6' # LTS
- '1.7' # latest stable
os:
- ubuntu-latest
- windows-latest
- macos-latest
arch:
- x64
# - x86
include:
- version: 'nightly'
os: ubuntu-latest
steps:
# Setup environment
- uses: actions/checkout@v2
- uses: julia-actions/setup-julia@latest
with:
version: ${{ matrix.version }}
- name: Cache artifacts
uses: actions/cache@v1
env:
cache-name: cache-artifacts
with:
path: ~/.julia/artifacts
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
restore-keys: |
${{ runner.os }}-test-${{ env.cache-name }}-
${{ runner.os }}-test-
${{ runner.os }}-
# TESTCMD
- name: Default TESTCMD
run: echo "TESTCMD=julia" >> $GITHUB_ENV
- name: Ubuntu TESTCMD
if: startsWith(matrix.os,'ubuntu')
run: |
echo "TESTCMD=xvfb-run --auto-servernum julia" >> $GITHUB_ENV
sudo apt-get -y update
sudo apt-get -y install gnuplot poppler-utils texlive-{latex-base,latex-extra,luatex}
sudo fc-cache -vr
# Julia Dependencies
- name: Install Julia dependencies
uses: julia-actions/julia-buildpkg@latest
# Run tests
- name: Run Graphical test
run: |
$TESTCMD --project -e 'using Pkg; Pkg.test(coverage=true)'
$TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("StatsPlots"); Pkg.test("StatsPlots")'
$TESTCMD -e 'using Pkg; Pkg.activate(tempdir()); Pkg.develop(path=abspath(".")); Pkg.add("GraphRecipes"); Pkg.test("GraphRecipes")'
# Codecov
- uses: julia-actions/julia-processcoverage@v1
if: startsWith(matrix.os,'ubuntu')
- uses: codecov/codecov-action@v2
if: startsWith(matrix.os,'ubuntu')
with:
file: lcov.info
Skip:
if: "contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- name: Skip CI 🚫
run: echo skip ci
+34
View File
@@ -0,0 +1,34 @@
name: docs
on:
workflow_dispatch:
push:
branches:
- master
tags: '*'
jobs:
Build_docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
repository: JuliaPlots/PlotDocs.jl
- uses: julia-actions/setup-julia@v1
- name: Cache artifacts
uses: actions/cache@v1
env:
cache-name: cache-artifacts
with:
path: ~/.julia/artifacts
key: ${{runner.os}}-test-${{env.cache-name}}-${{hashFiles('**/Project.toml')}}
restore-keys: |
${{runner.os}}-test-${{env.cache-name}}-
${{runner.os}}-test-
${{runner.os}}-
- name: Build documentation
env:
PYTHON: ""
DOCUMENTER_KEY: ${{secrets.DOCUMENTER_KEY}}
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
run: bash docs/ci_build.sh
+54
View File
@@ -0,0 +1,54 @@
name: format
on:
pull_request:
push:
branches:
- 'master'
jobs:
code-style:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: julia-actions/setup-julia@v1
- name: Install dependencies
run: |
using Pkg
Pkg.add([
PackageSpec("JuliaFormatter"),
PackageSpec(url = "https://github.com/tkf/JuliaProjectFormatter.jl.git"),
])
shell: julia --color=yes {0}
- name: Format Julia files
run: |
using JuliaFormatter
format(["src", "test"])
shell: julia --color=yes --compile=min -O0 {0}
- name: suggester / JuliaFormatter
uses: reviewdog/action-suggester@v1
with:
tool_name: JuliaFormatter
fail_on_error: true
# reviewdog/action-suggester not using `cleanup` flag?
- name: Cleanup
if: success() || failure()
run: |
git checkout -- .
git clean --force
shell: bash
- name: Format Julia project files
if: success() || failure()
run: |
using JuliaProjectFormatter
format_projects()
shell: julia --color=yes --compile=min -O0 {0}
- name: suggester / JuliaProjectFormatter
if: success() || failure()
uses: reviewdog/action-suggester@v1
with:
tool_name: JuliaProjectFormatter
fail_on_error: true
+35
View File
@@ -0,0 +1,35 @@
name: format
on:
schedule:
- cron: '0 0 1 * *'
jobs:
pr:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install JuliaFormatter and format
run: |
julia -e 'using Pkg; Pkg.add(PackageSpec(name="JuliaFormatter"))'
julia -e 'using JuliaFormatter; [format(["src", "test"]) for _ in 1:2]'
git diff --exit-code
- name: Create Pull Request
if: ${{ failure() }}
id: cpr
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Format .jl files [skip ci]"
title: 'Automatic JuliaFormatter.jl run'
branch: auto-juliaformatter-pr
delete-branch: true
labels: formatting, automated pr, no changelog
- name: Check outputs
if: ${{ failure() }}
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
+4 -1
View File
@@ -4,9 +4,12 @@
.DS_Store
examples/.ipynb_checkpoints/*
examples/meetup/.ipynb_checkpoints/*
deps/plotly-latest.min.js
deps/plotly-*
deps/build.log
deps/deps.jl
Manifest.toml
dev/
test/tmpplotsave.hdf5
/.benchmarkci
/benchmark/*.json
.vscode/
-44
View File
@@ -1,44 +0,0 @@
# Documentation: http://docs.travis-ci.com/user/languages/julia/
language: julia
os:
- linux
# - osx
julia:
- 1.0
- 1
- nightly
matrix:
allow_failures:
- julia: nightly
addons:
apt:
packages:
- at-spi2-core
- libgtk-3-dev
- xauth
- xvfb
env:
- GKS_ENCODING="utf8"
cache:
directories:
- $HOME/.julia/artifacts
sudo: required
before_install:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pwd ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./test/install_wkhtmltoimage.sh ; fi
notifications:
email: true
after_success:
- julia -e 'using Pkg; Pkg.add("Coverage"); using Coverage; Codecov.submit(process_folder())'
script:
- if [[ -a .git/shallow ]]; then git fetch --unshallow; fi
- if [[ `uname` = "Linux" ]]; then TESTCMD="xvfb-run julia"; else TESTCMD="julia"; fi
- $TESTCMD -e 'using Pkg; Pkg.build(); Pkg.test(coverage=true)'
+718
View File
@@ -0,0 +1,718 @@
{
"title": "Plots.jl",
"license": "MIT",
"creators": [
{
"affiliation": "Headlands Technologies",
"name": "Tom Breloff"
}
],
"contributors":[
{
"affiliation": "TU Wien",
"name": "Daniel Schwabeneder",
"orcid": "0000-0002-0412-0777",
"type": "ProjectLeader"
},
{
"affiliation": "GLOBE Institute, University of Copenhagen",
"name": "Michael Krabbe Borregaard",
"orcid": "0000-0002-8146-8435",
"type": "ProjectLeader"
},
{
"affiliation": "Leibniz Universit\u00e4t Hannover",
"name": "Simon Christ",
"orcid": "0000-0002-5866-1472",
"type": "ProjectLeader"
},
{
"affiliation": "Forschungszentrum J\u00fclich",
"name": "Josef Heinen",
"orcid": "0000-0001-6509-1925",
"type": "ProjectMember"
},
{
"name": "Yuval",
"type": "Other"
},
{
"name": "Andrew Palugniok",
"type": "ProjectMember"
},
{
"affiliation": "@beacon-biosignals",
"name": "Simon Danisch",
"type": "Other"
},
{
"affiliation": "Veos Digital (https://veos.digital/)",
"name": "Pietro Vertechi",
"type": "ProjectMember"
},
{
"affiliation": "Korea Advanced Inst. of Science and Technology (KAIST)",
"name": "Zhanibek Omarov",
"type": "ProjectMember",
"orcid": "0000-0002-8783-8791"
},
{
"name": "Thatcher Chamberlin",
"type": "Other"
},
{
"name": "@ma-laforge",
"type": "ProjectMember"
},
{
"affiliation": "Massachusetts Institute of Technology",
"name": "Christopher Rackauckas",
"orcid": "0000-0001-5850-0663",
"type": "Other"
},
{
"affiliation": "Max Planck Institute for Physics",
"name": "Oliver Schulz",
"type": "Other"
},
{
"affiliation": "@JuliaComputing",
"name": "Sebastian Pfitzner",
"type": "Other"
},
{
"name": "Takafumi Arakaki",
"type": "Other"
},
{
"affiliation": "University of Manitoba",
"name": "Amin Yahyaabadi",
"type": "Other"
},
{
"name": "Jack Devine",
"type": "Other"
},
{
"name": "Sebastian Pech",
"type": "Other"
},
{
"affiliation": "@JuliaComputing",
"name": "Patrick Kofod Mogensen",
"type": "Other",
"orcid": "0000-0002-4910-1932"
},
{
"name": "Samuel S. Watson",
"type": "Other"
},
{
"affiliation": "UC Davis",
"name": "Naoki Saito",
"orcid": "0000-0001-5234-4719",
"type": "Other"
},
{
"affiliation": "University of Southern California (USC)",
"name": "Benoit Pasquier",
"orcid": "0000-0002-3838-5976",
"type": "Other"
},
{
"affiliation": "NTNU Trondheim",
"name": "Ronny Bergmann",
"orcid": "0000-0001-8342-7218",
"type": "Other"
},
{
"name": "Andy Nowacki",
"affiliation": "University of Leeds",
"orcid": "0000-0001-7669-7383",
"type": "Other"
},
{
"name": "Ian Butterworth",
"type": "Other"
},
{
"affiliation": "Lund University",
"name": "David Gustavsson",
"type": "Other"
},
{
"name": "Anshul Singhvi",
"affiliation": "Columbia University",
"orcid": "0000-0001-6055-1291",
"type": "Other"
},
{
"name": "david-macmahon",
"type": "Other"
},
{
"name": "Fredrik Ekre",
"type": "Other"
},
{
"name": "Maaz Bin Tahir Saeed",
"type": "Other"
},
{
"name": "Kristoffer Carlsson",
"type": "Other"
},
{
"name": "Will Kearney",
"type": "Other"
},
{
"name": "Niklas Korsbo",
"type": "Other"
},
{
"name": "Miles Lucas",
"type": "Other"
},
{
"name": "@Godisemo",
"type": "Other"
},
{
"name": "Florian Oswald",
"type": "Other"
},
{
"name": "Diego Javier Zea",
"type": "Other"
},
{
"name": "@WillRam",
"type": "Other"
},
{
"name": "Fedor Bezrukov",
"type": "Other"
},
{
"name": "Spencer Lyon",
"type": "Other"
},
{
"name": "Darwin Darakananda",
"type": "Other"
},
{
"name": "Lukas Hauertmann",
"type": "Other"
},
{
"name": "Huckleberry Febbo",
"type": "Other"
},
{
"name": "@H-M-H",
"type": "Other"
},
{
"name": "Josh Day",
"type": "Other"
},
{
"name": "@wfgra",
"type": "Other"
},
{
"name": "Sheehan Olver",
"type": "Other"
},
{
"name": "Jerry Ling",
"type": "Other"
},
{
"name": "Jks Liu",
"type": "Other"
},
{
"name": "Seth Axen",
"type": "Other"
},
{
"name": "@o01eg",
"type": "Other"
},
{
"name": "Sebastian Micluța-Câmpeanu",
"type": "Other"
},
{
"name": "Tim Holy",
"type": "Other"
},
{
"name": "Tony Kelman",
"type": "Other"
},
{
"name": "Antoine Levitt",
"type": "Other"
},
{
"name": "Iblis Lin",
"type": "Other"
},
{
"name": "Harry Scholes",
"type": "Other"
},
{
"name": "@djsegal",
"type": "Other"
},
{
"name": "Goran Nakerst",
"type": "Other"
},
{
"name": "Felix Hagemann",
"type": "Other"
},
{
"name": "Matthieu Gomez",
"type": "Other"
},
{
"name": "@biggsbiggsby",
"type": "Other"
},
{
"name": "Jonathan Anderson",
"type": "Other"
},
{
"name": "Michael Kraus",
"type": "Other"
},
{
"name": "Carlo Lucibello",
"type": "Other"
},
{
"name": "Robin Deits",
"type": "Other"
},
{
"name": "Misha Mkhasenko",
"type": "Other"
},
{
"name": "Benoît Legat",
"type": "Other"
},
{
"name": "Steven G. Johnson",
"type": "Other"
},
{
"name": "John Verzani",
"type": "Other"
},
{
"name": "Mattias Fält",
"type": "Other"
},
{
"name": "Rashika Karki",
"type": "Other"
},
{
"name": "Morten Piibeleht",
"type": "Other"
},
{
"name": "Filippo Vicentini",
"type": "Other"
},
{
"name": "David Anthoff",
"type": "Other"
},
{
"name": "Leon Wabeke",
"type": "Other"
},
{
"name": "Yusuke Kominami",
"type": "Other"
},
{
"name": "Oscar Dowson",
"type": "Other"
},
{
"name": "Max G",
"type": "Other"
},
{
"name": "Fabian Greimel",
"type": "Other"
},
{
"name": "Jérémy",
"type": "Other"
},
{
"name": "Pearl Li",
"type": "Other"
},
{
"name": "David P. Sanders",
"type": "Other"
},
{
"name": "Asbjørn Nilsen Riseth",
"type": "Other"
},
{
"name": "Jan Weidner",
"type": "Other"
},
{
"name": "@jakkor2",
"type": "Other"
},
{
"name": "Pablo Zubieta",
"type": "Other"
},
{
"name": "Hamza Yusuf Çakır",
"type": "Other"
},
{
"name": "John Rinehart",
"type": "Other"
},
{
"name": "Martin Biel",
"type": "Other"
},
{
"name": "Moritz Schauer",
"type": "Other"
},
{
"name": "Mosè Giodano",
"type": "Other"
},
{
"name": "@olegshtch",
"type": "Other"
},
{
"name": "Leon Shen",
"type": "Other"
},
{
"name": "Jeff Fessler",
"type": "Other"
},
{
"name": "@hustf",
"type": "Other"
},
{
"name": "Asim H Dar",
"type": "Other"
},
{
"name": "@8uurg",
"type": "Other"
},
{
"name": "Abel Siqueira",
"type": "Other"
},
{
"name": "Adrian Dawid",
"type": "Other"
},
{
"name": "Alberto Lusiani",
"type": "Other"
},
{
"name": "Balázs Mezei",
"type": "Other"
},
{
"name": "Ben Ide",
"type": "Other"
},
{
"name": "Benjamin Lungwitz",
"type": "Other"
},
{
"affiliation": "University of Graz",
"name": "Bernd Riederer",
"type": "Other",
"orcid": "0000-0001-8390-0087"
},
{
"name": "Christina Lee",
"type": "Other"
},
{
"name": "Christof Stocker",
"type": "Other"
},
{
"name": "Christoph Finkensiep",
"type": "Other"
},
{
"name": "@Cornelius-G",
"type": "Other"
},
{
"name": "Daniel Høegh",
"type": "Other"
},
{
"name": "Denny Biasiolli",
"type": "Other"
},
{
"name": "Dieter Castel",
"type": "Other"
},
{
"name": "Elliot Saba",
"type": "Other"
},
{
"name": "Fengyang Wang",
"type": "Other"
},
{
"name": "Fons van der Plas",
"type": "Other"
},
{
"name": "Fredrik Bagge Carlson",
"type": "Other"
},
{
"name": "Graham Smith",
"type": "Other"
},
{
"name": "Hayato Ikoma",
"type": "Other"
},
{
"name": "Hessam Mehr",
"type": "Other"
},
{
"name": "@InfiniteChai",
"type": "Other"
},
{
"name": "Jack Dunn",
"type": "Other"
},
{
"name": "Jeff Bezanson",
"type": "Other"
},
{
"name": "Jeff Eldredge",
"type": "Other"
},
{
"name": "Jinay Jain",
"type": "Other"
},
{
"name": "Johan Blåbäck",
"type": "Other"
},
{
"name": "@jmert",
"type": "Other"
},
{
"name": "Lakshya Khatri",
"type": "Other"
},
{
"name": "Lia Siegelmann",
"type": "Other"
},
{
"name": "@marekkukan-tw",
"type": "Other"
},
{
"affiliation": "ETH Zurich",
"name": "Mauro Werder",
"type": "Other",
"orcid": "0000-0003-0137-9377"
},
{
"name": "Maxim Grechkin",
"type": "Other"
},
{
"name": "Michael Cawte",
"type": "Other"
},
{
"name": "@milesfrain",
"type": "Other"
},
{
"name": "Nicholas Bauer",
"type": "Other"
},
{
"name": "Nicolau Leal Werneck",
"type": "Other"
},
{
"name": "@nilshg",
"type": "Other"
},
{
"name": "Oliver Evans",
"type": "Other"
},
{
"name": "Peter Gagarinov",
"type": "Other"
},
{
"name": "Páll Haraldsson",
"type": "Other"
},
{
"name": "Rik Huijzer",
"type": "Other"
},
{
"name": "Romain Franconville",
"type": "Other"
},
{
"name": "Ronan Pigott",
"type": "Other"
},
{
"name": "Roshan Shariff",
"type": "Other"
},
{
"name": "Scott Thomas",
"type": "Other"
},
{
"name": "Sebastian Rollén",
"type": "Other"
},
{
"name": "Seth Bromberger",
"type": "Other"
},
{
"name": "Siva Swaminathan",
"type": "Other"
},
{
"name": "Tim DuBois",
"type": "Other"
},
{
"name": "Travis DePrato",
"type": "Other"
},
{
"name": "Will Thompson",
"type": "Other"
},
{
"name": "Yakir Luc Gagnon",
"type": "Other"
},
{
"name": "Benjamin Chislett",
"type": "Other"
},
{
"name": "@hhaensel",
"type": "Other"
},
{
"name": "@improbable22",
"type": "Other"
},
{
"name": "Johannes Fleck",
"type": "Other"
},
{
"name": "Peter Czaban",
"type": "Other"
},
{
"name": "@innerlee",
"type": "Other"
},
{
"name": "Mats Cronqvist",
"type": "Other"
},
{
"name": "Shi Pengcheng",
"type": "Other"
},
{
"name": "@wg030",
"type": "Other"
},
{
"affiliation": "University of Cambridge",
"name": "Will Tebbutt",
"type": "Other"
},
{
"name": "@t-bltg",
"type": "Other"
},
{
"name": "Fred Callaway",
"type": "Other"
},
{
"name": "Jan Thorben Schneider",
"type": "Other"
},
{
"orcid": "0000-0003-4102-2460",
"affiliation": "Alogus Research Corporation",
"name": "Lee Phillips",
"type": "Other"
},
{
"name": "Tom Gillam",
"type": "Other"
},
{
"name": "Steve Leung",
"type": "Other"
}
],
"upload_type": "software"
}
+1 -1
View File
@@ -3,7 +3,7 @@
#### notes on release changes, ongoing development, and future planned work
## (current master)
## NOTE: this file is deprecated, see the [TagBot](https://github.com/marketplace/actions/julia-tagbot) auto-generated changelogs instead
## 0.28.3
- support generalized array interface
+42 -20
View File
@@ -1,17 +1,19 @@
name = "Plots"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
author = ["Tom Breloff (@tbreloff)"]
version = "1.0.2"
version = "1.28.0"
[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
Contour = "d38c429a-6771-53c6-b99e-75d170b6e991"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
FFMPEG = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
@@ -22,50 +24,70 @@ Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
RecipesPipeline = "01d81517-befc-4cb6-b9ec-a95719d0359c"
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
Scratch = "6c6a2e73-6563-6170-7368-637461726353"
Showoff = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
UnicodeFun = "1cfade01-22cf-5700-b092-accc4b62d6e1"
Unzip = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d"
[compat]
Contour = "0.5"
FFMPEG = "0.2, 0.3"
FixedPointNumbers = "0.6, 0.7, 0.8"
GR = "0.46, 0.47, 0.48"
GeometryTypes = "0.7, 0.8"
JSON = "0.21"
FFMPEG = "0.2 - 0.4"
FixedPointNumbers = "0.6 - 0.8"
GR = "0.64"
GeometryBasics = "0.2, 0.3.1, 0.4"
JSON = "0.21, 1"
Latexify = "0.14 - 0.15"
Measures = "0.3"
NaNMath = "0.3"
PGFPlotsX = "1.2.0"
PlotThemes = "1"
PlotUtils = "0.6.5"
RecipesBase = "1"
Reexport = "0.2"
Requires = "0.5, 1.0"
Showoff = "0.3.1"
StatsBase = "0.32"
julia = "1"
NaNMath = "0.3, 1"
PGFPlotsX = "1"
PlotThemes = "2, 3"
PlotUtils = "1"
PlotlyBase = "0.7"
PlotlyJS = "0.18"
PyPlot = "2"
RecipesBase = "1.2"
RecipesPipeline = "0.5"
Reexport = "0.2, 1.0"
Requires = "1"
Scratch = "1"
Showoff = "0.3.1, 1.0"
StatsBase = "0.32 - 0.33"
UnicodeFun = "0.4"
UnicodePlots = "2.10"
Unzip = "0.1"
julia = "1.6"
[extras]
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
Gaston = "4b11ee91-296f-5714-9832-002c20994614"
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d"
LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433"
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925"
PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a"
PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee"
RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
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 = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LibGit2", "OffsetArrays", "PGFPlotsX", "HDF5", "Random", "RDatasets", "StaticArrays", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"]
test = ["Colors", "Distributions", "FileIO", "Gaston", "Gtk", "ImageMagick", "Images", "InspectDR", "LibGit2", "OffsetArrays", "PGFPlotsX", "PlotlyJS", "PlotlyBase", "PyPlot", "HDF5", "RDatasets", "StableRNGs", "StaticArrays", "StatsPlots", "Test", "TestImages", "UnicodePlots", "VisualRegressionTests"]
+9 -9
View File
@@ -1,10 +1,7 @@
# Plots
[travis-img]: https://img.shields.io/travis/JuliaPlots/Plots.jl?logo=travis
[travis-url]: https://travis-ci.org/JuliaPlots/Plots.jl
[appveyor-img]: https://ci.appveyor.com/api/projects/status/github/juliaplots/plots.jl?branch=master&svg=true
[appveyor-url]: https://ci.appveyor.com/project/mkborregaard/plots-jl
[gh-ci-img]: https://github.com/JuliaPlots/Plots.jl/workflows/ci/badge.svg?branch=master
[gh-ci-url]: https://github.com/JuliaPlots/Plots.jl/actions?query=workflow%3Aci
[pkgeval-img]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/P/Plots.svg
[pkgeval-url]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/report.html
@@ -13,14 +10,17 @@
[gitter-url]: https://gitter.im/tbreloff/Plots.jl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
[docs-img]: https://img.shields.io/badge/docs-stable-blue.svg
[docs-url]: http://docs.juliaplots.org/latest/
[docs-url]: https://docs.juliaplots.org/stable/
[![][travis-img]][travis-url]
[![][appveyor-img]][appveyor-url]
[![][gh-ci-img]][gh-ci-url]
[![][pkgeval-img]][pkgeval-url]
[![][gitter-img]][gitter-url]
[![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://julialang.zulipchat.com/#narrow/stream/236493-plots)
[![][docs-img]][docs-url]
[![Codecov](https://codecov.io/gh/JuliaPlots/Plots.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/JuliaPlots/Plots.jl)
[![Plots Downloads](https://shields.io/endpoint?url=https://pkgs.genieframework.com/api/v1/badge/Plots)](https://pkgs.genieframework.com?packages=Plots)
[![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)
-46
View File
@@ -1,46 +0,0 @@
environment:
matrix:
- julia_version: 1.0
- julia_version: 1
- julia_version: nightly
platform:
- x86 # 32-bit
- x64 # 64-bit
# # Uncomment the following lines to allow failures on nightly julia
# # (tests will run but not make your overall status red)
matrix:
allow_failures:
- julia_version: nightly
branches:
only:
- master
- /release-.*/
cache:
- '%USERPROFILE%\.julia\artifacts'
notifications:
- provider: Email
on_build_success: false
on_build_failure: false
on_build_status_changed: false
install:
- ps: iex ((new-object net.webclient).DownloadString("https://raw.githubusercontent.com/JuliaCI/Appveyor.jl/version-1/bin/install.ps1"))
build_script:
- echo "%JL_TEST_SCRIPT%"
- C:\julia\bin\julia -e "%JL_BUILD_SCRIPT%"
test_script:
- echo "%JL_TEST_SCRIPT%"
- C:\julia\bin\julia -e "%JL_TEST_SCRIPT%"
# # Uncomment to support code coverage upload. Should only be enabled for packages
# # which would have coverage gaps without running on Windows
# on_success:
# - echo "%JL_CODECOV_SCRIPT%"
# - C:\julia\bin\julia -e "%JL_CODECOV_SCRIPT%"
+5
View File
@@ -0,0 +1,5 @@
[deps]
BenchmarkCI = "20533458-34a3-403d-a444-e18f38190b5b"
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d"
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
+10
View File
@@ -0,0 +1,10 @@
using BenchmarkTools
using Plots
const SUITE = BenchmarkGroup()
julia_cmd = split(get(ENV, "TESTCMD", Base.JLOptions().julia_bin))
SUITE["load_plot_display"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots; display(plot(1:0.1:10, sin.(1:0.1:10)))'`)
SUITE["load"] = @benchmarkable run(`$julia_cmd --startup-file=no --project -e 'using Plots'`)
SUITE["plot"] = @benchmarkable p = plot(1:0.1:10, sin.(1:0.1:10)) samples=1 evals=1
SUITE["display"] = @benchmarkable display(p) setup=(p = plot(1:0.1:10, sin.(1:0.1:10))) samples=1 evals=1
+3
View File
@@ -1,3 +1,6 @@
github_checks:
annotations: false
ignore:
- "src/backends/inspectdr.jl"
- "src/backends/orca.jl"
+439
View File
@@ -0,0 +1,439 @@
# Use
# @warnpcfail precompile(args...)
# if you want to be warned when a precompile directive fails
macro warnpcfail(ex::Expr)
modl = __module__
file = __source__.file === nothing ? "?" : String(__source__.file)
line = __source__.line
quote
$(esc(ex)) || @warn """precompile directive
$($(Expr(:quote, ex)))
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
end
end
const __bodyfunction__ = Dict{Method,Any}()
# Find keyword "body functions" (the function that contains the body
# as written by the developer, called after all missing keyword-arguments
# have been assigned values), in a manner that doesn't depend on
# gensymmed names.
# `mnokw` is the method that gets called when you invoke it without
# supplying any keywords.
function __lookup_kwbody__(mnokw::Method)
function getsym(arg)
isa(arg, Symbol) && return arg
@assert isa(arg, GlobalRef)
return arg.name
end
f = get(__bodyfunction__, mnokw, nothing)
if f === nothing
fmod = mnokw.module
# The lowered code for `mnokw` should look like
# %1 = mkw(kwvalues..., #self#, args...)
# return %1
# where `mkw` is the name of the "active" keyword body-function.
ast = Base.uncompressed_ast(mnokw)
if isa(ast, Core.CodeInfo) && length(ast.code) >= 2
callexpr = ast.code[end-1]
if isa(callexpr, Expr) && callexpr.head == :call
fsym = callexpr.args[1]
if isa(fsym, Symbol)
f = getfield(fmod, fsym)
elseif isa(fsym, GlobalRef)
if fsym.mod === Core && fsym.name === :_apply
f = getfield(mnokw.module, getsym(callexpr.args[2]))
elseif fsym.mod === Core && fsym.name === :_apply_iterate
f = getfield(mnokw.module, getsym(callexpr.args[3]))
else
f = getfield(fsym.mod, fsym.name)
end
else
f = missing
end
else
f = missing
end
else
f = missing
end
__bodyfunction__[mnokw] = f
end
return f
end
function _precompile_()
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{GRBackend}}},Type{Subplot},GRBackend})
Base.precompile(Tuple{Core.kwftype(typeof(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{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{RGBA{Float64}, Bool, Float64, Symbol, Int64}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :flip, :minorgrid, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Float64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Float64, Float64}, Bool}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :guide), Tuple{Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :mirror, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guidefonthalign, :guide_position, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, StepRange{Int64, Int64}, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid, :scale, :guide), Tuple{Bool, Symbol, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{UnitRange{Int64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:shape,), Tuple{Symbol}},typeof(default)})
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :halign, :valign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :valign, :halign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),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{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, String, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector{T} where T}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector{T} where T},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},UnitRange{Int64},Matrix{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Int64}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64}, LinRange{Float64}}}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any, N} where N})
Base.precompile(Tuple{Core.kwftype(typeof(scatter!)),Any,typeof(scatter!),Any})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Type{GridLayout},Int64,Vararg{Int64, N} where N})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barbins}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:steppre}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Float64},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Int64},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Nothing},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Symbol},String})
Base.precompile(Tuple{typeof(_cycle),Base.OneTo{Int64},Vector{Int64}})
Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}})
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},StepRange{Int64, Int64}})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
Base.precompile(Tuple{typeof(_heatmap_edges),Vector{Float64},Bool,Bool})
Base.precompile(Tuple{typeof(_plot!),Plot,Any,Any})
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Vector{Float64},Tuple{Int64, Float64}})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}, N} where N})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
Base.precompile(Tuple{typeof(fakedata),MersenneTwister,Int64,Vararg{Int64, N} where N})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
Base.precompile(Tuple{typeof(gr_get_3d_axis_angle),Vector{Float64},Float64,Float64,Symbol})
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
Base.precompile(Tuple{typeof(gr_text_size),String})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
Base.precompile(Tuple{typeof(layout_args),Matrix{Any}})
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :blank), Tuple{Symbol, Bool}}})
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :width, :height), Tuple{Symbol, Symbol, Float64}}})
Base.precompile(Tuple{typeof(make_fillrange_side),UnitRange{Int64},LinRange{Float64}})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
Base.precompile(Tuple{typeof(plot!),Any})
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot, N} where N})
Base.precompile(Tuple{typeof(plot),Any,Any})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}, N} where N})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}, N} where N})
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{typeof(processGridArg!),Dict{Symbol, Any},Symbol,Symbol})
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Symbol})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Symbol})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol})
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol})
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
Base.precompile(Tuple{typeof(push!),Segments{Float64},Float64,Int64,Int64,Float64,Vararg{Float64, N} where N})
Base.precompile(Tuple{typeof(resetfontsizes)})
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
Base.precompile(Tuple{typeof(slice_arg),Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
Base.precompile(Tuple{typeof(spy),Any})
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(title!),AbstractString})
Base.precompile(Tuple{typeof(vline!),Any})
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any, N} where N})
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
isdefined(Plots, Symbol("#166#167")) && Base.precompile(Tuple{getfield(Plots, Symbol("#166#167")),Any})
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
isdefined(Plots, Symbol("#295#331")) && Base.precompile(Tuple{getfield(Plots, Symbol("#295#331"))})
isdefined(Plots, Symbol("#316#352")) && Base.precompile(Tuple{getfield(Plots, Symbol("#316#352"))})
isdefined(Plots, Symbol("#add_major_or_minor_segments#100")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#100")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
isdefined(Plots, Symbol("#add_major_or_minor_segments#101")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#101")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
let fbody = try __lookup_kwbody__(which(font, (Font,Vararg{Any, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}},typeof(font),Font,Vararg{Any, N} where N,))
end
end
let fbody = try __lookup_kwbody__(which(gr_set_font, (Font,Subplot{GRBackend},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Symbol,Symbol,RGBA{Float64},Float64,typeof(gr_set_font),Font,Subplot{GRBackend},))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Any,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Any,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Any,Vararg{Any, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Any,Vararg{Any, N} where N,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Plot,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Plot,Plot,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Plot,Plot,Plot,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,Vararg{Plot, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot!),Plot,Plot,Plot,Vararg{Plot, N} where N,))
end
end
let fbody = try __lookup_kwbody__(which(plot, (Any,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot),Any,))
end
end
let fbody = try __lookup_kwbody__(which(plot, (Any,Vararg{Any, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(plot),Any,Vararg{Any, N} where N,))
end
end
let fbody = try __lookup_kwbody__(which(scatter, (Any,Vararg{Any, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(scatter),Any,Vararg{Any, N} where N,))
end
end
let fbody = try __lookup_kwbody__(which(title!, (AbstractString,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(title!),AbstractString,))
end
end
let fbody = try __lookup_kwbody__(which(yaxis!, (Any,Vararg{Any, N} where N,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Any,typeof(yaxis!),Any,Vararg{Any, N} where N,))
end
end
end
+449
View File
@@ -0,0 +1,449 @@
# Use
# @warnpcfail precompile(args...)
# if you want to be warned when a precompile directive fails
macro warnpcfail(ex::Expr)
modl = __module__
file = __source__.file === nothing ? "?" : String(__source__.file)
line = __source__.line
quote
$(esc(ex)) || @warn """precompile directive
$($(Expr(:quote, ex)))
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
end
end
const __bodyfunction__ = Dict{Method,Any}()
# Find keyword "body functions" (the function that contains the body
# as written by the developer, called after all missing keyword-arguments
# have been assigned values), in a manner that doesn't depend on
# gensymmed names.
# `mnokw` is the method that gets called when you invoke it without
# supplying any keywords.
function __lookup_kwbody__(mnokw::Method)
function getsym(arg)
isa(arg, Symbol) && return arg
@assert isa(arg, GlobalRef)
return arg.name
end
f = get(__bodyfunction__, mnokw, nothing)
if f === nothing
fmod = mnokw.module
# The lowered code for `mnokw` should look like
# %1 = mkw(kwvalues..., #self#, args...)
# return %1
# where `mkw` is the name of the "active" keyword body-function.
ast = Base.uncompressed_ast(mnokw)
if isa(ast, Core.CodeInfo) && length(ast.code) >= 2
callexpr = ast.code[end-1]
if isa(callexpr, Expr) && callexpr.head == :call
fsym = callexpr.args[1]
if isa(fsym, Symbol)
f = getfield(fmod, fsym)
elseif isa(fsym, GlobalRef)
if fsym.mod === Core && fsym.name === :_apply
f = getfield(mnokw.module, getsym(callexpr.args[2]))
elseif fsym.mod === Core && fsym.name === :_apply_iterate
f = getfield(mnokw.module, getsym(callexpr.args[3]))
else
f = getfield(fsym.mod, fsym.name)
end
else
f = missing
end
else
f = missing
end
else
f = missing
end
__bodyfunction__[mnokw] = f
end
return f
end
function _precompile_()
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},GRBackend})
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{GridLayout}},Type{Subplot},PlotlyBackend})
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{GRBackend}}},Type{Subplot},GRBackend})
Base.precompile(Tuple{Core.kwftype(typeof(Type)),NamedTuple{(:parent,), Tuple{Subplot{PlotlyBackend}}},Type{Subplot},PlotlyBackend})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Tuple{Int64, Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:flip,), Tuple{Bool}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{RGBA{Float64}, Bool, Float64, Symbol, Int64}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :flip, :minorgrid, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Float64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Float64, Float64}, Bool}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :guide), Tuple{Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid, :minorgrid, :mirror, :guide), Tuple{Bool, Bool, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:grid,), Tuple{Bool}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guidefonthalign, :guide_position, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, StepRange{Int64, Int64}, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Float64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:minorgrid, :scale, :guide), Tuple{Bool, Symbol, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:rotation,), Tuple{Int64}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{UnitRange{Int64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:shape,), Tuple{Symbol}},typeof(default)})
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :halign, :valign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
Base.precompile(Tuple{Core.kwftype(typeof(font)),NamedTuple{(:family, :pointsize, :valign, :halign, :rotation, :color), Tuple{String, Int64, Symbol, Symbol, Float64, RGBA{Float64}}},typeof(font)})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(lens!)),Any,typeof(lens!),Any,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(: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{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, String, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},UnitRange{Int64},Matrix{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Int64}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64, Int64}, LinRange{Float64, Int64}}}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(scatter!)),Any,typeof(scatter!),Any})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(yaxis!)),Any,typeof(yaxis!),Any,Any})
Base.precompile(Tuple{Type{GridLayout},Int64,Vararg{Int64}})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{<:GeometryBasics.Point}})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:spy}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:steppre}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plot{GRBackend},Dict{Symbol, Any},Symbol})
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_axis_args!),Plot{PlotlyBackend},Dict{Symbol, Any},Symbol})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Float64},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Int64},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Nothing},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}},String})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{Symbol},String})
Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}})
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},UnitRange{Int64}})
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},Vector{Int64}})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
Base.precompile(Tuple{typeof(_heatmap_edges),Vector{Float64},Bool,Bool})
Base.precompile(Tuple{typeof(_plot!),Plot,Any,Any})
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{typeof(_replace_markershape),Vector{Symbol}})
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
Base.precompile(Tuple{typeof(annotate!),AbstractVector{<:Tuple}})
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Int64, Float64}})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}}})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
Base.precompile(Tuple{typeof(fakedata),TaskLocalRNG,Int64,Vararg{Int64}})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_markers),Series,Base.OneTo{Int64},Vector{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_markers),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,UnitRange{Int64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Nothing,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
Base.precompile(Tuple{typeof(gr_get_3d_axis_angle),Vector{Float64},Float64,Float64,Symbol})
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Int64}, Vector{String}},Int64})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
Base.precompile(Tuple{typeof(gr_text_size),String})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
Base.precompile(Tuple{typeof(layout_args),Matrix{Any}})
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :blank), Tuple{Symbol, Bool}}})
Base.precompile(Tuple{typeof(layout_args),NamedTuple{(:label, :width, :height), Tuple{Symbol, Symbol, Float64}}})
Base.precompile(Tuple{typeof(make_fillrange_side),UnitRange{Int64},LinRange{Float64, Int64}})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
Base.precompile(Tuple{typeof(plot!),Any})
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot}})
Base.precompile(Tuple{typeof(plot),Any,Any})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{typeof(processGridArg!),Dict{Symbol, Any},Symbol,Symbol})
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Symbol})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Bool})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},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(process_axis_arg!),Dict{Symbol, Any},Tuple{Int64, Int64},Symbol})
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
Base.precompile(Tuple{typeof(quiver_using_arrows),DefaultsDict})
Base.precompile(Tuple{typeof(resetfontsizes)})
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{PlotUtils.ContinuousColorGradient},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{RGBA{Float64}},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Symbol},Int64})
Base.precompile(Tuple{typeof(spy),Any})
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
Base.precompile(Tuple{typeof(stroke),Int64,Vararg{Any}})
Base.precompile(Tuple{typeof(title!),AbstractString})
Base.precompile(Tuple{typeof(vline!),Any})
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any}})
Base.precompile(Tuple{typeof(xgrid!),Plot{PlotlyBackend},Symbol,Vararg{Any}})
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
isdefined(Plots, Symbol("#168#169")) && Base.precompile(Tuple{getfield(Plots, Symbol("#168#169")),Any})
isdefined(Plots, Symbol("#170#171")) && Base.precompile(Tuple{getfield(Plots, Symbol("#170#171")),Any})
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
isdefined(Plots, Symbol("#301#337")) && Base.precompile(Tuple{getfield(Plots, Symbol("#301#337"))})
isdefined(Plots, Symbol("#322#358")) && Base.precompile(Tuple{getfield(Plots, Symbol("#322#358"))})
isdefined(Plots, Symbol("#add_major_or_minor_segments#102")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#102")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
isdefined(Plots, Symbol("#add_major_or_minor_segments#103")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#103")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
let fbody = try __lookup_kwbody__(which(annotate!, (AbstractVector{<:Tuple},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(annotate!),AbstractVector{<:Tuple},))
end
end
let fbody = try __lookup_kwbody__(which(font, (Font,Vararg{Any},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}},typeof(font),Font,Vararg{Any},))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Any,Vararg{Any},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Any,Vararg{Any},))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,Plot,))
end
end
let fbody = try __lookup_kwbody__(which(plot!, (Plot,Plot,Plot,Vararg{Plot},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot!),Plot,Plot,Plot,Vararg{Plot},))
end
end
let fbody = try __lookup_kwbody__(which(plot, (Any,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot),Any,))
end
end
let fbody = try __lookup_kwbody__(which(plot, (Any,Vararg{Any},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(plot),Any,Vararg{Any},))
end
end
let fbody = try __lookup_kwbody__(which(title!, (AbstractString,))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(title!),AbstractString,))
end
end
let fbody = try __lookup_kwbody__(which(yaxis!, (Any,Vararg{Any},))) catch missing end
if !ismissing(fbody)
precompile(fbody, (Base.Pairs{Symbol, V, Tuple{Vararg{Symbol, N}}, NamedTuple{names, T}} where {V, N, names, T<:Tuple{Vararg{Any, N}}},typeof(yaxis!),Any,Vararg{Any},))
end
end
end
+282
View File
@@ -0,0 +1,282 @@
# Use
# @warnpcfail precompile(args...)
# if you want to be warned when a precompile directive fails
macro warnpcfail(ex::Expr)
modl = __module__
file = __source__.file === nothing ? "?" : String(__source__.file)
line = __source__.line
quote
$(esc(ex)) || @warn """precompile directive
$($(Expr(:quote, ex)))
failed. Please report an issue in $($modl) (after checking for duplicates) or remove this directive.""" _file=$file _line=$line
end
end
function _precompile_()
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}, Vector{Float64}},Int64})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(_make_hist)),NamedTuple{(:normed, :weights), Tuple{Bool, Vector{Int64}}},typeof(_make_hist),Tuple{Vector{Float64}},Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:formatter,), Tuple{typeof(datetimeformatter)}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide,), Tuple{String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:guide_position, :guidefontvalign, :mirror, :guide), Tuple{Symbol, Symbol, Bool, String}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(attr!)),NamedTuple{(:ticks,), Tuple{Nothing}},typeof(attr!),Axis})
Base.precompile(Tuple{Core.kwftype(typeof(default)),NamedTuple{(:titlefont, :legendfontsize, :guidefont, :tickfont, :guide, :framestyle, :yminorgrid), Tuple{Tuple{Int64, String}, Int64, Tuple{Int64, Symbol}, Tuple{Int64, Symbol}, String, Symbol, Bool}},typeof(default)})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),StepRange{Int64, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),UnitRange{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_polyline)),NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}},typeof(gr_polyline),Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(gr_set_font)),NamedTuple{(:rotation, :color), Tuple{Int64, RGBA{Float64}}},typeof(gr_set_font),Font,Subplot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :label, :seriestype), Tuple{Float64, String, Symbol}},typeof(plot!),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{GRBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:alpha, :seriestype), Tuple{Float64, Symbol}},typeof(plot!),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:annotation,), Tuple{Vector{Tuple{Int64, Float64, Tuple{String, Any, Any, Any}}}}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:c, :lw, :label), Tuple{Symbol, Int64, String}},typeof(plot!),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:layout, :margin), Tuple{Matrix{Any}, AbsoluteLength}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Bool}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend},Vararg{Plot{PlotlyBackend}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{GRBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:line, :seriestype), Tuple{Tuple{Int64, Symbol, Float64, Matrix{Symbol}}, Symbol}},typeof(plot!),Plot{PlotlyBackend},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Function,Float64,Irrational{}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:lw, :color), Tuple{Int64, Symbol}},typeof(plot!),Plot{GRBackend},Function,Float64,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{GRBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),Plot{PlotlyBackend},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:marker, :series_annotations, :seriestype), Tuple{Tuple{Int64, Float64, Symbol}, Vector{Any}, Symbol}},typeof(plot!),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:markersize, :c, :seriestype), Tuple{Int64, Symbol, Symbol}},typeof(plot!),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{GRBackend},Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype, :inset), Tuple{Symbol, Tuple{Int64, BoundingBox{Tuple{Length{:w, Float64}, Length{:h, Float64}}, Tuple{Length{:w, Float64}, Length{:h, Float64}}}}}},typeof(plot!),Vector{Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot!),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!),Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:title,), Tuple{String}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot!),Plot{GRBackend},Vector{Float64},Vector{Float64},Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:yaxis, :minorgrid), Tuple{Tuple{String, Symbol}, Bool}},typeof(plot!)})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{GRBackend},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Plot{PlotlyBackend},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot!)),NamedTuple{(:zcolor, :m, :ms, :lab, :seriestype), Tuple{Vector{Float64}, Tuple{Symbol, Float64, Stroke}, Vector{Float64}, String, Symbol}},typeof(plot!),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:annotations, :leg), Tuple{Tuple{Int64, Float64, PlotText}, Bool}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:aspect_ratio, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{String},Vector{String},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bar_width, :alpha, :color, :fillto, :label, :seriestype), Tuple{Float64, Float64, Vector{Symbol}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, String, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:bins, :weights, :seriestype), Tuple{Symbol, Vector{Int64}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:color, :line, :marker), Tuple{Matrix{Symbol}, Tuple{Symbol, Int64}, Tuple{Matrix{Symbol}, Int64, Float64, Stroke}}},typeof(plot),Vector{Vector}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:connections, :title, :xlabel, :ylabel, :zlabel, :legend, :margin, :seriestype), Tuple{Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}, String, String, String, String, Symbol, AbsoluteLength, Symbol}},typeof(plot),Vector{Int64},Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill, :seriestype), Tuple{Bool, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:fill_z, :alpha, :label, :bar_width, :seriestype), Tuple{StepRange{Int64, Int64}, Vector{Float64}, String, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks, :seriestype), Tuple{Matrix{Symbol}, Matrix{String}, Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}, Int64, String, Int64, UnitRange{Int64}, Symbol}},typeof(plot),Vector{Vector{Float64}},Vector{Vector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:grid, :title), Tuple{Tuple{Symbol, Symbol, Symbol, Int64, Float64}, String}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:lab, :w, :palette, :fill, :α), Tuple{String, Int64, PlotUtils.ContinuousColorGradient, Int64, Float64}},typeof(plot),StepRange{Int64, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :legend, :seriestype), Tuple{String, Symbol, Symbol}},typeof(plot),Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label, :title, :xlabel, :linewidth, :legend), Tuple{Matrix{String}, String, String, Int64, Symbol}},typeof(plot),Vector{Function},Float64,Float64})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:label,), Tuple{Matrix{String}}},typeof(plot),Vector{AbstractVector{Float64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :group, :linetype, :linecolor), Tuple{Matrix{Any}, Vector{String}, Matrix{Symbol}, Symbol}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :label, :fillrange, :fillalpha), Tuple{Tuple{Int64, Int64}, String, Int64, Float64}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :link), Tuple{Int64, Symbol}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :palette, :bg_inside), Tuple{Int64, Matrix{PlotUtils.ContinuousColorGradient}, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :t, :leg, :ticks, :border), Tuple{Matrix{Any}, Matrix{Symbol}, Bool, Nothing, Symbol}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :title, :titlelocation, :left_margin, :bottom_margin, :xrotation), Tuple{Matrix{Any}, Matrix{String}, Symbol, Matrix{AbsoluteLength}, AbsoluteLength, Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xguide, :yguide, :xguidefonthalign, :yguidefontvalign, :xguideposition, :yguideposition, :ymirror, :xmirror, :legend, :seriestype), Tuple{Int64, String, String, Matrix{Symbol}, Matrix{Symbol}, Symbol, Matrix{Symbol}, Matrix{Bool}, Matrix{Bool}, Bool, Matrix{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout, :xlims), Tuple{Matrix{Any}, Tuple{Int64, Float64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:layout,), Tuple{Tuple{Int64, Int64}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:legend,), Tuple{Symbol}},typeof(plot),Vector{Tuple{Int64, Real}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :lab, :ms), Tuple{Tuple{Matrix{Symbol}, Int64}, Matrix{String}, Int64}},typeof(plot),Vector{Vector},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :label, :legendtitle), Tuple{Tuple{Int64, Matrix{Symbol}}, Matrix{String}, String}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :leg, :fill), Tuple{Int64, Bool, Tuple{Int64, Symbol}}},typeof(plot),Function,Function,Int64,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line, :marker, :bg, :fg, :xlim, :ylim, :leg), Tuple{Tuple{Int64, Symbol, Symbol}, Tuple{Shape{Float64, Float64}, Int64, RGBA{Float64}}, Symbol, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Bool}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:line_z, :linewidth, :legend), Tuple{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Int64, Bool}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:m, :markersize, :lab, :bg, :xlim, :ylim, :seriestype), Tuple{Matrix{Symbol}, Int64, Matrix{String}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker,), Tuple{Bool}},typeof(plot),Vector{Union{Missing, Int64}}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:marker_z, :color, :legend, :seriestype), Tuple{typeof(+), Symbol, Bool, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :markersize, :marker_z, :line_z, :linewidth), Tuple{Matrix{Symbol}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}, Matrix{Int64}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:markershape, :seriestype, :label), Tuple{Symbol, Symbol, String}},typeof(plot),UnitRange{Int64},Vector{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :seriestype), Tuple{Int64, Symbol}},typeof(plot),Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio, :seriestype), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64, Symbol}},typeof(plot),Vector{ComplexF64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:proj, :m), Tuple{Symbol, Int64}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:projection, :seriestype), Tuple{Symbol, Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},UnitRange{Int64},Matrix{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:quiver, :seriestype), Tuple{Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:reg, :fill), Tuple{Bool, Tuple{Int64, Symbol}}},typeof(plot),Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{Tuple{LinRange{Float64, Int64}, LinRange{Float64, Int64}}}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:ribbon,), Tuple{typeof(sqrt)}},typeof(plot),UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype, :markershape, :markersize, :color), Tuple{Matrix{Symbol}, Vector{Symbol}, Int64, Vector{Symbol}}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{DateTime},UnitRange{Int64},Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:seriestype,), Tuple{Symbol}},typeof(plot),Vector{OHLC}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:st, :xlabel, :ylabel, :zlabel), Tuple{Symbol, String, String, String}},typeof(plot),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :l, :seriestype), Tuple{String, Float64, Symbol}},typeof(plot),Vector{String},Vector{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xflip, :yflip, :zflip, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :xmirror, :ymirror, :zmirror, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, Bool, Bool, Bool, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title, :zlabel, :grid, :ylabel, :minorgrid, :xlabel, :seriestype), Tuple{String, String, Bool, String, Bool, String, Symbol}},typeof(plot),Vector{Float64},Vector{Float64},Function})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:title,), Tuple{Matrix{String}}},typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:w,), Tuple{Int64}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:xaxis, :background_color, :leg), Tuple{Tuple{String, Tuple{Int64, Int64}, StepRange{Int64, Int64}, Symbol}, RGB{Float64}, Bool}},typeof(plot),Matrix{Float64}})
Base.precompile(Tuple{Core.kwftype(typeof(plot)),NamedTuple{(:zcolor, :m, :leg, :cbar, :w), Tuple{StepRange{Int64, Int64}, Tuple{Int64, Float64, Symbol, Stroke}, Bool, Bool, Int64}},typeof(plot),Vector{Float64},Vector{Float64},UnitRange{Int64}})
Base.precompile(Tuple{Core.kwftype(typeof(portfoliocomposition)),Any,typeof(portfoliocomposition),Any,Vararg{Any}})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip, :disp), Tuple{Vector{Int64}, Bool}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(test_examples)),NamedTuple{(:skip,), Tuple{Vector{Int64}}},typeof(test_examples),Symbol})
Base.precompile(Tuple{Core.kwftype(typeof(yaxis!)),Any,typeof(yaxis!),Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},AbstractVector{OHLC}})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},PortfolioComposition})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:barhist}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bar}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:bins2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:histogram2d}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:hspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:lens}},AbstractPlot})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:pie}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:quiver}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:sticks}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vline}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:vspan}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Type{Val{:xerror}},Any,Any,Any})
Base.precompile(Tuple{typeof(RecipesBase.apply_recipe),AbstractDict{Symbol, Any},Vector{ComplexF64}})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.add_series!),Plot{PlotlyBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{GRBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.plot_setup!),Plot{PlotlyBackend},Dict{Symbol, Any},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.preprocess_attributes!),Plot{GRBackend},DefaultsDict})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{GRBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_sliced_series_attributes!),Plot{PlotlyBackend},Vector{Dict{Symbol, Any}}})
Base.precompile(Tuple{typeof(RecipesPipeline.process_userrecipe!),Plot{GRBackend},Vector{Dict{Symbol, Any}},Dict{Symbol, Any}})
Base.precompile(Tuple{typeof(RecipesPipeline.unzip),Vector{GeometryBasics.Point2{Float64}}})
Base.precompile(Tuple{typeof(_bin_centers),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}})
Base.precompile(Tuple{typeof(_cbar_unique),Vector{PlotUtils.ContinuousColorGradient},String})
Base.precompile(Tuple{typeof(_cycle),StepRange{Int64, Int64},Vector{Int64}})
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},StepRange{Int64, Int64}})
Base.precompile(Tuple{typeof(_cycle),Vector{Float64},Vector{Int64}})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{GRBackend},Bool})
Base.precompile(Tuple{typeof(_do_plot_show),Plot{PlotlyBackend},Bool})
Base.precompile(Tuple{typeof(_preprocess_barlike),DefaultsDict,Base.OneTo{Int64},Vector{Float64}})
Base.precompile(Tuple{typeof(_preprocess_binlike),DefaultsDict,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64}})
Base.precompile(Tuple{typeof(_update_min_padding!),GridLayout})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{GRBackend},Subplot{GRBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_args),Plot{PlotlyBackend},Subplot{PlotlyBackend},Dict{Symbol, Any},Int64,Bool})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{GRBackend},Vector{Any}})
Base.precompile(Tuple{typeof(_update_subplot_periphery),Subplot{PlotlyBackend},Vector{Any}})
Base.precompile(Tuple{typeof(annotate!),AbstractVector{<:Tuple}})
Base.precompile(Tuple{typeof(axis_limits),Subplot{GRBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(axis_limits),Subplot{PlotlyBackend},Symbol,Bool,Bool})
Base.precompile(Tuple{typeof(backend),PlotlyBackend})
Base.precompile(Tuple{typeof(bbox),AbsoluteLength,AbsoluteLength,AbsoluteLength,AbsoluteLength})
Base.precompile(Tuple{typeof(bbox),Float64,Float64,Float64,Float64})
Base.precompile(Tuple{typeof(build_layout),GridLayout,Int64,Vector{Plot}})
Base.precompile(Tuple{typeof(convert_to_polar),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Vector{Float64},Tuple{Int64, Float64}})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64},Vararg{Vector{Float64}}})
Base.precompile(Tuple{typeof(error_coords),Vector{Float64},Vector{Float64},Vector{Float64}})
Base.precompile(Tuple{typeof(error_zipit),Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}})
Base.precompile(Tuple{typeof(fakedata),Int64,Int64})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_minor_ticks),Subplot{GRBackend},Axis,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(get_series_color),SubArray{Symbol, 1, Vector{Symbol}, Tuple{UnitRange{Int64}}, true},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{GRBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_series_color),Vector{Symbol},Subplot{PlotlyBackend},Int64,Symbol})
Base.precompile(Tuple{typeof(get_ticks),StepRange{Int64, Int64},Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),Symbol,Vector{Float64},Vector{Any},Tuple{Int64, Int64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_ticks),UnitRange{Int64},Vector{Float64},Vector{Any},Tuple{Float64, Float64},Vararg{Any}})
Base.precompile(Tuple{typeof(get_xy),Vector{OHLC}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_add_legend),Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}},Vector{Float64}})
Base.precompile(Tuple{typeof(gr_display),Subplot{GRBackend},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(gr_draw_contour),Series,StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_heatmap),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Float64,Float64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Float64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Float64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Float64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_marker),Series,Int64,Int64,Tuple{Float64, Float64},Int64,Int64,Int64,Symbol})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},UnitRange{Int64},Tuple{Vector{Float64}, Vector{Float64}},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Base.OneTo{Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,StepRange{Int64, Int64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_segments),Series,Vector{Float64},Vector{Float64},Int64,Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Matrix{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_draw_surface),Series,Vector{Float64},Vector{Float64},Vector{Float64},Tuple{Float64, Float64}})
Base.precompile(Tuple{typeof(gr_fill_viewport),Vector{Float64},RGBA{Float64}})
Base.precompile(Tuple{typeof(gr_get_ticks_size),Tuple{Vector{Float64}, Vector{String}},Int64})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks),Subplot{GRBackend},Symbol,Tuple{Vector{Int64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_label_ticks_3d),Subplot{GRBackend},Symbol,Tuple{Vector{Float64}, Vector{String}}})
Base.precompile(Tuple{typeof(gr_polaraxes),Int64,Float64,Subplot{GRBackend}})
Base.precompile(Tuple{typeof(gr_set_gradient),PlotUtils.ContinuousColorGradient})
Base.precompile(Tuple{typeof(gr_text),Float64,Float64,String})
Base.precompile(Tuple{typeof(gr_text_size),String})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), NTuple{9, Float64}}})
Base.precompile(Tuple{typeof(gr_update_viewport_legend!),Vector{Float64},Subplot{GRBackend},NamedTuple{(:w, :h, :dy, :leftw, :textw, :rightw, :xoffset, :yoffset, :width_factor), Tuple{Int64, Int64, Int64, Float64, Int64, Float64, Float64, Float64, Float64}}})
Base.precompile(Tuple{typeof(gr_viewport_from_bbox),Subplot{GRBackend},BoundingBox{Tuple{AbsoluteLength, AbsoluteLength}, Tuple{AbsoluteLength, AbsoluteLength}},AbsoluteLength,AbsoluteLength,Vector{Float64}})
Base.precompile(Tuple{typeof(heatmap_edges),StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),UnitRange{Int64},Symbol})
Base.precompile(Tuple{typeof(heatmap_edges),Vector{Float64},Symbol})
Base.precompile(Tuple{typeof(ignorenan_minimum),Vector{Int64}})
Base.precompile(Tuple{typeof(is_marker_supported),GRBackend,Vector{Symbol}})
Base.precompile(Tuple{typeof(layout_args),Matrix{Any}})
Base.precompile(Tuple{typeof(link_axes!),GridLayout,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Function})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),Nothing,Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),StepRange{Int64, Int64},Tuple{Int64, Int64},Symbol,Symbol})
Base.precompile(Tuple{typeof(optimal_ticks_and_labels),UnitRange{Int64},Tuple{Float64, Float64},Symbol,Symbol})
Base.precompile(Tuple{typeof(partialcircle),Int64,Float64,Int64})
Base.precompile(Tuple{typeof(plot!),Plot,Plot,Plot,Vararg{Plot}})
Base.precompile(Tuple{typeof(plot),Any,Any})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend},Plot{GRBackend},Vararg{Plot{GRBackend}}})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend},Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{GRBackend}})
Base.precompile(Tuple{typeof(plot),Plot{PlotlyBackend},Plot{PlotlyBackend}})
Base.precompile(Tuple{typeof(processLineArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Matrix{Symbol}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},RGBA{Float64}})
Base.precompile(Tuple{typeof(processMarkerArg),Dict{Symbol, Any},Shape{Float64, Float64}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText,Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,PlotText})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol},Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String},Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{GRBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText,Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,PlotText})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol},Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Int64, Symbol, Symbol}})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String},Font})
Base.precompile(Tuple{typeof(process_annotation),Subplot{PlotlyBackend},Int64,Float64,Tuple{String, Symbol, Int64, String}})
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},StepRange{Int64, Int64},Symbol})
Base.precompile(Tuple{typeof(process_axis_arg!),Dict{Symbol, Any},Symbol,Symbol})
Base.precompile(Tuple{typeof(push!),Plot{GRBackend},Float64,Vector{Float64}})
Base.precompile(Tuple{typeof(push!),Segments{Tuple{Float64, Float64, Float64}},Tuple{Float64, Int64, Int64},Tuple{Float64, Int64, Int64}})
Base.precompile(Tuple{typeof(resetfontsizes)})
Base.precompile(Tuple{typeof(scalefontsizes),Float64})
Base.precompile(Tuple{typeof(series_annotations),Vector{Any}})
Base.precompile(Tuple{typeof(slice_arg),Matrix{AbsoluteLength},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Bool},Int64})
Base.precompile(Tuple{typeof(slice_arg),Matrix{Int64},Int64})
Base.precompile(Tuple{typeof(spy),Any})
Base.precompile(Tuple{typeof(straightline_data),Tuple{Float64, Float64},Tuple{Float64, Float64},Vector{Float64},Vector{Float64},Int64})
Base.precompile(Tuple{typeof(title!),AbstractString})
Base.precompile(Tuple{typeof(update_child_bboxes!),GridLayout})
Base.precompile(Tuple{typeof(update_clims),Float64,Float64,SubArray{Int64, 1, Vector{Int64}, Tuple{UnitRange{Int64}}, true},typeof(ignorenan_extrema)})
Base.precompile(Tuple{typeof(warn_on_attr_dim_mismatch),Series,Vector{Float64},Vector{Float64},Nothing,Base.Iterators.Flatten{Vector{Tuple{SeriesSegment}}}})
Base.precompile(Tuple{typeof(xgrid!),Plot{GRBackend},Symbol,Vararg{Any}})
Base.precompile(Tuple{typeof(xgrid!),Plot{PlotlyBackend},Symbol,Vararg{Any}})
Base.precompile(Tuple{typeof(xlims),Subplot{PlotlyBackend}})
isdefined(Plots, Symbol("#2#6")) && Base.precompile(Tuple{getfield(Plots, Symbol("#2#6")),UnitRange{Int64}})
isdefined(Plots, Symbol("#322#358")) && Base.precompile(Tuple{getfield(Plots, Symbol("#322#358"))})
isdefined(Plots, Symbol("#add_major_or_minor_segments#102")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#102")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64}},Float64,Bool})
isdefined(Plots, Symbol("#add_major_or_minor_segments#103")) && Base.precompile(Tuple{getfield(Plots, Symbol("#add_major_or_minor_segments#103")),Vector{Float64},Bool,Segments{Tuple{Float64, Float64, Float64}},Float64,Bool})
end
+4
View File
@@ -0,0 +1,4 @@
using Plots
Plots.test_examples(:gr, skip = Plots._backend_skips[:gr])
Plots.test_examples(:plotly, skip = Plots._backend_skips[:plotly], disp = false)
+6
View File
@@ -0,0 +1,6 @@
include("snoop_bot_config.jl")
snoop_bench(
botconfig,
joinpath(@__DIR__, "precompile_script.jl"),
)
+6
View File
@@ -0,0 +1,6 @@
include("snoop_bot_config.jl")
snoop_bot(
botconfig,
joinpath(@__DIR__, "precompile_script.jl"),
)
+7
View File
@@ -0,0 +1,7 @@
using CompileBot
botconfig = BotConfig(
"Plots",
version = ["1.6", "1.7", "1.8", "nightly"], # <<< keep these versions in sync with .github/workflows/SnoopCompile.yml
# else_version = "nightly",
)
-18
View File
@@ -1,18 +0,0 @@
#TODO: download https://cdn.plot.ly/plotly-latest.min.js to deps/ if it doesn't exist
file_path = ""
if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true"
global file_path
local_fn = joinpath(dirname(@__FILE__), "plotly-latest.min.js")
if !isfile(local_fn)
@info("Cannot find deps/plotly-latest.min.js... downloading latest version.")
download("https://cdn.plot.ly/plotly-latest.min.js", local_fn)
isfile(local_fn) && (file_path = local_fn)
else
file_path = local_fn
end
end
open("deps.jl", "w") do io
println(io, "const plotly_local_file_path = $(repr(file_path))")
end
-53
View File
@@ -1,53 +0,0 @@
# To figure out what should be precompiled, run this script, then move
# precompile_Plots.jl in precompiles_path (see below) to src/precompile.jl
# This script works by using SnoopCompile to log compilations that take place
# while running the examples on the GR backend. So SnoopCompile must be
# installed, and StatsPlots, RDatasets, and FileIO are also required for
# certain examples.
# If precompilation fails with an UndefVarError for a module, probably what is
# happening is that the module appears in the precompile statements, but is
# only visible to one of Plots' dependencies, and not Plots itself. Adding the
# module to the blacklist below will remove these precompile statements.
# Anonymous functions may appear in precompile statements as functions with
# hashes in their name. Those of the form "#something##kw" have to do with
# compiling functions with keyword arguments, and are named reproducibly, so
# can be kept. Others generally will not work. Currently, SnoopCompile includes
# some anonymous functions that not reproducible, but SnoopCompile PR #30
# (which looks about to be merged) will ensure that anonymous functions are
# actually defined before attempting to precompile them. Alternatively, we can
# keep only the keyword argument related anonymous functions by changing the
# regex that SnoopCompile uses to detect anonymous functions to
# r"#{1,2}[^\"#]+#{1,2}\d+" (see anonrex in SnoopCompile.jl). To exclude all
# precompile statements involving anonymous functions, "#" can also be added to
# the blacklist below.
using SnoopCompile
project_flag = string("--project=", joinpath(homedir(), ".julia", "dev", "Plots"))
log_path = joinpath(tempdir(), "compiles.log")
precompiles_path = joinpath(tempdir(), "precompile")
# run examples with GR backend, logging what needs to be compiled
SnoopCompile.@snoopc project_flag log_path begin
using Plots
Plots.test_examples(:gr)
Plots.test_examples(:plotly, skip = Plots._backend_skips[:plotly])
end
# precompile calls containing the following strings are dropped
blacklist = [
# functions defined in examples
"PlotExampleModule",
# the following are not visible to Plots, only its dependencies
"CategoricalArrays",
"FixedPointNumbers",
"SparseArrays",
r"#{1,2}[^\"#]+#{1,2}\d+",
]
data = SnoopCompile.read(log_path)
pc = SnoopCompile.parcel(reverse!(data[2]), blacklist=blacklist)
SnoopCompile.write(precompiles_path, pc)
+106 -52
View File
@@ -1,42 +1,61 @@
module Plots
const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2])
using Pkg
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@optlevel"))
@eval Base.Experimental.@optlevel 1
end
if isdefined(Base, :Experimental) && isdefined(Base.Experimental, Symbol("@max_methods"))
@eval Base.Experimental.@max_methods 1
end
const _plots_project = Pkg.Types.read_project(normpath(@__DIR__, "..", "Project.toml"))
const _current_plots_version = _plots_project.version
const _plots_compats = _plots_project.compat
function _check_compat(sim::Module)
sim_str = string(sim)
if !haskey(_plots_compats, sim_str)
return nothing
end
be_v = Pkg.Types.read_project(joinpath(Base.pkgdir(sim), "Project.toml")).version
be_c = _plots_compats[sim_str]
if be_c isa String # julia 1.6
if !(be_v in Pkg.Types.semver_spec(be_c))
@warn "$sim $be_v is not compatible with this version of Plots. The declared compatibility is $(be_c)."
end
else
if isempty(intersect(be_v, be_c.val))
@warn "$sim $be_v is not compatible with this version of Plots. The declared compatibility is $(be_c.str)."
end
end
end
using Reexport
import GeometryTypes
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random
import SparseArrays: findnz
import GeometryBasics
using Dates, Printf, Statistics, Base64, LinearAlgebra, Random, Unzip
using SparseArrays
using FFMPEG
@reexport using RecipesBase
import RecipesBase: plot, plot!, animate, is_explicit
import RecipesBase: plot, plot!, animate, is_explicit, grid
using Base.Meta
@reexport using PlotUtils
@reexport using PlotThemes
import Showoff
import UnicodeFun
import StatsBase
import Downloads
import Showoff
import JSON
using Requires
if isfile(joinpath(@__DIR__, "..", "deps", "deps.jl"))
include(joinpath(@__DIR__, "..", "deps", "deps.jl"))
else
# This is a bit dirty, but I don't really see why anyone should be forced
# to build Plots, while it will just include exactly the below line
# as long as `ENV["PLOTS_HOST_DEPENDENCY_LOCAL"] = "true"` is not set.
# If the above env is set + `plotly_local_file_path == ""``,
# it will warn in the __init__ function to run build
const plotly_local_file_path = ""
end
#! format: off
export
grid,
bbox,
plotarea,
@layout,
KW,
wrap,
@@ -104,6 +123,7 @@ export
gif,
mov,
mp4,
webm,
animate,
@animate,
@gif,
@@ -119,8 +139,11 @@ export
center,
BezierCurve,
plotattr
plotattr,
scalefontsize,
scalefontsizes,
resetfontsizes
#! format: on
# ---------------------------------------------------------
import NaNMath # define functions that ignores NaNs. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563
@@ -139,7 +162,6 @@ ignorenan_extrema(x) = Base.extrema(x)
# This makes it impossible to create row vectors of String and Symbol with the transpose operator.
# This solves this issue, internally in Plots at least.
# commented out on the insistence of the METADATA maintainers
#Base.transpose(x::Symbol) = x
@@ -150,12 +172,21 @@ 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.convert(::Type{<:Measure}, x::Float64) = x * pct
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
export BBox, BoundingBox, mm, cm, inch, px, pct, pt, w, h
end
@@ -163,15 +194,40 @@ using .PlotMeasures
import .PlotMeasures: Length, AbsoluteLength, Measure, width, height
# ---------------------------------------------------------
import RecipesPipeline
import RecipesPipeline:
SliceIt,
DefaultsDict,
Formatted,
AbstractSurface,
Surface,
Volume,
is3d,
is_surface,
needs_3d_axes,
group_as_matrix, # for StatsPlots
reset_kw!,
pop_kw!,
scale_func,
inverse_scale_func,
dateformatter,
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-2.6.3.min.js"
include("types.jl")
include("utils.jl")
include("components.jl")
include("colorbars.jl")
include("axes.jl")
include("args.jl")
include("components.jl")
include("consts.jl")
include("themes.jl")
include("plot.jl")
include("pipeline.jl")
include("series.jl")
include("layouts.jl")
include("subplots.jl")
include("recipes.jl")
@@ -184,6 +240,7 @@ include("output.jl")
include("ijulia.jl")
include("fileio.jl")
include("init.jl")
include("legend.jl")
include("backends/plotly.jl")
include("backends/gr.jl")
@@ -191,38 +248,35 @@ 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...) where {T<:Real} = plot!(plt; xticks = ticks, kw...)
global yticks!(plt::PlotOrSubplot, ticks::TicksArgs; kw...) where {T<:Real} = 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.jl")
_precompile_()
include("precompile_includer.jl")
end # module
+87 -70
View File
@@ -14,23 +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")
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.
@@ -47,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
# -----------------------------------------------
@@ -63,16 +64,21 @@ file_extension(fn) = Base.Filesystem.splitext(fn)[2][2:end]
gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim, fn; kw...)
mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim, fn, false; kw...)
mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim, fn, false; kw...)
webm(anim::Animation, fn = webmfn(); kw...) = buildanimation(anim, fn, false; kw...)
ffmpeg_framerate(fps) = "$fps"
ffmpeg_framerate(fps::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
@@ -80,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 -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -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 -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`)
ffmpeg_exe(
`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -loop $loop -y $fn`,
)
end
else
ffmpeg_exe(`-v $verbose_level -framerate $framerate -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`)
ffmpeg_exe(
`-v $verbose_level -framerate $framerate -i $(animdir)/%06d.png -vf format=yuv420p -loop $loop -y $fn`,
)
end
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 = "<img src=\"data:image/gif;base64," * base64encode(read(agif.filename)) * "\" />"
elseif ext in ("mov", "mp4")
mimetype = ext == "mov" ? "video/quicktime" : "video/mp4"
html = "<video controls><source src=\"data:$mimetype;base64," *
base64encode(read(agif.filename)) *
"\" type = \"$mimetype\"></video>"
html =
"<img src=\"data:image/gif;base64," *
base64encode(read(agif.filename)) *
"\" />"
elseif ext in ("mov", "mp4", "webm")
mimetype = ext == "mov" ? "video/quicktime" : "video/$ext"
html =
"<video controls><source src=\"data:$mimetype;base64," *
base64encode(read(agif.filename)) *
"\" type = \"$mimetype\"></video>"
else
error("Cannot show animation with extension $ext: $agif")
end
@@ -123,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
"""
+184 -156
View File
@@ -1,163 +1,191 @@
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.",
: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 (number of contours) or AbstractVector (contour values). Determines contour 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.",
:z_order => "Symbol or Integer. :front (default), :back or index of position where 1 is farest in the background.",
# 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 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 => "KW (Dict{Symbol,Any}). Pass a map of extra keyword args which may be specific to a backend.",
:fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides",
# 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.",
:title_location => "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 Symbol (legend position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:inside`, `:legend`, `:topright`, `:topleft`, `:bottomleft`, `:bottomright` , `:inline` (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",
: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` or 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 Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units.",
: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.",
:legend_background_color => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.",
:background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).",
:foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.",
:legend_foreground_color => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
:foreground_color_title => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of subplot title.",
: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_position => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position) or angle or (angle,inout) tuple. Bottom left corner of legend is placed at (x,y). Symbol values: `:none`; `:best`; `:inline`; `:inside`; `:legend`; any valid combination of `:(outer ?)(top/bottom ?)(right/left ?)`, i.e.: `:top`, `:topright`, `:outerleft`, `:outerbottomright` ... (note: only some may be supported in each backend)",
:legend_column => "Integer. Number of columns in the legend. `-1` stands for maximum number of colums (horizontal legend).",
:legend_title_font => "Font. Font of the legend title.",
:legend_font_family => "String or Symbol. Font family of legend entries.",
:legend_font_pointsize => "Integer. Font pointsize of legend entries.",
:legend_font_halign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
:legend_font_valign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center",
:legend_font_rotation => "Real. Font rotation of legend entries",
:legend_font_color => "Color Type. Font color of legend entries",
:legend_title => "String. Legend title.",
:legend_title_font_family => "String or Symbol. Font family of the legend title.",
:legend_title_font_pointsize => "Integer. Font pointsize the legend title.",
:legend_title_font_halign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center",
:legend_title_font_valign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center",
:legend_title_font_rotation => "Real. Font rotation of the legend title",
:legend_title_font_color => "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.",
:legend_font => "Font. Font of legend items.",
:legend_titlefont => "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.",
)
+1300 -627
View File
File diff suppressed because it is too large Load Diff
+530 -529
View File
File diff suppressed because it is too large Load Diff
+943 -417
View File
File diff suppressed because it is too large Load Diff
@@ -3,7 +3,7 @@
# significant contributions by: @pkofod
# --------------------------------------------------------------------------------------
# COV_EXCL_START
const _pgfplots_linestyles = KW(
:solid => "solid",
:dash => "dashed",
@@ -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
# --------------------------------------------------------------------------------------
@@ -166,7 +176,7 @@ function pgf_series(sp::Subplot, series::Series)
# function args
args = if st == :contour
plotattributes[:z].surf, plotattributes[:x], plotattributes[:y]
elseif is3d(st)
elseif RecipesPipeline.is3d(st)
plotattributes[:x], plotattributes[:y], plotattributes[:z]
elseif st == :straightline
straightline_data(series)
@@ -217,7 +227,7 @@ function pgf_series(sp::Subplot, series::Series)
end
# add to legend?
if i == 1 && sp[:legend] != :none && should_add_to_legend(series)
if i == 1 && sp[:legend_position] != :none && should_add_to_legend(series)
if plotattributes[:fillrange] !== nothing
push!(style, "forget plot")
push!(series_collection, pgf_fill_legend_hack(plotattributes, args))
@@ -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
@@ -271,7 +289,7 @@ function pgf_fillrange_series(series, i, fillrange, args...)
push!(style, _pgf_series_extrastyle[st])
end
kw[:style] = join(style, ',')
func = is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear
func = RecipesPipeline.is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear
return func(pgf_fillrange_args(fillrange, args...)...; kw...)
end
@@ -313,7 +331,7 @@ end
# ----------------------------------------------------------------
function pgf_axis(sp::Subplot, letter)
axis = sp[Symbol(letter,:axis)]
axis = sp[get_attr_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[get_attr_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[get_attr_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[get_attr_symbol(letter, :min)] = lims[1]
kw[get_attr_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,13 +538,13 @@ 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()
# add to style/kw for each axis
for letter in (:x, :y, :z)
if letter != :z || is3d(sp)
if letter != :z || RecipesPipeline.is3d(sp)
axisstyle, axiskw = pgf_axis(sp, letter)
append!(style, axisstyle)
merge!(kw, axiskw)
@@ -456,45 +556,71 @@ 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)
kw[:axisEqual] = "true"
end
legpos = sp[:legend]
legpos = sp[:legend_position]
if haskey(_pgfplots_legend_pos, legpos)
kw[:legendPos] = _pgfplots_legend_pos[legpos]
end
cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend]))
fg_alpha = alpha(plot_color(sp[:foreground_color_legend]))
cstr, bg_alpha = pgf_color(plot_color(sp[:legend_background_color]))
fg_alpha = alpha(plot_color(sp[:legend_foreground_color]))
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[:legend_foreground_color],
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)),
"}",
))
"text opacity = $(alpha(plot_color(sp[:legend_font_color]))),",
"font = ",
pgf_font(sp[:legend_font_pointsize], pgf_thickness_scaling(sp)),
"}",
),
)
if any(s[:seriestype] == :contour for s in series_list(sp))
kw[:view] = "{0}{90}"
kw[:colorbar] = !(sp[:colorbar] in (:none, :off, :hide, false))
elseif is3d(sp)
elseif RecipesPipeline.is3d(sp)
azim, elev = sp[:camera]
kw[:view] = "{$(azim)}{$(elev)}"
end
@@ -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
@@ -598,3 +740,5 @@ function _display(plt::Plot{PGFPlotsBackend})
# cleanup
PGFPlots.cleanup(plt.o)
end
# COV_EXCL_STOP
+604
View File
@@ -0,0 +1,604 @@
# https://github.com/mbaz/Gaston.
should_warn_on_unsupported(::GastonBackend) = false
# Create the window/figure for this backend.
function _create_backend_figure(plt::Plot{GastonBackend})
state_handle = Gaston.nexthandle() # for now all the figures will be kept
plt.o = Gaston.newfigure(state_handle)
end
function _before_layout_calcs(plt::Plot{GastonBackend})
# Initialize all the subplots first
plt.o.subplots = Gaston.SubPlot[]
n1 = n2 = 0
if length(plt.inset_subplots) > 0
n1, sps = gaston_get_subplots(0, plt.inset_subplots, plt.layout)
gaston_init_subplots(plt, sps)
end
if length(plt.subplots) > 0
n2, sps = gaston_get_subplots(0, plt.subplots, plt.layout)
end
if (n = n1 + n2) != length(plt.subplots)
@error "Gaston: $n != $(length(plt.subplots))"
end
plt.o.layout = gaston_init_subplots(plt, sps)
# Then add the series (curves in gaston)
for series in plt.series_list
gaston_add_series(plt, series)
end
for sp in plt.subplots
sp === nothing && continue
for ann in sp[:annotations]
x, y, val = locate_annotation(sp, ann...)
sp.o.axesconf *= "\nset label '$(val.str)' at $x,$y $(gaston_font(val.font))"
end
end
nothing
end
function _update_min_padding!(sp::Subplot{GastonBackend})
sp.minpad = 0mm, 0mm, 0mm, 0mm
nothing
end
function _update_plot_object(plt::Plot{GastonBackend})
# respect the layout ratio
dat = gaston_multiplot_pos_size(plt.layout, (0, 0, 1, 1))
gaston_multiplot_pos_size!(dat)
nothing
end
for (mime, term) in (
"application/eps" => "epscairo",
"image/eps" => "epslatex",
"application/pdf" => "pdfcairo",
"application/postscript" => "postscript",
"image/png" => "png",
"image/svg+xml" => "svg",
"text/latex" => "tikz",
"application/x-tex" => "epslatex",
"text/plain" => "dumb",
)
@eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{GastonBackend})
term = String($term)
tmpfile = "$(Gaston.tempname()).$term"
Gaston.save(
term = term,
output = tmpfile,
handle = plt.o.handle,
saveopts = gaston_saveopts(plt),
)
while !isfile(tmpfile)
end # avoid race condition with read in next line
write(io, read(tmpfile))
rm(tmpfile, force = true)
nothing
end
end
_display(plt::Plot{GastonBackend}) = display(plt.o)
# --------------------------------------------
# These functions are gaston specific
# --------------------------------------------
function gaston_saveopts(plt::Plot{GastonBackend})
saveopts = String["size $(join(plt.attr[:size], ","))"]
push!(
saveopts,
gaston_font(
plottitlefont(plt),
rot = false,
align = false,
color = false,
scale = 1,
),
)
push!(saveopts, "background $(gaston_color(plt.attr[:background_color]))")
# push!(saveopts, "title '$(plt.attr[:window_title])'")
# Scale all plot elements to match Plots.jl DPI standard
scaling = plt.attr[:dpi] / Plots.DPI
push!(saveopts, "fontscale $scaling lw $scaling dl $scaling") # ps $scaling
return join(saveopts, " ")
end
function gaston_get_subplots(n, plt_subplots, layout)
nr, nc = size(layout)
sps = Array{Any}(nothing, nr, nc)
for r in 1:nr, c in 1:nc # NOTE: col major
l = layout[r, c]
if l isa GridLayout
n, sub = gaston_get_subplots(n, plt_subplots, l)
sps[r, c] = size(sub) == (1, 1) ? only(sub) : sub
else
sps[r, c] = get(l.attr, :blank, false) ? nothing : plt_subplots[n += 1]
end
end
return n, sps
end
function gaston_init_subplots(plt, sps)
sz = nr, nc = size(sps)
for c in 1:nc, r in 1:nr # NOTE: row major
sp = sps[r, c]
if sp isa Subplot || sp === nothing
gaston_init_subplot(plt, sp)
else
gaston_init_subplots(plt, sp)
sz = max.(sz, size(sp))
end
end
return sz
end
function gaston_init_subplot(
plt::Plot{GastonBackend},
sp::Union{Nothing,Subplot{GastonBackend}},
)
if sp === nothing
push!(plt.o.subplots, sp)
else
dims =
RecipesPipeline.is3d(sp) ||
sp.attr[:projection] == "3d" ||
needs_any_3d_axes(sp) ? 3 : 2
any_label = false
for series in series_list(sp)
if dims == 2 && series[:seriestype] (:heatmap, :contour)
dims = 3 # we need heatmap/contour to use splot, not plot
end
any_label |= should_add_to_legend(series)
end
sp.o = Gaston.Plot(
dims = dims,
curves = [],
axesconf = gaston_parse_axes_args(plt, sp, dims, any_label),
)
push!(plt.o.subplots, sp.o)
end
nothing
end
function gaston_multiplot_pos_size(layout, parent_xy_wh)
nr, nc = size(layout)
dat = Array{Any}(nothing, nr, nc)
for r in 1:nr, c in 1:nc
l = layout[r, c]
# width and height (pct) are multiplicative (parent)
w = layout.widths[c].value * parent_xy_wh[3]
h = layout.heights[r].value * parent_xy_wh[4]
if isa(l, EmptyLayout)
dat[r, c] = (c - 1) * w, (r - 1) * h, w, h, nothing
else
# previous position (origin)
prev_r = r > 1 ? dat[r - 1, c] : nothing
prev_c = c > 1 ? dat[r, c - 1] : nothing
prev_r isa Array && (prev_r = prev_r[end, end])
prev_c isa Array && (prev_c = prev_c[end, end])
x = prev_c !== nothing ? prev_c[1] + prev_c[3] : parent_xy_wh[1]
y = prev_r !== nothing ? prev_r[2] + prev_r[4] : parent_xy_wh[2]
if l isa GridLayout
sub = gaston_multiplot_pos_size(l, (x, y, w, h))
dat[r, c] = size(sub) == (1, 1) ? only(sub) : sub
else
dat[r, c] = x, y, w, h, l
end
end
end
return dat
end
function gaston_multiplot_pos_size!(dat)
nr, nc = size(dat)
for r in 1:nr, c in 1:nc
xy_wh_sp = dat[r, c]
if xy_wh_sp isa Array
gaston_multiplot_pos_size!(xy_wh_sp)
elseif xy_wh_sp isa Tuple
x, y, w, h, sp = xy_wh_sp
sp === nothing && continue
sp.o === nothing && continue
# gnuplot screen coordinates: bottom left at 0,0 and top right at 1,1
sp.o.axesconf = "set origin $x, $(1 - y - h)\nset size $w, $h\n" * sp.o.axesconf
end
end
nothing
end
function gaston_add_series(plt::Plot{GastonBackend}, series::Series)
sp = series[:subplot]
gsp = sp.o
x, y, z = series[:x], series[:y], series[:z]
st = series[:seriestype]
curves = []
if gsp.dims == 2 && z === nothing
for (n, seg) in enumerate(series_segments(series, st; check = true))
i, rng = seg.attr_index, seg.range
fr = _cycle(series[:fillrange], 1:length(x[rng]))
for sc in gaston_seriesconf!(sp, series, i, n == 1)
push!(curves, Gaston.Curve(x[rng], y[rng], nothing, fr, sc))
end
end
else
if z isa Surface
z = z.surf
if st == :image
z = reverse(Float32.(Gray.(z)), dims = 1) # flip y axis
nr, nc = size(z)
if (ly = length(y)) == 2 && ly != nr
y = collect(range(y[1], y[2], length = nr))
end
if (lx = length(x)) == 2 && lx != nc
x = collect(range(x[1], x[2], length = nc))
end
end
length(x) == size(z, 2) + 1 && (x = (x[1:(end - 1)] + x[2:end]) / 2)
length(y) == size(z, 1) + 1 && (y = (y[1:(end - 1)] + y[2:end]) / 2)
end
if st == :mesh3d
x, y, z = mesh3d_triangles(x, y, z, series[:connections])
end
for sc in gaston_seriesconf!(sp, series, 1, true)
push!(curves, Gaston.Curve(x, y, z, nothing, sc))
end
end
for c in curves
append = length(gsp.curves) > 0
push!(gsp.curves, c)
Gaston.write_data(c, gsp.dims, gsp.datafile, append = append)
end
nothing
end
function gaston_seriesconf!(
sp::Subplot{GastonBackend},
series::Series,
i::Int,
add_to_legend::Bool,
)
#=
gnuplot abbreviations (see gnuplot/src/set.c)
---------------------------------------------
dl: dashlength
dt: dashtype
fc: fillcolor
fs: fillstyle
lc: linecolor
lp: linespoints
ls: linestyle
lt: linetype
lw: linewidth
pi: pointinterval
pn: pointnumber
ps: pointscale
pt: pointtype
tc: textcolor
w: with
=#
gsp = sp.o
st = series[:seriestype]
extra = []
add_to_legend &= should_add_to_legend(series)
curveconf = String[add_to_legend ? "title '$(series[:label])'" : "notitle"]
clims = get_clims(sp, series)
if st (:scatter, :scatter3d)
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
pt, ps, mc = gaston_mk_ms_mc(series, clims, i)
push!(curveconf, "w points pt $pt ps $ps lc $mc")
elseif st (:path, :straightline, :path3d)
fr = series[:fillrange]
fc = gaston_color(get_fillcolor(series, i), get_fillalpha(series, i))
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
if fr !== nothing # filled curves, but not filled curves with markers
push!(
curveconf,
"w filledcurves fc $fc fs solid border lc $lc lw $lw dt $dt,'' w lines lc $lc lw $lw dt $dt",
)
elseif series[:markershape] == :none # simplepath
push!(curveconf, "w lines lc $lc dt $dt lw $lw")
else
pt, ps, mc = gaston_mk_ms_mc(series, clims, i)
push!(curveconf, "w lp lc $mc dt $dt lw $lw pt $pt ps $ps")
end
elseif st == :shape
fc = gaston_color(get_fillcolor(series, i), get_fillalpha(series, i))
lc, _ = gaston_lc_ls_lw(series, clims, i)
push!(curveconf, "w filledcurves fc $fc fs solid border lc $lc")
elseif st (:steppre, :stepmid, :steppost)
step = if st == :steppre
"fsteps"
elseif st == :stepmid
"histeps"
elseif st == :steppost
"steps"
end
push!(curveconf, "w $step")
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
push!(extra, "w points lc $lc dt $dt lw $lw notitle")
elseif st == :image
palette = gaston_palette(series[:seriescolor])
gsp.axesconf *= "\nset palette model RGB defined $palette"
push!(curveconf, "w image pixels")
elseif st (:contour, :contour3d)
push!(curveconf, "w lines")
st == :contour && (gsp.axesconf *= "\nset view map\nunset surface") # 2D
levels = join(map(string, collect(contour_levels(series, clims))), ", ")
gsp.axesconf *= "\nset contour base\nset cntrparam levels discrete $levels"
elseif st (:surface, :heatmap)
push!(curveconf, "w pm3d")
palette = gaston_palette(series[:seriescolor])
gsp.axesconf *= "\nset palette model RGB defined $palette"
st == :heatmap && (gsp.axesconf *= "\nset view map")
elseif st (:wireframe, :mesh3d)
lc, dt, lw = gaston_lc_ls_lw(series, clims, i)
push!(curveconf, "w lines lc $lc dt $dt lw $lw")
elseif st == :quiver
push!(curveconf, "w vectors filled")
else
@warn "Gaston: $st is not implemented yet"
end
return [join(curveconf, " "), extra...]
end
function gaston_parse_axes_args(
plt::Plot{GastonBackend},
sp::Subplot{GastonBackend},
dims::Int,
any_label::Bool,
)
# axesconf = String["set margins 2, 2, 2, 2"] # left, right, bottom, top
axesconf = String[]
polar = ispolar(sp) && dims == 2 # cannot splot in polar coordinates
for letter in (:x, :y, :z)
(letter == :z && dims == 2) && continue
axis = sp.attr[get_attr_symbol(letter, :axis)]
# label names
push!(
axesconf,
"set $(letter)label '$(axis[:guide])' $(gaston_font(guidefont(axis)))",
)
mirror = axis[:mirror] ? "mirror" : "nomirror"
if axis[:scale] == :identity
logscale, base = "nologscale", ""
elseif axis[:scale] == :log10
logscale, base = "logscale", "10"
elseif axis[:scale] == :log2
logscale, base = "logscale", "2"
elseif axis[:scale] == :ln
logscale, base = "logscale", "e"
end
push!(axesconf, "set $logscale $letter $base")
# handle ticks
if polar
push!(axesconf, "set size square\nunset $(letter)tics")
else
push!(
axesconf,
"set $(letter)tics $(mirror) $(axis[:tick_direction]) $(gaston_font(tickfont(axis)))",
)
# major tick locations
if axis[:ticks] != :native
if axis[:flip]
hi, lo = axis_limits(sp, letter)
else
lo, hi = axis_limits(sp, letter)
end
push!(axesconf, "set $(letter)range [$lo:$hi]")
ticks = get_ticks(sp, axis)
gaston_set_ticks!(axesconf, ticks, letter, "", "")
if axis[:minorticks] != :native
minor_ticks = get_minor_ticks(sp, axis, ticks)
gaston_set_ticks!(axesconf, minor_ticks, letter, "m", "add")
end
end
end
if axis[:grid]
push!(axesconf, "set grid " * (polar ? "polar" : "$(letter)tics"))
axis[:minorgrid] &&
push!(axesconf, "set grid " * (polar ? "polar" : "m$(letter)tics"))
end
ratio = get_aspect_ratio(sp)
if ratio != :none
ratio == :equal && (ratio = -1)
push!(axesconf, "set size ratio $ratio")
end
end
gaston_set_legend!(axesconf, sp, any_label)
if hascolorbar(sp)
push!(axesconf, "set cbtics $(gaston_font(colorbartitlefont(sp)))")
end
if sp[:title] !== nothing
push!(axesconf, "set title '$(sp[:title])' $(gaston_font(titlefont(sp)))")
end
if polar
push!(axesconf, "unset border\nset polar\nset border polar")
tmin, tmax = axis_limits(sp, :x, false, false)
rmin, rmax = axis_limits(sp, :y, false, false)
rticks = get_ticks(sp, :y)
if (ttype = ticksType(rticks)) == :ticks
gaston_ticks = string.(rticks)
elseif ttype == :ticks_and_labels
gaston_ticks = String["'$l' $t" for (t, l) in zip(rticks...)]
end
push!(
axesconf,
"set rtics ( " *
join(gaston_ticks, ", ") *
" ) $(gaston_font(tickfont(sp.attr[:yaxis])))",
)
push!(axesconf, "set trange [$(min(0, tmin)):$(max(2π, tmax))]")
push!(axesconf, "set rrange [$rmin:$rmax]")
push!(
axesconf,
"set ttics 0,30 format \"%g\".GPVAL_DEGREE_SIGN $(gaston_font(tickfont(sp.attr[:xaxis])))",
)
push!(axesconf, "set mttics 3")
end
return join(axesconf, "\n")
end
function gaston_set_ticks!(axesconf, ticks, letter, maj_min, add)
ticks == :auto && return
if ticks (:none, nothing, false)
push!(axesconf, "unset $(maj_min)$(letter)tics")
return
end
gaston_ticks = String[]
if (ttype = ticksType(ticks)) == :ticks
tick_locs = @view ticks[:]
for i in eachindex(tick_locs)
tick = if maj_min == "m"
"'' $(tick_locs[i]) 1" # see gnuplot manual 'Mxtics'
else
"$(tick_locs[i])"
end
push!(gaston_ticks, tick)
end
elseif ttype == :ticks_and_labels
tick_locs = @view ticks[1][:]
tick_labels = @view ticks[2][:]
for i in eachindex(tick_locs)
lab = gaston_enclose_tick_string(tick_labels[i])
push!(gaston_ticks, "'$lab' $(tick_locs[i])")
end
else
gaston_ticks = nothing
@error "Gaston: invalid input for $(maj_min)$(letter)ticks: $ticks"
end
if gaston_ticks !== nothing
push!(axesconf, "set $(letter)tics $add (" * join(gaston_ticks, ", ") * ")")
end
nothing
end
function gaston_set_legend!(axesconf, sp, any_label)
leg = sp[:legend_position]
if sp[:legend_position] (:none, :inline) && any_label
leg == :best && (leg = :topright)
push!(
axesconf,
"set key " * (occursin("outer", string(leg)) ? "outside" : "inside"),
)
for position in ("top", "bottom", "left", "right")
occursin(position, string(leg)) && push!(axesconf, "set key $position")
end
push!(axesconf, "set key $(gaston_font(legendfont(sp), rot=false, align=false))")
if sp[:legend_title] !== nothing
# NOTE: cannot use legendtitlefont(sp) as it will override legendfont
push!(axesconf, "set key title '$(sp[:legend_title])'")
end
push!(axesconf, "set key box lw 1 opaque")
push!(axesconf, "set border back")
else
push!(axesconf, "set key off")
end
nothing
end
# --------------------------------------------
# Helpers
# --------------------------------------------
gaston_halign(k) = (left = :left, hcenter = :center, right = :right)[k]
gaston_valign(k) = (top = :top, vcenter = :center, bottom = :bottom)[k]
gaston_alpha(alpha) = alpha === nothing ? 0 : alpha
gaston_lc_ls_lw(series::Series, clims, i::Int) = (
gaston_color(get_linecolor(series, clims, i), get_linealpha(series, i)),
gaston_linestyle(get_linestyle(series, i)),
get_linewidth(series, i),
)
gaston_mk_ms_mc(series::Series, clims, i::Int) = (
gaston_marker(_cycle(series[:markershape], i), get_markeralpha(series, i)),
_cycle(series[:markersize], i) * 1.3 / 5,
gaston_color(get_markercolor(series, clims, i), get_markeralpha(series, i)),
)
function gaston_font(f; rot = true, align = true, color = true, scale = 1)
font = String["font '$(f.family),$(round(Int, scale * f.pointsize))'"]
align && push!(font, "$(gaston_halign(f.halign))")
rot && push!(font, "rotate by $(f.rotation)")
color && push!(font, "textcolor $(gaston_color(f.color))")
return join(font, " ")
end
function gaston_palette(gradient)
palette = String[]
n = -1
for rgba in gradient # FIXME: naive conversion, inefficient ?
push!(palette, "$(n += 1) $(rgba.r) $(rgba.g) $(rgba.b)")
end
return '(' * join(palette, ", ") * ')'
end
function gaston_marker(marker, alpha)
# NOTE: :rtriangle, :ltriangle, :hexagon, :heptagon, :octagon seems unsupported by gnuplot
filled = gaston_alpha(alpha) == 0
marker == :none && return -1
marker == :pixel && return 0
marker (:+, :cross) && return 1
marker (:x, :xcross) && return 2
marker == :star5 && return 3
marker == :rect && return filled ? 5 : 4
marker == :circle && return filled ? 7 : 6
marker == :utriangle && return filled ? 9 : 8
marker == :dtriangle && return filled ? 11 : 10
marker == :diamond && return filled ? 13 : 12
marker == :pentagon && return filled ? 15 : 14
@warn "Gaston: unsupported marker $marker"
return 1
end
function gaston_color(col, alpha = 0)
col = single_color(col) # in case of gradients
col = alphacolor(col, gaston_alpha(alpha)) # add a default alpha if non existent
return "rgb '#$(hex(col, :aarrggbb))'"
end
function gaston_linestyle(style)
style == :solid && return "1"
style == :dash && return "2"
style == :dot && return "3"
style == :dashdot && return "4"
style == :dashdotdot && return "5"
end
function gaston_enclose_tick_string(tick_string)
findfirst("^", tick_string) === nothing && return tick_string
base, power = split(tick_string, "^")
return "$base^{$power}"
end
+1481 -1254
View File
File diff suppressed because it is too large Load Diff
+494 -516
View File
File diff suppressed because it is too large Load Diff
+220 -122
View File
@@ -13,13 +13,10 @@ Add in functionality to Plots.jl:
:aspect_ratio,
=#
# ---------------------------------------------------------------------------
should_warn_on_unsupported(::InspectDRBackend) = false
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(
texmath2unicode(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,90 @@ 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 = texmath2unicode(sp[:title])
a.xlabel = texmath2unicode(xaxis[:guide])
a.ylabels = [texmath2unicode(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_position] != :none)
#l.halloc_legend = 150 #TODO: compute???
l.font_legend = InspectDR.Font(
sp[:legend_font_family],
_inspectdr_mapptsize(sp[:legend_font_pointsize]),
color = _inspectdr_mapcolor(sp[:legend_font_color]),
)
l.frame_legend.fillcolor = _inspectdr_mapcolor(sp[:legend_background_color])
#_round!() ensures values use integer spacings (looks better on screen):
InspectDR._round!(InspectDR.autofit2font!(l, legend_width = 10.0)) #10 "em"s wide
return
end
# 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 +483,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 +504,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)
@@ -429,29 +531,23 @@ end
# ----------------------------------------------------------------
const _inspectdr_mimeformats_dpi = Dict(
"image/png" => "png"
)
const _inspectdr_mimeformats_nodpi = Dict(
"image/svg+xml" => "svg",
"application/eps" => "eps",
"image/eps" => "eps",
# "application/postscript" => "ps", #TODO: support once Cairo supports PSSurface
"application/pdf" => "pdf"
)
_inspectdr_show(io::IO, mime::MIME, ::Nothing, w, h) =
throw(ErrorException("Cannot show(::IO, ...) plot - not yet generated"))
function _inspectdr_show(io::IO, mime::MIME, mplot, w, h)
InspectDR._show(io, mime, mplot, Float64(w), Float64(h))
end
for (mime, fmt) in _inspectdr_mimeformats_dpi
@eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{InspectDRBackend})
dpi = plt[:dpi]#TODO: support
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
end
function _show(io::IO, mime::MIME{Symbol("image/png")}, plt::Plot{InspectDRBackend})
dpi = plt[:dpi] # TODO: support
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
end
for (mime, fmt) in _inspectdr_mimeformats_nodpi
for (mime, fmt) in (
"image/svg+xml" => "svg",
"application/eps" => "eps",
"image/eps" => "eps",
# "application/postscript" => "ps", # TODO: support once Cairo supports PSSurface
"application/pdf" => "pdf",
)
@eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{InspectDRBackend})
_inspectdr_show(io, mime, _inspectdr_getmplot(plt.o), plt[:size]...)
end
@@ -462,7 +558,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
-24
View File
@@ -1,24 +0,0 @@
function plotlybase_syncplot(plt::Plot)
plt.o = ORCA.PlotlyBase.Plot()
traces = ORCA.PlotlyBase.GenericTrace[]
for series_dict in plotly_series(plt)
plotly_type = pop!(series_dict, :type)
push!(traces, ORCA.PlotlyBase.GenericTrace(plotly_type; series_dict...))
end
ORCA.PlotlyBase.addtraces!(plt.o, traces...)
layout = plotly_layout(plt)
w, h = plt[:size]
ORCA.PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
return plt.o
end
const _orca_mimeformats = Dict(
"application/pdf" => "pdf",
"image/png" => "png",
"image/svg+xml" => "svg",
"image/eps" => "eps",
)
for (mime, fmt) in _orca_mimeformats
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) = ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
end
+923 -587
View File
File diff suppressed because it is too large Load Diff
+527 -270
View File
File diff suppressed because it is too large Load Diff
+23
View File
@@ -0,0 +1,23 @@
function plotlybase_syncplot(plt::Plot)
plt.o = PlotlyBase.Plot()
traces = PlotlyBase.GenericTrace[]
for series_dict in plotly_series(plt)
plotly_type = pop!(series_dict, :type)
push!(traces, PlotlyBase.GenericTrace(plotly_type; series_dict...))
end
PlotlyBase.addtraces!(plt.o, traces...)
layout = plotly_layout(plt)
w, h = plt[:size]
PlotlyBase.relayout!(plt.o, layout, width = w, height = h)
return plt.o
end
for (mime, fmt) in (
"application/pdf" => "pdf",
"image/png" => "png",
"image/svg+xml" => "svg",
"image/eps" => "eps",
)
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) =
PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
end
+10 -11
View File
@@ -8,6 +8,7 @@ function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend})
traces = PlotlyJS.GenericTrace[]
for series_dict in plotly_series(plt)
plotly_type = pop!(series_dict, :type)
series_dict[:transpose] = false
push!(traces, PlotlyJS.GenericTrace(plotly_type; series_dict...))
end
PlotlyJS.addtraces!(plt.o, traces...)
@@ -19,32 +20,30 @@ end
# ------------------------------------------------------------------------------
const _plotlyjs_mimeformats = Dict(
for (mime, fmt) in (
"application/pdf" => "pdf",
"image/png" => "png",
"image/svg+xml" => "svg",
"image/eps" => "eps",
)
for (mime, fmt) in _plotlyjs_mimeformats
@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))
@require WebIO = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" begin
function WebIO.render(plt::Plot{PlotlyJSBackend})
plt_html = sprint(show, MIME("text/html"), plt)
return WebIO.render(dom"div"(innerHTML=plt_html))
end
function PlotlyJS.WebIO.render(plt::Plot{PlotlyJSBackend})
return PlotlyJS.WebIO.render(plotlyjs_syncplot(plt))
end
function closeall(::PlotlyJSBackend)
+826 -470
View File
File diff suppressed because it is too large Load Diff
+328 -137
View File
@@ -1,182 +1,373 @@
# https://github.com/JuliaPlots/UnicodePlots.jl
# https://github.com/Evizero/UnicodePlots.jl
const _canvas_map = (
braille = UnicodePlots.BrailleCanvas,
density = UnicodePlots.DensityCanvas,
heatmap = UnicodePlots.HeatmapCanvas,
lookup = UnicodePlots.LookupCanvas,
ascii = UnicodePlots.AsciiCanvas,
block = UnicodePlots.BlockCanvas,
dot = UnicodePlots.DotCanvas,
)
should_warn_on_unsupported(::UnicodePlotsBackend) = false
# don't warn on unsupported... there's just too many warnings!!
warnOnUnsupported_args(::UnicodePlotsBackend, plotattributes::KW) = nothing
# --------------------------------------------------------------------------------------
const _canvas_type = Ref(:auto)
function _canvas_map()
KW(
:braille => UnicodePlots.BrailleCanvas,
:ascii => UnicodePlots.AsciiCanvas,
:block => UnicodePlots.BlockCanvas,
:dot => UnicodePlots.DotCanvas,
:density => UnicodePlots.DensityCanvas,
)
end
# do all the magic here... build it all at once, since we need to know about all the series at the very beginning
function rebuildUnicodePlot!(plt::Plot, width, height)
plt.o = []
function _before_layout_calcs(plt::Plot{UnicodePlotsBackend})
plt.o = UnicodePlots.Plot[]
up_width = UnicodePlots.DEFAULT_WIDTH[]
up_height = UnicodePlots.DEFAULT_HEIGHT[]
has_layout = prod(size(plt.layout)) > 1
for sp in plt.subplots
sp_kw = sp[:extra_kwargs]
xaxis = sp[:xaxis]
yaxis = sp[:yaxis]
xlim = axis_limits(sp, :x)
ylim = axis_limits(sp, :y)
xlim = collect(axis_limits(sp, :x))
ylim = collect(axis_limits(sp, :y))
zlim = collect(axis_limits(sp, :z))
F = float(eltype(xlim))
# make vectors
xlim = [xlim[1], xlim[2]]
ylim = [ylim[1], ylim[2]]
# We set x/y to have a single point,
# since we need to create the plot with some data.
# Since this point is at the bottom left corner of the plot,
# it should be hidden by consecutive plotting commands.
x = Vector{F}(xlim)
y = Vector{F}(ylim)
z = Vector{F}(zlim)
# we set x/y to have a single point, since we need to create the plot with some data.
# since this point is at the bottom left corner of the plot, it shouldn't actually be shown
x = Float64[xlim[1]]
y = Float64[ylim[1]]
# create a plot window with xlim/ylim set, but the X/Y vectors are outside the bounds
ct = _canvas_type[]
canvas_type = if ct == :auto
isijulia() ? UnicodePlots.AsciiCanvas : UnicodePlots.BrailleCanvas
# create a plot window with xlim/ylim set,
# but the X/Y vectors are outside the bounds
canvas = if (up_c = get(sp_kw, :canvas, :auto)) === :auto
isijulia() ? :ascii : :braille
else
_canvas_map()[ct]
up_c
end
# special handling for spy
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
))
continue
border = if (up_b = get(sp_kw, :border, :auto)) === :auto
isijulia() ? :ascii : :solid
else
up_b
end
# blank plots will not be shown
width = has_layout && isempty(series_list(sp)) ? 0 : get(sp_kw, :width, up_width)
height = get(sp_kw, :height, up_height)
plot_3d = is3d(sp)
blend = get(sp_kw, :blend, true)
grid = xaxis[:grid] && yaxis[:grid]
quiver = contour = false
for series in series_list(sp)
st = series[:seriestype]
blend &= get(series[:extra_kwargs], :blend, true)
quiver |= series[:arrow] isa Arrow # post-pipeline detection (:quiver -> :path)
contour |= st === :contour
if st === :histogram2d
xlim = ylim = (0, 0)
elseif st === :spy || st === :heatmap
width = height = 0
grid = false
end
end
grid &= !(quiver || contour)
blend &= !(quiver || contour)
# # make it a bar canvas if plotting bar
# if any(series -> series[:seriestype] == :bar, series_list(sp))
# canvas_type = UnicodePlots.BarplotGraphics
# end
plot_3d && (xlim = ylim = (0, 0)) # determined using projection
azimuth, elevation = sp[:camera] # PyPlot: azimuth = -60 & elevation = 30
projection = plot_3d ? get(sp_kw, :projection, :orthographic) : nothing
o = UnicodePlots.Plot(x, y, canvas_type;
width = width,
kw = (
compact = true,
title = texmath2unicode(sp[:title]),
xlabel = texmath2unicode(xaxis[:guide]),
ylabel = texmath2unicode(yaxis[:guide]),
grid = grid,
blend = blend,
height = height,
title = sp[:title],
width = width,
xscale = xaxis[:scale],
yscale = yaxis[:scale],
border = border,
xlim = xlim,
ylim = ylim,
border = isijulia() ? :ascii : :solid
# 3d
projection = projection,
elevation = elevation,
azimuth = azimuth,
zoom = get(sp_kw, :zoom, 1),
up = get(sp_kw, :up, :z),
)
# set the axis labels
UnicodePlots.xlabel!(o, xaxis[:guide])
UnicodePlots.ylabel!(o, yaxis[:guide])
# now use the ! functions to add to the plot
o = UnicodePlots.Plot(x, y, plot_3d ? z : nothing, _canvas_map[canvas]; kw...)
for series in series_list(sp)
addUnicodeSeries!(o, series.plotattributes, sp[:legend] != :none, xlim, ylim)
o = addUnicodeSeries!(
sp,
o,
kw,
series,
sp[:legend_position] !== :none,
plot_3d,
)
end
# save the object
push!(plt.o, o)
for ann in sp[:annotations]
x, y, val = locate_annotation(sp, ann...)
o = UnicodePlots.annotate!(
o,
x,
y,
texmath2unicode(val.str);
color = up_color(val.font.color),
halign = val.font.halign,
valign = val.font.valign,
)
end
push!(plt.o, o) # save the object
end
end
up_color(col::UnicodePlots.UserColorType) = col
up_color(col::RGBA) =
(c = convert(ARGB32, col); map(Int, (red(c).i, green(c).i, blue(c).i)))
up_color(col) = :auto
function up_cmap(series)
rng = range(0, 1, length = length(UnicodePlots.COLOR_MAP_DATA[:viridis]))
[(red(c), green(c), blue(c)) for c in get(get_colorgradient(series), rng)]
end
# add a single series
function addUnicodeSeries!(o, plotattributes, addlegend::Bool, xlim, ylim)
# get the function, or special handling for step/bar/hist
st = plotattributes[:seriestype]
if st == :histogram2d
UnicodePlots.densityplot!(o, plotattributes[:x], plotattributes[:y])
return
end
if st in (:path, :straightline)
func = UnicodePlots.lineplot!
elseif st == :scatter || plotattributes[:markershape] != :none
func = UnicodePlots.scatterplot!
# elseif st == :bar
# func = UnicodePlots.barplot!
elseif st == :shape
func = UnicodePlots.lineplot!
else
error("Linestyle $st not supported by UnicodePlots")
end
function addUnicodeSeries!(
sp::Subplot{UnicodePlotsBackend},
up::UnicodePlots.Plot,
kw,
series,
addlegend::Bool,
plot_3d::Bool,
)
st = series[:seriestype]
se_kw = series[:extra_kwargs]
# get the series data and label
x, y = if st == :straightline
straightline_data(plotattributes)
elseif st == :shape
shape_data(plotattributes)
x, y = if st === :straightline
straightline_data(series)
elseif st === :shape
shape_data(series)
else
[collect(float(plotattributes[s])) for s in (:x, :y)]
end
label = addlegend ? plotattributes[:label] : ""
# if we happen to pass in allowed color symbols, great... otherwise let UnicodePlots decide
color = plotattributes[:linecolor] in UnicodePlots.color_cycle ? plotattributes[:linecolor] : :auto
# add the series
x, y = Plots.unzip(collect(Base.Iterators.filter(xy->isfinite(xy[1])&&isfinite(xy[2]), zip(x,y))))
func(o, x, y; color = color, name = label)
end
# -------------------------------
# since this is such a hack, it's only callable using `png`... should error during normal `show`
function png(plt::AbstractPlot{UnicodePlotsBackend}, fn::AbstractString)
fn = addExtension(fn, "png")
# make some whitespace and show the plot
println("\n\n\n\n\n\n")
gui(plt)
# @osx_only begin
@static if Sys.isapple()
# BEGIN HACK
# wait while the plot gets drawn
sleep(0.5)
# use osx screen capture when my terminal is maximized and cursor starts at the bottom (I know, right?)
# TODO: compute size of plot to adjust these numbers (or maybe implement something good??)
run(`screencapture -R50,600,700,420 $fn`)
# END HACK (phew)
return
series[:x], series[:y]
end
error("Can only savepng on osx with UnicodePlots (though even then I wouldn't do it)")
if ispolar(sp) || ispolar(series)
return UnicodePlots.polarplot(x, y)
end
# special handling (src/interface)
fix_ar = get(se_kw, :fix_ar, true)
if st === :histogram2d
return UnicodePlots.densityplot(x, y; kw...)
elseif st === :spy
return UnicodePlots.spy(Array(series[:z]); fix_ar = fix_ar, kw...)
elseif st in (:contour, :heatmap) # 2D
colormap = get(se_kw, :colormap, :none)
kw = (
kw...,
zlabel = sp[:colorbar_title],
colormap = colormap === :none ? up_cmap(series) : colormap,
colorbar = hascolorbar(sp),
)
if st === :contour
isfilledcontour(series) &&
@warn "Plots(UnicodePlots): filled contour is not implemented"
return UnicodePlots.contourplot(
x,
y,
Array(series[:z]);
kw...,
levels = series[:levels],
)
elseif st === :heatmap
return UnicodePlots.heatmap(Array(series[:z]); fix_ar = fix_ar, kw...)
end
elseif st in (:surface, :wireframe) # 3D
colormap = get(se_kw, :colormap, :none)
lines = get(se_kw, :lines, st === :wireframe)
zscale = get(se_kw, :zscale, :identity)
kw = (
kw...,
zlabel = sp[:colorbar_title],
colormap = colormap === :none ? up_cmap(series) : colormap,
colorbar = hascolorbar(sp),
color = st === :wireframe ? up_color(get_linecolor(series, 1)) : nothing,
zscale = zscale,
lines = lines,
)
return UnicodePlots.surfaceplot(x, y, Array(series[:z]); kw...)
elseif st === :mesh3d
return UnicodePlots.lineplot!(
up,
mesh3d_triangles(x, y, series[:z], series[:connections])...,
)
end
# now use the ! functions to add to the plot
if st in (:path, :path3d, :straightline, :shape, :mesh3d)
func = UnicodePlots.lineplot!
series_kw = (; head_tail = series[:arrow] isa Arrow ? series[:arrow].side : nothing)
elseif st in (:scatter, :scatter3d) || series[:markershape] !== :none
func = UnicodePlots.scatterplot!
series_kw = (; marker = series[:markershape])
else
error("Plots(UnicodePlots): series type $st not supported")
end
label = addlegend ? series[:label] : ""
for (n, segment) in enumerate(series_segments(series, st; check = true))
i, rng = segment.attr_index, segment.range
lc = get_linecolor(series, i)
up = func(
up,
x[rng],
y[rng],
plot_3d ? series[:z][rng] : nothing;
color = up_color(lc),
name = n == 1 ? label : "",
series_kw...,
)
end
for (xi, yi, str, fnt) in EachAnn(series[:series_annotations], x, y)
up = UnicodePlots.annotate!(
up,
xi,
yi,
str;
color = up_color(fnt.color),
halign = fnt.halign,
valign = fnt.valign,
)
end
up
end
# -------------------------------
# ------------------------------------------------------------------------------------------
# we don't do very much for subplots... just stack them vertically
function unicodeplots_rebuild(plt::Plot{UnicodePlotsBackend})
w, h = plt[:size]
plt.attr[:color_palette] = [RGB(0,0,0)]
rebuildUnicodePlot!(plt, div(w, 10), div(h, 20))
function _show(io::IO, ::MIME"image/png", plt::Plot{UnicodePlotsBackend})
prepare_output(plt)
nr, nc = size(plt.layout)
s1 = zeros(Int, nr, nc)
s2 = zeros(Int, nr, nc)
canvas_type = nothing
imgs = []
sps = 0
for r in 1:nr
for c in 1:nc
if (l = plt.layout[r, c]) isa GridLayout && size(l) != (1, 1)
error("Plots(UnicodePlots): complex nested layout is currently unsupported")
else
img = UnicodePlots.png_image(plt.o[sps += 1])
canvas_type = eltype(img)
h, w = size(img)
s1[r, c] = h
s2[r, c] = w
push!(imgs, img)
end
end
end
if canvas_type !== nothing
m1 = maximum(s1; dims = 2)
m2 = maximum(s2; dims = 1)
img = zeros(canvas_type, sum(m1), sum(m2))
sps = 0
n1 = 1
for r in 1:nr
n2 = 1
for c in 1:nc
sp = imgs[sps += 1]
h, w = size(sp)
img[n1:(n1 + (h - 1)), n2:(n2 + (w - 1))] = sp
n2 += m2[c]
end
n1 += m1[r]
end
stream = UnicodePlots.FileIO.Stream{UnicodePlots.FileIO.format"PNG"}(io)
UnicodePlots.FileIO.save(stream, img)
end
nothing
end
Base.show(plt::Plot{UnicodePlotsBackend}) = show(stdout, plt)
Base.show(io::IO, plt::Plot{UnicodePlotsBackend}) = _show(io, MIME("text/plain"), plt)
# NOTE: _show(...) must be kept for Base.showable (src/output.jl)
function _show(io::IO, ::MIME"text/plain", plt::Plot{UnicodePlotsBackend})
unicodeplots_rebuild(plt)
foreach(x -> show(io, x), plt.o)
prepare_output(plt)
nr, nc = size(plt.layout)
if nr == 1 && nc == 1 # fast path
n = length(plt.o)
for (i, p) in enumerate(plt.o)
show(io, p)
i < n && println(io)
end
else
have_color = Base.get_have_color()
buf = IOContext(PipeBuffer(), :color => have_color)
lines_colored = Array{Union{Nothing,Vector{String}}}(undef, nr, nc)
lines_uncolored = have_color ? similar(lines_colored) : lines_colored
l_max = zeros(Int, nr)
w_max = zeros(Int, nc)
sps = 0
for r in 1:nr
lmax = 0
for c in 1:nc
if (l = plt.layout[r, c]) isa GridLayout && size(l) != (1, 1)
error(
"Plots(UnicodePlots): complex nested layout is currently unsupported",
)
else
if get(l.attr, :blank, false)
lines_colored[r, c] = lines_uncolored[r, c] = nothing
else
sp = plt.o[sps += 1]
show(buf, sp)
colored = read(buf, String)
lines_colored[r, c] = lu = lc = split(colored, '\n')
if have_color
uncolored = UnicodePlots.no_ansi_escape(colored)
lines_uncolored[r, c] = lu = split(uncolored, '\n')
end
lmax = max(length(lc), lmax)
w_max[c] = max(maximum(length.(lu)), w_max[c])
end
end
end
l_max[r] = lmax
end
empty = String[' '^w for w in w_max]
for r in 1:nr
for n in 1:l_max[r]
for c in 1:nc
pre = c == 1 ? '\0' : ' '
lc = lines_colored[r, c]
if lc === nothing || length(lc) < n
print(io, pre, empty[c])
else
lu = lines_uncolored[r, c]
print(io, pre, lc[n], ' '^(w_max[c] - length(lu[n])))
end
end
n < l_max[r] && println(io)
end
r < nr && println(io)
end
end
nothing
end
# we only support MIME"text/plain", hence display(...) falls back to plain-text on stdout
function _display(plt::Plot{UnicodePlotsBackend})
unicodeplots_rebuild(plt)
map(show, plt.o)
nothing
show(stdout, plt)
println(stdout)
end
+13 -3
View File
@@ -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"),
)
"""
<!DOCTYPE html>
<html>
@@ -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[] = 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)
+105
View File
@@ -0,0 +1,105 @@
# These functions return an operator for use in `get_clims(::Seres, op)`
process_clims(lims::Tuple{<:Number,<:Number}) =
(zlims -> ifelse.(isfinite.(lims), lims, zlims)) ignorenan_extrema
process_clims(s::Union{Symbol,Nothing,Missing}) = ignorenan_extrema
# don't specialize on ::Function otherwise python functions won't work
process_clims(f) = f
get_clims(sp::Subplot)::Tuple{Float64,Float64} =
haskey(sp.attr, :clims_calculated) ? sp[:clims_calculated] : update_clims(sp)
get_clims(series::Series)::Tuple{Float64,Float64} =
haskey(series.plotattributes, :clims_calculated) ?
series[:clims_calculated]::Tuple{Float64,Float64} : update_clims(series)
get_clims(sp::Subplot, series::Series)::Tuple{Float64,Float64} =
series[:colorbar_entry] ? get_clims(sp) : get_clims(series)
function update_clims(sp::Subplot, op = process_clims(sp[:clims]))::Tuple{Float64,Float64}
zmin, zmax = Inf, -Inf
for series in series_list(sp)
if series[:colorbar_entry]::Bool
zmin, zmax = _update_clims(zmin, zmax, update_clims(series, op)...)
else
update_clims(series, op)
end
end
return sp[:clims_calculated] = zmin <= zmax ? (zmin, zmax) : (NaN, NaN)
end
"""
update_clims(::Series, op=Plots.ignorenan_extrema)
Finds the limits for the colorbar by taking the "z-values" for the series and passing them into `op`,
which must return the tuple `(zmin, zmax)`. The default op is the extrema of the finite
values of the input. The value is stored as a series property, which is retrieved by `get_clims`.
"""
function update_clims(series::Series, op = ignorenan_extrema)::Tuple{Float64,Float64}
zmin, zmax = Inf, -Inf
# keeping this unrolled has higher performance
if series[:seriestype] _z_colored_series && series[:z] !== nothing
zmin, zmax = update_clims(zmin, zmax, series[:z], op)
end
if series[:line_z] !== nothing
zmin, zmax = update_clims(zmin, zmax, series[:line_z], op)
end
if series[:marker_z] !== nothing
zmin, zmax = update_clims(zmin, zmax, series[:marker_z], op)
end
if series[:fill_z] !== nothing
zmin, zmax = update_clims(zmin, zmax, series[:fill_z], op)
end
return series[:clims_calculated] = zmin <= zmax ? (zmin, zmax) : (NaN, NaN)
end
update_clims(zmin, zmax, vals::AbstractSurface, op)::Tuple{Float64,Float64} =
update_clims(zmin, zmax, vals.surf, op)
update_clims(zmin, zmax, vals::Any, op)::Tuple{Float64,Float64} =
_update_clims(zmin, zmax, op(vals)...)
update_clims(zmin, zmax, ::Nothing, ::Any)::Tuple{Float64,Float64} = zmin, zmax
_update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax)
@enum ColorbarStyle cbar_gradient cbar_fill cbar_lines
function colorbar_style(series::Series)
colorbar_entry = series[:colorbar_entry]
if !(colorbar_entry isa Bool)
@warn "Non-boolean colorbar_entry ignored."
colorbar_entry = true
end
if !colorbar_entry
nothing
elseif isfilledcontour(series)
cbar_fill
elseif iscontour(series)
cbar_lines
elseif series[:seriestype] (:heatmap, :surface) ||
any(series[z] !== nothing for z in [:marker_z, :line_z, :fill_z])
cbar_gradient
else
nothing
end
end
hascolorbar(series::Series) = colorbar_style(series) !== nothing
hascolorbar(sp::Subplot) =
sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp))
function get_colorbar_ticks(sp::Subplot; update = true)
if update || !haskey(sp.attr, :colorbar_optimized_ticks)
ticks = _transform_ticks(sp[:colorbar_ticks])
cvals = sp[:colorbar_continuous_values]
dvals = sp[:colorbar_discrete_values]
clims = get_clims(sp)
scale = sp[:colorbar_scale]
formatter = sp[:colorbar_formatter]
sp.attr[:colorbar_optimized_ticks] =
get_ticks(ticks, cvals, dvals, clims, scale, formatter)
end
return sp.attr[:colorbar_optimized_ticks]
end
function _update_subplot_colorbars(sp::Subplot)
# Dynamic callback from the pipeline if needed
update_clims(sp)
end
+384 -402
View File
File diff suppressed because it is too large Load Diff
+87
View File
@@ -0,0 +1,87 @@
const _all_defaults = KW[_series_defaults, _plot_defaults, _subplot_defaults]
const _initial_defaults = deepcopy(_all_defaults)
const _initial_axis_defaults = deepcopy(_axis_defaults)
# add defaults for the letter versions
const _axis_defaults_byletter = KW()
function reset_axis_defaults_byletter!()
for letter in (:x, :y, :z)
_axis_defaults_byletter[letter] = KW()
for (k, v) in _axis_defaults
_axis_defaults_byletter[letter][k] = v
end
end
end
reset_axis_defaults_byletter!()
# to be able to reset font sizes to initial values
const _initial_plt_fontsizes =
Dict(:plot_titlefontsize => _plot_defaults[:plot_titlefontsize])
const _initial_sp_fontsizes = Dict(
:titlefontsize => _subplot_defaults[:titlefontsize],
:legend_font_pointsize => _subplot_defaults[:legend_font_pointsize],
:legend_title_font_pointsize => _subplot_defaults[:legend_title_font_pointsize],
:annotationfontsize => _subplot_defaults[:annotationfontsize],
:colorbar_tickfontsize => _subplot_defaults[:colorbar_tickfontsize],
:colorbar_titlefontsize => _subplot_defaults[:colorbar_titlefontsize],
)
const _initial_ax_fontsizes = Dict(
:tickfontsize => _axis_defaults[:tickfontsize],
:guidefontsize => _axis_defaults[:guidefontsize],
)
const _initial_fontsizes =
merge(_initial_plt_fontsizes, _initial_sp_fontsizes, _initial_ax_fontsizes)
const _internal_args =
[:plot_object, :series_plotindex, :markershape_to_add, :letter, :idxfilter]
const _axis_args = Set(keys(_axis_defaults))
const _series_args = Set(keys(_series_defaults))
const _subplot_args = Set(keys(_subplot_defaults))
const _plot_args = Set(keys(_plot_defaults))
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
const _magic_subplot_args =
[:title_font, :legend_font, :legend_title_font, :plot_title_font, :colorbar_titlefont]
const _magic_series_args = [:line, :marker, :fill]
const _all_magic_args =
Set(union(_magic_axis_args, _magic_series_args, _magic_subplot_args))
const _all_axis_args = union(_axis_args, _magic_axis_args)
const _lettered_all_axis_args =
Set([Symbol(letter, kw) for letter in (:x, :y, :z) for kw in _all_axis_args])
const _all_subplot_args = union(_subplot_args, _magic_subplot_args)
const _all_series_args = union(_series_args, _magic_series_args)
const _all_plot_args = _plot_args
const _all_args =
union(_lettered_all_axis_args, _all_subplot_args, _all_series_args, _all_plot_args)
# add all pluralized forms to the _keyAliases dict
for arg in _all_args
add_aliases(arg, makeplural(arg))
end
# fill symbol cache
for letter in (:x, :y, :z)
_attrsymbolcache[letter] = Dict{Symbol,Symbol}()
for k in _axis_args
# populate attribute cache
lk = Symbol(letter, k)
_attrsymbolcache[letter][k] = lk
# allow the underscore version too: xguide or x_guide
add_aliases(lk, Symbol(letter, "_", k))
end
for k in (_magic_axis_args..., :(_discrete_indices))
_attrsymbolcache[letter][k] = Symbol(letter, k)
end
end
# add all non_underscored forms to the _keyAliases
add_non_underscore_aliases!(_keyAliases)
+603 -234
View File
File diff suppressed because it is too large Load Diff
+6 -3
View File
@@ -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}
+7 -13
View File
@@ -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[] = 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
+47 -33
View File
@@ -1,101 +1,115 @@
using REPL
using Scratch
const plotly_local_file_path = Ref{Union{Nothing,String}}(nothing)
function _plots_defaults()
if isdefined(Main, :PLOTS_DEFAULTS)
Dict{Symbol,Any}(Main.PLOTS_DEFAULTS)
copy(Dict{Symbol,Any}(Main.PLOTS_DEFAULTS))
else
Dict{Symbol,Any}()
end
end
function __init__()
user_defaults = _plots_defaults()
if haskey(user_defaults, :theme)
theme(user_defaults[:theme])
end
for (k,v) in user_defaults
k == :theme || default(k, v)
theme(pop!(user_defaults, :theme); user_defaults...)
else
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")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" begin
fn = joinpath(@__DIR__, "backends", "inspectdr.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" begin
fn = joinpath(@__DIR__, "backends", "pgfplots.jl")
fn = joinpath(@__DIR__, "backends", "deprecated", "pgfplots.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require ORCA = "47be7bcc-f1a6-5447-8b36-7eeeff7534fd" begin
fn = joinpath(@__DIR__, "backends", "orca.jl")
@require PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5" begin
fn = joinpath(@__DIR__, "backends", "plotlybase.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" begin
fn = joinpath(@__DIR__, "backends", "pgfplotsx.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" begin
fn = joinpath(@__DIR__, "backends", "plotlyjs.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" begin
fn = joinpath(@__DIR__, "backends", "pyplot.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" begin
fn = joinpath(@__DIR__, "backends", "unicodeplots.jl")
include(fn)
@require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn)
end
@require Gaston = "4b11ee91-296f-5714-9832-002c20994614" begin
fn = joinpath(@__DIR__, "backends", "gaston.jl")
include(fn)
end
@require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin
if IJulia.inited
_init_ijulia_plotting()
IJulia.display_dict(plt::Plot) = _ijulia_display_dict(plt)
end
end
if haskey(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL")
use_local_plotlyjs[] = ENV["PLOTS_HOST_DEPENDENCY_LOCAL"] == "true"
use_local_dependencies[] = isfile(plotly_local_file_path) && use_local_plotlyjs[]
if use_local_plotlyjs[] && !isfile(plotly_local_file_path)
@warn("PLOTS_HOST_DEPENDENCY_LOCAL is set to true, but no local plotly file found. run Pkg.build(\"Plots\") and make sure PLOTS_HOST_DEPENDENCY_LOCAL is set to true")
if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true"
global plotly_local_file_path[] =
joinpath(@get_scratch!("plotly"), _plotly_min_js_filename)
if !isfile(plotly_local_file_path[])
Downloads.download(
"https://cdn.plot.ly/$(_plotly_min_js_filename)",
plotly_local_file_path[],
)
end
else
use_local_dependencies[] = use_local_plotlyjs[]
use_local_plotlyjs[] = true
end
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
+138 -272
View File
@@ -4,34 +4,6 @@
to_pixels(m::AbsoluteLength) = m.value / 0.254
const _cbar_width = 5mm
#Base.broadcast(::typeof(Base.:.*), m::Measure, n::Number) = m * n
#Base.broadcast(::typeof(Base.:.*), m::Number, n::Measure) = m * n
Base.:-(m::Measure, a::AbstractArray) = map(ai -> m - ai, a)
Base.:-(a::AbstractArray, m::Measure) = map(ai -> ai - m, a)
Base.zero(::Type{typeof(mm)}) = 0mm
Base.one(::Type{typeof(mm)}) = 1mm
Base.typemin(::typeof(mm)) = -Inf*mm
Base.typemax(::typeof(mm)) = Inf*mm
Base.convert(::Type{F}, l::AbsoluteLength) where {F<:AbstractFloat} = convert(F, l.value)
# TODO: these are unintuitive and may cause tricky bugs
# Base.:+(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 + m2.value))
# Base.:+(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (1 + m1.value))
# Base.:-(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * (1 - m2.value))
# Base.:-(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * (m1.value - 1))
Base.:*(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value * m2.value)
Base.:*(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value * m1.value)
Base.:/(m1::AbsoluteLength, m2::Length{:pct}) = AbsoluteLength(m1.value / m2.value)
Base.:/(m1::Length{:pct}, m2::AbsoluteLength) = AbsoluteLength(m2.value / m1.value)
Base.zero(::Type{typeof(pct)}) = 0pct
Base.one(::Type{typeof(pct)}) = 1pct
Base.typemin(::typeof(pct)) = 0pct
Base.typemax(::typeof(pct)) = 1pct
const defaultbox = BoundingBox(0mm, 0mm, 0mm, 0mm)
left(bbox::BoundingBox) = bbox.x0[1]
@@ -46,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
@@ -81,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
@@ -89,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
# -----------------------------------------------------------
@@ -111,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
@@ -188,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))
@@ -234,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
@@ -258,27 +233,30 @@ end
grid(args...; kw...)
Create a grid layout for subplots. `args` specify the dimensions, e.g.
`grid(3,2, widths = (0.6,04))` creates a grid with three rows and two
`grid(3,2, widths = (0.6,0.4))` creates a grid with three rows and two
columns of different width.
"""
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
@@ -287,9 +265,12 @@ 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
function Base.setindex!(layout::GridLayout, v, ci::CartesianIndex)
layout.grid[ci] = v
end
leftpad(layout::GridLayout) = layout.minpad[1]
@@ -297,7 +278,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
@@ -309,14 +289,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
@@ -335,7 +314,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
@@ -343,23 +324,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
@@ -373,7 +352,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
@@ -385,19 +364,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]
@@ -407,10 +389,10 @@ function update_child_bboxes!(layout::GridLayout, minimum_perimeter = [0mm,0mm,0
# this is the minimum perimeter as decided by this child's parent, so that
# all children on this border have the same value
min_child_perimeter = [
c == 1 ? layout.minpad[1] : 0mm,
r == 1 ? layout.minpad[2] : 0mm,
c == nc ? layout.minpad[3] : 0mm,
r == nr ? layout.minpad[4] : 0mm
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],
]
# recursively update the child's children
@@ -425,18 +407,21 @@ function update_inset_bboxes!(plt::Plot)
p_area = Measures.resolve(plotarea(sp.parent), sp[:relative_bbox])
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
@@ -471,7 +456,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
@@ -481,32 +468,45 @@ 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
end
layout_args(nt::NamedTuple) = EmptyLayout(; nt...), 1
function layout_args(m::AbstractVecOrMat)
sz = size(m)
nr = sz[1]
nc = get(sz, 2, 1)
gl = GridLayout(nr, nc)
for ci in CartesianIndices(m)
gl[ci] = layout_args(m[ci])[1]
end
layout_args(gl)
end
# compute number of subplots
function layout_args(layout::GridLayout)
# recursively get the size of the grid
@@ -514,57 +514,63 @@ function layout_args(layout::GridLayout)
layout, n
end
layout_args(n_override::Integer, layout::GridLayout) = layout_args(layout)
layout_args(n_override::Integer, layout::Union{AbstractVecOrMat,GridLayout}) =
layout_args(layout)
layout_args(huh) = error("unhandled layout type $(typeof(huh)): $huh")
# ----------------------------------------------------------------------
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
@@ -573,161 +579,13 @@ 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
function add_layout_pct!(kw::AKW, v::Expr, idx::Integer, nidx::Integer)
# dump(v)
# something like {0.2w}?
if v.head == :call && v.args[1] == :*
num = v.args[2]
if length(v.args) == 3 && isa(num, Number)
units = v.args[3]
if units == :h
return kw[:h] = num*pct
elseif units == :w
return kw[:w] = num*pct
elseif units in (:pct, :px, :mm, :cm, :inch)
idx == 1 && (kw[:w] = v)
(idx == 2 || nidx == 1) && (kw[:h] = v)
# return kw[idx == 1 ? :w : :h] = v
end
end
end
error("Couldn't match layout curly (idx=$idx): $v")
end
function add_layout_pct!(kw::AKW, v::Number, idx::Integer)
# kw[idx == 1 ? :w : :h] = v*pct
idx == 1 && (kw[:w] = v*pct)
(idx == 2 || nidx == 1) && (kw[:h] = v*pct)
end
isrow(v) = isa(v, Expr) && v.head in (:hcat,:row)
iscol(v) = isa(v, Expr) && v.head == :vcat
rowsize(v) = isrow(v) ? length(v.args) : 1
function create_grid(expr::Expr)
if iscol(expr)
create_grid_vcat(expr)
elseif isrow(expr)
:(let cell = GridLayout(1, $(length(expr.args)))
$([:(cell[1,$i] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...)
cell
end)
elseif expr.head == :curly
create_grid_curly(expr)
else
# if it's something else, just return that (might be an existing layout?)
esc(expr)
end
end
function create_grid_vcat(expr::Expr)
rowsizes = map(rowsize, expr.args)
rmin, rmax = extrema(rowsizes)
if rmin > 0 && rmin == rmax
# we have a grid... build the whole thing
# note: rmin is the number of columns
nr = length(expr.args)
nc = rmin
body = Expr(:block)
for r=1:nr
arg = expr.args[r]
if isrow(arg)
for (c,item) in enumerate(arg.args)
push!(body.args, :(cell[$r,$c] = $(create_grid(item))))
end
else
push!(body.args, :(cell[$r,1] = $(create_grid(arg))))
end
end
:(let cell = GridLayout($nr, $nc)
$body
cell
end)
else
# otherwise just build one row at a time
:(let cell = GridLayout($(length(expr.args)), 1)
$([:(cell[$i,1] = $(create_grid(v))) for (i,v) in enumerate(expr.args)]...)
cell
end)
end
end
function create_grid_curly(expr::Expr)
kw = KW()
for (i,arg) in enumerate(expr.args[2:end])
add_layout_pct!(kw, arg, i, length(expr.args)-1)
end
s = expr.args[1]
if isa(s, Expr) && s.head == :call && s.args[1] == :grid
create_grid(:(grid($(s.args[2:end]...), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto))))))
elseif isa(s, Symbol)
:(EmptyLayout(label = $(QuoteNode(s)), width = $(get(kw, :w, QuoteNode(:auto))), height = $(get(kw, :h, QuoteNode(:auto)))))
else
error("Unknown use of curly brackets: $expr")
end
end
function create_grid(s::Symbol)
:(EmptyLayout(label = $(QuoteNode(s)), blank = $(s == :_)))
end
macro layout(mat::Expr)
create_grid(mat)
end
# -------------------------------------------------------------------------
# make all reference the same axis extrema/values.
# 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)
@@ -749,8 +607,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
@@ -766,20 +624,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
@@ -805,11 +662,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
+57
View File
@@ -0,0 +1,57 @@
"""
```julia
legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax, inout)
```
Return `(x,y)` at an angle `theta` degrees from
`(xcenter,ycenter)` on a rectangle defined by (`xmin`, `xmax`, `ymin`, `ymax`).
"""
function legend_pos_from_angle(theta, xmin, xcenter, xmax, ymin, ycenter, ymax)
(s, c) = sincosd(theta)
x = c < 0 ? (xmin - xcenter) / c : (xmax - xcenter) / c
y = s < 0 ? (ymin - ycenter) / s : (ymax - ycenter) / s
A = min(x, y)
return (xcenter + A * c, ycenter + A * s)
end
"""
Split continuous range `[-1,1]` evenly into an integer `[1,2,3]`
"""
function legend_anchor_index(x)
x < -1 // 3 && return 1
x < 1 // 3 && return 2
return 3
end
"""
Turn legend argument into a (theta, :inner) or (theta, :outer) tuple.
For backends where legend position is given in normal coordinates (0,0) -- (1,1),
so :topleft exactly corresponds to (45, :inner) etc.
If `leg` is a (::Real,::Real) tuple, keep it as is.
"""
legend_angle(leg::Real) = (leg, :inner)
legend_angle(leg::Tuple{S,T}) where {S<:Real,T<:Real} = leg
legend_angle(leg::Tuple{S,Symbol}) where {S<:Real} = leg
legend_angle(leg::Symbol) = get(
(
topleft = (135, :inner),
top = (90, :inner),
topright = (45, :inner),
left = (180, :inner),
right = (0, :inner),
bottomleft = (225, :inner),
bottom = (270, :inner),
bottomright = (315, :inner),
outertopleft = (135, :outer),
outertop = (90, :outer),
outertopright = (45, :outer),
outerleft = (180, :outer),
outerright = (0, :outer),
outerbottomleft = (225, :outer),
outerbottom = (270, :outer),
outerbottomright = (315, :outer),
),
leg,
(45, :inner),
)
+96 -110
View File
@@ -1,116 +1,101 @@
defaultOutputFormat(plt::Plot) = "png"
function png(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "png")
io = open(fn, "w")
show(io, MIME("image/png"), plt)
close(io)
open(addExtension(fn, "png"), "w") do io
show(io, MIME("image/png"), plt)
end
end
png(fn::AbstractString) = png(current(), fn)
function svg(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "svg")
io = open(fn, "w")
show(io, MIME("image/svg+xml"), plt)
close(io)
open(addExtension(fn, "svg"), "w") do io
show(io, MIME("image/svg+xml"), plt)
end
end
svg(fn::AbstractString) = svg(current(), fn)
function pdf(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "pdf")
io = open(fn, "w")
show(io, MIME("application/pdf"), plt)
close(io)
open(addExtension(fn, "pdf"), "w") do io
show(io, MIME("application/pdf"), plt)
end
end
pdf(fn::AbstractString) = pdf(current(), fn)
function ps(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "ps")
io = open(fn, "w")
show(io, MIME("application/postscript"), plt)
close(io)
open(addExtension(fn, "ps"), "w") do io
show(io, MIME("application/postscript"), plt)
end
end
ps(fn::AbstractString) = ps(current(), fn)
function eps(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "eps")
io = open(fn, "w")
show(io, MIME("image/eps"), plt)
close(io)
open(addExtension(fn, "eps"), "w") do io
show(io, MIME("image/eps"), plt)
end
end
eps(fn::AbstractString) = eps(current(), fn)
function tex(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "tex")
io = open(fn, "w")
show(io, MIME("application/x-tex"), plt)
close(io)
open(addExtension(fn, "tex"), "w") do io
show(io, MIME("application/x-tex"), plt)
end
end
tex(fn::AbstractString) = tex(current(), fn)
function json(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "json")
io = open(fn, "w")
show(io, MIME("application/vnd.plotly.v1+json"), plt)
close(io)
open(addExtension(fn, "json"), "w") do io
show(io, MIME("application/vnd.plotly.v1+json"), plt)
end
end
json(fn::AbstractString) = json(current(), fn)
function html(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "html")
io = open(fn, "w")
show(io, MIME("text/html"), plt)
close(io)
open(addExtension(fn, "html"), "w") do io
show(io, MIME("text/html"), plt)
end
end
html(fn::AbstractString) = html(current(), fn)
function txt(plt::Plot, fn::AbstractString)
fn = addExtension(fn, "txt")
io = open(fn, "w")
show(io, MIME("text/plain"), plt)
close(io)
function txt(plt::Plot, fn::AbstractString; color::Bool = true)
open(addExtension(fn, "txt"), "w") do io
show(IOContext(io, :color => color), MIME("text/plain"), plt)
end
end
txt(fn::AbstractString) = txt(current(), fn)
# ----------------------------------------------------------------
const _savemap = Dict(
"png" => png,
"svg" => svg,
"pdf" => pdf,
"ps" => ps,
"ps" => ps,
"eps" => eps,
"tex" => tex,
"json" => json,
"html" => html,
"tikz" => tex,
"txt" => txt,
)
)
function getExtension(fn::AbstractString)
pieces = split(fn, ".")
length(pieces) > 1 || error("Can't extract file extension: ", fn)
ext = pieces[end]
haskey(_savemap, ext) || error("Invalid file extension: ", fn)
ext
for out in Symbol.(unique(values(_savemap)))
@eval @doc """
$($out)([plot,], filename)
Save plot as $($out)-file.
""" $out
end
const _extension_map = Dict("tikz" => "tex")
function addExtension(fn::AbstractString, ext::AbstractString)
try
oldext = getExtension(fn)
if oldext == ext
return fn
oldfn, oldext = splitext(fn)
oldext = chop(oldext, head = 1, tail = 0)
if get(_extension_map, oldext, oldext) == ext
return fn
else
return "$fn.$ext"
return string(fn, ".", ext)
end
catch
return "$fn.$ext"
end
end
"""
@@ -121,27 +106,27 @@ type is inferred from the file extension. All backends support png and pdf
file types, some also support svg, ps, eps, html and tex.
"""
function savefig(plt::Plot, fn::AbstractString)
fn = abspath(expanduser(fn))
# get the extension
local ext
try
ext = getExtension(fn)
catch
# if we couldn't extract the extension, add the default
ext = defaultOutputFormat(plt)
fn = addExtension(fn, ext)
end
fn = abspath(expanduser(fn))
# save it
func = get(_savemap, ext) do
error("Unsupported extension $ext with filename ", fn)
end
func(plt, fn)
# get the extension
_, ext = splitext(fn)
ext = chop(ext, head = 1, tail = 0)
if isempty(ext)
ext = defaultOutputFormat(plt)
end
# save it
if haskey(_savemap, ext)
func = _savemap[ext]
return func(plt, fn)
else
error("Invalid file extension: ", fn)
end
end
savefig(fn::AbstractString) = savefig(current(), fn)
# ---------------------------------------------------------
"""
gui([plot])
@@ -164,17 +149,13 @@ end
_do_plot_show(plt, showval::Bool) = showval && gui(plt)
function _do_plot_show(plt, showval::Symbol)
showval == :gui && gui(plt)
showval in (:inline,:ijulia) && inline(plt)
showval in (:inline, :ijulia) && inline(plt)
end
# ---------------------------------------------------------
const _best_html_output_type = KW(
:pyplot => :png,
:unicodeplots => :txt,
:plotlyjs => :html,
:plotly => :html
)
const _best_html_output_type =
KW(:pyplot => :png, :unicodeplots => :txt, :plotlyjs => :html, :plotly => :html)
# a backup for html... passes to svg or png depending on the html_output_format arg
function _show(io::IO, ::MIME"text/html", plt::Plot)
@@ -184,7 +165,12 @@ function _show(io::IO, ::MIME"text/html", plt::Plot)
end
if output_type == :png
# @info("writing png to html output")
print(io, "<img src=\"data:image/png;base64,", base64encode(show, MIME("image/png"), plt), "\" />")
print(
io,
"<img src=\"data:image/png;base64,",
base64encode(show, MIME("image/png"), plt),
"\" />",
)
elseif output_type == :svg
# @info("writing svg to html output")
show(io, MIME("image/svg+xml"), plt)
@@ -196,38 +182,47 @@ 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)
@warn("_display is not defined for this backend.")
end
Base.show(io::IO, m::MIME"text/plain", plt::Plot) = show(io, plt)
# for writing to io streams... first prepare, then callback
for mime in ("text/plain", "text/html", "image/png", "image/eps", "image/svg+xml",
"application/eps", "application/pdf", "application/postscript",
"application/x-tex", "application/vnd.plotly.v1+json")
for mime in (
"text/html",
"text/latex",
"image/png",
"image/eps",
"image/svg+xml",
"application/eps",
"application/pdf",
"application/postscript",
"application/x-tex",
"application/vnd.plotly.v1+json",
)
@eval function Base.show(io::IO, m::MIME{Symbol($mime)}, plt::Plot)
if haskey(io, :juno_plotsize)
showjuno(io, m, plt)
showjuno(io, m, plt)
else
prepare_output(plt)
_show(io, m, plt)
prepare_output(plt)
_show(io, m, plt)
end
return nothing
end
end
Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) = showjuno(io, MIME("text/html"), plt)
Base.showable(::MIME"text/html", plt::Plot{UnicodePlotsBackend}) = false # Pluto
# default text/plain for all backends
_show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot) = show(io, plt)
Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) =
showjuno(io, MIME("text/html"), plt)
"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)
@@ -244,39 +239,30 @@ closeall() = closeall(backend())
#
# html_output_format("svg")
# ---------------------------------------------------------
# Atom PlotPane
# ---------------------------------------------------------
function showjuno(io::IO, m, plt)
sz = collect(plt[:size])
dpi = plt[:dpi]
thickness_scaling = plt[:thickness_scaling]
jsize = get(io, :juno_plotsize, [400, 500])
jratio = get(io, :juno_dpi_ratio, 1)
scale = minimum(jsize[i] / sz[i] for i in 1:2)
plt[:size] = [s * scale for s in sz]
plt[:dpi] = jratio*Plots.DPI
plt[:thickness_scaling] *= scale
plt[:dpi] = jratio * Plots.DPI
prepare_output(plt)
try
_showjuno(io, m, plt)
_showjuno(io, m, plt)
finally
plt[:size] = sz
plt[:dpi] = dpi
plt[:thickness_scaling] = thickness_scaling
plt[:dpi] = dpi
end
end
function _showjuno(io::IO, m::MIME"image/svg+xml", plt)
if Symbol(plt.attr[:html_output_format]) :svg
throw(MethodError(show, (typeof(m), typeof(plt))))
else
_show(io, m, plt)
end
if Symbol(plt.attr[:html_output_format]) :svg
throw(MethodError(show, (typeof(m), typeof(plt))))
else
_show(io, m, plt)
end
end
Base.showable(::MIME"application/prs.juno.plotpane+html", plt::Plot) = false
+239 -250
View File
@@ -1,127 +1,60 @@
# Error for aliases used in recipes
function warn_on_recipe_aliases!(plotattributes, recipe_type, 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`."
end
plotattributes[dk] = pop_kw!(plotattributes, k)
end
end
end
function warn_on_recipe_aliases!(v::AbstractVector, recipe_type, args...)
foreach(x -> warn_on_recipe_aliases!(x, recipe_type, args...), v)
end
function warn_on_recipe_aliases!(rd::RecipeData, recipe_type, args...)
warn_on_recipe_aliases!(rd.plotattributes, recipe_type, args...)
end
# RecipesPipeline API
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)"
## Warnings
# ------------------------------------------------------------------
# preprocessing
function series_idx(kw_list::AVec{KW}, kw::AKW)
Int(kw[:series_plotindex]) - Int(kw_list[1][:series_plotindex]) + 1
end
function _expand_seriestype_array(plotattributes::AKW, args)
sts = get(plotattributes, :seriestype, :path)
if typeof(sts) <: AbstractArray
reset_kw!(plotattributes, :seriestype)
rd = Vector{RecipeData}(undef, size(sts, 1))
for r in axes(sts, 1)
dc = copy(plotattributes)
dc[:seriestype] = sts[r:r,:]
rd[r] = RecipeData(dc, args)
end
rd
else
RecipeData[RecipeData(copy(plotattributes), args)]
end
end
function _preprocess_args(plotattributes::AKW, args, still_to_process::Vector{RecipeData})
# the grouping mechanism is a recipe on a GroupBy object
# we simply add the GroupBy object to the front of the args list to allow
# the recipe to be applied
if haskey(plotattributes, :group)
args = (extractGroupArgs(plotattributes[:group], args...), args...)
end
# if we were passed a vector/matrix of seriestypes and there's more than one row,
# we want to duplicate the inputs, once for each seriestype row.
if !isempty(args)
append!(still_to_process, _expand_seriestype_array(plotattributes, args))
end
# remove subplot and axis args from plotattributes... they will be passed through in the kw_list
if !isempty(args)
for (k,v) in plotattributes
if k in _all_subplot_args || k in _all_axis_args
reset_kw!(plotattributes, k)
function RecipesPipeline.warn_on_recipe_aliases!(
plt::Plot,
plotattributes::AKW,
recipe_type::Symbol,
@nospecialize(args)
)
pkeys = keys(plotattributes)
for k in pkeys
dk = get(_keyAliases, k, nothing)
if dk !== nothing
kv = RecipesPipeline.pop_kw!(plotattributes, k)
if dk pkeys
plotattributes[dk] = kv
end
end
end
args
end
# ------------------------------------------------------------------
# user recipes
## Grouping
RecipesPipeline.splittable_attribute(plt::Plot, key, val::SeriesAnnotations, len) =
RecipesPipeline.splittable_attribute(plt, key, val.strs, len)
function _process_userrecipes(plt::Plot, plotattributes::AKW, args)
still_to_process = RecipeData[]
args = _preprocess_args(plotattributes, args, still_to_process)
function RecipesPipeline.split_attribute(plt::Plot, key, val::SeriesAnnotations, indices)
split_strs = RecipesPipeline.split_attribute(plt, key, val.strs, indices)
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
end
# for plotting recipes, swap out the args and update the parameter dictionary
# we are keeping a stack of series that still need to be processed.
# each pass through the loop, we pop one off and apply the recipe.
# the recipe will return a list a Series objects... the ones that are
# finished (no more args) get added to the kw_list, the ones that are not
# are placed on top of the stack and are then processed further.
kw_list = KW[]
while !isempty(still_to_process)
# grab the first in line to be processed and either add it to the kw_list or
# pass it through apply_recipe to generate a list of RecipeData objects (data + attributes)
# for further processing.
next_series = popfirst!(still_to_process)
# recipedata should be of type RecipeData. if it's not then the inputs must not have been fully processed by recipes
if !(typeof(next_series) <: RecipeData)
error("Inputs couldn't be processed... expected RecipeData but got: $next_series")
end
if isempty(next_series.args)
_process_userrecipe(plt, kw_list, next_series)
else
rd_list = RecipesBase.apply_recipe(
next_series.plotattributes,
next_series.args...
)
warn_on_recipe_aliases!(rd_list, :user, next_series.args...)
prepend!(still_to_process,rd_list)
## Preprocessing attributes
function RecipesPipeline.preprocess_axis_args!(plt::Plot, plotattributes, letter)
# Fix letter for seriestypes that are x only but data gets passed as y
if treats_y_as_x(get(plotattributes, :seriestype, :path))
if get(plotattributes, :orientation, :vertical) == :vertical
letter = :x
end
end
# don't allow something else to handle it
plotattributes[:smooth] = false
kw_list
plotattributes[:letter] = letter
RecipesPipeline.preprocess_axis_args!(plt, plotattributes)
end
function _process_userrecipe(plt::Plot, kw_list::Vector{KW}, recipedata::RecipeData)
# when the arg tuple is empty, that means there's nothing left to recursively
# process... finish up and add to the kw_list
kw = recipedata.plotattributes
preprocessArgs!(kw)
RecipesPipeline.preprocess_attributes!(plt::Plot, plotattributes) =
RecipesPipeline.preprocess_attributes!(plotattributes) # in src/args.jl
RecipesPipeline.is_axis_attribute(plt::Plot, attr) = is_axis_attr_noletter(attr) # in src/args.jl
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)
_preprocess_userrecipe(kw)
warnOnUnsupported_scales(plt.backend, kw)
warn_on_unsupported_scales(plt.backend, kw)
# add the plot index
plt.n += 1
kw[:series_plotindex] = plt.n
@@ -135,31 +68,28 @@ end
function _preprocess_userrecipe(kw::AKW)
_add_markershape(kw)
# if there was a grouping, filter the data here
_filter_input_data!(kw)
# map marker_z if it's a Function
if isa(get(kw, :marker_z, nothing), Function)
if isa(get(kw, :marker_z, default(:marker_z)), Function)
# TODO: should this take y and/or z as arguments?
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])
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]) : map(kw[:line_z], kw[:x], kw[:y], kw[:z])
if isa(get(kw, :line_z, default(:line_z)), Function)
kw[:line_z] =
isa(kw[:z], Nothing) ? map(kw[:line_z], kw[:x], kw[:y]) :
map(kw[:line_z], kw[:x], kw[:y], kw[:z])
end
# convert a ribbon into a fillrange
if get(kw, :ribbon, nothing) !== nothing
make_fillrange_from_ribbon(kw)
end
return
end
function _add_errorbar_kw(kw_list::Vector{KW}, kw::AKW)
# handle error bars by creating new recipedata data... these will have
# the same recipedata index as the recipedata they are copied from
for esym in (:xerror, :yerror)
for esym in (:xerror, :yerror, :zerror)
if get(kw, esym, nothing) !== nothing
# we make a copy of the KW and apply an errorbar recipe
errkw = copy(kw)
@@ -178,59 +108,71 @@ function _add_smooth_kw(kw_list::Vector{KW}, kw::AKW)
β, α = convert(Matrix{Float64}, [x ones(length(x))]) \ convert(Vector{Float64}, y)
sx = [ignorenan_minimum(x), ignorenan_maximum(x)]
sy = β .* sx .+ α
push!(kw_list, merge(copy(kw), KW(
:seriestype => :path,
:x => sx,
:y => sy,
:fillrange => nothing,
:label => "",
:primary => false,
)))
push!(
kw_list,
merge(
copy(kw),
KW(
:seriestype => :path,
:x => sx,
:y => sy,
:fillrange => nothing,
:label => "",
:primary => false,
),
),
)
end
end
# ------------------------------------------------------------------
# plot recipes
RecipesPipeline.get_axis_limits(plt::Plot, letter) = axis_limits(plt[1], letter, false)
# Grab the first in line to be processed and pass it through apply_recipe
# to generate a list of RecipeData objects (data + attributes).
# If we applied a "plot recipe" without error, then add the returned datalist's KWs,
# otherwise we just add the original KW.
function _process_plotrecipe(plt::Plot, kw::AKW, kw_list::Vector{KW}, still_to_process::Vector{KW})
if !isa(get(kw, :seriestype, nothing), Symbol)
# seriestype was never set, or it's not a Symbol, so it can't be a plot recipe
push!(kw_list, kw)
return
end
try
st = kw[:seriestype]
st = kw[:seriestype] = get(_typeAliases, st, st)
datalist = RecipesBase.apply_recipe(kw, Val{st}, plt)
warn_on_recipe_aliases!(datalist, :plot, st)
for data in datalist
preprocessArgs!(data.plotattributes)
if data.plotattributes[:seriestype] == st
error("Plot recipe $st returned the same seriestype: $(data.plotattributes)")
end
push!(still_to_process, data.plotattributes)
end
catch err
if isa(err, MethodError)
push!(kw_list, kw)
else
rethrow()
end
end
return
## Plot recipes
RecipesPipeline.type_alias(plt::Plot) = get(_typeAliases, st, st)
## Plot setup
function RecipesPipeline.plot_setup!(plt::Plot, plotattributes, kw_list)
_plot_setup(plt, plotattributes, kw_list)
_subplot_setup(plt, plotattributes, kw_list)
return nothing
end
function RecipesPipeline.process_sliced_series_attributes!(plt::Plots.Plot, kw_list)
# swap errors
err_inds =
findall(kw -> get(kw, :seriestype, :path) in (:xerror, :yerror, :zerror), kw_list)
for ind in err_inds
if get(kw_list[ind - 1], :seriestype, :path) == :scatter
tmp = copy(kw_list[ind])
kw_list[ind] = copy(kw_list[ind - 1])
kw_list[ind - 1] = tmp
end
end
# ------------------------------------------------------------------
# setup plot and subplot
for kw in kw_list
rib = get(kw, :ribbon, default(:ribbon))
fr = get(kw, :fillrange, default(:fillrange))
# map ribbon if it's a Function
if rib isa Function
kw[:ribbon] = map(rib, kw[:x])
end
# convert a ribbon into a fillrange
if rib !== nothing
make_fillrange_from_ribbon(kw)
# map fillrange if it's a Function
elseif fr !== nothing && fr isa Function
kw[:fillrange] = map(fr, kw[:x])
end
end
return nothing
end
# 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
for kw in kw_list, (k,v) in kw
for kw in kw_list, (k, v) in kw
haskey(_plot_defaults, k) && (plotattributes[k] = pop!(kw, k))
end
@@ -241,7 +183,7 @@ function _plot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
# create the layout and subplots from the inputs
plt.layout, plt.subplots, plt.spmap = build_layout(plt.attr)
for (idx,sp) in enumerate(plt.subplots)
for (idx, sp) in enumerate(plt.subplots)
sp.plt = plt
sp.attr[:subplot_index] = idx
end
@@ -249,7 +191,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
@@ -266,7 +207,7 @@ function _plot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
else
parent = plt.layout
end
sp = Subplot(backend(), parent=parent)
sp = Subplot(backend(), parent = parent)
sp.plt = plt
push!(plt.subplots, sp)
push!(plt.inset_subplots, sp)
@@ -286,34 +227,48 @@ function _subplot_setup(plt::Plot, plotattributes::AKW, kw_list::Vector{KW})
for kw in kw_list
# get the Subplot object to which the series belongs.
sps = get(kw, :subplot, :auto)
sp = get_subplot(plt, _cycle(sps == :auto ? plt.subplots : plt.subplots[sps], series_idx(kw_list,kw)))
sp = get_subplot(
plt,
_cycle(
sps == :auto ? plt.subplots : plt.subplots[sps],
series_idx(kw_list, kw),
),
)
kw[:subplot] = sp
# extract subplot/axis attributes from kw and add to sp_attr
attr = KW()
for (k,v) in collect(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)
for letter in (:x,:y,:z)
attr[Symbol(letter,k)] = v
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[get_attr_symbol(letter, k)] = v
end
end
for k in (:scale,), letter in (:x,:y,:z)
# Series recipes may need access to this information
lk = Symbol(letter,k)
if haskey(attr, lk)
kw[lk] = attr[lk]
end
end
for k in (:scale,), letter in (:x, :y, :z)
# Series recipes may need access to this information
lk = get_attr_symbol(letter, k)
if haskey(attr, lk)
kw[lk] = attr[lk]
end
end
sp_attrs[sp] = attr
end
_add_plot_title!(plt)
# override subplot/axis args. `sp_attrs` take precendence
for (idx,sp) in enumerate(plt.subplots)
for (idx, sp) in enumerate(plt.subplots)
attr = if !haskey(plotattributes, :subplot) || plotattributes[:subplot] == idx
merge(plotattributes, get(sp_attrs, sp, KW()))
else
@@ -324,11 +279,73 @@ 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]
plot_titleindex = nothing
if plot_title != ""
# make new subplot for plot title
if plt[:plot_titleindex] == 0
the_layout = plt.layout
vspan = plt[:plot_titlevspan]
plt.layout = grid(2, 1, heights = (vspan, 1 - vspan))
plt.layout.grid[1, 1] =
subplot = Subplot(plt.backend, parent = plt.layout[1, 1])
plt.layout.grid[2, 1] = the_layout
subplot.plt = plt
top = plt.backend isa PyPlotBackend ? nothing : 0mm
bot = 0mm
plt[:force_minpad] = nothing, top, nothing, bot
subplot[:subplot_index] = last(plt.subplots)[:subplot_index] + 1
plt[:plot_titleindex] = subplot[:subplot_index]
subplot[:framestyle] = :none
subplot[:margin] = 0px
push!(plt.subplots, subplot)
end
# propagate arguments plt[:plot_titleXXX] --> subplot[:titleXXX]
plot_titleindex = plt[:plot_titleindex]
subplot = plt.subplots[plot_titleindex]
for sym in filter(x -> startswith(string(x), "plot_title"), keys(_plot_defaults))
subplot[Symbol(string(sym)[(length("plot_") + 1):end])] = plt[sym]
end
end
return plot_titleindex
end
## Series recipes
function RecipesPipeline.slice_series_attributes!(plt::Plot, kw_list, kw)
sp::Subplot = kw[:subplot]
# in series attributes given as vector with one element per series,
# select the value for current series
_slice_series_args!(kw, plt, sp, series_idx(kw_list, kw))
return nothing
end
RecipesPipeline.series_defaults(plt::Plot) = _series_defaults # in args.jl
RecipesPipeline.is_seriestype_supported(plt::Plot, st) = is_seriestype_supported(st)
function RecipesPipeline.add_series!(plt::Plot, plotattributes)
sp = _prepare_subplot(plt, plotattributes)
_expand_subplot_extrema(sp, plotattributes, plotattributes[:seriestype])
_update_series_attributes!(plotattributes, plt, sp)
_add_the_series(plt, sp, plotattributes)
end
# getting ready to add the series... last update to subplot from anything
# that might have been added during series recipes
function _prepare_subplot(plt::Plot{T}, plotattributes::AKW) where T
function _prepare_subplot(plt::Plot{T}, plotattributes::AKW) where {T}
st::Symbol = plotattributes[:seriestype]
sp::Subplot{T} = plotattributes[:subplot]
sp_idx = get_subplot_index(plt, sp)
@@ -337,7 +354,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 is3d(st)
if (
RecipesPipeline.needs_3d_axes(st) ||
(st == :quiver && plotattributes[:z] !== nothing)
)
sp.attr[:projection] = "3d"
end
@@ -349,14 +369,14 @@ function _prepare_subplot(plt::Plot{T}, plotattributes::AKW) where T
sp
end
# ------------------------------------------------------------------
# series types
function _override_seriestype_check(plotattributes::AKW, st::Symbol)
# do we want to override the series type?
if !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
@@ -364,30 +384,22 @@ function _override_seriestype_check(plotattributes::AKW, st::Symbol)
st
end
function _prepare_annotations(sp::Subplot, plotattributes::AKW)
# strip out series annotations (those which are based on series x/y coords)
# and add them to the subplot attr
sp_anns = annotations(sp[:annotations])
# series_anns = annotations(pop!(plotattributes, :series_annotations, []))
# if isa(series_anns, SeriesAnnotations)
# series_anns.x = plotattributes[:x]
# series_anns.y = plotattributes[:y]
# elseif length(series_anns) > 0
# x, y = plotattributes[:x], plotattributes[:y]
# nx, ny, na = map(length, (x,y,series_anns))
# n = max(nx, ny, na)
# series_anns = [(x[mod1(i,nx)], y[mod1(i,ny)], text(series_anns[mod1(i,na)])) for i=1:n]
# end
# sp.attr[:annotations] = vcat(sp_anns, series_anns)
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
xmin, xmax = ignorenan_extrema(plotattributes[:x]); ymin, ymax = ignorenan_extrema(plotattributes[:y])
xmin, xmax = ignorenan_extrema(plotattributes[:x])
ymin, ymax = ignorenan_extrema(plotattributes[:y])
expand_extrema!(sp[:xaxis], (xmin, xmax))
expand_extrema!(sp[:yaxis], (ymin, ymax))
elseif !(st in (:pie, :histogram, :bins2d, :histogram2d))
elseif !(st in (:histogram, :bins2d, :histogram2d))
expand_extrema!(sp, plotattributes)
end
# expand for zerolines (axes through origin)
@@ -398,56 +410,33 @@ function _expand_subplot_extrema(sp::Subplot, plotattributes::AKW, st::Symbol)
end
function _add_the_series(plt, sp, plotattributes)
warnOnUnsupported_args(plt.backend, plotattributes)
warnOnUnsupported(plt.backend, plotattributes)
extra_kwargs = warn_on_unsupported_args(plt.backend, plotattributes)
if (kw = plt[:extra_kwargs]) isa AbstractDict
plt[:extra_plot_kwargs] = get(kw, :plot, KW())
sp[:extra_kwargs] = get(kw, :subplot, KW())
plotattributes[:extra_kwargs] = get(kw, :series, KW())
elseif plt[:extra_kwargs] == :plot
plt[:extra_plot_kwargs] = extra_kwargs
elseif plt[:extra_kwargs] == :subplot
sp[:extra_kwargs] = extra_kwargs
elseif plt[:extra_kwargs] == :series
plotattributes[:extra_kwargs] = extra_kwargs
else
ArgumentError("Unsupported type for extra keyword arguments")
end
warn_on_unsupported(plt.backend, plotattributes)
series = Series(plotattributes)
push!(plt.series_list, series)
push!(sp.series_list, series)
_series_added(plt, series)
end
# -------------------------------------------------------------------------------
# this method recursively applies series recipes when the seriestype is not supported
# natively by the backend
function _process_seriesrecipe(plt::Plot, plotattributes::AKW)
#println("process $(typeof(plotattributes))")
# replace seriestype aliases
st = Symbol(plotattributes[:seriestype])
st = plotattributes[:seriestype] = get(_typeAliases, st, st)
# shapes shouldn't have fillrange set
if plotattributes[:seriestype] == :shape
plotattributes[:fillrange] = nothing
end
# if it's natively supported, finalize processing and pass along to the backend, otherwise recurse
if is_seriestype_supported(st)
sp = _prepare_subplot(plt, plotattributes)
_prepare_annotations(sp, plotattributes)
_expand_subplot_extrema(sp, plotattributes, st)
_update_series_attributes!(plotattributes, plt, sp)
_add_the_series(plt, sp, plotattributes)
z_order = plotattributes[:z_order]
if z_order == :front
push!(sp.series_list, series)
elseif z_order == :back
pushfirst!(sp.series_list, series)
elseif z_order isa Integer
insert!(sp.series_list, z_order, series)
else
# get a sub list of series for this seriestype
x, y, z = plotattributes[:x], plotattributes[:y], plotattributes[:z]
datalist = RecipesBase.apply_recipe(plotattributes, Val{st}, x, y, z)
warn_on_recipe_aliases!(datalist, :series, st)
# assuming there was no error, recursively apply the series recipes
for data in datalist
if isa(data, RecipeData)
preprocessArgs!(data.plotattributes)
if data.plotattributes[:seriestype] == st
error("The seriestype didn't change in series recipe $st. This will cause a StackOverflow.")
end
_process_seriesrecipe(plt, data.plotattributes)
else
@warn("Unhandled recipe: $(data)")
break
end
end
@error "Wrong type $(typeof(z_order)) for attribute z_order"
end
nothing
_series_added(plt, series)
_update_subplot_colorbars(sp)
end
+86 -105
View File
@@ -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,14 +75,15 @@ 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)
preprocessArgs!(plotattributes)
RecipesPipeline.preprocess_attributes!(plotattributes)
# create an empty Plot then process
plt = Plot()
@@ -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)
preprocessArgs!(plotattributes)
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,10 +163,11 @@ function plot(plt1::Plot, plts_tail::Plot...; kw...)
cmdidx += 1
end
end
ttl_idx = _add_plot_title!(plt)
# first apply any args for the subplots
for (idx,sp) in enumerate(plt.subplots)
_update_subplot_args(plt, sp, plotattributes, idx, false)
for (idx, sp) in enumerate(plt.subplots)
_update_subplot_args(plt, sp, idx == ttl_idx ? KW() : plotattributes, idx, false)
end
# finish up
@@ -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,9 +189,11 @@ 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)
preprocessArgs!(plotattributes)
RecipesPipeline.preprocess_attributes!(plotattributes)
# merge!(plt.user_attr, plotattributes)
_plot!(plt, plotattributes, args)
end
@@ -163,97 +203,21 @@ end
# this is the core plotting function. recursively apply recipes to build
# 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::AKW, args::Tuple)
plotattributes[:plot_object] = plt
if !isempty(args) && !isdefined(Main, :StatsPlots) &&
first(split(string(typeof(args[1])), ".")) == "DataFrames"
@warn("You're trying to plot a DataFrame, but this functionality is provided by StatsPlots")
end
# --------------------------------
# "USER RECIPES"
# --------------------------------
kw_list = _process_userrecipes(plt, plotattributes, args)
# @info(1)
# map(DD, kw_list)
# --------------------------------
# "PLOT RECIPES"
# --------------------------------
# "plot recipe", which acts like a series type, and is processed before
# the plot layout is created, which allows for setting layouts and other plot-wide attributes.
# we get inputs which have been fully processed by "user recipes" and "type recipes",
# so we can expect standard vectors, surfaces, etc. No defaults have been set yet.
still_to_process = kw_list
kw_list = KW[]
while !isempty(still_to_process)
next_kw = popfirst!(still_to_process)
_process_plotrecipe(plt, next_kw, kw_list, still_to_process)
end
# @info(2)
# map(DD, kw_list)
# --------------------------------
# Plot/Subplot/Layout setup
# --------------------------------
_plot_setup(plt, plotattributes, kw_list)
_subplot_setup(plt, plotattributes, kw_list)
# !!! note: At this point, kw_list is fully decomposed into individual series... one KW per series. !!!
# !!! The next step is to recursively apply series recipes until the backend supports that series type !!!
# --------------------------------
# "SERIES RECIPES"
# --------------------------------
# @info(3)
# map(DD, kw_list)
for kw in kw_list
sp::Subplot = kw[:subplot]
# in series attributes given as vector with one element per series,
# select the value for current series
_slice_series_args!(kw, plt, sp, series_idx(kw_list,kw))
series_attr = Attr(kw, _series_defaults)
# now we have a fully specified series, with colors chosen. we must recursively handle
# series recipes, which dispatch on seriestype. If a backend does not natively support a seriestype,
# we check for a recipe that will convert that series type into one made up of lower-level components.
# For example, a histogram is just a bar plot with binned data, a bar plot is really a filled step plot,
# and a step plot is really just a path. So any backend that supports drawing a path will implicitly
# be able to support step, bar, and histogram plots (and any recipes that use those components).
_process_seriesrecipe(plt, series_attr)
end
# --------------------------------
function _plot!(plt::Plot, plotattributes, args)
@nospecialize
RecipesPipeline.recipe_pipeline!(plt, plotattributes, args)
current(plt)
# do we want to force display?
# if plt[:show]
# gui(plt)
# end
_do_plot_show(plt, plt[:show])
plt
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.
@@ -262,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)
@@ -272,6 +247,12 @@ function prepare_output(plt::Plot)
_update_plot_object(plt)
end
"""
backend_object(plot)
Returns the backend representation of a Plot object.
Returns `nothing` if the backend does not support this.
"""
function backend_object(plt::Plot)
prepare_output(plt)
plt.o
@@ -281,12 +262,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
# --------------------------------------------------------------------
+23 -14
View File
@@ -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
-1119
View File
File diff suppressed because it is too large Load Diff
+40
View File
@@ -0,0 +1,40 @@
#! format: off
should_precompile = true
# Don't edit the following! Instead change the script for `snoop_bot`.
ismultios = false
ismultiversion = true
# precompile_enclosure
@static if !should_precompile
# nothing
elseif !ismultios && !ismultiversion
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile/precompile_Plots.jl"))
include("../deps/SnoopCompile/precompile/precompile_Plots.jl")
_precompile_()
end
else
@static if v"1.6.0-DEV" <= VERSION <= v"1.6.9"
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.6/precompile_Plots.jl"))
include("../deps/SnoopCompile/precompile//1.6/precompile_Plots.jl")
_precompile_()
end
elseif v"1.7.0-DEV" <= VERSION <= v"1.7.9"
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.7/precompile_Plots.jl"))
include("../deps/SnoopCompile/precompile//1.7/precompile_Plots.jl")
_precompile_()
end
elseif v"1.8.0-DEV" <= VERSION <= v"1.8.9"
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.8/precompile_Plots.jl"))
include("../deps/SnoopCompile/precompile//1.8/precompile_Plots.jl")
_precompile_()
end
elseif v"1.9.0-DEV" <= VERSION <= v"1.9.9"
@static if isfile(joinpath(@__DIR__, "../deps/SnoopCompile/precompile//1.9/precompile_Plots.jl"))
include("../deps/SnoopCompile/precompile//1.9/precompile_Plots.jl")
_precompile_()
end
else
end
end # precompile_enclosure
+533 -264
View File
File diff suppressed because it is too large Load Diff
-652
View File
@@ -1,652 +0,0 @@
# create a new "build_series_args" which converts all inputs into xs = Any[xitems], ys = Any[yitems].
# Special handling for: no args, xmin/xmax, parametric, dataframes
# Then once inputs have been converted, build the series args, map functions, etc.
# This should cut down on boilerplate code and allow more focused dispatch on type
# note: returns meta information... mainly for use with automatic labeling from DataFrames for now
const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}}
const MaybeNumber = Union{Number, Missing}
const MaybeString = Union{AbstractString, Missing}
const DataPoint = Union{MaybeNumber, MaybeString}
prepareSeriesData(x) = error("Cannot convert $(typeof(x)) to series data for plotting")
prepareSeriesData(::Nothing) = nothing
prepareSeriesData(t::Tuple{T, T}) where {T<:Number} = t
prepareSeriesData(f::Function) = f
prepareSeriesData(ar::AbstractRange{<:Number}) = ar
function prepareSeriesData(a::AbstractArray{<:MaybeNumber})
f = isimmutable(a) ? replace : replace!
a = f(x -> ismissing(x) || isinf(x) ? NaN : x, map(float, a))
end
prepareSeriesData(a::AbstractArray{<:Missing}) = fill(NaN, axes(a))
prepareSeriesData(a::AbstractArray{<:MaybeString}) = replace(x -> ismissing(x) ? "" : x, a)
prepareSeriesData(s::Surface{<:AMat{<:MaybeNumber}}) = Surface(prepareSeriesData(s.surf))
prepareSeriesData(s::Surface) = s # non-numeric Surface, such as an image
prepareSeriesData(v::Volume) = Volume(prepareSeriesData(v.v), v.x_extents, v.y_extents, v.z_extents)
# default: assume x represents a single series
series_vector(x, plotattributes) = [prepareSeriesData(x)]
# fixed number of blank series
series_vector(n::Integer, plotattributes) = [zeros(0) for i in 1:n]
# vector of data points is a single series
series_vector(v::AVec{<:DataPoint}, plotattributes) = [prepareSeriesData(v)]
# list of things (maybe other vectors, functions, or something else)
function series_vector(v::AVec, plotattributes)
if all(x -> x isa MaybeNumber, v)
series_vector(Vector{MaybeNumber}(v), plotattributes)
elseif all(x -> x isa MaybeString, v)
series_vector(Vector{MaybeString}(v), plotattributes)
else
vcat((series_vector(vi, plotattributes) for vi in v)...)
end
end
# Matrix is split into columns
function series_vector(v::AMat{<:DataPoint}, plotattributes)
if all3D(plotattributes)
[prepareSeriesData(Surface(v))]
else
[prepareSeriesData(v[:, i]) for i in axes(v, 2)]
end
end
# --------------------------------------------------------------------
# Fillranges & ribbons
process_fillrange(range::Number, plotattributes) = [range]
process_fillrange(range, plotattributes) = series_vector(range, plotattributes)
process_ribbon(ribbon::Number, plotattributes) = [ribbon]
process_ribbon(ribbon, plotattributes) = series_vector(ribbon, plotattributes)
# ribbon as a tuple: (lower_ribbons, upper_ribbons)
process_ribbon(ribbon::Tuple{S, T}, plotattributes) where {S, T} = collect(zip(
series_vector(ribbon[1], plotattributes),
series_vector(ribbon[2], plotattributes),
))
# --------------------------------------------------------------------
compute_x(x::Nothing, y::Nothing, z) = axes(z,1)
compute_x(x::Nothing, y, z) = axes(y,1)
compute_x(x::Function, y, z) = map(x, y)
compute_x(x, y, z) = x
compute_y(x::Nothing, y::Nothing, z) = axes(z,2)
compute_y(x, y::Function, z) = map(y, x)
compute_y(x, y, z) = y
compute_z(x, y, z::Function) = map(z, x, y)
compute_z(x, y, z::AbstractMatrix) = Surface(z)
compute_z(x, y, z::Nothing) = nothing
compute_z(x, y, z) = z
nobigs(v::AVec{BigFloat}) = map(Float64, v)
nobigs(v::AVec{BigInt}) = map(Int64, v)
nobigs(v) = v
@noinline function compute_xyz(x, y, z)
x = compute_x(x,y,z)
y = compute_y(x,y,z)
z = compute_z(x,y,z)
nobigs(x), nobigs(y), nobigs(z)
end
# not allowed
compute_xyz(x::Nothing, y::FuncOrFuncs{F}, z) where {F<:Function} = error("If you want to plot the function `$y`, you need to define the x values!")
compute_xyz(x::Nothing, y::Nothing, z::FuncOrFuncs{F}) where {F<:Function} = error("If you want to plot the function `$z`, you need to define x and y values!")
compute_xyz(x::Nothing, y::Nothing, z::Nothing) = error("x/y/z are all nothing!")
# --------------------------------------------------------------------
# we are going to build recipes to do the processing and splitting of the args
# --------------------------------------------------------------------
# The catch-all SliceIt recipe
# --------------------------------------------------------------------
# ensure we dispatch to the slicer
struct SliceIt end
# The `SliceIt` recipe finishes user and type recipe processing.
# It splits processed data into individual series data, stores in copied `plotattributes`
# for each series and returns no arguments.
@recipe function f(::Type{SliceIt}, x, y, z)
# handle data with formatting attached
if typeof(x) <: Formatted
xformatter := x.formatter
x = x.data
end
if typeof(y) <: Formatted
yformatter := y.formatter
y = y.data
end
if typeof(z) <: Formatted
zformatter := z.formatter
z = z.data
end
xs = series_vector(x, plotattributes)
ys = series_vector(y, plotattributes)
zs = series_vector(z, plotattributes)
fr = pop!(plotattributes, :fillrange, nothing)
fillranges = process_fillrange(fr, plotattributes)
mf = length(fillranges)
rib = pop!(plotattributes, :ribbon, nothing)
ribbons = process_ribbon(rib, plotattributes)
mr = length(ribbons)
mx = length(xs)
my = length(ys)
mz = length(zs)
if mx > 0 && my > 0 && mz > 0
for i in 1:max(mx, my, mz)
# add a new series
di = copy(plotattributes)
xi, yi, zi = xs[mod1(i,mx)], ys[mod1(i,my)], zs[mod1(i,mz)]
di[:x], di[:y], di[:z] = compute_xyz(xi, yi, zi)
# handle fillrange
fr = fillranges[mod1(i,mf)]
di[:fillrange] = isa(fr, Function) ? map(fr, di[:x]) : fr
# handle ribbons
rib = ribbons[mod1(i,mr)]
di[:ribbon] = isa(rib, Function) ? map(rib, di[:x]) : rib
push!(series_list, RecipeData(di, ()))
end
end
nothing # don't add a series for the main block
end
# --------------------------------------------------------------------
# Apply type recipes
# --------------------------------------------------------------------
# this is the default "type recipe"... just pass the object through
@recipe f(::Type{T}, v::T) where T = v
# this should catch unhandled "series recipes" and error with a nice message
@recipe f(::Type{V}, x, y, z) where {V<:Val} = error("The backend must not support the series type $V, and there isn't a series recipe defined.")
function _apply_type_recipe(plotattributes, v, letter)
_preprocess_axis_args!(plotattributes, letter)
rdvec = RecipesBase.apply_recipe(plotattributes, typeof(v), v)
warn_on_recipe_aliases!(plotattributes, :type, typeof(v))
_postprocess_axis_args!(plotattributes, letter)
return rdvec[1].args[1]
end
# Handle type recipes when the recipe is defined on the elements.
# This sort of recipe should return a pair of functions... one to convert to number,
# and one to format tick values.
function _apply_type_recipe(plotattributes, v::AbstractArray, letter)
_preprocess_axis_args!(plotattributes, letter)
# First we try to apply an array type recipe.
w = RecipesBase.apply_recipe(plotattributes, typeof(v), v)[1].args[1]
warn_on_recipe_aliases!(plotattributes, :type, typeof(v))
# If the type did not change try it element-wise
if typeof(v) == typeof(w)
isempty(skipmissing(v)) && return Float64[]
x = first(skipmissing(v))
args = RecipesBase.apply_recipe(plotattributes, typeof(x), x)[1].args
warn_on_recipe_aliases!(plotattributes, :type, typeof(x))
_postprocess_axis_args!(plotattributes, letter)
if length(args) == 2 && all(arg -> arg isa Function, args)
numfunc, formatter = args
return Formatted(map(numfunc, v), formatter)
else
return v
end
end
_postprocess_axis_args!(plotattributes, letter)
return w
end
# special handling for Surface... need to properly unwrap and re-wrap
_apply_type_recipe(plotattributes, v::Surface{<:AMat{<:DataPoint}}) = v
function _apply_type_recipe(plotattributes, v::Surface)
ret = _apply_type_recipe(plotattributes, v.surf)
if typeof(ret) <: Formatted
Formatted(Surface(ret.data), ret.formatter)
else
Surface(ret.data)
end
end
# don't do anything vectors of datapoints and for nothing
_apply_type_recipe(plotattributes, v::Nothing, letter) = v
_apply_type_recipe(plotattributes, v::AbstractArray{<:MaybeString}, letter) = v
_apply_type_recipe(plotattributes, v::AbstractArray{<:Union{Real, Nothing}}, letter) = v
# axis args before type recipes should still be mapped to all axes
function _preprocess_axis_args!(plotattributes)
for (k, v) in plotattributes
if is_axis_attr_noletter(k)
pop!(plotattributes, k)
for l in (:x, :y, :z)
lk = Symbol(l, k)
haskey(plotattributes, lk) || (plotattributes[lk] = v)
end
end
end
end
function _preprocess_axis_args!(plotattributes, letter)
plotattributes[:letter] = letter
_preprocess_axis_args!(plotattributes)
end
# axis args in type recipes should only be applied to the current axis
function _postprocess_axis_args!(plotattributes, letter)
pop!(plotattributes, :letter)
if letter in (:x, :y, :z)
for (k, v) in plotattributes
if is_axis_attr_noletter(k)
pop!(plotattributes, k)
lk = Symbol(letter, k)
haskey(plotattributes, lk) || (plotattributes[lk] = v)
end
end
end
end
# --------------------------------------------------------------------
# Fallback user recipes calling type recipes
# --------------------------------------------------------------------
# handle "type recipes" by converting inputs, and then either re-calling or slicing
@recipe function f(x, y, z)
wrap_surfaces!(plotattributes, x, y, z)
did_replace = false
newx = _apply_type_recipe(plotattributes, x, :x)
x === newx || (did_replace = true)
newy = _apply_type_recipe(plotattributes, y, :y)
y === newy || (did_replace = true)
newz = _apply_type_recipe(plotattributes, z, :z)
z === newz || (did_replace = true)
if did_replace
newx, newy, newz
else
SliceIt, x, y, z
end
end
@recipe function f(x, y)
wrap_surfaces!(plotattributes, x, y)
did_replace = false
newx = _apply_type_recipe(plotattributes, x, :x)
x === newx || (did_replace = true)
newy = _apply_type_recipe(plotattributes, y, :y)
y === newy || (did_replace = true)
if did_replace
newx, newy
else
SliceIt, x, y, nothing
end
end
@recipe function f(y)
wrap_surfaces!(plotattributes, y)
newy = _apply_type_recipe(plotattributes, y, :y)
if y !== newy
newy
else
SliceIt, nothing, y, nothing
end
end
# if there's more than 3 inputs, it can't be passed directly to SliceIt
# so we'll apply_type_recipe to all of them
@recipe function f(v1, v2, v3, v4, vrest...)
did_replace = false
newargs = map(v -> begin
newv = _apply_type_recipe(plotattributes, v, :unknown)
if newv !== v
did_replace = true
end
newv
end, (v1, v2, v3, v4, vrest...))
if !did_replace
error("Couldn't process recipe args: $(map(typeof, (v1, v2, v3, v4, vrest...)))")
end
newargs
end
# helper function to ensure relevant attributes are wrapped by Surface
function wrap_surfaces!(plotattributes, args...) end
wrap_surfaces!(plotattributes, x::AMat, y::AMat, z::AMat) = wrap_surfaces!(plotattributes)
wrap_surfaces!(plotattributes, x::AVec, y::AVec, z::AMat) = wrap_surfaces!(plotattributes)
function wrap_surfaces!(plotattributes, x::AVec, y::AVec, z::Surface)
wrap_surfaces!(plotattributes)
end
function wrap_surfaces!(plotattributes)
if haskey(plotattributes, :fill_z)
v = plotattributes[:fill_z]
if !isa(v, Surface)
plotattributes[:fill_z] = Surface(v)
end
end
end
# --------------------------------------------------------------------
# 1 argument
# --------------------------------------------------------------------
@recipe f(n::Integer) = is3d(get(plotattributes,:seriestype,:path)) ? (SliceIt, n, n, n) : (SliceIt, n, n, nothing)
all3D(plotattributes) = trueOrAllTrue(
st -> st in (
:contour,
:contourf,
:heatmap,
:surface,
:wireframe,
:contour3d,
:image,
:plots_heatmap,
),
get(plotattributes, :seriestype, :none),
)
# return a surface if this is a 3d plot, otherwise let it be sliced up
@recipe function f(mat::AMat)
if all3D(plotattributes)
n, m = axes(mat)
m, n, Surface(mat)
else
nothing, mat, nothing
end
end
# if a matrix is wrapped by Formatted, do similar logic, but wrap data with Surface
@recipe function f(fmt::Formatted{<:AMat})
if all3D(plotattributes)
mat = fmt.data
n, m = axes(mat)
m, n, Formatted(Surface(mat), fmt.formatter)
else
nothing, fmt, nothing
end
end
# assume this is a Volume, so construct one
@recipe function f(vol::AbstractArray{<:MaybeNumber, 3}, args...)
seriestype := :volume
SliceIt, nothing, Volume(vol, args...), nothing
end
# images - grays
function clamp_greys!(mat::AMat{<:Gray})
for i in eachindex(mat)
mat[i].val < 0 && (mat[i] = Gray(0))
mat[i].val > 1 && (mat[i] = Gray(1))
end
mat
end
@recipe function f(mat::AMat{<:Gray})
n, m = axes(mat)
if is_seriestype_supported(:image)
seriestype := :image
yflip --> true
SliceIt, m, n, Surface(clamp_greys!(mat))
else
seriestype := :heatmap
yflip --> true
cbar --> false
fillcolor --> ColorGradient([:black, :white])
SliceIt, m, n, Surface(clamp!(convert(Matrix{Float64}, mat), 0., 1.))
end
end
# images - colors
@recipe function f(mat::AMat{T}) where T<:Colorant
n, m = axes(mat)
if is_seriestype_supported(:image)
seriestype := :image
yflip --> true
SliceIt, m, n, Surface(mat)
else
seriestype := :heatmap
yflip --> true
cbar --> false
aspect_ratio --> :equal
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
SliceIt, m, n, Surface(z)
end
end
# plotting arbitrary shapes/polygons
@recipe function f(shape::Shape)
seriestype --> :shape
coords(shape)
end
@recipe function f(shapes::AVec{Shape})
seriestype --> :shape
coords(shapes)
end
@recipe function f(shapes::AMat{Shape})
seriestype --> :shape
for j in axes(shapes,2)
@series coords(vec(shapes[:,j]))
end
end
# Dicts: each entry is a data point (x,y)=(key,value)
@recipe f(d::AbstractDict) = collect(keys(d)), collect(values(d))
# function without range... use the current range of the x-axis
@recipe function f(f::FuncOrFuncs{F}) where F<:Function
plt = plotattributes[:plot_object]
xmin, xmax = if haskey(plotattributes, :xlims)
plotattributes[:xlims]
else
try
axis_limits(plt[1], :x)
catch
xinv = invscalefunc(get(plotattributes, :xscale, :identity))
xm = PlotUtils.tryrange(f, xinv.([-5,-1,0,0.01]))
xm, PlotUtils.tryrange(f, filter(x->x>xm, xinv.([5,1,0.99, 0, -0.01])))
end
end
f, xmin, xmax
end
# --------------------------------------------------------------------
# 2 arguments
# --------------------------------------------------------------------
# if functions come first, just swap the order (not to be confused with parametric
# functions... as there would be more than one function passed in)
@recipe function f(f::FuncOrFuncs{F}, x) where F<:Function
F2 = typeof(x)
@assert !(F2 <: Function || (F2 <: AbstractArray && F2.parameters[1] <: Function)) # otherwise we'd hit infinite recursion here
x, f
end
# --------------------------------------------------------------------
# 3 arguments
# --------------------------------------------------------------------
# surface-like... function
@recipe function f(x::AVec, y::AVec, zf::Function)
x, y, Surface(zf, x, y) # TODO: replace with SurfaceFunction when supported
end
# surface-like... matrix grid
@recipe function f(x::AVec, y::AVec, z::AMat)
if !like_surface(get(plotattributes, :seriestype, :none))
plotattributes[:seriestype] = :contour
end
x, y, Surface(z)
end
# images - grays
@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where T<:Gray
if is_seriestype_supported(:image)
seriestype := :image
yflip --> true
SliceIt, x, y, Surface(mat)
else
seriestype := :heatmap
yflip --> true
cbar --> false
fillcolor --> ColorGradient([:black, :white])
SliceIt, x, y, Surface(convert(Matrix{Float64}, mat))
end
end
# images - colors
@recipe function f(x::AVec, y::AVec, mat::AMat{T}) where T<:Colorant
if is_seriestype_supported(:image)
seriestype := :image
yflip --> true
SliceIt, x, y, Surface(mat)
else
seriestype := :heatmap
yflip --> true
cbar --> false
z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat)
SliceIt, x, y, Surface(z)
end
end
# --------------------------------------------------------------------
# Parametric functions
# --------------------------------------------------------------------
# special handling... xmin/xmax with parametric function(s)
@recipe function f(f::Function, xmin::Number, xmax::Number)
xscale, yscale = [get(plotattributes, sym, :identity) for sym=(:xscale,:yscale)]
_scaled_adapted_grid(f, xscale, yscale, xmin, xmax)
end
@recipe function f(fs::AbstractArray{F}, xmin::Number, xmax::Number) where F<:Function
xscale, yscale = [get(plotattributes, sym, :identity) for sym=(:xscale,:yscale)]
unzip(_scaled_adapted_grid.(fs, xscale, yscale, xmin, xmax))
end
@recipe f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, u::AVec) where {F<:Function,G<:Function} = mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u)
@recipe f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, umin::Number, umax::Number, n = 200) where {F<:Function,G<:Function} = fx, fy, range(umin, stop = umax, length = n)
function _scaled_adapted_grid(f, xscale, yscale, xmin, xmax)
(xf, xinv), (yf, yinv) = ((scalefunc(s),invscalefunc(s)) for s in (xscale,yscale))
xs, ys = adapted_grid(yf∘f∘xinv, xf.((xmin, xmax)))
xinv.(xs), yinv.(ys)
end
# special handling... 3D parametric function(s)
@recipe function f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, fz::FuncOrFuncs{H}, u::AVec) where {F<:Function,G<:Function,H<:Function}
mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u), mapFuncOrFuncs(fz, u)
end
@recipe function f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, fz::FuncOrFuncs{H}, umin::Number, umax::Number, numPoints = 200) where {F<:Function,G<:Function,H<:Function}
fx, fy, fz, range(umin, stop = umax, length = numPoints)
end
# --------------------------------------------------------------------
# Lists of tuples and GeometryTypes.Points
# --------------------------------------------------------------------
@recipe f(v::AVec{<:Tuple}) = unzip(v)
@recipe f(v::AVec{<:GeometryTypes.Point}) = unzip(v)
@recipe f(tup::Tuple) = [tup]
@recipe f(p::GeometryTypes.Point) = [p]
# Special case for 4-tuples in :ohlc series
@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] : unzip(xyuv)
# --------------------------------------------------------------------
# handle grouping
# --------------------------------------------------------------------
splittable_kw(key, val, lengthGroup) = false
splittable_kw(key, val::AbstractArray, lengthGroup) = !(key in (:group, :color_palette)) && length(axes(val,1)) == lengthGroup
splittable_kw(key, val::Tuple, lengthGroup) = all(splittable_kw.(key, val, lengthGroup))
splittable_kw(key, val::SeriesAnnotations, lengthGroup) = splittable_kw(key, val.strs, lengthGroup)
split_kw(key, val::AbstractArray, indices) = val[indices, fill(Colon(), ndims(val)-1)...]
split_kw(key, val::Tuple, indices) = Tuple(split_kw(key, v, indices) for v in val)
function split_kw(key, val::SeriesAnnotations, indices)
split_strs = split_kw(key, val.strs, indices)
return SeriesAnnotations(split_strs, val.font, val.baseshape, val.scalefactor)
end
function groupedvec2mat(x_ind, x, y::AbstractArray, groupby, def_val = y[1])
y_mat = Array{promote_type(eltype(y), typeof(def_val))}(undef, length(keys(x_ind)), length(groupby.groupLabels))
fill!(y_mat, def_val)
for i in eachindex(groupby.groupLabels)
xi = x[groupby.groupIds[i]]
yi = y[groupby.groupIds[i]]
y_mat[getindex.(Ref(x_ind), xi), i] = yi
end
return y_mat
end
groupedvec2mat(x_ind, x, y::Tuple, groupby) = Tuple(groupedvec2mat(x_ind, x, v, groupby) for v in y)
group_as_matrix(t) = false
# split the group into 1 series per group, and set the label and idxfilter for each
@recipe function f(groupby::GroupBy, args...)
lengthGroup = maximum(union(groupby.groupIds...))
if !(group_as_matrix(args[1]))
for (i,glab) in enumerate(groupby.groupLabels)
@series begin
label --> string(glab)
idxfilter --> groupby.groupIds[i]
for (key,val) in plotattributes
if splittable_kw(key, val, lengthGroup)
:($key) := split_kw(key, val, groupby.groupIds[i])
end
end
args
end
end
else
g = args[1]
if length(g.args) == 1
x = zeros(Int, lengthGroup)
for indexes in groupby.groupIds
x[indexes] = eachindex(indexes)
end
last_args = g.args
else
x = g.args[1]
last_args = g.args[2:end]
end
x_u = unique(sort(x))
x_ind = Dict(zip(x_u, eachindex(x_u)))
for (key,val) in plotattributes
if splittable_kw(key, val, lengthGroup)
:($key) := groupedvec2mat(x_ind, x, val, groupby)
end
end
label --> reshape(groupby.groupLabels, 1, :)
typeof(g)((x_u, (groupedvec2mat(x_ind, x, arg, groupby, NaN) for arg in last_args)...))
end
end
+85 -37
View File
@@ -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
@@ -69,7 +72,7 @@ Make a histogram bar plot. See `histogram`.
"""
stephist(x)
stephist(x)
stephist!(x)
Make a histogram step plot (bin counts are represented using horizontal lines
instead of bars). See `histogram`.
@@ -238,7 +241,6 @@ julia> ohlc(y)
"""
@shorthands ohlc
"""
contour(x,y,z)
contour!(x,y,z)
@@ -251,7 +253,7 @@ Draw contour lines of the `Surface` z.
# Example
```julia-repl
julia> x = y = range(-20, 20, length = 100)
julia> x = y = range(-20, stop = 20, length = 100)
julia> contour(x, y, (x, y) -> x^2 + y^2)
```
"""
@@ -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
"""
@@ -272,7 +273,7 @@ Draw a 3D surface plot.
# Example
```julia-repl
julia> using LinearAlgebra
julia> x = y = range(-3, 3, length = 100)
julia> x = y = range(-3, stop = 3, length = 100)
julia> surface(x, y, (x, y) -> sinc(norm([x, y])))
```
"""
@@ -318,6 +319,27 @@ julia> scatter3d([0,1,2,3],[0,1,4,9],[0,1,8,27])
"""
@shorthands scatter3d
"""
mesh3d(x,y,z)
mesh3d(x,y,z; connections)
Plot a 3d mesh. On Plotly the triangles can be specified using the connections argument.
# Example
```Julia
x=[0, 1, 2, 0]
y=[0, 0, 1, 2]
z=[0, 2, 0, 1]
i=[0, 0, 0, 1]
j=[1, 2, 3, 2]
k=[2, 3, 1, 3]
plot(x,y,z,seriestype=:mesh3d;connections=(i,j,k))
```
"""
@shorthands mesh3d
"""
boxplot(x, y)
boxplot!(x, y)
@@ -326,10 +348,10 @@ Make a box and whisker plot.
# Keyword arguments
- `notch`: Bool. Notch the box plot? (false)
- `range`: Real. Values more than range*IQR below the first quartile
or above the third quartile are shown as outliers (1.5)
- `whisker_range`: Real. Whiskers extend `whisker_range`*IQR below the first quartile
and above the third quartile. Values outside this range are shown as outliers (1.5)
- `outliers`: Bool. Show outliers? (true)
- `whisker_width`: Real or Symbol. Length of whiskers (:match)
- `whisker_width`: Real or Symbol. Length of whiskers; the options are `:match` to match the box width, `:half`, or a number to indicate the total length. (:half)
# Example
```julia-repl
@@ -381,46 +403,44 @@ julia> curves([1,2,3,4],[1,1,2,4])
@shorthands curves
"Plot a pie diagram"
pie(args...; kw...) = plot(args...; kw..., seriestype = :pie, aspect_ratio = :equal, grid=false, xticks=nothing, yticks=nothing)
pie!(args...; kw...) = plot!(args...; kw..., seriestype = :pie, aspect_ratio = :equal, grid=false, xticks=nothing, yticks=nothing)
@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...) where {T<:Real} = plot!(; xticks = v, kw...)
xticks!(v::TicksArgs; kw...) = plot!(; xticks = v, kw...)
"Set yticks for an existing plot"
yticks!(v::TicksArgs; kw...) where {T<:Real} = plot!(; yticks = v, kw...)
yticks!(v::TicksArgs; kw...) = plot!(; yticks = v, kw...)
xticks!(
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...)
@@ -430,27 +450,55 @@ 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::AVec{T}; kw...) where {T<:Tuple} = 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...)
xgrid!(args...; kw...) = plot!(; xgrid = 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...)
ygrid!(args...; kw...) = plot!(; ygrid = args, kw...)
@doc """
abline!([plot,] a, b; kwargs...)
Adds ax+b... straight line over the current plot, without changing the axis limits
""" abline!
@doc """
areaplot([x,] y)
areaplot!([x,] y)
Draw a stacked area plot of the matrix y.
# Examples
```julia-repl
julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], fillalpha = [0.2 0.3 0.4])
```
""" areaplot
@doc """
lens!([plot,] x, y, inset = (sp_index, bbox(x1, x2, y1, y2)))
Magnify a region of a plot given by `x` and `y`.
`sp_index` is the index of the subplot and `x1`, `x2`, `y1` and `y2` should be between `0` and `1`.
""" lens!
@specialize
+22 -12
View File
@@ -1,15 +1,14 @@
function Subplot(::T; parent = RootLayout()) where T<:AbstractBackend
function Subplot(::T; parent = RootLayout()) where {T<:AbstractBackend}
Subplot{T}(
parent,
Series[],
(20mm, 5mm, 2mm, 10mm),
defaultbox,
defaultbox,
Attr(KW(), _subplot_defaults),
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
@@ -42,12 +40,24 @@ get_subplot_index(plt::Plot, sp::Subplot) = findfirst(x -> x === sp, plt.subplot
series_list(sp::Subplot) = sp.series_list # filter(series -> series.plotattributes[:subplot] === sp, sp.plt.series_list)
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, :pie, :image
))
series.plotattributes[:primary] &&
series.plotattributes[:label] != "" &&
!(
series.plotattributes[:seriestype] in (
:hexbin,
:bins2d,
:histogram2d,
:hline,
:vline,
:contour,
:contourf,
:contour3d,
:surface,
:wireframe,
:heatmap,
:image,
)
)
end
# ----------------------------------------------------------------------
+15 -29
View File
@@ -14,25 +14,15 @@ function _theme(s::Symbol, defaults::AKW; kw...)
# Set the theme's gradient as default
if haskey(defaults, :colorgradient)
PlotUtils.clibrary(:misc)
PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s))
pop!(defaults, :colorgradient)
PlotUtils.default_cgrad(pop!(defaults, :colorgradient))
else
PlotUtils.clibrary(:Plots)
PlotUtils.default_cgrad(default = :sequential, sequential = :inferno)
PlotUtils.default_cgrad(:default)
end
# maybe overwrite the theme's gradient
kw = KW(kw)
if haskey(kw, :colorgradient)
kwgrad = pop!(kw, :colorgradient)
for clib in clibraries()
if kwgrad in cgradients(clib)
PlotUtils.clibrary(clib)
PlotUtils.default_cgrad(default = :sequential, sequential = kwgrad)
break
end
end
PlotUtils.default_cgrad(pop!(kw, :colorgradient))
end
# Set the theme's defaults
@@ -44,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)
@@ -57,12 +44,12 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
defaults = PlotThemes._themes[thm].defaults
# get the gradient
gradient_colors = get(defaults, :colorgradient, cgrad(:inferno).colors)
gradient_colors = color_list(cgrad(get(defaults, :colorgradient, :default)))
colorgradient = cgrad(cfunc.(RGB.(gradient_colors)))
# get the palette
palette = get(defaults, :palette, get_color_palette(:auto, plot_color(:white), 17))
palette = cfunc.(RGB.(palette))
cp = color_list(palette(get(defaults, :palette, :default)))
cp = cfunc.(RGB.(cp))
# apply the theme
for k in keys(defaults)
@@ -89,7 +76,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
for j in 1:4
@series begin
subplot := 1
palette := palette
color_palette := cp
seriestype := :path
cumsum(randn(50))
end
@@ -97,7 +84,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
@series begin
subplot := 2
seriestype := :scatter
palette := palette
color_palette := cp
marker := (:circle, :diamond, :star5, :square)[j]
randn(10), randn(10)
end
@@ -106,7 +93,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
@series begin
subplot := 3
seriestype := :histogram
palette := palette
color_palette := cp
randn(1000) .+ (0:2:4)'
end
@@ -120,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
@@ -129,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
@@ -147,5 +134,4 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func
line_z := z
x, y, z
end
end
+20 -66
View File
@@ -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
@@ -18,65 +19,10 @@ end
wrap(obj::T) where {T} = InputWrapper{T}(obj)
Base.isempty(wrapper::InputWrapper) = false
# -----------------------------------------------------------
struct Attr <: AbstractDict{Symbol,Any}
explicit::KW
defaults::KW
end
function Base.getindex(attr::Attr, k)
return haskey(attr.explicit, k) ? attr.explicit[k] : attr.defaults[k]
end
Base.haskey(attr::Attr, k) = haskey(attr.explicit,k) || haskey(attr.defaults,k)
Base.get(attr::Attr, k, default) = haskey(attr, k) ? attr[k] : default
function Base.get!(attr::Attr, k, default)
v = if haskey(attr, k)
attr[k]
else
attr.defaults[k] = default
end
return v
end
function Base.delete!(attr::Attr, k)
haskey(attr.explicit, k) && delete!(attr.explicit, k)
haskey(attr.defaults, k) && delete!(attr.defaults, k)
end
Base.length(attr::Attr) = length(union(keys(attr.explicit), keys(attr.defaults)))
function Base.iterate(attr::Attr)
exp_keys = keys(attr.explicit)
def_keys = setdiff(keys(attr.defaults), exp_keys)
key_list = collect(Iterators.flatten((exp_keys, def_keys)))
iterate(attr, (key_list, 1))
end
function Base.iterate(attr::Attr, (key_list, i))
i > length(key_list) && return nothing
k = key_list[i]
(k=>attr[k], (key_list, i+1))
end
Base.copy(attr::Attr) = Attr(copy(attr.explicit), attr.defaults)
RecipesBase.is_explicit(attr::Attr, k) = haskey(attr.explicit,k)
isdefault(attr::Attr, k) = !is_explicit(attr,k) && haskey(attr.defaults,k)
Base.setindex!(attr::Attr, v, k) = attr.explicit[k] = v
# Reset to default value and return dict
reset_kw!(attr::Attr, k) = is_explicit(attr, k) ? delete!(attr.explicit, k) : attr
# Reset to default value and return old value
pop_kw!(attr::Attr, k) = is_explicit(attr, k) ? pop!(attr.explicit, k) : attr.defaults[k]
pop_kw!(attr::Attr, k, default) = is_explicit(attr, k) ? pop!(attr.explicit, k) : get(attr.defaults, k, default)
# Fallbacks for dicts without defaults
reset_kw!(d::AKW, k) = delete!(d, k)
pop_kw!(d::AKW, k) = pop!(d, k)
pop_kw!(d::AKW, k, default) = pop!(d, k, default)
# -----------------------------------------------------------
mutable struct Series
plotattributes::Attr
plotattributes::DefaultsDict
end
attr(series::Series, k::Symbol) = series.plotattributes[k]
@@ -91,7 +37,7 @@ mutable struct Subplot{T<:AbstractBackend} <: AbstractLayout
minpad::Tuple # leftpad, toppad, rightpad, bottompad
bbox::BoundingBox # the canvas area which is available to this subplot
plotarea::BoundingBox # the part where the data goes
attr::Attr # args specific to this subplot
attr::DefaultsDict # args specific to this subplot
o # can store backend-specific data... like a pyplot ax
plt # the enclosing Plot object (can't give it a type because of no forward declarations)
end
@@ -103,7 +49,7 @@ Base.show(io::IO, sp::Subplot) = print(io, "Subplot{$(sp[:subplot_index])}")
# simple wrapper around a KW so we can hold all attributes pertaining to the axis in one place
mutable struct Axis
sps::Vector{Subplot}
plotattributes::Attr
plotattributes::DefaultsDict
end
mutable struct Extrema
@@ -114,15 +60,14 @@ 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
attr::Attr # arguments for the whole plot
attr::DefaultsDict # arguments for the whole plot
series_list::Vector{Series} # arguments for each series
o # the backend's plot object
subplots::Vector{Subplot}
@@ -133,9 +78,18 @@ mutable struct Plot{T<:AbstractBackend} <: AbstractPlot{T}
end
function Plot()
Plot(backend(), 0, Attr(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
# -----------------------------------------------------------------------
@@ -144,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
+497 -381
View File
File diff suppressed because it is too large Load Diff
+47 -19
View File
@@ -1,43 +1,71 @@
import Plots._current_plots_version
function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = !is_ci(), sigma = [1,1], tol = 1e-2)
# replace `f(args...)` with `f(rng, args...)` for `f ∈ (rand, randn)`
function replace_rand!(ex) end
function replace_rand!(ex::Expr)
for arg in ex.args
replace_rand!(arg)
end
if ex.head === :call && ex.args[1] (:rand, :randn, :(Plots.fakedata))
pushfirst!(ex.args, ex.args[1])
ex.args[2] = :rng
end
end
function fix_rand!(ex)
replace_rand!(ex)
end
function image_comparison_tests(
pkg::Symbol,
idx::Int;
debug = false,
popup = !is_ci(),
sigma = [1, 1],
tol = 1e-2,
)
Plots._debugMode.on = debug
example = Plots._examples[idx]
Plots.theme(:default)
@info("Testing plot: $pkg:$idx:$(example.header)")
backend(pkg)
backend()
default(size=(500,300))
# ensure consistent results
Random.seed!(1234)
default(size = (500, 300))
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
expr = Expr(:block)
append!(expr.args, example.exprs)
eval(expr)
eval(:(rng = StableRNG(PLOTS_SEED)))
for the_expr in example.exprs
expr = Expr(:block)
push!(expr.args, the_expr)
fix_rand!(expr)
eval(expr)
end
png(fn)
end
# the test
vtest = VisualTest(func, reffn, idx)
test_images(vtest, popup=popup, sigma=sigma, tol=tol, newfn = newfn)
test_images(vtest, popup = popup, sigma = sigma, tol = tol, newfn = newfn)
end
function image_comparison_facts(pkg::Symbol;
skip = [], # skip these examples (int index)
only = nothing, # limit to these examples (int index)
debug = false, # print debug information?
sigma = [1,1], # number of pixels to "blur"
tol = 1e-2) # acceptable error (percent)
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) |> success == true
function image_comparison_facts(
pkg::Symbol;
skip = [], # skip these examples (int index)
only = nothing, # limit to these examples (int index)
debug = false, # print debug information?
sigma = [1, 1], # number of pixels to "blur"
tol = 1e-2,
) # acceptable error (percent)
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) |>
success == true
end
end
end
end
+60
View File
@@ -0,0 +1,60 @@
using Plots, Test, Dates
@testset "Limits" begin
y = [1.0 * i * i for i in 1:10]
x = [Date(2019, 11, i) for i in 1:10]
rx = [x[3], x[5]]
p = plot(x, y, widen = false)
vspan!(p, rx, label = "", alpha = 0.2)
ref_ylims = (y[1], y[end])
ref_xlims = (x[1].instant.periods.value, x[end].instant.periods.value)
@test Plots.ylims(p) == ref_ylims
@test Plots.xlims(p) == ref_xlims
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
@static if haskey(ENV, "APPVEYOR")
@info "Skipping display tests on AppVeyor"
else
@test isa(display(p), Nothing) == true
closeall()
end
end # testset
@testset "Date xlims" begin
y = [1.0 * i * i for i in 1:10]
x = [Date(2019, 11, i) for i in 1:10]
span = (Date(2019, 10, 31), Date(2019, 11, 11))
ref_xlims = map(date -> date.instant.periods.value, span)
p = plot(x, y, xlims = span, widen = false)
@test Plots.xlims(p) == ref_xlims
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
@static if haskey(ENV, "APPVEYOR")
@info "Skipping display tests on AppVeyor"
else
@test isa(display(p), Nothing) == true
closeall()
end
end # testset
@testset "DateTime xlims" begin
y = [1.0 * i * i for i in 1:10]
x = [DateTime(2019, 11, i, 11) for i in 1:10]
span = (DateTime(2019, 10, 31, 11, 59, 59), DateTime(2019, 11, 11, 12, 01, 15))
ref_xlims = map(date -> date.instant.periods.value, span)
p = plot(x, y, xlims = span, widen = false)
@test Plots.xlims(p) == ref_xlims
#@static if (haskey(ENV, "APPVEYOR") || haskey(ENV, "CI"))
@static if haskey(ENV, "APPVEYOR")
@info "Skipping display tests on AppVeyor"
else
@test isa(display(p), Nothing) == true
closeall()
end
end # testset
+430 -127
View File
@@ -1,24 +1,341 @@
import ImageMagick
using Plots: guidefont, series_annotations, PLOTS_SEED
using VisualRegressionTests
using Plots
using Random
using Test
using FileIO
using Gtk
using RecipesBase
using StableRNGs
using TestImages
using LibGit2
using GeometryTypes
using Random
using FileIO
using Plots
using Dates
using JSON
using Test
using Gtk
include("test_hdf5plots.jl")
include("test_pgfplotsx.jl")
import GeometryBasics
import ImageMagick
reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
@testset "Infrastructure" begin
@test_nowarn JSON.Parser.parse(
String(read(joinpath(dirname(pathof(Plots)), "..", ".zenodo.json"))),
)
end
@testset "Plotly standalone" begin
@test_nowarn Plots._init_ijulia_plotting()
@test Plots.plotly_local_file_path[] === nothing
temp = Plots.use_local_dependencies[]
withenv("PLOTS_HOST_DEPENDENCY_LOCAL" => true) do
Plots.__init__()
@test Plots.plotly_local_file_path[] isa String
@test isfile(Plots.plotly_local_file_path[])
@test Plots.use_local_dependencies[] = true
@test_nowarn Plots._init_ijulia_plotting()
end
Plots.plotly_local_file_path[] = nothing
Plots.use_local_dependencies[] = temp
end
@testset "Utils" begin
zipped = (
[(1, 2)],
[("a", "b")],
[(1, "a"), (2, "b")],
[(1, 2), (3, 4)],
[(1, 2, 3), (3, 4, 5)],
[(1, 2, 3, 4), (3, 4, 5, 6)],
[(1, 2.0), (missing, missing)],
[(1, missing), (missing, "a")],
[(missing, missing)],
[(missing, missing, missing), ("a", "b", "c")],
)
for z in zipped
@test isequal(collect(zip(Plots.RecipesPipeline.unzip(z)...)), z)
@test isequal(
collect(zip(Plots.RecipesPipeline.unzip(GeometryBasics.Point.(z))...)),
z,
)
end
op1 = Plots.process_clims((1.0, 2.0))
op2 = Plots.process_clims((1, 2.0))
data = randn(100, 100)
@test op1(data) == op2(data)
@test Plots.process_clims(nothing) ==
Plots.process_clims(missing) ==
Plots.process_clims(:auto)
@test (==)(
Plots.texmath2unicode(
raw"Equation $y = \alpha \cdot x + \beta$ and eqn $y = \sin(x)^2$",
),
raw"Equation y = α ⋅ x + β and eqn y = sin(x)²",
)
@test Plots.isvector([1, 2])
@test !Plots.isvector(nothing)
@test Plots.ismatrix([1 2; 3 4])
@test !Plots.ismatrix(nothing)
@test Plots.isscalar(1.0)
@test !Plots.isscalar(nothing)
@test Plots.tovec([]) isa AbstractVector
@test Plots.tovec(nothing) isa AbstractVector
@test Plots.anynan(1, 3, (1, NaN, 3))
@test Plots.allnan(1, 2, (NaN, NaN, 1))
@test Plots.makevec([]) isa AbstractVector
@test Plots.makevec(1) isa AbstractVector
@test Plots.maketuple(1) == (1, 1)
@test Plots.maketuple((1, 1)) == (1, 1)
@test Plots.ok(1, 2)
@test !Plots.ok(1, 2, NaN)
@test Plots.ok((1, 2, 3))
@test !Plots.ok((1, 2, NaN))
@test Plots.nansplit([1, 2, NaN, 3, 4]) == [[1.0, 2.0], [3.0, 4.0]]
@test Plots.nanvcat([1, NaN]) |> length == 4
@test Plots.nop() === nothing
@test_throws ErrorException Plots.notimpl()
@test Plots.inch2px(1) isa AbstractFloat
@test Plots.px2inch(1) isa AbstractFloat
@test Plots.inch2mm(1) isa AbstractFloat
@test Plots.mm2inch(1) isa AbstractFloat
@test Plots.px2mm(1) isa AbstractFloat
@test Plots.mm2px(1) isa AbstractFloat
p = plot()
@test xlims() isa Tuple
@test ylims() isa Tuple
@test zlims() isa Tuple
Plots.makekw(foo = 1, bar = 2) isa Dict
@test_throws ErrorException Plots.inline()
@test_throws ErrorException Plots._do_plot_show(plot(), :inline)
@test_throws ErrorException Plots.dumpcallstack()
Plots.debugplots(true)
Plots.debugplots(false)
Plots.debugshow(devnull, nothing)
Plots.debugshow(devnull, [1])
p = plot(1)
push!(p, 1.5)
push!(p, 1, 1.5)
# append!(p, [1., 2.])
append!(p, 1, 2.5, 2.5)
push!(p, (1.5, 2.5))
push!(p, 1, (1.5, 2.5))
append!(p, (1.5, 2.5))
append!(p, 1, (1.5, 2.5))
p = plot([1, 2, 3], [4, 5, 6])
@test Plots.xmin(p) == 1
@test Plots.xmax(p) == 3
@test Plots.ignorenan_extrema(p) == (1, 3)
@test Plots.get_attr_symbol(:x, "lims") == :xlims
@test Plots.get_attr_symbol(:x, :lims) == :xlims
@testset "NaN-separated Segments" begin
segments(args...) = collect(iter_segments(args...))
nan10 = fill(NaN, 10)
@test segments(11:20) == [1:10]
@test segments([NaN]) == []
@test segments(nan10) == []
@test segments([nan10; 1:5]) == [11:15]
@test segments([1:5; nan10]) == [1:5]
@test segments([nan10; 1:5; nan10; 1:5; nan10]) == [11:15, 26:30]
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
end
end
@testset "Axes" begin
p = plot()
axis = p.subplots[1][:xaxis]
@test typeof(axis) == Plots.Axis
@test Plots.discrete_value!(axis, "HI") == (0.5, 1)
@test Plots.discrete_value!(axis, :yo) == (1.5, 2)
@test Plots.ignorenan_extrema(axis) == (0.5, 1.5)
@test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1)
Plots.discrete_value!(axis, ["x$i" for i in 1:5])
Plots.discrete_value!(axis, ["x$i" for i in 0:2])
@test Plots.ignorenan_extrema(axis) == (0.5, 7.5)
end
@testset "NoFail" begin
# ensure backend with tested display
@test unicodeplots() == Plots.UnicodePlotsBackend()
@test backend() == Plots.UnicodePlotsBackend()
dsp = TextDisplay(IOContext(IOBuffer(), :color => true))
@testset "plot" begin
for plt in [
histogram([1, 0, 0, 0, 0, 0]),
plot([missing]),
plot([missing, missing]),
plot(fill(missing, 10)),
plot([missing; 1:4]),
plot([fill(missing, 10); 1:4]),
plot([1 1; 1 missing]),
plot(["a" "b"; missing "d"], [1 2; 3 4]),
]
display(dsp, plt)
end
@test_nowarn plot(x -> x^2, 0, 2)
end
@testset "bar" begin
p = bar([3, 2, 1], [1, 2, 3])
@test p isa Plots.Plot
@test display(dsp, p) isa Nothing
end
@testset "gui" begin
open(tempname(), "w") do io
redirect_stdout(io) do
gui(plot())
end
end
end
end
@testset "Coverage" begin
@testset "themes" begin
p = showtheme(:dark)
@test p isa Plots.Plot
end
@testset "plotattr" begin
tmp = tempname()
open(tmp, "w") do io
redirect_stdout(io) do
plotattr("seriestype")
plotattr(:Plot)
plotattr()
end
end
str = join(readlines(tmp), "")
@test occursin("seriestype", str)
@test occursin("Plot attributes", str)
end
@testset "legend" begin
@test isa(
Plots.legend_pos_from_angle(20, 0.0, 0.5, 1.0, 0.0, 0.5, 1.0),
NTuple{2,<:AbstractFloat},
)
@test Plots.legend_anchor_index(-1) == 1
@test Plots.legend_anchor_index(+0) == 2
@test Plots.legend_anchor_index(+1) == 3
@test Plots.legend_angle(:foo_bar) == (45, :inner)
@test Plots.legend_angle(20.0) ==
Plots.legend_angle((20.0, :inner)) ==
(20.0, :inner)
@test Plots.legend_angle((20.0, 10.0)) == (20.0, 10.0)
end
end
@testset "Output" begin
@test Plots.defaultOutputFormat(plot()) == "png"
@test Plots.addExtension("foo", "bar") == "foo.bar"
fn = tempname()
gr()
let p = plot()
Plots.png(p, fn)
Plots.png(fn)
savefig(p, "$fn.png")
savefig("$fn.png")
Plots.pdf(p, fn)
Plots.pdf(fn)
savefig(p, "$fn.pdf")
savefig("$fn.pdf")
Plots.ps(p, fn)
Plots.ps(fn)
savefig(p, "$fn.ps")
savefig("$fn.ps")
Plots.svg(p, fn)
Plots.svg(fn)
savefig(p, "$fn.svg")
savefig("$fn.svg")
end
if Sys.islinux()
pgfplotsx()
let p = plot()
Plots.tex(p, fn)
Plots.tex(fn)
savefig(p, "$fn.tex")
savefig("$fn.tex")
end
end
unicodeplots()
let p = plot()
Plots.txt(p, fn)
Plots.txt(fn)
savefig(p, "$fn.txt")
savefig("$fn.txt")
end
plotlyjs()
let p = plot()
Plots.html(p, fn)
Plots.html(fn)
savefig(p, "$fn.html")
savefig("$fn.html")
if Sys.islinux()
Plots.eps(p, fn)
Plots.eps(fn)
savefig(p, "$fn.eps")
savefig("$fn.eps")
end
end
@test_throws ErrorException savefig("$fn.foo")
end
gr() # reset to default backend
for fn in (
"test_args.jl",
"test_defaults.jl",
"test_pipeline.jl",
"test_axes.jl",
"test_layouts.jl",
"test_contours.jl",
"test_axis_letter.jl",
"test_components.jl",
"test_shorthands.jl",
"integration_dates.jl",
"test_recipes.jl",
"test_hdf5plots.jl",
"test_pgfplotsx.jl",
"test_plotly.jl",
"test_animations.jl",
)
@testset "$fn" begin
include(fn)
end
end
reference_dir(args...) =
joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...)
function reference_file(backend, i, version)
refdir = reference_dir("Plots", string(backend))
fn = "ref$i.png"
versions = sort(VersionNumber.(readdir(refdir)), rev = true)
reffn = joinpath(refdir, string(version), fn)
for v in versions
tmpfn = joinpath(refdir, string(v), fn)
@@ -27,7 +344,6 @@ function reference_file(backend, i, version)
break
end
end
return reffn
end
@@ -35,41 +351,109 @@ 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) # don't actually show the plots
is_ci() = get(ENV, "CI", "false") == "true"
img_tol = is_ci() ? 1e-2 : Sys.islinux() ? 1e-3 : 0.1
const PLOTS_IMG_TOL = parse(
Float64,
get(ENV, "PLOTS_IMG_TOL", is_ci() ? Sys.iswindows() ? "2e-4" : "1e-4" : "1e-5"),
)
## Uncomment the following lines to update reference images for different backends
#=
@testset "GR" begin
image_comparison_facts(:gr, tol=img_tol, skip = Plots._backend_skips[:gr])
end
# @testset "GR" begin
# image_comparison_facts(:gr, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:gr])
# end
#
# plotly()
# @testset "Plotly" begin
# image_comparison_facts(:plotly, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:plotlyjs])
# end
#
# pyplot()
# @testset "PyPlot" begin
# image_comparison_facts(:pyplot, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pyplot])
# end
#
# pgfplotsx()
# @testset "PGFPlotsX" begin
# image_comparison_facts(:pgfplotsx, tol=PLOTS_IMG_TOL, skip = Plots._backend_skips[:pgfplotsx])
# end
plotly()
@testset "Plotly" begin
image_comparison_facts(:plotly, tol=img_tol, skip = Plots._backend_skips[:plotlyjs])
end
pyplot()
@testset "PyPlot" begin
image_comparison_facts(:pyplot, tol=img_tol, skip = Plots._backend_skips[:pyplot])
end
pgfplots()
@testset "PGFPlots" begin
image_comparison_facts(:pgfplots, tol=img_tol, skip = Plots._backend_skips[:pgfplots])
end
=#
##
@testset "Examples" begin
if Sys.islinux()
backends = (
:unicodeplots,
:pgfplotsx,
:inspectdr,
:plotlyjs,
:gaston,
# :pyplot, # FIXME: fails with system matplotlib
)
only = setdiff(
1:length(Plots._examples),
(Plots._backend_skips[be] for be in backends)...,
)
for be in backends
@info be
for (i, p) in Plots.test_examples(be, only = only, disp = false)
fn = tempname() * ".png"
png(p, fn)
@test filesize(fn) > 1_000
end
end
end
end
@testset "Backends" begin
@testset "UnicodePlots" begin
@test unicodeplots() == Plots.UnicodePlotsBackend()
@test backend() == Plots.UnicodePlotsBackend()
io = IOContext(IOBuffer(), :color => true)
# lets just make sure it runs without error
p = plot(rand(10))
@test p isa Plots.Plot
@test show(io, p) isa Nothing
p = bar(randn(10))
@test p isa Plots.Plot
@test show(io, p) isa Nothing
p = plot([1, 2], [3, 4])
annotate!(p, [(1.5, 3.2, Plots.text("Test", :red, :center))])
hline!(p, [3.1])
@test p isa Plots.Plot
@test show(io, p) isa Nothing
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
hline!(p, [3.1])
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
@test p isa Plots.Plot
@test show(io, p) isa Nothing
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, :auto)])
hline!(p, [3.1])
@test p isa Plots.Plot
@test show(io, p) isa Nothing
p = plot((plot(i) for i in 1:4)..., layout = (2, 2))
@test p isa Plots.Plot
@test show(io, p) isa Nothing
end
@testset "GR" begin
ENV["PLOTS_TEST"] = "true"
@@ -80,101 +464,20 @@ end
@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
@testset "UnicodePlots" begin
@test unicodeplots() == Plots.UnicodePlotsBackend()
@test backend() == Plots.UnicodePlotsBackend()
@testset "PlotlyJS" begin
@test plotlyjs() == Plots.PlotlyJSBackend()
@test backend() == Plots.PlotlyJSBackend()
# lets just make sure it runs without error
p = plot(rand(10))
@test isa(p, Plots.Plot) == true
@test isa(display(p), Nothing) == true
p = bar(randn(10))
@test isa(p, Plots.Plot) == true
@test isa(display(p), Nothing) == true
p = plot([1, 2], [3, 4])
annotate!(p, [(1.5, 3.2, Plots.text("Test", :red, :center))])
hline!(p, [3.1])
@test isa(p, Plots.Plot) == true
@test isa(display(p), Nothing) == true
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
hline!(p, [3.1])
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
@test isa(p, Plots.Plot) == true
@test isa(display(p), Nothing) == true
p = plot([Dates.Date(2019, 1, 1), Dates.Date(2019, 2, 1)], [3, 4])
annotate!(p, [(Dates.Date(2019, 1, 15), 3.2, Plots.text("Test", :red, :center))])
hline!(p, [3.1])
@test isa(p, Plots.Plot) == true
@test isa(display(p), Nothing) == true
end
end
@testset "Axes" begin
p = plot()
axis = p.subplots[1][:xaxis]
@test typeof(axis) == Plots.Axis
@test Plots.discrete_value!(axis, "HI") == (0.5, 1)
@test Plots.discrete_value!(axis, :yo) == (1.5, 2)
@test Plots.ignorenan_extrema(axis) == (0.5,1.5)
@test axis[:discrete_map] == Dict{Any,Any}(:yo => 2, "HI" => 1)
Plots.discrete_value!(axis, ["x$i" for i=1:5])
Plots.discrete_value!(axis, ["x$i" for i=0:2])
@test Plots.ignorenan_extrema(axis) == (0.5, 7.5)
end
@testset "NoFail" begin
plots = [histogram([1, 0, 0, 0, 0, 0]),
plot([missing]),
plot([missing; 1:4]),
plot([fill(missing,10); 1:4]),
plot([1 1; 1 missing]),
plot(["a" "b"; missing "d"], [1 2; 3 4])]
for plt in plots
display(plt)
end
@test_nowarn plot(x->x^2,0,2)
end
@testset "EmptyAnim" begin
anim = @animate for i in []
end
@test_throws ArgumentError gif(anim)
end
@testset "Segments" begin
function segments(args...)
segs = UnitRange{Int}[]
for seg in iter_segments(args...)
push!(segs,seg)
end
segs
end
nan10 = fill(NaN,10)
@test segments(11:20) == [1:10]
@test segments([NaN]) == []
@test segments(nan10) == []
@test segments([nan10; 1:5]) == [11:15]
@test segments([1:5;nan10]) == [1:5]
@test segments([nan10; 1:5; nan10; 1:5; nan10]) == [11:15, 26:30]
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
end
@testset "Utils" begin
zipped = ([(1,2)], [("a","b")], [(1,"a"),(2,"b")],
[(1,2),(3,4)], [(1,2,3),(3,4,5)], [(1,2,3,4),(3,4,5,6)],
[(1,2.0),(missing,missing)], [(1,missing),(missing,"a")],
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
for z in zipped
@test isequal(collect(zip(Plots.unzip(z)...)), z)
@test isequal(collect(zip(Plots.unzip(GeometryTypes.Point.(z))...)), z)
@test p isa Plots.Plot
@test_broken display(p) isa Nothing
end
end
+61
View File
@@ -0,0 +1,61 @@
@testset "Empty anim" begin
anim = @animate for i in []
end
@test_throws ArgumentError gif(anim)
end
@userplot CirclePlot
@recipe function f(cp::CirclePlot)
x, y, i = cp.args
n = length(x)
inds = circshift(1:n, 1 - i)
linewidth --> range(0, 10, length = n)
seriesalpha --> range(0, 1, length = n)
aspect_ratio --> 1
label --> false
x[inds], y[inds]
end
@testset "Circle plot" begin
n = 10
t = range(0, 2π, length = n)
x = sin.(t)
y = cos.(t)
anim = @animate for i in 1:n
circleplot(x, y, i)
end
@test filesize(gif(anim).filename) > 10_000
@test filesize(mov(anim).filename) > 10_000
@test filesize(mp4(anim).filename) > 10_000
@test filesize(webm(anim).filename) > 10_000
@gif for i in 1:n
circleplot(x, y, i, line_z = 1:n, cbar = false, framestyle = :zerolines)
end every 5
end
@testset "html" begin
p = plot([sin, cos], zeros(0), leg = false, xlims = (0, 2π), ylims = (-1, 1))
anim = Animation()
for x in range(0, stop = 2π, length = 10)
push!(p, x, Float64[sin(x), cos(x)])
frame(anim)
end
agif = gif(anim)
html = tempname() * ".html"
open(html, "w") do io
show(io, MIME("text/html"), agif)
end
@test filesize(html) > 10_000
@test showable(MIME("image/gif"), agif)
agif = mp4(anim)
html = tempname() * ".html"
open(html, "w") do io
show(io, MIME("text/html"), agif)
end
@test filesize(html) > 10_000
end
+18
View File
@@ -0,0 +1,18 @@
using Plots, Test
@testset "Series Attributes" begin
pl = plot([[1, 2, 3], [2, 3, 4]], lw = 5)
@test hline!(deepcopy(pl), [1.75])[1].series_list[3][:label] ==
hline!(deepcopy(pl), [1.75], z_order = :front)[1].series_list[3][:label] ==
"y3"
@test hline!(deepcopy(pl), [1.75], z_order = :back)[1].series_list[1][:label] == "y3"
@test hline!(deepcopy(pl), [1.75], z_order = 2)[1].series_list[2][:label] == "y3"
end
@testset "Axis Attributes" begin
pl = @test_nowarn plot(; tickfont = font(10, "Times"))
for axis in (:xaxis, :yaxis, :zaxis)
@test pl[1][axis][:tickfontsize] == 10
@test pl[1][axis][:tickfontfamily] == "Times"
end
end
+122
View File
@@ -0,0 +1,122 @@
using Plots, Test
@testset "Showaxis" begin
for value in Plots._allShowaxisArgs
@test plot(1:5, showaxis = value)[1][:yaxis][:showaxis] isa Bool
end
@test plot(1:5, showaxis = :y)[1][:yaxis][:showaxis] == true
@test plot(1:5, showaxis = :y)[1][:xaxis][:showaxis] == false
end
@testset "Magic axis" begin
@test plot(1, axis = nothing)[1][:xaxis][:ticks] == []
@test plot(1, axis = nothing)[1][:yaxis][:ticks] == []
end # testset
@testset "Categorical ticks" begin
p1 = plot('A':'M', 1:13)
p2 = plot('A':'Z', 1:26)
p3 = plot('A':'Z', 1:26, ticks = :all)
@test Plots.get_ticks(p1[1], p1[1][:xaxis])[2] == string.('A':'M')
@test Plots.get_ticks(p2[1], p2[1][:xaxis])[2] == string.('C':3:'Z')
@test Plots.get_ticks(p3[1], p3[1][:xaxis])[2] == string.('A':'Z')
end
@testset "Ticks getter functions" begin
ticks1 = ([1, 2, 3], ("a", "b", "c"))
ticks2 = ([4, 5], ("e", "f"))
p1 = plot(1:5, 1:5, 1:5, xticks = ticks1, yticks = ticks1, zticks = ticks1)
p2 = plot(1:5, 1:5, 1:5, xticks = ticks2, yticks = ticks2, zticks = ticks2)
p = plot(p1, p2)
@test xticks(p) == yticks(p) == zticks(p) == [ticks1, ticks2]
@test xticks(p[1]) == yticks(p[1]) == zticks(p[1]) == ticks1
end
@testset "Axis limits" begin
pl = plot(1:5, xlims = :symmetric, widen = false)
@test Plots.xlims(pl) == (-5, 5)
pl = plot(1:3)
@test Plots.xlims(pl) == Plots.widen(1, 3)
pl = plot([1.05, 2.0, 2.95], ylims = :round)
@test Plots.ylims(pl) == (1, 3)
pl = plot(1:3, xlims = (1, 5))
@test Plots.xlims(pl) == (1, 5)
pl = plot(1:3, xlims = (1, 5), widen = true)
@test Plots.xlims(pl) == Plots.widen(1, 5)
end
@testset "3D Axis" begin
ql = quiver([1, 2], [2, 1], [3, 4], quiver = ([1, -1], [0, 0], [1, -0.5]), arrow = true)
@test ql[1][:projection] == "3d"
end
@testset "twinx" begin
pl = plot(1:10, margin = 2Plots.cm)
twpl = twinx(pl)
pl! = plot!(twinx(), -(1:10))
@test twpl[:right_margin] == 2Plots.cm
@test twpl[:left_margin] == 2Plots.cm
@test twpl[:top_margin] == 2Plots.cm
@test twpl[:bottom_margin] == 2Plots.cm
end
@testset "axis-aliases" begin
@test haskey(Plots._keyAliases, :xguideposition)
@test haskey(Plots._keyAliases, :x_guide_position)
@test !haskey(Plots._keyAliases, :xguide_position)
p = plot(1:2, xl = "x label")
@test p[1][:xaxis][:guide] === "x label"
p = plot(1:2, xrange = (0, 3))
@test xlims(p) === (0, 3)
p = plot(1:2, xtick = [1.25, 1.5, 1.75])
@test p[1][:xaxis][:ticks] == [1.25, 1.5, 1.75]
p = plot(1:2, xlabelfontsize = 4)
@test p[1][:xaxis][:guidefontsize] == 4
p = plot(1:2, xgα = 0.07)
@test p[1][:xaxis][:gridalpha] 0.07
p = plot(1:2, xgridls = :dashdot)
@test p[1][:xaxis][:gridstyle] === :dashdot
p = plot(1:2, xgridcolor = :red)
@test p[1][:xaxis][:foreground_color_grid] === RGBA{Float64}(1.0, 0.0, 0.0, 1.0)
p = plot(1:2, xminorgridcolor = :red)
@test p[1][:xaxis][:foreground_color_minor_grid] === RGBA{Float64}(1.0, 0.0, 0.0, 1.0)
p = plot(1:2, xgrid_lw = 0.01)
@test p[1][:xaxis][:gridlinewidth] 0.01
p = plot(1:2, xminorgrid_lw = 0.01)
@test p[1][:xaxis][:minorgridlinewidth] 0.01
p = plot(1:2, xtickor = :out)
@test p[1][:xaxis][:tick_direction] === :out
end
@testset "aliases" begin
compare(p::Plots.Plot, s::Symbol, val, op) =
op(p[1][:xaxis][s], val) && op(p[1][:yaxis][s], val) && op(p[1][:zaxis][s], val)
p = plot(1:2, guide = "all labels")
@test compare(p, :guide, "all labels", ===)
p = plot(1:2, label = "test")
@test compare(p, :guide, "", ===)
p = plot(1:2, lim = (0, 3))
@test xlims(p) === ylims(p) === zlims(p) === (0, 3)
p = plot(1:2, tick = [1.25, 1.5, 1.75])
@test compare(p, :ticks, [1.25, 1.5, 1.75], ==)
p = plot(1:2, labelfontsize = 4)
@test compare(p, :guidefontsize, 4, ==)
p = plot(1:2, gα = 0.07)
@test compare(p, :gridalpha, 0.07, )
p = plot(1:2, gridls = :dashdot)
@test compare(p, :gridstyle, :dashdot, ===)
p = plot(1:2, gridcolor = :red)
@test compare(p, :foreground_color_grid, RGBA{Float64}(1.0, 0.0, 0.0, 1.0), ===)
p = plot(1:2, minorgridcolor = :red)
@test compare(p, :foreground_color_minor_grid, RGBA{Float64}(1.0, 0.0, 0.0, 1.0), ===)
p = plot(1:2, grid_lw = 0.01)
@test compare(p, :gridlinewidth, 0.01, )
p = plot(1:2, minorgrid_lw = 0.01)
@test compare(p, :minorgridlinewidth, 0.01, )
p = plot(1:2, tickor = :out)
@test compare(p, :tick_direction, :out, ===)
end
+28
View File
@@ -0,0 +1,28 @@
using Plots, Test
@testset "axis letter" begin
using Plots, RecipesBase
# a custom type for dispacthing the axis-letter-testing recipe
struct MyType <: Number
val::Float64
end
value(m::MyType) = m.val
data = MyType.(sort(randn(20)))
# A recipe that puts the axis letter in the title
@recipe function f(::Type{T}, m::T) where {T<:AbstractArray{<:MyType}}
title --> string(plotattributes[:letter])
value.(m)
end
@testset "$f (orientation = $o)" for f in [histogram, barhist, stephist, scatterhist],
o in [:vertical, :horizontal]
@test f(data, orientation = o).subplots[1].attr[:title] ==
(o == :vertical ? "x" : "y")
end
@testset "$f" for f in [hline, hspan]
@test f(data).subplots[1].attr[:title] == "y"
end
@testset "$f" for f in [vline, vspan]
@test f(data).subplots[1].attr[:title] == "x"
end
end
+221
View File
@@ -0,0 +1,221 @@
using Plots, Test
@testset "Shapes" begin
@testset "Type" begin
square = Shape([(0, 0.0), (1, 0.0), (1, 1.0), (0, 1.0)])
@test Plots.get_xs(square) == [0, 1, 1, 0]
@test Plots.get_ys(square) == [0, 0, 1, 1]
@test Plots.vertices(square) == [(0, 0), (1, 0), (1, 1), (0, 1)]
@test isa(square, Shape{Int64,Float64})
@test coords(square) isa Tuple{Vector{S},Vector{T}} where {T,S}
end
@testset "Copy" begin
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
square2 = Shape(square)
@test square2.x == square.x
@test square2.y == square.y
end
@testset "Center" begin
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
@test Plots.center(square) == (0.5, 0.5)
end
@testset "Translate" begin
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
squareUp = Shape([(0, 1), (1, 1), (1, 2), (0, 2)])
squareUpRight = Shape([(1, 1), (2, 1), (2, 2), (1, 2)])
@test Plots.translate(square, 0, 1).x == squareUp.x
@test Plots.translate(square, 0, 1).y == squareUp.y
@test Plots.center(translate!(square, 1)) == (1.5, 1.5)
end
@testset "Rotate" begin
# 2 radians rotation matrix
R2 = [cos(2) sin(2); -sin(2) cos(2)]
coords = [0 0; 1 0; 1 1; 0 1]'
coordsRotated2 = R2 * (coords .- 0.5) .+ 0.5
square = Shape([(0, 0), (1, 0), (1, 1), (0, 1)])
# make a new, rotated square
square2 = Plots.rotate(square, -2)
@test square2.x coordsRotated2[1, :]
@test square2.y coordsRotated2[2, :]
# unrotate the new square in place
rotate!(square2, 2)
@test square2.x coords[1, :]
@test square2.y coords[2, :]
end
@testset "Plot" begin
ang = range(0, 2π, length = 60)
ellipse(x, y, w, h) = Shape(w * sin.(ang) .+ x, h * cos.(ang) .+ y)
myshapes = [ellipse(x, rand(), rand(), rand()) for x in 1:4]
@test coords(myshapes) isa Tuple{Vector{Vector{S}},Vector{Vector{T}}} where {T,S}
local p
@test_nowarn p = plot(myshapes)
@test p[1][1][:seriestype] == :shape
end
@testset "Misc" begin
@test Plots.weave([1, 3], [2, 4]) == collect(1:4)
@test Plots.makeshape(3) isa Plots.Shape
@test Plots.makestar(3) isa Plots.Shape
@test Plots.makecross() isa Plots.Shape
@test Plots.makearrowhead(10.0) isa Plots.Shape
@test Plots.rotate(1.0, 2.0, 5.0, (0, 0)) isa Tuple
star = Plots.makestar(3)
star_scaled = Plots.scale(star, 0.5)
Plots.scale!(star, 0.5)
@test Plots.get_xs(star) == Plots.get_xs(star_scaled)
@test Plots.get_ys(star) == Plots.get_ys(star_scaled)
@test Plots.extrema_plus_buffer([1, 2], 0.1) == (0.9, 2.1)
end
end
@testset "Brush" begin
@testset "Colors" begin
baseline = brush(1, RGB(0, 0, 0))
@test brush(:black) == baseline
@test brush("black") == baseline
end
@testset "Weight" begin
@test brush(10).size == 10
@test brush(0.1).size == 1
end
@testset "Alpha" begin
@test brush(0.4).alpha == 0.4
@test brush(20).alpha == nothing
end
@testset "Bad Argument" begin
# using test_logs because test_warn seems to not work anymore
@test_logs (:warn, "Unused brush arg: nothing (Nothing)") begin
brush(nothing)
end
end
end
@testset "Text" begin
t = Plots.PlotText("foo")
f = Plots.font()
@test Plots.PlotText(nothing).str == "nothing"
@test length(t) == 3
@test text(t).str == "foo"
@test text(t, f).str == "foo"
@test text("bar", f).str == "bar"
@test text(true).str == "true"
end
@testset "Annotations" begin
ann = Plots.series_annotations(missing)
@test Plots.series_annotations(["1" "2"; "3" "4"]) isa AbstractMatrix
@test Plots.series_annotations(10).strs[1].str == "10"
@test Plots.series_annotations(nothing) === nothing
@test Plots.series_annotations(ann) == ann
@test Plots.annotations(["1" "2"; "3" "4"]) isa AbstractMatrix
@test Plots.annotations(ann) == ann
@test Plots.annotations([ann]) == [ann]
@test Plots.annotations(nothing) == []
t = Plots.text("foo")
sp = plot(1)[1]
@test Plots.locate_annotation(sp, 1, 2, t) == (1, 2, t)
@test Plots.locate_annotation(sp, 1, 2, 3, t) == (1, 2, 3, t)
@test Plots.locate_annotation(sp, (0.1, 0.2), t) isa Tuple
@test Plots.locate_annotation(sp, (0.1, 0.2, 0.3), t) isa Tuple
end
@testset "Fonts" begin
@testset "Scaling" begin
sizesToCheck = [
:titlefontsize,
:legendfontsize,
:legendtitlefontsize,
:xtickfontsize,
:ytickfontsize,
:ztickfontsize,
:xguidefontsize,
:yguidefontsize,
:zguidefontsize,
]
# get inital font sizes
initialSizes = [Plots.default(s) for s in sizesToCheck]
#scale up font sizes
scalefontsizes(2)
# get inital font sizes
doubledSizes = [Plots.default(s) for s in sizesToCheck]
@test doubledSizes == initialSizes * 2
# reset font sizes
resetfontsizes()
finalSizes = [Plots.default(s) for s in sizesToCheck]
@test finalSizes == initialSizes
end
end
@testset "Series Annotations" begin
square = Shape([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)])
@test_logs (:warn, "Unused SeriesAnnotations arg: triangle (Symbol)") begin
p = plot(
[1, 2, 3],
series_annotations = (
["a"],
2, # pass a scale factor
(1, 4), # pass two scale factors (overwrites first one)
square, # pass a shape
font(:courier), # pass an annotation font
:triangle, # pass an incorrect argument
),
)
sa = p.series_list[1].plotattributes[:series_annotations]
@test only(sa.strs).str == "a"
@test sa.font.family == "courier"
@test sa.baseshape == square
@test sa.scalefactor == (1, 4)
end
spl = scatter(
4.53 .* [1 / 1 1 / 2 1 / 3 1 / 4 1 / 5],
[0 0 0 0 0],
layout = (5, 1),
ylims = (-1.1, 1.1),
xlims = (0, 5),
series_annotations = permutedims([["1/1"], ["1/2"], ["1/3"], ["1/4"], ["1/5"]]),
)
for i in 1:5
@test only(spl.series_list[i].plotattributes[:series_annotations].strs).str ==
"1/$i"
end
p = plot([1, 2], annotations = (1.5, 2, text("foo", :left)))
x, y, txt = only(p.subplots[end][:annotations])
@test (x, y) == (1.5, 2)
@test txt.str == "foo"
p = plot([1, 2], annotations = ((0.1, 0.5), :auto))
pos, txt = only(p.subplots[end][:annotations])
@test pos == (0.1, 0.5)
@test txt.str == "(a)"
end
@testset "Bezier" begin
curve = Plots.BezierCurve([Plots.P2(0.0, 0.0), Plots.P2(0.5, 1.0), Plots.P2(1.0, 0.0)])
@test curve(0.75) == Plots.P2(0.75, 0.375)
@test length(coords(curve, 10)) == 10
end
+68
View File
@@ -0,0 +1,68 @@
using Plots, Test
import RecipesPipeline
@testset "Contours" begin
@testset "check_contour_levels" begin
@test Plots.check_contour_levels(2) === nothing
@test Plots.check_contour_levels(-1.0:0.2:10.0) === nothing
@test Plots.check_contour_levels([-100, -2, -1, 0, 1, 2, 100]) === nothing
@test_throws ArgumentError Plots.check_contour_levels(1.0)
@test_throws ArgumentError Plots.check_contour_levels((1, 2, 3))
@test_throws ArgumentError Plots.check_contour_levels(-3)
end
@testset "RecipesPipeline.preprocess_attributes!" begin
function equal_after_pipeline(kw)
kw = deepcopy(kw)
RecipesPipeline.preprocess_attributes!(kw)
kw == kw
end
@test equal_after_pipeline(KW(:levels => 1))
@test equal_after_pipeline(KW(:levels => 1:10))
@test equal_after_pipeline(KW(:levels => [1.0, 3.0, 5.0]))
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(
KW(:levels => 1.0),
)
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(
KW(:levels => (1, 2, 3)),
)
@test_throws ArgumentError RecipesPipeline.preprocess_attributes!(KW(:levels => -3))
end
@testset "contour[f]" begin
x = (-2π):0.1:(2π)
y = (-π):0.1:π
z = cos.(y) .* sin.(x')
@testset "Incorrect input" begin
@test_throws ArgumentError contour(x, y, z, levels = 1.0)
@test_throws ArgumentError contour(x, y, z, levels = (1, 2, 3))
@test_throws ArgumentError contour(x, y, z, levels = -3)
end
@testset "Default number" begin
@test contour(x, y, z)[1][1].plotattributes[:levels] ==
Plots._series_defaults[:levels]
end
@testset "Number" begin
@testset "$n contours" for n in (2, 5, 100)
p = contour(x, y, z, levels = n)
attr = p[1][1].plotattributes
@test attr[:seriestype] == :contour
@test attr[:levels] == n
end
end
@testset "Range" begin
levels = -1:0.5:1
@test contour(x, y, z, levels = levels)[1][1].plotattributes[:levels] == levels
end
@testset "Set of levels" begin
levels = [-1, 0.25, 0, 0.25, 1]
@test contour(x, y, z, levels = levels)[1][1].plotattributes[:levels] == levels
end
end
end
+101
View File
@@ -0,0 +1,101 @@
using Plots, Test, Plots.Colors
const PLOTS_DEFAULTS = Dict(:theme => :wong2, :fontfamily => :palantino)
Plots.__init__()
@testset "Loading theme" begin
pl = plot(1:5)
@test pl[1][1][:seriescolor] == RGBA(colorant"black")
@test Plots.guidefont(pl[1][:xaxis]).family == "palantino"
end
empty!(PLOTS_DEFAULTS)
Plots.__init__()
@testset "default" begin
default(fillrange = 0)
@test Plots._series_defaults[:fillrange] == 0
pl = plot(1:5)
@test pl[1][1][:fillrange] == 0
default()
end
@testset "Legend defaults" begin
p = plot()
@test p[1][:legend_font_family] == "sans-serif"
@test p[1][:legend_font_pointsize] == 8
@test p[1][:legend_font_halign] == :hcenter
@test p[1][:legend_font_valign] == :vcenter
@test p[1][:legend_font_rotation] == 0.0
@test p[1][:legend_font_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
@test p[1][:legend_position] == :best
@test p[1][:legend_title] == nothing
@test p[1][:legend_title_font_family] == "sans-serif"
@test p[1][:legend_title_font_pointsize] == 11
@test p[1][:legend_title_font_halign] == :hcenter
@test p[1][:legend_title_font_valign] == :vcenter
@test p[1][:legend_title_font_rotation] == 0.0
@test p[1][:legend_title_font_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
@test p[1][:legend_background_color] == RGBA{Float64}(1.0, 1.0, 1.0, 1.0)
@test p[1][:legend_foreground_color] == RGB{Colors.N0f8}(0.0, 0.0, 0.0)
end # testset
@testset "Legend API" begin
p = plot(;
legendfontfamily = "serif",
legendfontsize = 12,
legendfonthalign = :left,
legendfontvalign = :top,
legendfontrotation = 1,
legendfontcolor = :red,
legend = :outertopleft,
legendtitle = "The legend",
legendtitlefontfamily = "helvetica",
legendtitlefontsize = 3,
legendtitlefonthalign = :right,
legendtitlefontvalign = :bottom,
legendtitlefontrotation = -5.2,
legendtitlefontcolor = :blue,
background_color_legend = :cyan,
foreground_color_legend = :green,
)
@test p[1][:legend_font_family] == "serif"
@test p[1][:legend_font_pointsize] == 12
@test p[1][:legend_font_halign] == :left
@test p[1][:legend_font_valign] == :top
@test p[1][:legend_font_rotation] == 1.0
@test p[1][:legend_font_color] == :red
@test p[1][:legend_position] == :outertopleft
@test p[1][:legend_title] == "The legend"
@test p[1][:legend_title_font_family] == "helvetica"
@test p[1][:legend_title_font_pointsize] == 3
@test p[1][:legend_title_font_halign] == :right
@test p[1][:legend_title_font_valign] == :bottom
@test p[1][:legend_title_font_rotation] == -5.2
@test p[1][:legend_title_font_color] == :blue
@test p[1][:legend_background_color] == RGBA{Float64}(0.0, 1.0, 1.0, 1.0)
@test p[1][:legend_foreground_color] == RGBA{Float64}(0.0, 0.5019607843137255, 0.0, 1.0)
#remember settings
plot(legend_font_pointsize = 20)
sp = plot!(label = "R")[1]
@test Plots.legendfont(sp).pointsize == 20
#setting whole font
sp = plot(
1:5,
legendfont = font(12),
legend_font_halign = :left,
foreground_color_subplot = :red,
)[1]
@test Plots.legendfont(sp).pointsize == 12
@test Plots.legendfont(sp).halign == :left
# match mechanism
@test sp[:legend_font_color] == sp[:foreground_color_subplot]
@test Plots.legendfont(sp).color == sp[:foreground_color_subplot]
# magic invocation
@test_nowarn sp = plot(; legendfont = 12)[1]
@test sp[:legend_font_pointsize] == 12
@test Plots.legendfont(sp).pointsize == 12
end # testset
+12 -13
View File
@@ -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
+98
View File
@@ -0,0 +1,98 @@
using Plots, Test
@testset "Subplot sclicing" begin
pl = @test_nowarn plot(
rand(4, 8),
layout = 4,
yscale = [:identity :identity :log10 :log10],
)
@test pl[1][:yaxis][:scale] == :identity
@test pl[2][:yaxis][:scale] == :identity
@test pl[3][:yaxis][:scale] == :log10
@test pl[4][:yaxis][:scale] == :log10
end
@testset "Plot title" begin
pl = plot(rand(4, 8), layout = 4, plot_title = "My title")
@test pl[:plot_title] == "My title"
@test pl[:plot_titleindex] == 5
plot!(pl)
@test pl[:plot_title] == "My title"
@test pl[:plot_titleindex] == 5
plot!(pl, plot_title = "My new title")
@test pl[:plot_title] == "My new title"
@test pl[:plot_titleindex] == 5
end
@testset "Plots.jl/issues/4083" begin
p = plot(plot(1:2), plot(1:2); border = :grid, plot_title = "abc")
@test p[1][:framestyle] === :grid
@test p[2][:framestyle] === :grid
@test p[3][:framestyle] === :none
end
@testset "Coverage" begin
p = plot((plot(i) for i in 1:4)..., layout = (2, 2))
sp = p[end]
@test sp isa Plots.Subplot
@test size(sp) == (1, 1)
@test length(sp) == 1
@test sp[1, 1] == sp
@test Plots.get_subplot(p, UInt32(4)) == sp
@test Plots.series_list(sp) |> first |> Plots.get_subplot isa Plots.Subplot
@test Plots.get_subplot(p, keys(p.spmap) |> first) isa Plots.Subplot
gl = p[2, 2]
@test gl isa Plots.GridLayout
@test length(gl) == 1
@test size(gl) == (1, 1)
@test Plots.layout_args(gl) == (gl, 1)
@test size(p, 1) == 2
@test size(p, 2) == 2
@test size(p) === (2, 2)
@test ndims(p) == 2
@test p[1][end] isa Plots.Series
show(devnull, p[1])
@test Plots.getplot(p) == p
@test Plots.getattr(p) == p.attr
@test Plots.backend_object(p) == p.o
@test occursin("Plot", string(p))
print(devnull, p)
@test Plots.to_pixels(1Plots.mm) isa AbstractFloat
@test Plots.ispositive(1Plots.mm)
@test size(Plots.defaultbox) == (0Plots.mm, 0Plots.mm)
show(devnull, Plots.defaultbox)
show(devnull, p.layout)
@test Plots.make_measure_hor(1Plots.mm) == 1Plots.mm
@test Plots.make_measure_vert(1Plots.mm) == 1Plots.mm
@test Plots.parent(p.layout) isa Plots.RootLayout
show(devnull, Plots.parent_bbox(p.layout))
rl = Plots.RootLayout()
show(devnull, rl)
@test parent(rl) === nothing
@test Plots.parent_bbox(rl) == Plots.defaultbox
@test Plots.bbox(rl) == Plots.defaultbox
el = Plots.EmptyLayout()
@test Plots.update_position!(el) === nothing
@test size(el) == (0, 0)
@test length(el) == 0
@test el[1, 1] === nothing
@test Plots.left(el) == 0Plots.mm
@test Plots.top(el) == 0Plots.mm
@test Plots.right(el) == 0Plots.mm
@test Plots.bottom(el) == 0Plots.mm
@test_throws ErrorException Plots.layout_args(nothing)
end
+395 -279
View File
@@ -2,294 +2,410 @@ 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" ""], arrow = true)
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 length(series) == 5
@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")
@test !haskey(series[5].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 = (:heat, 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"] == 1
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 :heat :lightrainbow],
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 = :bluesreds,
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)
plot(
y,
annotations = (3, y[3], Plots.text("this is \\#3", :left)),
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")),
])
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),
],
)
# mktempdir() do path
# @test_nowarn savefig(annotation_plot, path*"annotation.pdf")
# 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) == 4
@test !haskey(plots[1].options.dict, "fill")
@test !haskey(plots[2].options.dict, "fill")
@test !haskey(plots[3].options.dict, "fill")
@test haskey(plots[4].options.dict, "fill")
@test ribbon_plot.o !== nothing
@test ribbon_plot.o.the_plot !== nothing
# mktempdir() do path
# @test_nowarn savefig(ribbon_plot, path*"ribbon.svg")
# end
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};"
end # testset
@testset "Titlefonts" begin
pl = plot(1:5, title = "Test me", titlefont = (2, :left))
@test pl[1][:title] == "Test me"
@test pl[1][:titlefontsize] == 2
@test pl[1][:titlefonthalign] == :left
Plots._update_plot_object(pl)
ax_opt = Plots.pgfx_axes(pl.o)[1].options
@test ax_opt["title"] == "Test me"
@test(haskey(ax_opt.dict, "title style")) isa Test.Pass
pl = plot(1:5, plot_title = "Test me", plot_titlefont = (2, :left))
@test pl[:plot_title] == "Test me"
@test pl[:plot_titlefontsize] == 2
@test pl[:plot_titlefonthalign] == :left
pl = heatmap(rand(3, 3), colorbar_title = "Test me", colorbar_titlefont = (12, :right))
@test pl[1][:colorbar_title] == "Test me"
@test pl[1][:colorbar_titlefontsize] == 12
@test pl[1][:colorbar_titlefonthalign] == :right
end # testset
+38
View File
@@ -0,0 +1,38 @@
using Plots, Test
using RecipesPipeline
@testset "plot" begin
pl = plot(1:5)
pl2 = plot(pl, tex_output_standalone = true)
@test pl[:tex_output_standalone] == false
@test pl2[:tex_output_standalone] == true
plot!(pl, tex_output_standalone = true)
@test pl[:tex_output_standalone] == true
end
@testset "get_axis_limits" begin
x = [0.1, 5]
p1 = plot(x, [5, 0.1], yscale = :log10)
p2 = plot!(identity)
@test all(RecipesPipeline.get_axis_limits(p1, :x) .== x)
@test all(RecipesPipeline.get_axis_limits(p2, :x) .== x)
end
@testset "Slicing" begin
@test plot(1:5, fillrange = 0)[1][1][:fillrange] == 0
data4 = rand(4, 4)
mat = reshape(1:8, 2, 4)
for i in axes(data4, 1)
for attribute in (:fillrange, :ribbon)
@test plot(data4; NamedTuple{tuple(attribute)}(0)...)[1][i][attribute] == 0
@test plot(data4; NamedTuple{tuple(attribute)}(Ref([1, 2]))...)[1][i][attribute] ==
[1.0, 2.0]
@test plot(data4; NamedTuple{tuple(attribute)}(Ref([1 2]))...)[1][i][attribute] ==
(iseven(i) ? 2 : 1)
@test plot(data4; NamedTuple{tuple(attribute)}(Ref(mat))...)[1][i][attribute] ==
[2(i - 1) + 1, 2i]
end
@test plot(data4, ribbon = (mat, mat))[1][i][:ribbon] ==
([2(i - 1) + 1, 2i], [2(i - 1) + 1, 2i])
end
end
+64
View File
@@ -0,0 +1,64 @@
using Plots, Test
@testset "Plotly" begin
@testset "Basic" begin
@test plotly() == Plots.PlotlyBackend()
@test backend() == Plots.PlotlyBackend()
p = plot(rand(10))
@test isa(p, Plots.Plot) == true
@test_nowarn Plots.plotly_series(plot())
end
@testset "Contours" begin
x = (-2π):0.1:(2π)
y = (-π):0.1:π
z = cos.(y) .* sin.(x')
@testset "Contour numbers" begin
@testset "Default" begin
@test Plots.plotly_series(contour(x, y, z))[1][:ncontours] ==
Plots._series_defaults[:levels] + 2
end
@testset "Specified number" begin
@test Plots.plotly_series(contour(x, y, z, levels = 10))[1][:ncontours] ==
12
end
end
@testset "Contour values" begin
@testset "Range" begin
levels = -1:0.5:1
p = contour(x, y, z, levels = levels)
@test p[1][1].plotattributes[:levels] == levels
@test Plots.plotly_series(p)[1][:contours][:start] == first(levels)
@test Plots.plotly_series(p)[1][:contours][:end] == last(levels)
@test Plots.plotly_series(p)[1][:contours][:size] == step(levels)
end
@testset "Set of contours" begin
levels = [-1, -0.25, 0, 0.25, 1]
levels_range =
range(first(levels), stop = last(levels), length = length(levels))
p = contour(x, y, z, levels = levels)
@test p[1][1].plotattributes[:levels] == levels
series_dict = @test_logs (
:warn,
"setting arbitrary contour levels with Plotly backend " *
"is not supported; use a range to set equally-spaced contours or an " *
"integer to set the approximate number of contours with the keyword " *
"`levels`. Setting levels to -1.0:0.5:1.0",
) Plots.plotly_series(p)
@test series_dict[1][:contours][:start] == first(levels_range)
@test series_dict[1][:contours][:end] == last(levels_range)
@test series_dict[1][:contours][:size] == step(levels_range)
end
end
end
@testset "Extra kwargs" begin
pl = plot(1:5, test = "me")
@test Plots.plotly_series(pl)[1][:test] == "me"
pl = plot(1:5, test = "me", extra_kwargs = :plot)
@test Plots.plotly_layout(pl)[:test] == "me"
end
end
+61
View File
@@ -0,0 +1,61 @@
using Plots, Test
using OffsetArrays
@testset "User recipes" begin
struct LegendPlot end
@recipe function f(plot::LegendPlot)
legend --> :topleft
(1:3, 1:3)
end
pl = plot(LegendPlot(); legend = :right)
@test pl[1][:legend_position] == :right
pl = plot(LegendPlot())
@test pl[1][:legend_position] == :topleft
end
@testset "lens!" begin
pl = plot(1:5)
lens!(pl, [1, 2], [1, 2], inset = (1, bbox(0.0, 0.0, 0.2, 0.2)), colorbar = false)
@test length(pl.series_list) == 4
@test pl[2][:colorbar] == :none
end # testset
@testset "vline, vspan" begin
vl = vline([1], widen = false)
@test Plots.xlims(vl) == (1, 2)
@test Plots.ylims(vl) == (1, 2)
vl = vline([1], xlims = (0, 2), widen = false)
@test Plots.xlims(vl) == (0, 2)
vl = vline([1], ylims = (-3, 5), widen = false)
@test Plots.ylims(vl) == (-3, 5)
vsp = vspan([1, 3], widen = false)
@test Plots.xlims(vsp) == (1, 3)
@test Plots.ylims(vsp) == (0, 1) # TODO: might be problematic on log-scales
vsp = vspan([1, 3], xlims = (-2, 5), widen = false)
@test Plots.xlims(vsp) == (-2, 5)
vsp = vspan([1, 3], ylims = (-2, 5), widen = false)
@test Plots.ylims(vsp) == (-2, 5)
end # testset
@testset "offset axes" begin
tri = OffsetVector(vcat(1:5, 4:-1:1), 11:19)
sticks = plot(tri, seriestype = :sticks)
@test length(sticks) == 1
end
@testset "framestyle axes" begin
pl = plot(-1:1, -1:1, -1:1)
sp = pl.subplots[1]
defaultret = Plots.axis_drawing_info_3d(sp, :x)
for letter in [:x, :y, :z]
for fr in [:box :semi :origin :zerolines :grid :none]
prevha = UInt64(0)
push!(sp.attr, :framestyle => fr)
ret = Plots.axis_drawing_info_3d(sp, letter)
ha = hash(string(ret))
@test ha != prevha
prevha = ha
end
end
end
+138
View File
@@ -0,0 +1,138 @@
using Plots, Test
@testset "Shorthands" begin
@testset "Set Lims" begin
p = plot(rand(10))
xlims!((1, 20))
@test xlims(p) == (1, 20)
xlims!(p, (1, 21))
@test xlims(p) == (1, 21)
ylims!((-1, 1))
@test ylims(p) == (-1, 1)
ylims!(p, (-2, 2))
@test ylims(p) == (-2, 2)
zlims!((-1, 1))
@test zlims(p) == (-1, 1)
zlims!(p, (-2, 2))
@test zlims(p) == (-2, 2)
xlims!(-1, 11)
@test xlims(p) == (-1, 11)
xlims!(p, -2, 12)
@test xlims(p) == (-2, 12)
ylims!((-10, 10))
@test ylims(p) == (-10, 10)
ylims!(p, (-11, 9))
@test ylims(p) == (-11, 9)
zlims!((-10, 10))
@test zlims(p) == (-10, 10)
zlims!(p, (-9, 8))
@test zlims(p) == (-9, 8)
end
@testset "Set Title / Labels" begin
p = plot()
title!(p, "Foo")
sp = p[1]
@test sp[:title] == "Foo"
xlabel!(p, "xlabel")
@test sp[:xaxis][:guide] == "xlabel"
ylabel!(p, "ylabel")
@test sp[:yaxis][:guide] == "ylabel"
end
@testset "Misc" begin
p = plot()
sp = p[1]
xflip!(p)
@test sp[:xaxis][:flip]
yflip!(p)
@test sp[:yaxis][:flip]
xgrid!(p, true)
@test sp[:xaxis][:grid]
xgrid!(p, false)
@test !sp[:xaxis][:grid]
ygrid!(p, true)
@test sp[:yaxis][:grid]
ygrid!(p, false)
@test !sp[:yaxis][:grid]
ann = [(7, 3, "(7,3)"), (3, 7, text("hey", 14, :left, :top, :green))]
annotate!(p, ann)
annotate!(p, ann...)
xaxis!(p, true)
@test sp[:xaxis][:showaxis]
xaxis!(p, false)
@test !sp[:xaxis][:showaxis]
yaxis!(p, true)
@test sp[:yaxis][:showaxis]
yaxis!(p, false)
@test !sp[:yaxis][:showaxis]
p = plot3d([1, 2], [1, 2], [1, 2])
plot3d!(p, [3, 4], [3, 4], [3, 4])
@test Plots.series_list(p[1])[1][:seriestype] == :path3d
end
@testset "Set Ticks" begin
p = plot([0, 2, 3, 4, 5, 6, 7, 8, 9, 10])
sp = p[1]
xticks = 2:6
xticks!(xticks)
@test sp.attr[:xaxis][:ticks] == xticks
xticks = 1:5
xticks!(p, xticks)
@test sp.attr[:xaxis][:ticks] == xticks
yticks = 0.2:0.1:0.7
yticks!(yticks)
@test sp.attr[:yaxis][:ticks] == yticks
yticks = 0.1:0.5
yticks!(p, yticks)
@test sp.attr[:yaxis][:ticks] == yticks
xticks = [5, 6, 7.5]
xlabels = ["a", "b", "c"]
xticks!(xticks, xlabels)
@test sp.attr[:xaxis][:ticks] == (xticks, xlabels)
xticks = [5, 2]
xlabels = ["b", "a"]
xticks!(p, xticks, xlabels)
@test sp.attr[:xaxis][:ticks] == (xticks, xlabels)
yticks = [0.5, 0.6, 0.75]
ylabels = ["z", "y", "x"]
yticks!(yticks, ylabels)
@test sp.attr[:yaxis][:ticks] == (yticks, ylabels)
yticks = [0.5, 0.1]
ylabels = ["z", "y"]
yticks!(p, yticks, ylabels)
@test sp.attr[:yaxis][:ticks] == (yticks, ylabels)
end
end