Compare commits

..

119 Commits

Author SHA1 Message Date
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
Josef Heinen a05d31a472 Merge remote-tracking branch 'upstream/master' 2020-04-07 09:21:52 +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
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
27 changed files with 734 additions and 657 deletions
+32
View File
@@ -0,0 +1,32 @@
---
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 | | |
plotly | | |
plotlyjs | | |
pgfplotsx | | |
inspectdr | | |
### Versions
Plots.jl version:
Backend version:
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.
+4 -4
View File
@@ -1,7 +1,7 @@
name = "Plots"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
author = ["Tom Breloff (@tbreloff)"]
version = "1.0.8"
version = "1.1.2"
[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
@@ -41,10 +41,10 @@ JSON = "0.21"
Measures = "0.3"
NaNMath = "0.3"
PGFPlotsX = "1.2.0"
PlotThemes = "1"
PlotUtils = "0.6.5"
PlotThemes = "2"
PlotUtils = "1"
RecipesBase = "1"
RecipesPipeline = "0.1.1"
RecipesPipeline = "0.1.3"
Reexport = "0.2"
Requires = "0.5, 1"
Showoff = "0.3.1"
+2
View File
@@ -44,7 +44,9 @@ blacklist = [
# the following are not visible to Plots, only its dependencies
"CategoricalArrays",
"FixedPointNumbers",
"OffsetArrays",
"SparseArrays",
"StaticArrays",
r"#{1,2}[^\"#]+#{1,2}\d+",
]
+3 -2
View File
@@ -72,10 +72,11 @@ const _arg_desc = KW(
: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",
: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`",
: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",
@@ -89,7 +90,7 @@ const _arg_desc = KW(
:foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
:foreground_color_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)",
:legend => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position). Bottom left corner of legend is placed at (x,y). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:inside`, `:legend`, `:topright`, `:topleft`, `:bottomleft`, `:bottomright` , `:inline` (note: only some may be supported in each backend)",
: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",
+28 -12
View File
@@ -305,12 +305,13 @@ const _plot_defaults = KW(
:thickness_scaling => 1,
:display_type => :auto,
:extra_kwargs => KW(),
:warn_on_unsupported => true,
)
const _subplot_defaults = KW(
:title => "",
:title_location => :center, # also :left or :right
:titlelocation => :center, # also :left or :right
:fontfamily_subplot => :match,
:titlefontfamily => :match,
:titlefontsize => 14,
@@ -480,10 +481,7 @@ is_default_attribute(k) = k in _internal_args || k in _all_args || is_axis_attr_
makeplural(s::Symbol) = Symbol(string(s,"s"))
autopick(arr::AVec, idx::Integer) = arr[mod1(idx,length(arr))]
autopick(notarr, idx::Integer) = notarr
autopick_ignore_none_auto(arr::AVec, idx::Integer) = autopick(setdiff(arr, [:none, :auto]), idx)
autopick_ignore_none_auto(arr::AVec, idx::Integer) = _cycle(setdiff(arr, [:none, :auto]), idx)
autopick_ignore_none_auto(notarr, idx::Integer) = notarr
function aliasesAndAutopick(plotattributes::AKW, sym::Symbol, aliases::Dict{Symbol,Symbol}, options::AVec, plotIndex::Int)
@@ -600,7 +598,7 @@ add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio)
add_aliases(:match_dimensions, :transpose, :transpose_z)
add_aliases(:subplot, :sp, :subplt, :splt)
add_aliases(:projection, :proj)
add_aliases(:title_location, :title_loc, :titleloc, :title_position, :title_pos, :titlepos, :titleposition, :title_align, :title_alignment)
add_aliases(:titlelocation, :title_location, :title_loc, :titleloc, :title_position, :title_pos, :titlepos, :titleposition, :title_align, :title_alignment)
add_aliases(:series_annotations, :series_ann, :seriesann, :series_anns, :seriesanns, :series_annotation, :text, :txt, :texts, :txts)
add_aliases(:html_output_format, :format, :fmt, :html_format)
add_aliases(:orientation, :direction, :dir)
@@ -614,6 +612,7 @@ add_aliases(:framestyle, :frame_style, :frame, :axesstyle, :axes_style, :boxstyl
add_aliases(:tick_direction, :tickdirection, :tick_dir, :tickdir, :tick_orientation, :tickorientation, :tick_or, :tickor)
add_aliases(:camera, :cam, :viewangle, :view_angle)
add_aliases(:contour_labels, :contourlabels, :clabels, :clabs)
add_aliases(:warn_on_unsupported, :warn)
# add all pluralized forms to the _keyAliases dict
for arg in keys(_series_defaults)
@@ -680,7 +679,10 @@ function default(k::Symbol, v)
k in _suppress_warnings || error("Unknown key: ", k)
end
function default(; kw...)
function default(; reset = true, kw...)
if reset && isempty(kw)
reset_defaults()
end
kw = KW(kw)
RecipesPipeline.preprocess_attributes!(kw)
for (k,v) in kw
@@ -1119,6 +1121,9 @@ const _already_warned = Dict{Symbol,Set{Symbol}}()
const _to_warn = Set{Symbol}()
function warn_on_unsupported_args(pkg::AbstractBackend, plotattributes)
if !get(plotattributes, :warn_on_unsupported, _plot_defaults[:warn_on_unsupported])
return
end
empty!(_to_warn)
bend = backend_name(pkg)
already_warned = get!(_already_warned, bend, Set{Symbol}())
@@ -1143,6 +1148,9 @@ end
# _markershape_supported(pkg::AbstractBackend, shapes::AVec) = all([_markershape_supported(pkg, shape) for shape in shapes])
function warn_on_unsupported(pkg::AbstractBackend, plotattributes)
if !get(plotattributes, :warn_on_unsupported, _plot_defaults[:warn_on_unsupported])
return
end
if !is_seriestype_supported(pkg, plotattributes[:seriestype])
@warn("seriestype $(plotattributes[:seriestype]) is unsupported with $pkg. Choose from: $(supported_seriestypes(pkg))")
end
@@ -1155,6 +1163,9 @@ function warn_on_unsupported(pkg::AbstractBackend, plotattributes)
end
function warn_on_unsupported_scales(pkg::AbstractBackend, plotattributes::AKW)
if !get(plotattributes, :warn_on_unsupported, _plot_defaults[:warn_on_unsupported])
return
end
for k in (:xscale, :yscale, :zscale, :scale)
if haskey(plotattributes, k)
v = plotattributes[k]
@@ -1396,8 +1407,7 @@ end
function _update_subplot_colors(sp::Subplot)
# background colors
color_or_nothing!(sp.attr, :background_color_subplot)
bg = plot_color(sp[:background_color_subplot])
sp.attr[:color_palette] = get_color_palette(sp.attr[:color_palette], bg, 30)
sp.attr[:color_palette] = get_color_palette(sp.attr[:color_palette], 30)
color_or_nothing!(sp.attr, :background_color_legend)
color_or_nothing!(sp.attr, :background_color_inside)
@@ -1500,9 +1510,9 @@ end
# and assigns a color automatically
function get_series_color(c, sp::Subplot, n::Int, seriestype)
if c == :auto
c = like_surface(seriestype) ? cgrad() : autopick(sp[:color_palette], n)
c = like_surface(seriestype) ? cgrad() : _cycle(sp[:color_palette], n)
elseif isa(c, Int)
c = autopick(sp[:color_palette], c)
c = _cycle(sp[:color_palette], c)
end
plot_color(c)
end
@@ -1512,7 +1522,13 @@ function get_series_color(c::AbstractArray, sp::Subplot, n::Int, seriestype)
end
function ensure_gradient!(plotattributes::AKW, csym::Symbol, asym::Symbol)
if !isa(plotattributes[csym], ColorGradient)
if plotattributes[csym] isa ColorPalette
α = nothing
if !(plotattributes[asym] isa AbstractVector)
α = plotattributes[asym]
end
plotattributes[csym] = cgrad(plotattributes[csym], categorical = true, alpha = α)
elseif !(plotattributes[csym] isa ColorGradient)
plotattributes[csym] = typeof(plotattributes[asym]) <: AbstractVector ? cgrad() : cgrad(alpha = plotattributes[asym])
end
end
+6 -5
View File
@@ -283,7 +283,7 @@ function get_minor_ticks(sp, axis, ticks)
minorticks = typeof(ticks[1])[]
for (i,hi) in enumerate(ticks[2:end])
lo = ticks[i]
if isfinite(lo) && hi > lo
if isfinite(lo) && isfinite(hi) && hi > lo
append!(minorticks,collect(lo + (hi-lo)/n :(hi-lo)/n: hi - (hi-lo)/2n))
end
end
@@ -462,11 +462,12 @@ function axis_limits(sp, letter, should_widen = default_should_widen(sp[Symbol(l
lims = axis[:lims]
has_user_lims = (isa(lims, Tuple) || isa(lims, AVec)) && length(lims) == 2
if has_user_lims
if isfinite(lims[1])
amin = lims[1]
lmin, lmax = lims
if lmin != :auto && isfinite(lmin)
amin = lmin
end
if isfinite(lims[2])
amax = lims[2]
if lmax != :auto && isfinite(lmax)
amax = lmax
end
end
if amax <= amin && isfinite(amin)
+28 -5
View File
@@ -30,7 +30,7 @@ macro init_backend(s)
esc(quote
struct $T <: AbstractBackend end
export $sym
$sym(; kw...) = (default(; kw...); backend($T()))
$sym(; kw...) = (default(; reset = false, kw...); backend($T()))
backend_name(::$T) = Symbol($str)
backend_package_name(pkg::$T) = backend_package_name(Symbol($str))
push!(_backends, Symbol($str))
@@ -378,7 +378,7 @@ const _plotly_attr = merge_with_base_supported([
:markerstrokewidth, :markerstrokecolor, :markerstrokealpha, :markerstrokestyle,
:fillrange, :fillcolor, :fillalpha,
:bins,
:title, :title_location,
:title, :titlelocation,
:titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign,
:titlefontcolor,
:legendfontfamily, :legendfontsize, :legendfontcolor,
@@ -505,7 +505,7 @@ const _pyplot_attr = merge_with_base_supported([
:markerstrokewidth, :markerstrokecolor, :markerstrokealpha,
:fillrange, :fillcolor, :fillalpha,
:bins, :bar_width, :bar_edges, :bar_position,
:title, :title_location, :titlefont,
:title, :titlelocation, :titlefont,
:window_title,
:guide, :guide_position, :lims, :ticks, :scale, :flip, :rotation,
:titlefontfamily, :titlefontsize, :titlefontcolor,
@@ -568,6 +568,9 @@ const _unicodeplots_style = [:auto, :solid]
const _unicodeplots_marker = [:none, :auto, :circle]
const _unicodeplots_scale = [:identity]
# Additional constants
const _canvas_type = Ref(:auto)
# ------------------------------------------------------------------------------
# hdf5
@@ -582,7 +585,7 @@ const _hdf5_attr = merge_with_base_supported([
:markerstrokewidth, :markerstrokecolor, :markerstrokealpha,
:fillrange, :fillcolor, :fillalpha,
:bins, :bar_width, :bar_edges, :bar_position,
:title, :title_location, :titlefont,
:title, :titlelocation, :titlefont,
:window_title,
:guide, :lims, :ticks, :scale, :flip, :rotation,
:tickfont, :guidefont, :legendfont,
@@ -612,6 +615,23 @@ const _hdf5_style = [:auto, :solid, :dash, :dot, :dashdot]
const _hdf5_marker = vcat(_allMarkers, :pixel)
const _hdf5_scale = [:identity, :ln, :log2, :log10]
# Additional constants
#Dict has problems using "Types" as keys. Initialize in "_initialize_backend":
const HDF5PLOT_MAP_STR2TELEM = Dict{String, Type}()
const HDF5PLOT_MAP_TELEM2STR = Dict{Type, String}()
#Don't really like this global variable... Very hacky
mutable struct HDF5Plot_PlotRef
ref::Union{Plot, Nothing}
end
const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing)
#Simple sub-structures that can just be written out using _hdf5plot_gwritefields:
const HDF5PLOT_SIMPLESUBSTRUCT = Union{Font, BoundingBox,
GridLayout, RootLayout, ColorGradient, SeriesAnnotations, PlotText,
Shape,
}
# ------------------------------------------------------------------------------
# inspectdr
@@ -629,7 +649,7 @@ const _inspectdr_attr = merge_with_base_supported([
:markerstrokestyle, #Causes warning not to have it... what is this?
:fillcolor, :fillalpha, #:fillrange,
# :bins, :bar_width, :bar_edges, :bar_position,
:title, :title_location,
:title, :titlelocation,
:window_title,
:guide, :lims, :scale, #:ticks, :flip, :rotation,
:titlefontfamily, :titlefontsize, :titlefontcolor,
@@ -800,3 +820,6 @@ const _pgfplotsx_marker = [
]
const _pgfplotsx_scale = [:identity, :ln, :log2, :log10]
is_marker_supported(::PGFPlotsXBackend, shape::Shape) = true
# additional constants
const _pgfplotsx_series_ids = KW()
+91 -118
View File
@@ -9,53 +9,37 @@ export GR
# --------------------------------------------------------------------------------------
const gr_linetype = KW(
:auto => 1,
:solid => 1,
:dash => 2,
:dot => 3,
:dashdot => 4,
:dashdotdot => -1
)
gr_linetype(k) = (auto = 1, solid = 1, dash = 2, dot = 3, dashdot = 4, dashdotdot = -1)[k]
const gr_markertype = KW(
:auto => 1,
:none => -1,
:circle => -1,
:rect => -7,
:diamond => -13,
:utriangle => -3,
:dtriangle => -5,
:ltriangle => -18,
:rtriangle => -17,
:pentagon => -21,
:hexagon => -22,
:heptagon => -23,
:octagon => -24,
:cross => 2,
:xcross => 5,
:+ => 2,
:x => 5,
:star4 => -25,
:star5 => -26,
:star6 => -27,
:star7 => -28,
:star8 => -29,
:vline => -30,
:hline => -31
)
gr_markertype(k) = (
auto = 1,
none = -1,
circle = -1,
rect = -7,
diamond = -13,
utriangle = -3,
dtriangle = -5,
ltriangle = -18,
rtriangle = -17,
pentagon = -21,
hexagon = -22,
heptagon = -23,
octagon = -24,
cross = 2,
xcross = 5,
+ = 2,
x = 5,
star4 = -25,
star5 = -26,
star6 = -27,
star7 = -28,
star8 = -29,
vline = -30,
hline = -31,
)[k]
const gr_halign = KW(
:left => 1,
:hcenter => 2,
:right => 3
)
const gr_valign = KW(
:top => 1,
:vcenter => 3,
:bottom => 5
)
gr_halign(k) = (left = 1, hcenter = 2, right = 3)[k]
gr_valign(k) = (top = 1, vcenter = 3, bottom = 5)[k]
const gr_font_family = Dict(
"times" => 1,
@@ -67,6 +51,11 @@ const gr_font_family = Dict(
"palatino" => 26
)
const gr_vector_font = Dict(
"serif-roman" => 232,
"sans-serif" => 233
)
# --------------------------------------------------------------------------------------
gr_color(c) = gr_color(c, color_type(c))
@@ -98,16 +87,19 @@ gr_set_transparency(c, α) = gr_set_transparency(α)
gr_set_transparency(c::Colorant, ::Nothing) = gr_set_transparency(c)
gr_set_transparency(c::Colorant) = GR.settransparency(alpha(c))
const _gr_arrow_map = Dict(
:simple => 1,
:hollow => 3,
:filled => 4,
:triangle => 5,
:filledtriangle => 6,
:closed => 6,
:open => 5,
)
gr_set_arrowstyle(s::Symbol) = GR.setarrowstyle(get(_gr_arrow_map, s, 1))
gr_set_arrowstyle(s::Symbol) = GR.setarrowstyle(get(
(
simple = 1,
hollow = 3,
filled = 4,
triangle = 5,
filledtriangle = 6,
closed = 6,
open = 5,
),
s,
1,
))
# --------------------------------------------------------------------------------------
@@ -340,7 +332,7 @@ function gr_draw_marker(series, xi, yi, clims, i, msize::Number, shape::Symbol)
gr_set_bordercolor(get_markerstrokecolor(series, i));
gr_set_markercolor(get_markercolor(series, clims, i));
gr_set_transparency(get_markeralpha(series, i))
GR.setmarkertype(gr_markertype[shape])
GR.setmarkertype(gr_markertype(shape))
GR.setmarkersize(0.3msize / nominal_size())
GR.polymarker([xi], [yi])
end
@@ -365,7 +357,7 @@ end
# ---------------------------------------------------------
function gr_set_line(lw, style, c) #, a)
GR.setlinetype(gr_linetype[style])
GR.setlinetype(gr_linetype(style))
w, h = gr_plot_size
GR.setlinewidth(_gr_thickness_scaling[1] * max(0, lw / nominal_size()))
gr_set_linecolor(c) #, a)
@@ -390,9 +382,11 @@ function gr_set_font(f::Font; halign = f.halign, valign = f.valign,
GR.setcharup(sind(-rotation), cosd(-rotation))
if haskey(gr_font_family, family)
GR.settextfontprec(100 + gr_font_family[family], GR.TEXT_PRECISION_STRING)
elseif haskey(gr_vector_font, family)
GR.settextfontprec(gr_vector_font[family], 3)
end
gr_set_textcolor(color)
GR.settextalign(gr_halign[halign], gr_valign[valign])
GR.settextalign(gr_halign(halign), gr_valign(valign))
end
function gr_nans_to_infs!(z)
@@ -419,8 +413,6 @@ const viewport_plotarea = zeros(4)
# the size of the current plot in pixels
const gr_plot_size = [600.0, 400.0]
const gr_colorbar_ratio = 0.1
function gr_viewport_from_bbox(sp::Subplot{GRBackend}, bb::BoundingBox, w, h, viewport_canvas)
viewport = zeros(4)
viewport[1] = viewport_canvas[2] * (left(bb) / w)
@@ -428,7 +420,7 @@ function gr_viewport_from_bbox(sp::Subplot{GRBackend}, bb::BoundingBox, w, h, vi
viewport[3] = viewport_canvas[4] * (1.0 - bottom(bb) / h)
viewport[4] = viewport_canvas[4] * (1.0 - top(bb) / h)
if hascolorbar(sp)
viewport[2] -= gr_colorbar_ratio * (1 + RecipesPipeline.is3d(sp) / 2)
viewport[2] -= 0.1 * (1 + RecipesPipeline.is3d(sp) / 2)
end
viewport
end
@@ -527,7 +519,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims)
GR.setwindow(xmin, xmax, zmin, zmax)
if !isempty(cbar.gradients)
series = cbar.gradients
gr_set_gradient(_cbar_unique(gr_get_color.(series),"color"))
gr_set_gradient(_cbar_unique(get_colorgradient.(series),"color"))
gr_set_transparency(_cbar_unique(get_fillalpha.(series), "fill alpha"))
GR.cellarray(xmin, xmax, zmax, zmin, 1, 256, 1000:1255)
end
@@ -535,7 +527,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims)
if !isempty(cbar.fills)
series = cbar.fills
GR.setfillintstyle(GR.INTSTYLE_SOLID)
gr_set_gradient(_cbar_unique(gr_get_color.(series), "color"))
gr_set_gradient(_cbar_unique(get_colorgradient.(series), "color"))
gr_set_transparency(_cbar_unique(get_fillalpha.(series), "fill alpha"))
levels = _cbar_unique(contour_levels.(series, Ref(clims)), "levels")
# GR implicitly uses the maximal z value as the highest level
@@ -554,7 +546,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims)
if !isempty(cbar.lines)
series = cbar.lines
gr_set_gradient(_cbar_unique(gr_get_color.(series),"color"))
gr_set_gradient(_cbar_unique(get_colorgradient.(series),"color"))
gr_set_line(_cbar_unique(get_linewidth.(series), "line width"),
_cbar_unique(get_linestyle.(series), "line style"),
_cbar_unique(get_linecolor.(series, Ref(clims)), "line color"))
@@ -574,7 +566,7 @@ function gr_draw_colorbar(cbar::GRColorbar, sp::Subplot, clims)
gr_set_font(guidefont(sp[:yaxis]))
GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP)
GR.setcharup(-1, 0)
gr_text(viewport_plotarea[2] + gr_colorbar_ratio,
gr_text(viewport_plotarea[2] + 0.1,
gr_view_ycenter(), sp[:colorbar_title])
GR.restorestate()
@@ -637,38 +629,20 @@ end
# --------------------------------------------------------------------------------------
const _gr_gradient_alpha = ones(256)
function gr_set_gradient(c)
grad = _as_gradient(c)
for (i,z) in enumerate(range(0, stop=1, length=256))
c = grad[z]
GR.setcolorrep(999+i, red(c), green(c), blue(c))
_gr_gradient_alpha[i] = alpha(c)
end
grad
end
function gr_set_gradient(series::Series)
color = gr_get_color(series)
color = get_colorgradient(series)
color !== nothing && gr_set_gradient(color)
end
function gr_get_color(series::Series)
st = series[:seriestype]
if st in (:surface, :heatmap) || isfilledcontour(series)
series[:fillcolor]
elseif st in (:contour, :wireframe)
series[:linecolor]
elseif series[:marker_z] !== nothing
series[:markercolor]
elseif series[:line_z] !== nothing
series[:linecolor]
elseif series[:fill_z] !== nothing
series[:fillcolor]
end
end
# this is our new display func... set up the viewport_canvas, compute bounding boxes, and display each subplot
function gr_display(plt::Plot, fmt="")
GR.clearws()
@@ -815,6 +789,7 @@ end
function _update_min_padding!(sp::Subplot{GRBackend})
dpi = sp.plt[:thickness_scaling]
ENV["GKS_ENCODING"] = "utf8"
if !haskey(ENV, "GKSwstype")
if isijulia()
ENV["GKSwstype"] = "svg"
@@ -872,7 +847,8 @@ function _update_min_padding!(sp::Subplot{GRBackend})
tickfont(zaxis),
halign = (zaxis[:mirror] ? :left : :right),
valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2],
rotation = zaxis[:rotation]
rotation = zaxis[:rotation],
color = zaxis[:tickfontcolor],
)
l = 0.01 + first(gr_get_ticks_size(zticks, zaxis[:rotation]))
w = 1mm + gr_plot_size[1] * l * px
@@ -1230,7 +1206,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
tickfont(xaxis),
halign = (:left, :hcenter, :right)[sign(xaxis[:rotation]) + 2],
valign = (xaxis[:mirror] ? :bottom : :top),
rotation = xaxis[:rotation]
rotation = xaxis[:rotation],
color = xaxis[:tickfontcolor],
)
yt = if sp[:framestyle] == :origin
0
@@ -1260,7 +1237,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
tickfont(yaxis),
halign = (:left, :hcenter, :right)[sign(yaxis[:rotation]) + 2],
valign = (yaxis[:mirror] ? :bottom : :top),
rotation = yaxis[:rotation]
rotation = yaxis[:rotation],
color = yaxis[:tickfontcolor],
)
xt = if sp[:framestyle] == :origin
0
@@ -1290,7 +1268,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
tickfont(zaxis),
halign = (zaxis[:mirror] ? :left : :right),
valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2],
rotation = zaxis[:rotation]
rotation = zaxis[:rotation],
color = zaxis[:tickfontcolor],
)
xt = if sp[:framestyle] == :origin
0
@@ -1336,7 +1315,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
end
xticks, yticks, xspine_segs, yspine_segs, xtick_segs, ytick_segs, xgrid_segs, ygrid_segs, xminorgrid_segs, yminorgrid_segs, xborder_segs, yborder_segs = axis_drawing_info(sp)
# @show xticks yticks #spine_segs grid_segs
# draw the grid lines
if xaxis[:grid]
@@ -1442,7 +1420,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
GR.savestate()
if sp[:title] != ""
gr_set_font(titlefont(sp))
loc = sp[:title_location]
loc = sp[:titlelocation]
if loc == :left
xpos = viewport_plotarea[1]
halign = GR.TEXT_HALIGN_LEFT
@@ -1614,7 +1592,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
elseif st == :contour
GR.setspace(clims[1], clims[2], 0, 90)
GR.setlinetype(gr_linetype[get_linestyle(series)])
GR.setlinetype(gr_linetype(get_linestyle(series)))
GR.setlinewidth(max(0, get_linewidth(series)) / nominal_size())
is_lc_black = let black=plot_color(:black)
plot_color(series[:linecolor]) in (black,[black])
@@ -1653,34 +1631,32 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
elseif st == :heatmap
zmin, zmax = clims
fillgrad = _as_gradient(series[:fillcolor])
if !ispolar(sp)
GR.setspace(zmin, zmax, 0, 90)
GR.setspace(clims..., 0, 90)
x, y = heatmap_edges(series[:x], sp[:xaxis][:scale], series[:y], sp[:yaxis][:scale], size(series[:z]))
w, h = length(x) - 1, length(y) - 1
z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z)
if is_uniformly_spaced(x) && is_uniformly_spaced(y)
# For uniformly spaced data use GR.drawimage, which can be
# much faster than GR.nonuniformcellarray, especially for
# pdf output, and also supports alpha values.
# Note that drawimage draws uniformly spaced data correctly
# even on log scales, where it is visually non-uniform.
fillgrad = _as_gradient(series[:fillcolor])
colors = plot_color.(fillgrad[z_normalized], series[:fillalpha])
colors[isnan.(z_normalized)] .= RGBA(0,0,0,0)
colors = plot_color.(get(fillgrad, z, clims), series[:fillalpha])
rgba = gr_color.(colors)
GR.drawimage(first(x), last(x), last(y), first(y), w, h, rgba)
else
(something(series[:fillalpha],1) < 1 || any(_gr_gradient_alpha .< 1)) && @warn(
"GR: transparency not supported in non-uniform heatmaps. Alpha values ignored.")
z_normalized = map(x -> isnan(x) ? 256/255 : x, z_normalized) # results in color index = 1256 -> transparent
colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized]
GR.nonuniformcellarray(x, y, w, h, colors)
if something(series[:fillalpha],1) < 1
@warn "GR: transparency not supported in non-uniform heatmaps. Alpha values ignored."
end
colors = get(fillgrad, z, clims)
z_normalized = map(c -> c == invisible() ? 256/255 : PlotUtils.getinverse(fillgrad, c), colors)
rgba = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized]
GR.nonuniformcellarray(x, y, w, h, rgba)
end
else
phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl
nx, ny = length(series[:x]), length(series[:y])
z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z)
colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized]
xmin, xmax, ymin, ymax = xy_lims
rmax = data_lims[4]
GR.setwindow(-rmax, rmax, -rmax, rmax)
@@ -1690,8 +1666,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
if series[:y][end] != ny
@warn "Right now only the maximum value of y (r) is taken into account."
end
colors = get(fillgrad, z, clims)
z_normalized = map(c -> c == invisible() ? 256/255 : PlotUtils.getinverse(fillgrad.colors, c), colors)
rgba = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized]
# GR.polarcellarray(0, 0, phimin, phimax, ymin, ymax, nx, ny, colors)
GR.polarcellarray(0, 0, phimin, phimax, 0, ymax, nx, ny, colors)
GR.polarcellarray(0, 0, phimin, phimax, 0, ymax, nx, ny, rgba)
# Right now only the maximum value of y (r) is taken into account.
# This is certainly not perfect but nonuniform polar array is not yet supported in GR.jl
end
@@ -1926,18 +1905,14 @@ end
# ----------------------------------------------------------------
const _gr_mimeformats = Dict(
"application/pdf" => "pdf",
"image/png" => "png",
"application/postscript" => "ps",
"image/svg+xml" => "svg",
for (mime, fmt) in (
"application/pdf" => "pdf",
"image/png" => "png",
"application/postscript" => "ps",
"image/svg+xml" => "svg",
)
const _gr_wstype = Ref(get(ENV, "GKSwstype", ""))
gr_set_output(wstype::String) = (_gr_wstype[] = wstype)
for (mime, fmt) in _gr_mimeformats
@eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{GRBackend})
ENV["GKS_ENCODING"] = "utf8"
GR.emergencyclosegks()
filepath = tempname() * "." * $fmt
env = get(ENV, "GKSwstype", "0")
@@ -1950,12 +1925,13 @@ for (mime, fmt) in _gr_mimeformats
if env != "0"
ENV["GKSwstype"] = env
else
pop!(ENV,"GKSwstype")
pop!(ENV, "GKSwstype")
end
end
end
function _display(plt::Plot{GRBackend})
ENV["GKS_ENCODING"] = "utf8"
if plt[:display_type] == :inline
GR.emergencyclosegks()
filepath = tempname() * ".pdf"
@@ -1968,9 +1944,6 @@ function _display(plt::Plot{GRBackend})
rm(filepath)
else
ENV["GKS_DOUBLE_BUF"] = true
if _gr_wstype[] != ""
ENV["GKSwstype"] = _gr_wstype[]
end
gr_display(plt)
end
end
+16 -43
View File
@@ -37,33 +37,6 @@ import FixedPointNumbers: N0f8 #In core Julia
struct HDF5PlotNative; end #Indentifies a data element that can natively be handled by HDF5
struct HDF5CTuple; end #Identifies a "complex" tuple structure
mutable struct HDF5Plot_PlotRef
ref::Union{Plot, Nothing}
end
#==Useful constants
===============================================================================#
const _hdf5_nullable{T} = Union{T, Nothing}
const _hdf5_plotroot = "plot"
const _hdf5_dataroot = "data" #TODO: Eventually move data to different root (easier to locate)?
const _hdf5plot_datatypeid = "TYPE" #Attribute identifying type
const _hdf5plot_countid = "COUNT" #Attribute for storing count
#Dict has problems using "Types" as keys. Initialize in "_initialize_backend":
const HDF5PLOT_MAP_STR2TELEM = Dict{String, Type}()
const HDF5PLOT_MAP_TELEM2STR = Dict{Type, String}()
#Don't really like this global variable... Very hacky
const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing)
#Simple sub-structures that can just be written out using _hdf5plot_gwritefields:
const HDF5PLOT_SIMPLESUBSTRUCT = Union{Font, BoundingBox,
GridLayout, RootLayout, ColorGradient, SeriesAnnotations, PlotText,
Shape,
}
#==
===============================================================================#
is_marker_supported(::HDF5Backend, shape::Shape) = true
@@ -95,7 +68,7 @@ if length(HDF5PLOT_MAP_TELEM2STR) < 1
"AXIS" => Axis,
"SURFACE" => Surface,
"SUBPLOT" => Subplot,
"NULLABLE" => _hdf5_nullable,
"NULLABLE" => Union{Nothing, T} where T,
)
merge!(HDF5PLOT_MAP_STR2TELEM, telem2str)
merge!(HDF5PLOT_MAP_TELEM2STR, Dict{Type, String}(v=>k for (k,v) in HDF5PLOT_MAP_STR2TELEM))
@@ -105,8 +78,8 @@ end
#==Helper functions
===============================================================================#
_hdf5_plotelempath(subpath::String) = "$_hdf5_plotroot/$subpath"
_hdf5_datapath(subpath::String) = "$_hdf5_dataroot/$subpath"
_hdf5_plotelempath(subpath::String) = "plot/$subpath"
_hdf5_datapath(subpath::String) = "data/$subpath"
_hdf5_map_str2telem(k::String) = HDF5PLOT_MAP_STR2TELEM[k]
_hdf5_map_str2telem(v::Vector) = HDF5PLOT_MAP_STR2TELEM[v[1]]
@@ -201,38 +174,38 @@ end
function _hdf5plot_writetype(grp, k::String, tstr::Array{String})
d = HDF5.d_open(grp, k)
HDF5.a_write(d, _hdf5plot_datatypeid, tstr)
HDF5.a_write(d, "TYPE", tstr)
end
function _hdf5plot_writetype(grp, k::String, T::Type)
tstr = HDF5PLOT_MAP_TELEM2STR[T]
d = HDF5.d_open(grp, k)
HDF5.a_write(d, _hdf5plot_datatypeid, tstr)
HDF5.a_write(d, "TYPE", tstr)
end
function _hdf5plot_overwritetype(grp, k::String, T::Type)
tstr = HDF5PLOT_MAP_TELEM2STR[T]
d = HDF5.d_open(grp, k)
HDF5.a_delete(d, _hdf5plot_datatypeid)
HDF5.a_write(d, _hdf5plot_datatypeid, tstr)
HDF5.a_delete(d, "TYPE")
HDF5.a_write(d, "TYPE", tstr)
end
function _hdf5plot_writetype(grp, T::Type) #Write directly to group
tstr = HDF5PLOT_MAP_TELEM2STR[T]
HDF5.a_write(grp, _hdf5plot_datatypeid, tstr)
HDF5.a_write(grp, "TYPE", tstr)
end
function _hdf5plot_overwritetype(grp, T::Type) #Write directly to group
tstr = HDF5PLOT_MAP_TELEM2STR[T]
HDF5.a_delete(grp, _hdf5plot_datatypeid)
HDF5.a_write(grp, _hdf5plot_datatypeid, tstr)
HDF5.a_delete(grp, "TYPE")
HDF5.a_write(grp, "TYPE", tstr)
end
function _hdf5plot_writetype(grp, ::Type{Array{T}}) where T<:Any
tstr = HDF5PLOT_MAP_TELEM2STR[Array] #ANY
HDF5.a_write(grp, _hdf5plot_datatypeid, tstr)
HDF5.a_write(grp, "TYPE", tstr)
end
function _hdf5plot_writetype(grp, ::Type{T}) where T<:BoundingBox
tstr = HDF5PLOT_MAP_TELEM2STR[BoundingBox]
HDF5.a_write(grp, _hdf5plot_datatypeid, tstr)
HDF5.a_write(grp, "TYPE", tstr)
end
function _hdf5plot_writecount(grp, n::Int) #Write directly to group
HDF5.a_write(grp, _hdf5plot_countid, n)
HDF5.a_write(grp, "COUNT", n)
end
function _hdf5plot_gwritefields(grp, k::String, v)
grp = HDF5.g_create(grp, k)
@@ -372,7 +345,7 @@ function _hdf5plot_gwrite(grp, k::String, v::Surface)
_hdf5plot_writetype(grp, Surface)
end
# #TODO: "Properly" support Nullable using _hdf5plot_writetype?
# function _hdf5plot_gwrite(grp, k::String, v::_hdf5_nullable)
# function _hdf5plot_gwrite(grp, k::String, v::Union{Nothing, T} where T)
# if isnull(v)
# _hdf5plot_gwrite(grp, k, nothing)
# else
@@ -448,7 +421,7 @@ hdf5plot_write(path::AbstractString) = hdf5plot_write(current(), path)
===============================================================================#
function _hdf5plot_readcount(grp) #Read directly from group
return HDF5.a_read(grp, _hdf5plot_countid)
return HDF5.a_read(grp, "COUNT")
end
_hdf5plot_convert(T::Type{HDF5PlotNative}, v) = v
@@ -589,7 +562,7 @@ function _hdf5plot_read(grp, k::String, T::Type{Length}, dtid::Vector)
return Length{TU,T}(v)
end
function _hdf5plot_read(grp, k::String)
dtid = HDF5.a_read(grp[k], _hdf5plot_datatypeid)
dtid = HDF5.a_read(grp[k], "TYPE")
T = _hdf5_map_str2telem(dtid) #expect exception
return _hdf5plot_read(grp, k, T, dtid)
end
+10 -16
View File
@@ -429,29 +429,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, "image/png", _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
+6 -7
View File
@@ -12,13 +12,12 @@ function plotlybase_syncplot(plt::Plot)
return plt.o
end
const _orca_mimeformats = Dict(
for (mime, fmt) in (
"application/pdf" => "pdf",
"image/png" => "png",
"image/svg+xml" => "svg",
"image/eps" => "eps",
"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)
@eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) =
ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt)
end
+98 -84
View File
@@ -123,7 +123,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
fg_alpha = alpha(plot_color(sp[:foreground_color_legend]))
title_cstr = plot_color(sp[:titlefontcolor])
title_a = alpha(title_cstr)
title_loc = sp[:title_location]
title_loc = sp[:titlelocation]
bgc_inside = plot_color(sp[:background_color_inside])
bgc_inside_a = alpha(bgc_inside)
axis_opt = PGFPlotsX.Options(
@@ -179,10 +179,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
x, y = sp[:legend]
push!(axis_opt["legend style"], "at={($x, $y)}")
else
push!(
axis_opt["legend style"],
get(_pgfplotsx_legend_pos, sp[:legend], ("at" => string((1.02, 1)), "anchor" => "north west"))...
)
push!(axis_opt["legend style"], pgfx_get_legend_pos(sp[:legend])...)
end
for letter in (:x, :y, :z)
if letter != :z || RecipesPipeline.is3d(sp)
@@ -200,12 +197,13 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
# As it is likely that all series within the same axis use the same
# colormap this should not cause any problem.
for series in series_list(sp)
for col in (:markercolor, :fillcolor, :linecolor)
if typeof(series.plotattributes[col]) == ColorGradient
if hascolorbar(series)
cg = get_colorgradient(series)
cm = pgfx_colormap(get_colorgradient(series))
PGFPlotsX.push_preamble!(
pgfx_plot.the_plot,
"""\\pgfplotsset{
colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))},
colormap={plots$(sp.attr[:subplot_index])}{$cm},
}""",
)
push!(
@@ -213,10 +211,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
"colorbar" => nothing,
"colormap name" => "plots$(sp.attr[:subplot_index])",
)
if cg isa PlotUtils.CategoricalColorGradient
push!(
axis_opt,
"colormap access" => "piecewise const",
"colorbar sampled" => nothing,
)
end
# goto is needed to break out of col and series for
@goto colorbar_end
end
end
end
@label colorbar_end
@@ -224,9 +228,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
axis_opt,
"colorbar style" => PGFPlotsX.Options(
"title" => sp[:colorbar_title],
"point meta max" => get_clims(sp)[2],
"point meta min" => get_clims(sp)[1],
),
"point meta max" => get_clims(sp)[2],
"point meta min" => get_clims(sp)[1],
)
if RecipesPipeline.is3d(sp)
azim, elev = sp[:camera]
@@ -240,6 +244,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
PGFPlotsX.Axis
end
axis = axisf(axis_opt)
if sp[:legendtitle] !== nothing
push!(axis, PGFPlotsX.Options("\\addlegendimage{empty legend}" => nothing))
push!(
axis,
PGFPlotsX.LegendEntry(
string("\\hspace{-.6cm}{\\textbf{", sp[:legendtitle], "}}"),
false,
),
)
end
for (series_index, series) in enumerate(series_list(sp))
# give each series a uuid for fillbetween
series_id = uuid4()
@@ -579,62 +593,65 @@ function pgfx_series_coordinates!(
"""
end
##
const _pgfplotsx_linestyles = KW(
:solid => "solid",
:dash => "dashed",
:dot => "dotted",
:dashdot => "dashdotted",
:dashdotdot => "dashdotdotted",
pgfx_get_linestyle(k) = get(
(
solid = "solid",
dash = "dashed",
dot = "dotted",
dashdot = "dashdotted",
dashdotdot = "dashdotdotted",
),
Symbol(k),
"solid",
)
const _pgfplotsx_series_ids = KW()
const _pgfplotsx_markers = KW(
:none => "none",
:cross => "+",
:xcross => "x",
:+ => "+",
:x => "x",
:utriangle => "triangle*",
:dtriangle => "triangle*",
:rtriangle => "triangle*",
:ltriangle => "triangle*",
:circle => "*",
:rect => "square*",
:star5 => "star",
:star6 => "asterisk",
:diamond => "diamond*",
:pentagon => "pentagon*",
:hline => "-",
:vline => "|",
pgfx_get_marker(k) = get(
(
none = "none",
cross = "+",
xcross = "x",
+ = "+",
x = "x",
utriangle = "triangle*",
dtriangle = "triangle*",
rtriangle = "triangle*",
ltriangle = "triangle*",
circle = "*",
rect = "square*",
star5 = "star",
star6 = "asterisk",
diamond = "diamond*",
pentagon = "pentagon*",
hline = "-",
vline = "|",
),
Symbol(k),
"*",
)
const _pgfplotsx_legend_pos = KW(
:top => ("at" => string((0.5, 0.98)), "anchor" => "north"),
:bottom => ("at" => string((0.5, 0.02)), "anchor" => "south"),
:left => ("at" => string((0.02, 0.5)), "anchor" => "west"),
:right => ("at" => string((0.98, 0.5)), "anchor" => "east"),
:bottomleft => ("at" => string((0.02, 0.02)), "anchor" => "south west"),
:bottomright => ("at" => string((0.98, 0.02)), "anchor" => "south east"),
:topright => ("at" => string((0.98, 0.98)), "anchor" => "north east"),
:topleft => ("at" => string((-0.02, 0.98)), "anchor" => "north west"),
:outertop => ("at" => string((0.5, 1.02)), "anchor" => "south"),
:outerbottom => ("at" => string((0.5, -0.02)), "anchor" => "north"),
:outerleft => ("at" => string((-0.02, 0.5)), "anchor" => "east"),
:outerright => ("at" => string((1.02, 0.5)), "anchor" => "west"),
:outerbottomleft => ("at" => string((-0.02, -0.02)), "anchor" => "north east"),
:outerbottomright => ("at" => string((1.02, -0.02)), "anchor" => "north west"),
:outertopright => ("at" => string((1.02, 1)), "anchor" => "north west"),
:outertopleft => ("at" => string((-0.02, 1)), "anchor" => "north east"),
pgfx_get_legend_pos(k) = get(
(
top = ("at" => string((0.5, 0.98)), "anchor" => "north"),
bottom = ("at" => string((0.5, 0.02)), "anchor" => "south"),
left = ("at" => string((0.02, 0.5)), "anchor" => "west"),
right = ("at" => string((0.98, 0.5)), "anchor" => "east"),
bottomleft = ("at" => string((0.02, 0.02)), "anchor" => "south west"),
bottomright = ("at" => string((0.98, 0.02)), "anchor" => "south east"),
topright = ("at" => string((0.98, 0.98)), "anchor" => "north east"),
topleft = ("at" => string((0.02, 0.98)), "anchor" => "north west"),
outertop = ("at" => string((0.5, 1.02)), "anchor" => "south"),
outerbottom = ("at" => string((0.5, -0.02)), "anchor" => "north"),
outerleft = ("at" => string((-0.02, 0.5)), "anchor" => "east"),
outerright = ("at" => string((1.02, 0.5)), "anchor" => "west"),
outerbottomleft = ("at" => string((-0.02, -0.02)), "anchor" => "north east"),
outerbottomright = ("at" => string((1.02, -0.02)), "anchor" => "north west"),
outertopright = ("at" => string((1.02, 1)), "anchor" => "north west"),
outertopleft = ("at" => string((-0.02, 1)), "anchor" => "north east"),
),
Symbol(k),
("at" => string((1.02, 1)), "anchor" => "north west"),
)
const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none]
const _pgfx_framestyle_defaults = Dict(:semi => :box)
# we use the anchors to define orientations for example to align left
# one needs to use the right edge as anchor
const _pgfx_annotation_halign =
KW(:center => "", :left => "right", :right => "left")
## --------------------------------------------------------------------------------------
# Generates a colormap for pgfplots based on a ColorGradient
pgfx_arrow(::Nothing) = "every arrow/.append style={-}"
@@ -667,22 +684,24 @@ function pgfx_filllegend!(series_opt, opt)
}""")
end
function pgfx_colormap(grad::ColorGradient)
join(map(grad.colors) do c
pgfx_colormap(cl::PlotUtils.AbstractColorList) = pgfx_colormap(color_list(cl))
function pgfx_colormap(v::Vector{<:Colorant})
join(map(v) do c
@sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c))
end, "\n")
end
function pgfx_colormap(grad::Vector{<:Colorant})
join(map(grad) do c
@sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c))
function pgfx_colormap(cg::ColorGradient)
join(map(1:length(cg)) do i
@sprintf("rgb(%.8fcm)=(%.8f,%.8f,%.8f)", cg.values[i], red(cg.colors[i]), green(cg.colors[i]), blue(cg.colors[i]))
end, "\n")
end
function pgfx_framestyle(style::Symbol)
if style in _pgfx_framestyles
if style in (:box, :axes, :origin, :zerolines, :grid, :none)
return style
else
default_style = get(_pgfx_framestyle_defaults, style, :axes)
default_style = get((semi = :box,), style, :axes)
@warn( "Framestyle :$style is not (yet) supported by the PGFPlotsX backend. :$default_style was cosen instead.",)
default_style
end
@@ -701,14 +720,14 @@ function pgfx_fillstyle(plotattributes, i = 1)
PGFPlotsX.Options("fill" => cstr, "fill opacity" => a)
end
function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = "solid")
function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = :solid)
cstr = plot_color(color, α)
a = alpha(cstr)
return PGFPlotsX.Options(
"color" => cstr,
"draw opacity" => a,
"line width" => linewidth,
get(_pgfplotsx_linestyles, linestyle, "solid") => nothing,
pgfx_get_linestyle(linestyle) => nothing,
)
end
@@ -746,10 +765,8 @@ end
function pgfx_marker(plotattributes, i = 1)
shape = _cycle(plotattributes[:markershape], i)
cstr = plot_color(
get_markercolor(plotattributes, i),
get_markeralpha(plotattributes, i),
)
cstr =
plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i))
a = alpha(cstr)
cstr_stroke = plot_color(
get_markerstrokecolor(plotattributes, i),
@@ -758,11 +775,10 @@ function pgfx_marker(plotattributes, i = 1)
a_stroke = alpha(cstr_stroke)
mark_size =
pgfx_thickness_scaling(plotattributes) *
0.5 *
0.75 *
_cycle(plotattributes[:markersize], i)
return PGFPlotsX.Options(
"mark" =>
shape isa Shape ? "PlotsShape$i" : get(_pgfplotsx_markers, shape, "*"),
"mark" => shape isa Shape ? "PlotsShape$i" : pgfx_get_marker(shape),
"mark size" => "$mark_size pt",
"mark options" => PGFPlotsX.Options(
"color" => cstr_stroke,
@@ -771,6 +787,7 @@ function pgfx_marker(plotattributes, i = 1)
"fill opacity" => a,
"line width" =>
pgfx_thickness_scaling(plotattributes) *
0.75 *
_cycle(plotattributes[:markerstrokewidth], i),
"rotate" => if shape == :dtriangle
180
@@ -781,11 +798,7 @@ function pgfx_marker(plotattributes, i = 1)
else
0
end,
get(
_pgfplotsx_linestyles,
_cycle(plotattributes[:markerstrokestyle], i),
"solid",
) => nothing,
pgfx_get_linestyle(_cycle(plotattributes[:markerstrokestyle], i)) => nothing,
),
)
end
@@ -799,7 +812,8 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1)
[
"\\node",
PGFPlotsX.Options(
get(_pgfx_annotation_halign, val.font.halign, "") => nothing,
get((center = "", left = "right", right = "left"), val.font.halign, "") =>
nothing,
"color" => cstr,
"draw opacity" => convert(Float16, a),
"rotate" => val.font.rotation,
@@ -1123,7 +1137,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter)
axis[:minorgridalpha],
axis[:minorgridstyle],
),
"major tick length" => axis[:minorticks] ? "0.1cm" : "0"
"major tick length" => typeof(axis[:minorticks]) <: Integer && axis[:minorticks] > 1 || axis[:minorticks] ? "0.1cm" : "0"
),
)
end
+52 -43
View File
@@ -3,13 +3,11 @@
is_subplot_supported(::PlotlyBackend) = true
# is_string_supported(::PlotlyBackend) = true
const _plotly_framestyles = [:box, :axes, :zerolines, :grid, :none]
const _plotly_framestyle_defaults = Dict(:semi => :box, :origin => :zerolines)
function _plotly_framestyle(style::Symbol)
if style in _plotly_framestyles
if style in (:box, :axes, :zerolines, :grid, :none)
return style
else
default_style = get(_plotly_framestyle_defaults, style, :axes)
default_style = get((semi = :box, origin = :zerolines), style, :axes)
@warn("Framestyle :$style is not supported by Plotly and PlotlyJS. :$default_style was cosen instead.")
default_style
end
@@ -17,29 +15,25 @@ end
# --------------------------------------------------------------------------------------
const plotly_remote_file_path = "https://cdn.plot.ly/plotly-latest.min.js"
# if isatom()
# import Atom
# Atom.@msg evaljs(_js_code)
# end
using UUIDs
# ----------------------------------------------------------------
const _plotly_legend_pos = KW(
:right => [1., 0.5],
:left => [0., 0.5],
:top => [0.5, 1.],
:bottom => [0.5, 0.],
:bottomleft => [0., 0.],
:bottomright => [1., 0.],
:topright => [1., 1.],
:topleft => [0., 1.]
plotly_legend_pos(pos::Symbol) = get(
(
right = [1.0, 0.5],
left = [0.0, 0.5],
top = [0.5, 1.0],
bottom = [0.5, 0.0],
bottomleft = [0.0, 0.0],
bottomright = [1.0, 0.0],
topright = [1.0, 1.0],
topleft = [0.0, 1.0],
),
pos,
[1.0, 1.0],
)
plotly_legend_pos(pos::Symbol) = get(_plotly_legend_pos, pos, [1.,1.])
plotly_legend_pos(v::Tuple{S,T}) where {S<:Real, T<:Real} = v
function plotly_font(font::Font, color = font.color)
@@ -176,7 +170,7 @@ function plotly_axis(plt::Plot, axis::Axis, sp::Subplot)
lims = axis_limits(sp, letter)
if axis[:ticks] != :native || axis[:lims] != :auto
ax[:range] = map(scalefunc(axis[:scale]), lims)
ax[:range] = map(RecipesPipeline.scale_func(axis[:scale]), lims)
end
if !(axis[:ticks] in (nothing, :none, false))
@@ -245,7 +239,7 @@ function plotly_layout(plt::Plot)
# but vertically just below the top of the subplot bounding box
if sp[:title] != ""
bb = plotarea(sp)
tpos = sp[:title_location]
tpos = sp[:titlelocation]
xmm = if tpos == :left
left(bb)
elseif tpos == :right
@@ -350,30 +344,44 @@ function plotly_layout_json(plt::Plot)
end
function plotly_colorscale(grad::ColorGradient, α)
[[grad.values[i], rgba_string(plot_color(grad.colors[i], α))] for i in eachindex(grad.colors)]
end
plotly_colorscale(c::Colorant,α) = plotly_colorscale(_as_gradient(c),α)
function plotly_colorscale(c::AbstractVector{<:RGBA}, α)
plotly_colorscale(cg::ColorGradient, α = nothing) =
[[v, rgba_string(plot_color(cg.colors[v], α))] for v in cg.values]
function plotly_colorscale(c::AbstractVector{<:Colorant}, α = nothing)
if length(c) == 1
return [[0.0, rgba_string(plot_color(c[1], α))], [1.0, rgba_string(plot_color(c[1], α))]]
return [
[0.0, rgba_string(plot_color(c[1], α))],
[1.0, rgba_string(plot_color(c[1], α))],
]
else
vals = range(0.0, stop=1.0, length=length(c))
vals = range(0.0, stop = 1.0, length = length(c))
return [[vals[i], rgba_string(plot_color(c[i], α))] for i in eachindex(c)]
end
end
# plotly_colorscale(c, alpha = nothing) = plotly_colorscale(cgrad(), alpha)
function plotly_colorscale(cg::PlotUtils.CategoricalColorGradient, α = nothing)
n = length(cg)
cinds = repeat(1:n, inner = 2)
vinds = vcat((i:(i + 1) for i in 1:n)...)
return [
[cg.values[vinds[i]], rgba_string(plot_color(color_list(cg)[cinds[i]], α))]
for i in eachindex(cinds)
]
end
plotly_colorscale(c, α = nothing) = plotly_colorscale(_as_gradient(c), α)
const _plotly_markers = KW(
:rect => "square",
:xcross => "x",
:x => "x",
:utriangle => "triangle-up",
:dtriangle => "triangle-down",
:star5 => "star-triangle-up",
:vline => "line-ns",
:hline => "line-ew",
get_plotly_marker(k, def) = get(
(
rect = "square",
xcross = "x",
x = "x",
utriangle = "triangle-up",
dtriangle = "triangle-down",
star5 = "star-triangle-up",
vline = "line-ns",
hline = "line-ew",
),
k,
def,
)
# find indicies of axes to which the supblot links to
@@ -550,7 +558,7 @@ function plotly_series(plt::Plot, series::Series)
if hasmarker
inds = eachindex(x)
plotattributes_out[:marker] = KW(
:symbol => get(_plotly_markers, series[:markershape], string(series[:markershape])),
:symbol => get_plotly_marker(series[:markershape], string(series[:markershape])),
# :opacity => series[:markeralpha],
:size => 2 * _cycle(series[:markersize], inds),
:color => rgba_string.(plot_color.(get_markercolor.(series, inds), get_markeralpha.(series, inds))),
@@ -670,7 +678,7 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z
# add "marker"
if hasmarker
plotattributes_out[:marker] = KW(
:symbol => get(_plotly_markers, _cycle(series[:markershape], i), string(_cycle(series[:markershape], i))),
:symbol => get_plotly_marker(_cycle(series[:markershape], i), string(_cycle(series[:markershape], i))),
# :opacity => series[:markeralpha],
:size => 2 * _cycle(series[:markersize], i),
:color => rgba_string(plot_color(get_markercolor(series, clims, i), get_markeralpha(series, i))),
@@ -809,7 +817,8 @@ const ijulia_initialized = Ref(false)
function plotly_html_head(plt::Plot)
local_file = ("file://" * plotly_local_file_path)
plotly = use_local_dependencies[] ? local_file : plotly_remote_file_path
plotly =
use_local_dependencies[] ? local_file : "https://cdn.plot.ly/plotly-latest.min.js"
if isijulia() && !ijulia_initialized[]
# using requirejs seems to be key to load a js depency in IJulia!
# https://requirejs.org/docs/start.html
+4 -8
View File
@@ -19,14 +19,12 @@ 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)
end
@@ -40,11 +38,9 @@ _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = write(io, standal
_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(WebIO.dom"div"(innerHTML=plt_html))
end
function PlotlyJS.WebIO.render(plt::Plot{PlotlyJSBackend})
plt_html = sprint(show, MIME("text/html"), plt)
return PlotlyJS.WebIO.render(PlotlyJS.WebIO.dom"div"(innerHTML=plt_html))
end
function closeall(::PlotlyJSBackend)
+132 -115
View File
@@ -1,6 +1,3 @@
# Do "using PyPlot: PyCall, LaTeXStrings" without dependency warning:
const PyCall = PyPlot.PyCall
const LaTeXStrings = PyPlot.LaTeXStrings
# https://github.com/stevengj/PyPlot.jl
@@ -35,7 +32,7 @@ else
end
# PyCall API changes in v1.90.0
if !isdefined(PyCall, :_setproperty!)
if !isdefined(PyPlot.PyCall, :_setproperty!)
@warn "Plots no longer supports PyCall < 1.90.0 and PyPlot < 2.8.0. Either update PyCall and PyPlot or pin Plots to a version <= 0.23.2."
end
@@ -64,16 +61,23 @@ end
py_color(s) = py_color(parse(Colorant, string(s)))
py_color(c::Colorant) = (red(c), green(c), blue(c), alpha(c))
py_color(cs::AVec) = map(py_color, cs)
py_color(grad::ColorGradient) = py_color(grad.colors)
py_color(grad::PlotUtils.AbstractColorList) = py_color(color_list(grad))
py_color(c::Colorant, α) = py_color(plot_color(c, α))
function py_colormap(grad::ColorGradient)
pyvals = [(z, py_color(grad[z])) for z in grad.values]
function py_colormap(cg::ColorGradient)
pyvals = collect(zip(cg.values, py_color(PlotUtils.color_list(cg))))
cm = pycolors."LinearSegmentedColormap"."from_list"("tmp", pyvals)
cm."set_bad"(color=(0,0,0,0.0), alpha=0.0)
cm
end
py_colormap(c::Colorant) = py_colormap(_as_gradient(c))
function py_colormap(cg::PlotUtils.CategoricalColorGradient)
r = range(0, stop = 1, length = 256)
pyvals = collect(zip(r, py_color(cg[r])))
cm = pycolors."LinearSegmentedColormap"."from_list"("tmp", pyvals)
cm."set_bad"(color=(0,0,0,0.0), alpha=0.0)
cm
end
py_colormap(c) = py_colormap(_as_gradient(c))
function py_shading(c, z)
@@ -105,32 +109,6 @@ function py_marker(marker::Shape)
pypath."Path"(mat)
end
const _path_MOVETO = UInt8(1)
const _path_LINETO = UInt8(2)
const _path_CLOSEPOLY = UInt8(79)
# # see http://matplotlib.org/users/path_tutorial.html
# # and http://matplotlib.org/api/path_api.html#matplotlib.path.Path
# function py_path(x, y)
# n = length(x)
# mat = zeros(n+1, 2)
# codes = zeros(UInt8, n+1)
# lastnan = true
# for i=1:n
# mat[i,1] = x[i]
# mat[i,2] = y[i]
# nan = !ok(x[i], y[i])
# codes[i] = if nan && i>1
# _path_CLOSEPOLY
# else
# lastnan ? _path_MOVETO : _path_LINETO
# end
# lastnan = nan
# end
# codes[n+1] = _path_CLOSEPOLY
# pypath["Path"](mat, codes)
# end
# get the marker shape
function py_marker(marker::Symbol)
marker == :none && return " "
@@ -197,11 +175,11 @@ end
function labelfunc(scale::Symbol, backend::PyPlotBackend)
if scale == :log10
x -> LaTeXStrings.latexstring("10^{$x}")
x -> PyPlot.LaTeXStrings.latexstring("10^{$x}")
elseif scale == :log2
x -> LaTeXStrings.latexstring("2^{$x}")
x -> PyPlot.LaTeXStrings.latexstring("2^{$x}")
elseif scale == :ln
x -> LaTeXStrings.latexstring("e^{$x}")
x -> PyPlot.LaTeXStrings.latexstring("e^{$x}")
else
string
end
@@ -209,7 +187,7 @@ end
function py_mask_nans(z)
# pynp["ma"][:masked_invalid](z)))
PyCall.pycall(pynp."ma"."masked_invalid", Any, z)
PyPlot.PyCall.pycall(pynp."ma"."masked_invalid", Any, z)
# pynp["ma"][:masked_where](pynp["isnan"](z),z)
end
@@ -229,11 +207,6 @@ function fix_xy_lengths!(plt::Plot{PyPlotBackend}, series::Series)
end
end
py_linecolor(series::Series) = py_color(series[:linecolor])
py_markercolor(series::Series) = py_color(series[:markercolor])
py_markerstrokecolor(series::Series) = py_color(series[:markerstrokecolor])
py_fillcolor(series::Series) = py_color(series[:fillcolor])
py_linecolormap(series::Series) = py_colormap(series[:linecolor])
py_markercolormap(series::Series) = py_colormap(series[:markercolor])
py_fillcolormap(series::Series) = py_colormap(series[:fillcolor])
@@ -486,8 +459,8 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
:arrowstyle => "simple,head_length=$(a.headlength),head_width=$(a.headwidth)",
:shrinkA => 0,
:shrinkB => 0,
:edgecolor => py_linecolor(series),
:facecolor => py_linecolor(series),
:edgecolor => py_color(get_linecolor(series)),
:facecolor => py_color(get_linecolor(series)),
:linewidth => py_thickness_scale(plt, get_linewidth(series)),
:linestyle => py_linestyle(st, get_linestyle(series)),
)
@@ -533,16 +506,19 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
handle = []
x,y = xyargs
shapes = series[:markershape]
msc = py_markerstrokecolor(series)
msc = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series))
lw = py_thickness_scale(plt, series[:markerstrokewidth])
for i=eachindex(y)
extrakw[:c] = _cycle(markercolor, i)
if series[:marker_z] !== nothing
extrakw[:c] = [py_color(get_markercolor(series, i), get_markercoloralpha(series, i))]
end
push!(handle, ax."scatter"(_cycle(x,i), _cycle(y,i);
label = series[:label],
zorder = series[:series_plotindex] + 0.5,
marker = py_marker(_cycle(shapes,i)),
s = py_thickness_scale(plt, _cycle(series[:markersize],i) .^ 2),
facecolors = py_color(get_markercolor(series, i), get_markercoloralpha(series, i)),
edgecolors = msc,
linewidths = lw,
extrakw...
@@ -582,7 +558,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
zorder = series[:series_plotindex] + 0.5,
marker = prev_marker,
s = cur_scale_list,
edgecolors = py_markerstrokecolor(series),
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)), # Do we need include i?
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
facecolors = cur_color_list,
extrakw...
@@ -603,7 +579,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
zorder = series[:series_plotindex] + 0.5,
marker = prev_marker,
s = cur_scale_list,
edgecolors = py_markerstrokecolor(series),
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
facecolors = cur_color_list,
extrakw...
@@ -618,7 +594,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
zorder = series[:series_plotindex] + 0.5,
marker = py_marker(series[:markershape]),
s = py_thickness_scale(plt, series[:markersize] .^ 2),
edgecolors = py_markerstrokecolor(series),
edgecolors = py_color(get_markerstrokecolor(series), get_markerstrokealpha(series)),
linewidths = py_thickness_scale(plt, series[:markerstrokewidth]),
extrakw...
)
@@ -632,7 +608,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
zorder = series[:series_plotindex],
gridsize = series[:bins],
linewidths = py_thickness_scale(plt, series[:linewidth]),
edgecolors = py_linecolor(series),
edgecolors = py_color(get_linecolor(series)),
cmap = py_fillcolormap(series), # applies to the pcolorfast object
extrakw...
)
@@ -705,7 +681,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
rstride = series[:stride][1],
cstride = series[:stride][2],
linewidth = py_thickness_scale(plt, series[:linewidth]),
edgecolor = py_linecolor(series),
edgecolor = py_color(get_linecolor(series)),
extrakw...
)
push!(handles, handle)
@@ -731,7 +707,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
zorder = series[:series_plotindex],
cmap = py_fillcolormap(series),
linewidth = py_thickness_scale(plt, series[:linewidth]),
edgecolor = py_linecolor(series),
edgecolor = py_color(get_linecolor(series)),
extrakw...
)
push!(handles, handle)
@@ -753,7 +729,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
end
handle = ax."imshow"(z;
zorder = series[:series_plotindex],
cmap = py_colormap(cgrad([:black, :white])),
cmap = py_colormap(cgrad(plot_color([:black, :white]))),
vmin = 0.0,
vmax = 1.0,
extent = (xmin-0.5, xmax+0.5, ymax+0.5, ymin-0.5)
@@ -939,7 +915,7 @@ function py_set_axis_colors(sp, ax, a::Axis)
spine."set_color"(py_color(a[:foreground_color_border]))
end
axissym = Symbol(a[:letter], :axis)
if PyCall.hasproperty(ax, axissym)
if PyPlot.PyCall.hasproperty(ax, axissym)
tickcolor = sp[:framestyle] in (:zerolines, :grid) ? py_color(plot_color(a[:foreground_color_grid], a[:gridalpha])) : py_color(a[:foreground_color_axis])
ax."tick_params"(axis=string(a[:letter]), which="both",
colors=tickcolor,
@@ -989,7 +965,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
# title
if sp[:title] != ""
loc = lowercase(string(sp[:title_location]))
loc = lowercase(string(sp[:titlelocation]))
func = if loc == "left"
:_left_title
elseif loc == "right"
@@ -1080,7 +1056,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
# axis attributes
for letter in (:x, :y, :z)
axissym = Symbol(letter, :axis)
PyCall.hasproperty(ax, axissym) || continue
PyPlot.PyCall.hasproperty(ax, axissym) || continue
axis = sp[axissym]
pyaxis = getproperty(ax, axissym)
if axis[:mirror] && letter != :z
@@ -1103,13 +1079,23 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
ticks[2][ticks[1] .== 0] .= ""
end
axis[:ticks] != :native ? py_set_ticks(ax, ticks, letter) : nothing
pyaxis."set_tick_params"(direction = axis[:tick_direction] == :out ? "out" : "in")
intensity = 0.5 # This value corresponds to scaling of other grid elements
pyaxis."set_tick_params"(direction = axis[:tick_direction] == :out ? "out" : "in", width=py_thickness_scale(plt, intensity))
getproperty(ax, Symbol("set_", letter, "label"))(axis[:guide])
if get(axis.plotattributes, :flip, false)
getproperty(ax, Symbol("invert_", letter, "axis"))()
end
pyaxis."label"."set_fontsize"(py_thickness_scale(plt, axis[:guidefontsize]))
pyaxis."label"."set_family"(axis[:guidefontfamily])
if (letter == :y && !RecipesPipeline.is3d(sp))
pyaxis."label"."set_rotation"(axis[:guidefontrotation] + 90)
else
pyaxis."label"."set_rotation"(axis[:guidefontrotation])
end
for lab in getproperty(ax, Symbol("get_", letter, "ticklabels"))()
lab."set_fontsize"(py_thickness_scale(plt, axis[:tickfontsize]))
lab."set_family"(axis[:tickfontfamily])
@@ -1126,6 +1112,35 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
else
pyaxis."grid"(false)
end
#
if axis[:minorticks] > 1
pyaxis."set_minor_locator"(PyPlot.matplotlib.ticker.AutoMinorLocator(axis[:minorticks]))
pyaxis."set_tick_params"(
which = "minor",
direction = axis[:tick_direction] == :out ? "out" : "in",
width=py_thickness_scale(plt, intensity))
end
if axis[:minorgrid]
if !(axis[:minorticks] > 1) # Check if ticks were already configured
ax."minorticks_on"()
end
pyaxis."set_tick_params"(
which = "minor",
direction = axis[:tick_direction] == :out ? "out" : "in",
width=py_thickness_scale(plt, intensity))
pyaxis."grid"(true,
which = "minor",
color = fgcolor,
linestyle = py_linestyle(:line, axis[:minorgridstyle]),
linewidth = py_thickness_scale(plt, axis[:minorgridlinewidth]),
alpha = axis[:minorgridalpha])
end
py_set_axis_colors(sp, ax, axis)
end
@@ -1249,43 +1264,44 @@ end
# -----------------------------------------------------------------
const _pyplot_legend_pos = KW(
:right => "right",
:left => "center left",
:top => "upper center",
:bottom => "lower center",
:bottomleft => "lower left",
:bottomright => "lower right",
:topright => "upper right",
:topleft => "upper left"
)
const _pyplot_legend_pos_outer = KW(
:outerright => "center left",
:outerleft => "right",
:outertop => "lower center",
:outerbottom => "upper center",
:outerbottomleft => "lower right",
:outerbottomright => "lower left",
:outertopright => "upper left",
:outertopleft => "upper right"
py_legend_pos(pos::Symbol) = get(
(
right = "right",
left = "center left",
top = "upper center",
bottom = "lower center",
bottomleft = "lower left",
bottomright = "lower right",
topright = "upper right",
topleft = "upper left",
outerright = "center left",
outerleft = "right",
outertop = "lower center",
outerbottom = "upper center",
outerbottomleft = "lower right",
outerbottomright = "lower left",
outertopright = "upper left",
outertopleft = "upper right",
),
pos,
"best",
)
py_legend_pos(pos::Symbol) = get(_pyplot_legend_pos, pos, get(_pyplot_legend_pos_outer, pos, "best"))
py_legend_pos(pos) = "lower left"
const _pyplot_legend_bbox_outer = KW(
:outerright => (1.0, 0.5, 0.0, 0.0),
:outerleft => (-0.15, 0.5, 0.0, 0.0),
:outertop => (0.5, 1.0, 0.0, 0.0),
:outerbottom => (0.5, -0.15, 0.0, 0.0),
:outerbottomleft => (-0.15, 0.0, 0.0, 0.0),
:outerbottomright => (1.0, 0.0, 0.0, 0.0),
:outertopright => (1.0, 1.0, 0.0, 0.0),
:outertopleft => (-0.15, 1.0, 0.0, 0.0)
py_legend_bbox(pos::Symbol) = get(
(
outerright = (1.0, 0.5, 0.0, 0.0),
outerleft = (-0.15, 0.5, 0.0, 0.0),
outertop = (0.5, 1.0, 0.0, 0.0),
outerbottom = (0.5, -0.15, 0.0, 0.0),
outerbottomleft = (-0.15, 0.0, 0.0, 0.0),
outerbottomright = (1.0, 0.0, 0.0, 0.0),
outertopright = (1.0, 1.0, 0.0, 0.0),
outertopleft = (-0.15, 1.0, 0.0, 0.0),
),
pos,
(0.0, 0.0, 1.0, 1.0),
)
py_legend_bbox(pos::Symbol) = get(_pyplot_legend_bbox_outer, pos, (0.0, 0.0, 1.0, 1.0))
py_legend_bbox(pos) = pos
function py_add_legend(plt::Plot, sp::Subplot, ax)
@@ -1298,25 +1314,29 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
if should_add_to_legend(series)
clims = get_clims(sp, series)
# add a line/marker and a label
push!(handles, if series[:seriestype] == :shape || series[:fillrange] !== nothing
pypatches."Patch"(
edgecolor = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
facecolor = py_color(single_color(get_fillcolor(series, clims)), get_fillalpha(series)),
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
linestyle = py_linestyle(series[:seriestype], get_linestyle(series))
)
elseif series[:seriestype] in (:path, :straightline, :scatter)
PyPlot.plt."Line2D"((0,1),(0,0),
color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
linestyle = py_linestyle(:path, get_linestyle(series)),
marker = py_marker(first(series[:markershape])),
markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)),
markerfacecolor = py_color(single_color(get_markercolor(series, clims)), get_markeralpha(series))
)
else
series[:serieshandle][1]
end)
push!(handles,
if series[:seriestype] == :shape || series[:fillrange] !== nothing
pypatches."Patch"(
edgecolor = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
facecolor = py_color(single_color(get_fillcolor(series, clims)), get_fillalpha(series)),
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
linestyle = py_linestyle(series[:seriestype], get_linestyle(series))
)
elseif series[:seriestype] in (:path, :straightline, :scatter)
PyPlot.plt."Line2D"((0,1),(0,0),
color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
linewidth = py_thickness_scale(plt, clamp(get_linewidth(series), 0, 5)),
linestyle = py_linestyle(:path, get_linestyle(series)),
marker = py_marker(_cycle(series[:markershape], 1)),
# markersize = py_thickness_scale(plt, series[:markersize]), # In case we decide that markersize needs to be scaled in the legend too
markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)),
markerfacecolor = py_color(single_color(get_markercolor(series, clims)), get_markeralpha(series)),
markeredgewidth = py_thickness_scale(plt, series[:markerstrokewidth])
)
else
series[:serieshandle][1]
end
)
push!(labels, series[:label])
end
end
@@ -1332,6 +1352,7 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
facecolor = py_color(sp[:background_color_legend]),
edgecolor = py_color(sp[:foreground_color_legend]),
framealpha = alpha(plot_color(sp[:background_color_legend])),
fancybox = false # makes the legend box square
)
frame = leg."get_frame"()
frame."set_linewidth"(py_thickness_scale(plt, 1))
@@ -1382,8 +1403,7 @@ end
_display(plt::Plot{PyPlotBackend}) = plt.o."show"()
const _pyplot_mimeformats = Dict(
for (mime, fmt) in (
"application/eps" => "eps",
"image/eps" => "eps",
"application/pdf" => "pdf",
@@ -1392,9 +1412,6 @@ const _pyplot_mimeformats = Dict(
"image/svg+xml" => "svg",
"application/x-tex" => "pgf"
)
for (mime, fmt) in _pyplot_mimeformats
@eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PyPlotBackend})
fig = plt.o
fig."canvas"."print_figure"(
+7 -9
View File
@@ -3,19 +3,17 @@
# don't warn on unsupported... there's just too many warnings!!
warnOnUnsupported_args(::UnicodePlotsBackend, plotattributes::KW) = nothing
warn_on_unsupported_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,
(
braille = UnicodePlots.BrailleCanvas,
ascii = UnicodePlots.AsciiCanvas,
block = UnicodePlots.BlockCanvas,
dot = UnicodePlots.DotCanvas,
density = UnicodePlots.DensityCanvas,
)
end
+1 -1
View File
@@ -752,7 +752,7 @@ end
@deprecate curve_points coords
coords(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, Base.range(range..., length=n))
coords(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, Base.range(first(range), stop=last(range), length=n))
# build a BezierCurve which leaves point p vertically upwards and arrives point q vertically upwards.
# may create a loop if necessary. Assumes the view is [0,1]
+20 -13
View File
@@ -74,7 +74,7 @@ const _examples = PlotExample[
rand(11, 4),
lab = "lines",
w = 3,
palette = :grays,
palette = cgrad(:grays),
fill = 0,
α = 0.6,
)
@@ -322,7 +322,7 @@ const _examples = PlotExample[
plot(
Plots.fakedata(100, 10),
layout = 4,
palette = [:grays :blues :heat :lightrainbow],
palette = cgrad.([:grays :blues :heat :lightrainbow]),
bg_inside = [:orange :pink :darkblue :black],
)
end
@@ -586,7 +586,7 @@ const _examples = PlotExample[
rand(100, 6),
layout = @layout([a b; c]),
title = ["A" "B" "C"],
title_location = :left,
titlelocation = :left,
left_margin = [20mm 0mm],
bottom_margin = 10px,
xrotation = 60,
@@ -986,21 +986,28 @@ const _examples = PlotExample[
]
# Some constants for PlotDocs and PlotReferenceImages
_animation_examples = [2, 30]
_animation_examples = [2, 31]
_backend_skips = Dict(
:gr => [25, 30],
:pyplot => [25, 30],
:pyplot => [2, 25, 30, 31],
:plotlyjs => [2, 21, 24, 25, 30, 31],
:plotly => [2, 21, 24, 25, 30, 31],
:pgfplots => [2, 5, 6, 10, 16, 20, 22, 23, 25, 28, 30, 31, 34, 37, 38, 39],
:pgfplotsx => [ 6, # images
10, # histogram2d
16, # pgfplots thinks the upper panel is too small
22, # contourf
23, # pie
32, # spy
38, # histogram2d
] )
:pgfplotsx => [
2, # animation
6, # images
10, # histogram2d
16, # pgfplots thinks the upper panel is too small
22, # contourf
23, # pie
25, # @df
30, # @df
31, # animation
32, # spy
38, # histogram2d
45, # wireframe
],
)
+90 -90
View File
@@ -1,54 +1,51 @@
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)
fn = addExtension(fn, "png")
io = open(fn, "w")
show(io, MIME("image/png"), plt)
close(io)
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)
fn = addExtension(fn, "svg")
io = open(fn, "w")
show(io, MIME("image/svg+xml"), plt)
close(io)
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)
fn = addExtension(fn, "pdf")
io = open(fn, "w")
show(io, MIME("application/pdf"), plt)
close(io)
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)
fn = addExtension(fn, "ps")
io = open(fn, "w")
show(io, MIME("application/postscript"), plt)
close(io)
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)
fn = addExtension(fn, "eps")
io = open(fn, "w")
show(io, MIME("image/eps"), plt)
close(io)
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)
fn = addExtension(fn, "tex")
io = open(fn, "w")
show(io, MIME("application/x-tex"), plt)
close(io)
end
tex(fn::AbstractString) = tex(current(), fn)
@@ -69,48 +66,39 @@ 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)
fn = addExtension(fn, "txt")
io = open(fn, "w")
show(io, MIME("text/plain"), plt)
close(io)
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
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 +109,28 @@ 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
fn, 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 +153,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 +169,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,7 +186,7 @@ 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}
function Base.showable(m::M, plt::P) where {M <: MIME, P <: Plot}
return hasmethod(_show, Tuple{IO, M, P})
end
@@ -205,21 +195,31 @@ function _display(plt::Plot)
end
# 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/plain",
"text/html",
"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.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) =
showjuno(io, MIME("text/html"), plt)
# default text/plain for all backends
_show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot) = show(io, plt)
@@ -258,25 +258,25 @@ function showjuno(io::IO, m, plt)
scale = minimum(jsize[i] / sz[i] for i in 1:2)
plt[:size] = [s * scale for s in sz]
plt[:dpi] = jratio*Plots.DPI
plt[:dpi] = jratio * Plots.DPI
plt[:thickness_scaling] *= scale
prepare_output(plt)
try
_showjuno(io, m, plt)
_showjuno(io, m, plt)
finally
plt[:size] = sz
plt[:dpi] = dpi
plt[:thickness_scaling] = thickness_scaling
plt[:size] = sz
plt[:dpi] = dpi
plt[:thickness_scaling] = thickness_scaling
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
+27 -20
View File
@@ -30,6 +30,7 @@ function _precompile_()
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}})
isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Base.UnitRange{Int64}})
isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font})
isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation, :color), Tuple{Symbol, Symbol, Int64, ColorTypes.RGBA{Float64}}}, typeof(Plots.gr_set_font), Plots.Font})
isdefined(Plots, Symbol("#heatmap##kw")) && precompile(Tuple{getfield(Plots, Symbol("#heatmap##kw")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int})
isdefined(Plots, Symbol("#histogram##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram##kw")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}})
isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}})
@@ -37,7 +38,10 @@ function _precompile_()
isdefined(Plots, Symbol("#hline!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#hline!##kw")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}})
isdefined(Plots, Symbol("#lens!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#lens!##kw")), NamedTuple{(:inset,), Tuple{Tuple{Int64, Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}}}}, typeof(Plots.lens!), Array{Int64, 1}, Int})
isdefined(Plots, Symbol("#pie##kw")) && precompile(Tuple{getfield(Plots, Symbol("#pie##kw")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int})
isdefined(Plots, Symbol("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Float64, Float64, Plots.PlotText})
isdefined(Plots, Symbol("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Float64, Float64, String})
isdefined(Plots, Symbol("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Int64, Float64, Plots.PlotText})
isdefined(Plots, Symbol("#plotly_annotation_dict##kw")) && precompile(Tuple{getfield(Plots, Symbol("#plotly_annotation_dict##kw")), NamedTuple{(:xref, :yref), Tuple{String, String}}, typeof(Plots.plotly_annotation_dict), Int64, Float64, String})
isdefined(Plots, Symbol("#portfoliocomposition##kw")) && precompile(Tuple{getfield(Plots, Symbol("#portfoliocomposition##kw")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int})
isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int})
isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}})
@@ -53,13 +57,14 @@ function _precompile_()
precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}})
precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, RecipesPipeline.DefaultsDict})
precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.PlotlyBackend}, Plots.Subplot{Plots.PlotlyBackend}, RecipesPipeline.DefaultsDict})
precompile(Tuple{typeof(Plots._as_gradient), PlotUtils.ContinuousColorGradient})
precompile(Tuple{typeof(Plots._backend_instance), Symbol})
precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}})
precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol})
precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String})
precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String})
precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String})
precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String})
precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ContinuousColorGradient, 1}, String})
precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String})
precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.PlotlyBackend}})
@@ -73,7 +78,6 @@ function _precompile_()
precompile(Tuple{typeof(Plots._cycle), Base.OneTo{Int64}, Array{Int64, 1}})
precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64})
precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Array{Int64, 1}})
precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64})
precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64})
precompile(Tuple{typeof(Plots._cycle), Float64, Int64})
precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}})
@@ -81,6 +85,8 @@ function _precompile_()
precompile(Tuple{typeof(Plots._cycle), Nothing, Array{Int64, 1}})
precompile(Tuple{typeof(Plots._cycle), Nothing, Base.UnitRange{Int64}})
precompile(Tuple{typeof(Plots._cycle), Nothing, Int64})
precompile(Tuple{typeof(Plots._cycle), PlotUtils.ColorPalette, Int64})
precompile(Tuple{typeof(Plots._cycle), PlotUtils.ContinuousColorGradient, Int64})
precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64})
precompile(Tuple{typeof(Plots._cycle), Plots.Subplot{Plots.GRBackend}, Int64})
precompile(Tuple{typeof(Plots._cycle), Plots.Subplot{Plots.PlotlyBackend}, Int64})
@@ -217,7 +223,6 @@ function _precompile_()
precompile(Tuple{typeof(Plots.arrow), Int64})
precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol})
precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol})
precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64})
precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64})
precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.axis_drawing_info_3d), Plots.Subplot{Plots.GRBackend}})
@@ -307,11 +312,13 @@ function _precompile_()
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.PlotlyBackend}, Plots.Series})
precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.get_colorgradient), Plots.Series})
precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64})
precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series})
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64})
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64})
precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}})
precompile(Tuple{typeof(Plots.get_gradient), PlotUtils.ContinuousColorGradient})
precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64})
precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series})
precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64})
@@ -329,12 +336,13 @@ function _precompile_()
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}})
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}})
precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Int64, 1}, Array{String, 1}}})
precompile(Tuple{typeof(Plots.get_plotly_marker), Symbol, String})
precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ContinuousColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ContinuousColorGradient, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.PlotlyBackend}, Int64, Symbol})
precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}})
@@ -372,12 +380,13 @@ function _precompile_()
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}, Tuple{Float64, Float64}})
precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64})
precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series})
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64})
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64})
precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Int64, 1}, Array{String, 1}}, Int64})
precompile(Tuple{typeof(Plots.gr_getcolorind), ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String})
precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64})
precompile(Tuple{typeof(Plots.gr_linetype), Symbol})
precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)})
precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}})
@@ -385,19 +394,18 @@ function _precompile_()
precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font})
precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient})
precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ContinuousColorGradient})
precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series})
precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient})
precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient})
precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ContinuousColorGradient})
precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ContinuousColorGradient})
precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}})
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64})
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Int64})
precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing})
precompile(Tuple{typeof(Plots.gr_set_transparency), Float64})
precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.gr_set_viewport_polar)})
precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}})
@@ -408,7 +416,6 @@ function _precompile_()
precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series})
precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}})
precompile(Tuple{typeof(Plots.gr_w3tondc), Float64, Float64, Float64})
precompile(Tuple{typeof(Plots.gr_w3tondc), Int64, Float64, Float64})
precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.guide_padding), Plots.Axis})
@@ -418,6 +425,7 @@ function _precompile_()
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol})
precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol})
precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series})
precompile(Tuple{typeof(Plots.has_black_border_for_default), Symbol})
precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol})
@@ -450,22 +458,15 @@ function _precompile_()
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}})
precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Measures.BoundingBox{Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}, Tuple{Measures.Length{:w, Float64}, Measures.Length{:h, Float64}}}}})
precompile(Tuple{typeof(Plots.is_axis_attr), Symbol})
precompile(Tuple{typeof(Plots.is_axis_attr_noletter), Symbol})
precompile(Tuple{typeof(Plots.is_default_attribute), Symbol})
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol})
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.PlotlyBackend, Symbol})
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape})
precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke})
precompile(Tuple{typeof(Plots.is_marker_supported), Symbol})
precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol})
precompile(Tuple{typeof(Plots.is_scale_supported), Plots.PlotlyBackend, Symbol})
precompile(Tuple{typeof(Plots.is_series_attr), Symbol})
precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol})
precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.PlotlyBackend, Symbol})
precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol})
precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol})
precompile(Tuple{typeof(Plots.is_style_supported), Plots.PlotlyBackend, Symbol})
precompile(Tuple{typeof(Plots.is_subplot_attr), Symbol})
precompile(Tuple{typeof(Plots.is_uniformly_spaced), Array{Float64, 1}})
precompile(Tuple{typeof(Plots.iscontour), Plots.Series})
precompile(Tuple{typeof(Plots.isijulia)})
@@ -499,7 +500,6 @@ function _precompile_()
precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}})
precompile(Tuple{typeof(Plots.like_histogram), Symbol})
precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol})
precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis})
precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis})
@@ -508,6 +508,7 @@ function _precompile_()
precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.PlotlyBackend}, Symbol})
precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol})
precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText})
precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.PlotlyBackend}, Int64, Float64, Plots.PlotText})
precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}})
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Array{Float64, 1}})
precompile(Tuple{typeof(Plots.make_fillrange_side), Base.UnitRange{Int64}, Base.LinRange{Float64}})
@@ -536,7 +537,9 @@ function _precompile_()
precompile(Tuple{typeof(Plots.plotly_apply_aspect_ratio), Plots.Subplot{Plots.PlotlyBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Array{Float64, 1}})
precompile(Tuple{typeof(Plots.plotly_axis), Plots.Plot{Plots.PlotlyBackend}, Plots.Axis, Plots.Subplot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.plotly_colorbar_hack), Plots.Series, Base.Dict{Symbol, Any}, Symbol})
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ColorGradient, Nothing})
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.CategoricalColorGradient, Int64})
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ContinuousColorGradient, Int64})
precompile(Tuple{typeof(Plots.plotly_colorscale), PlotUtils.ContinuousColorGradient, Nothing})
precompile(Tuple{typeof(Plots.plotly_data), Array{Float64, 1}})
precompile(Tuple{typeof(Plots.plotly_data), Array{Int64, 1}})
precompile(Tuple{typeof(Plots.plotly_data), Array{String, 1}})
@@ -644,6 +647,7 @@ function _precompile_()
precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Array{Float64, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Array{PlotUtils.ContinuousColorGradient, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64})
precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64})
@@ -677,6 +681,9 @@ function _precompile_()
precompile(Tuple{typeof(Plots.text_size), Int64, Int64, Int64})
precompile(Tuple{typeof(Plots.tick_padding), Plots.Subplot{Plots.PlotlyBackend}, Plots.Axis})
precompile(Tuple{typeof(Plots.tickfont), Plots.Axis})
precompile(Tuple{typeof(Plots.ticksType), Tuple{Array{Float64, 1}, Array{Any, 1}}})
precompile(Tuple{typeof(Plots.ticksType), Tuple{Array{Float64, 1}, Array{String, 1}}})
precompile(Tuple{typeof(Plots.ticksType), Tuple{Array{Int64, 1}, Array{String, 1}}})
precompile(Tuple{typeof(Plots.title!), String})
precompile(Tuple{typeof(Plots.title_padding), Plots.Subplot{Plots.PlotlyBackend}})
precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}})
+1 -1
View File
@@ -1019,7 +1019,7 @@ error_tuple(x::Tuple) = x
function error_coords(errorbar, errordata, otherdata...)
ed = Vector{float_extended_type(errordata)}(undef, 0)
od = [Float64[] for _ in otherdata]
od = [Vector{float_extended_type(odi)}(undef, 0) for odi in otherdata]
for (i, edi) in enumerate(errordata)
for (j, odj) in enumerate(otherdata)
odi = _cycle(odj, i)
+5 -4
View File
@@ -251,7 +251,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)
```
"""
@@ -272,7 +272,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])))
```
"""
@@ -438,8 +438,9 @@ julia> plot(1:10)
julia> annotate!([(7,3,"(7,3)"),(3,7,text("hey", 14, :left, :top, :green))])
```
"""
annotate!(anns...; kw...) = plot!(; annotation = collect(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...)
+9 -19
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
@@ -57,12 +47,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 +79,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 +87,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 +96,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
+29 -16
View File
@@ -1,8 +1,8 @@
function replace_image_with_heatmap(z::Array{T}) where T<:Colorant
n, m = size(z)
colors = ColorGradient(vec(z))
newz = reshape(range(0, stop=1, length=n*m), n, m)
colors = palette(vec(z))
newz = reshape(1:n*m, n, m)
newz, colors
end
@@ -130,11 +130,13 @@ _cycle(v::AVec, indices::AVec{Int}) = map(i -> _cycle(v,i), indices)
_cycle(v::AMat, indices::AVec{Int}) = map(i -> _cycle(v,i), indices)
_cycle(v, indices::AVec{Int}) = fill(v, length(indices))
_cycle(grad::ColorGradient, idx::Int) = _cycle(grad.colors, idx)
_cycle(grad::ColorGradient, indices::AVec{Int}) = _cycle(grad.colors, indices)
_cycle(cl::PlotUtils.AbstractColorList, idx::Int) = cl[mod1(idx, end)]
_cycle(cl::PlotUtils.AbstractColorList, idx::AVec{Int}) = cl[mod1.(idx, end)]
_as_gradient(grad::ColorGradient) = grad
_as_gradient(c::Colorant) = ColorGradient([c,c])
_as_gradient(grad) = grad
_as_gradient(v::AbstractVector{<:Colorant}) = cgrad(v)
_as_gradient(cp::ColorPalette) = cgrad(cp, categorical = true)
_as_gradient(c::Colorant) = cgrad([c, c])
makevec(v::AVec) = v
makevec(v::T) where {T} = T[v]
@@ -206,13 +208,6 @@ Base.first(x::Symbol) = x
sortedkeys(plotattributes::Dict) = sort(collect(keys(plotattributes)))
const _scale_base = Dict{Symbol, Real}(
:log10 => 10,
:log2 => 2,
:ln => ,
)
function _heatmap_edges(v::AVec, isedges::Bool = false)
length(v) == 1 && return v[1] .+ [-0.5, 0.5]
if isedges return v end
@@ -521,8 +516,7 @@ for comp in (:line, :fill, :marker)
if z === nothing
isa(c, ColorGradient) ? c : plot_color(_cycle(c, i))
else
grad = isa(c, ColorGradient) ? c : cgrad()
grad[clamp((_cycle(z, i) - cmin) / (cmax - cmin), 0, 1)]
get(get_gradient(c), z[i], (cmin, cmax))
end
end
@@ -540,9 +534,28 @@ for comp in (:line, :fill, :marker)
end
end
function get_colorgradient(series::Series)
st = series[:seriestype]
if st in (:surface, :heatmap) || isfilledcontour(series)
series[:fillcolor]
elseif st in (:contour, :wireframe)
series[:linecolor]
elseif series[:marker_z] !== nothing
series[:markercolor]
elseif series[:line_z] !== nothing
series[:linecolor]
elseif series[:fill_z] !== nothing
series[:fillcolor]
end
end
single_color(c, v = 0.5) = c
single_color(grad::ColorGradient, v = 0.5) = grad[v]
get_gradient(c) = cgrad()
get_gradient(cg::ColorGradient) = cg
get_gradient(cp::ColorPalette) = cgrad(cp, categorical = true)
function get_linewidth(series, i::Int = 1)
_cycle(series[:linewidth], i)
end
@@ -1071,7 +1084,7 @@ end
function shape_data(series, expansion_factor = 1)
sp = series[:subplot]
xl, yl = isvertical(series) ? (xlims(sp), ylims(sp)) : (ylims(sp), xlims(sp))
x, y = series[:x], series[:y]
x, y = copy(series[:x]), copy(series[:y])
factor = 100
for i in eachindex(x)
if x[i] == -Inf
+19 -18
View File
@@ -47,26 +47,27 @@ img_tol = is_ci() ? 1e-2 : Sys.islinux() ? 1e-3 : 0.1
## 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=img_tol, skip = Plots._backend_skips[:gr])
# end
#
# plotly()
# @testset "Plotly" begin
# image_comparison_facts(:plotly, tol=img_tol, skip = Plots._backend_skips[:plotlyjs])
# end
#
# pyplot()
# @testset "PyPlot" begin
# image_comparison_facts(:pyplot, tol=img_tol, skip = Plots._backend_skips[:pyplot])
# end
#
# pgfplotsx()
# @testset "PGFPlotsX" begin
# image_comparison_facts(:pgfplotsx, tol=img_tol, skip = Plots._backend_skips[:pgfplotsx])
# end
plotly()
@testset "Plotly" begin
image_comparison_facts(:plotly, tol=img_tol, skip = Plots._backend_skips[:plotlyjs])
end
# 10 Histogram2D
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 "Backends" begin
+4 -4
View File
@@ -71,7 +71,7 @@ end
pl = scatter!(
y,
zcolor = abs.(y .- 0.5),
m = (:heat, 0.8, Plots.stroke(1, :green)),
m = (:hot, 0.8, Plots.stroke(1, :green)),
ms = 10 * abs.(y .- 0.5) .+ 4,
lab = ["grad", "", "ient"],
)
@@ -84,7 +84,7 @@ end
@test marker.options["mark"] == "*"
@test marker.options["mark options"]["color"] ==
RGBA{Float64}(colorant"green", 0.8)
@test marker.options["mark options"]["line width"] == 1
@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))
@@ -122,7 +122,7 @@ end
plot(
Plots.fakedata(100, 10),
layout = 4,
palette = [:grays :blues :heat :lightrainbow],
palette = [:grays :blues :hot :rainbow],
bg_inside = [:orange :pink :darkblue :black],
)
end # testset
@@ -211,7 +211,7 @@ end
marker_z = ((x, y) -> begin
x + y
end),
color = :bluesreds,
color = :bwr,
legend = false,
)
plot(p1, p2)