Compare commits

...

70 Commits

Author SHA1 Message Date
Josef Heinen 4757bd89c0 Merge pull request #1249 from apalugniok/pgfplots-scaled-ticks
WIP: Fix scientific formatter for PGFPlots and GR. Fixes #1241
2018-01-10 19:05:13 +01:00
Michael Krabbe Borregaard 1e56bf939d Merge pull request #1347 from mkborregaard/master
update news for 0.14.3
2018-01-10 11:38:38 +01:00
Michael K. Borregaard dbd5ae46dd update news 2018-01-10 11:38:11 +01:00
Daniel Schwabeneder 7c6095b6e8 Merge pull request #1344 from daschw/heatmap-alpha
allow transparency in heatmaps (fix #1342)
2018-01-09 10:19:04 +02:00
Daniel Schwabeneder 04888646e7 fix gr 2018-01-08 13:50:16 +01:00
Daniel Schwabeneder f6ed3fbb76 allow transparency in heatmaps 2018-01-08 12:50:46 +01:00
Daniel Schwabeneder 7bf2918438 Merge pull request #1324 from wkearn/plotlyjs_rgba
Map rgba_string over :color vector and cycle through result
2018-01-08 12:44:47 +02:00
Daniel Schwabeneder 92fefc7089 Merge pull request #1340 from wkearn/framestyle_ticks
Add a check for ticks==nothing or false
2018-01-08 11:51:10 +02:00
Will Kearney e6df4d977d Add a check for ticks==nothing or false
Fixes #1336
2018-01-06 14:54:57 -05:00
Andrew Palugniok 62ca787e6e Fix scientific formatter for GR and PGFPlots. 2017-12-23 00:35:44 +00:00
Andrew Palugniok 32d59fff61 Turn off scaled ticks for PGFPlots. 2017-12-22 23:29:50 +00:00
Andrew Palugniok 1949b6fe0f Merge pull request #1330 from apalugniok/pyplot-alphaImages
Fix PyPlot ignoring alpha values of images. Fixes #1131
2017-12-19 14:19:32 +00:00
Andrew Palugniok 95a5b5025a Fix PyPlot ignoring alpha values of images 2017-12-19 12:05:11 +00:00
Daniel Schwabeneder aa22fd2ff2 Merge pull request #1328 from daschw/gr-grid3d
fix gr 3d grid appearance
2017-12-18 22:57:47 +01:00
Daniel Schwabeneder 50df9a70c9 fix gr 3d grid appearance 2017-12-18 22:15:57 +01:00
Michael Krabbe Borregaard 6d88e150d0 Merge pull request #1327 from mkborregaard/master
Don't return false from abline!
2017-12-18 09:20:36 +01:00
Michael K. Borregaard b1817e513b Don't return false 2017-12-18 09:19:31 +01:00
Michael Krabbe Borregaard ce737a9491 Merge pull request #1326 from mkborregaard/master
Don't add `abline!` if outside plot window
2017-12-18 09:17:36 +01:00
Michael K. Borregaard 6ff4dce62a Don't add abline! if outside plot window 2017-12-18 09:16:51 +01:00
Will Kearney 89b5582d0d Map rgba_string over :color vector and cycle through result 2017-12-17 16:13:35 -05:00
Daniel Schwabeneder 09c5e8a375 Merge pull request #1323 from daschw/plottheme
Reduce number of ticks in heatmap in showtheme recipe
2017-12-17 17:21:18 +01:00
Daniel Schwabeneder a1a7dcd6b8 reduce tick number in heatmap plot 2017-12-17 17:04:05 +01:00
Daniel Schwabeneder d223d872fb Merge pull request #1322 from daschw/line_z
Fix line_z
2017-12-17 17:01:28 +01:00
Andrew Palugniok 91eaa32ad7 Merge pull request #1320 from apalugniok/pyplot-legend
Fix mismatched legend color when linecolor is given. Fixes #1319
2017-12-17 16:00:08 +00:00
Daniel Schwabeneder 6cdccf4353 add missing 'series' 2017-12-17 16:44:20 +01:00
Josef Heinen ac9aee97fd Merge pull request #1318 from jheinen/master
gr: improve PNG output (resolution)
2017-12-17 13:07:16 +01:00
Josef Heinen 5be95be9ae gr: improve PNG output (resolution) 2017-12-17 12:52:20 +01:00
Andrew Palugniok e402f5dfce Fix mismatched legend color when linecolor is given. 2017-12-16 20:11:11 +00:00
Michael Krabbe Borregaard 61be113714 Merge pull request #1317 from apalugniok/3d-marker_z
3D marker_z handling. Fixes #1205
2017-12-16 10:08:13 +01:00
Andrew Palugniok a637f43edd Only base clims on z values when series is colored by z. 2017-12-15 22:49:46 +00:00
Daniel Schwabeneder 4bb43887a4 Merge pull request #1314 from daschw/showtheme
update showtheme recipe
2017-12-15 14:04:19 +01:00
Daniel Schwabeneder 802b20be6f update showtheme recipe 2017-12-15 10:30:56 +01:00
Michael K. Borregaard 216a9c3666 reactivate precompilation 2017-12-15 09:24:00 +01:00
Michael K. Borregaard d52b2a9adc update news 2017-12-15 09:22:20 +01:00
Michael K. Borregaard 81782c3927 turn off precompilation 2017-12-15 09:18:37 +01:00
Michael Krabbe Borregaard 2c2ebbba0e Merge pull request #1313 from joshday/jd/fix-histogram
Fix plotly histogram
2017-12-15 09:15:06 +01:00
Josh Day 3d323a734d fix plotly histogram 2017-12-15 00:22:05 -05:00
Michael Krabbe Borregaard 93263a61b1 Merge pull request #1301 from JuliaPlots/sd/fixlines
fix JuliaGL/GLVisualize.jl#238
2017-12-15 05:04:38 +01:00
Michael Krabbe Borregaard 8b551e5285 Merge pull request #1311 from apalugniok/ribbons
Fix ribbons slicing for several series. Fixes #1302
2017-12-14 22:13:44 +01:00
Michael Krabbe Borregaard e11c91ddd9 Merge pull request #1308 from rdeits/line-z-example
add line_z and marker_z example
2017-12-14 22:05:30 +01:00
Andrew Palugniok 938c83533b Fix slicing of ribbons. 2017-12-14 19:25:59 +00:00
Daniel Schwabeneder 46136d616f Merge pull request #1310 from daschw/release
precompile on
2017-12-14 11:33:19 +01:00
Daniel Schwabeneder 8fe902e96c precompile on 2017-12-14 11:29:55 +01:00
Daniel Schwabeneder 2fb7dddffb Merge pull request #1309 from daschw/release
prepare release
2017-12-14 11:25:30 +01:00
Daniel Schwabeneder 5d1876ab6d precompile off 2017-12-14 11:03:52 +01:00
Daniel Schwabeneder 1aa4e7eee6 update news.md 2017-12-14 11:02:59 +01:00
Daniel Schwabeneder 995e12bd57 Merge pull request #1279 from daschw/plottheme
New PlotTheme type
2017-12-14 09:38:49 +01:00
Robin Deits 349b6e8254 fix typo 2017-12-13 18:59:15 -05:00
Robin Deits ee6dbb9ac7 add line_z and marker_z example 2017-12-13 18:55:48 -05:00
Daniel Schwabeneder 5b85cd83f2 Merge pull request #1307 from wkearn/pyplot_legend_style
Add linestyle argument to the legend
2017-12-13 22:27:59 +01:00
Will Kearney 1645c3f66b Add linestyle argument to the legend
This fixes #1305
2017-12-13 15:07:54 -05:00
Michael Krabbe Borregaard 084d45141d Merge pull request #1304 from joshday/jd/histogram
plotly: bar_width and stroke_width support for bar plots
2017-12-12 21:50:45 +01:00
Josh Day 50bec7a461 cleanup 2017-12-12 15:18:17 -05:00
Josh Day f80afddd8f add strokewidth and bar_width for plotly's bar 2017-12-12 15:15:12 -05:00
Andrew Palugniok 5d2c630b05 Merge pull request #1299 from apalugniok/gr-logticks
Fix default log scale ticks in GR backend. Fixes #1203
2017-12-12 17:37:07 +00:00
Andrew Palugniok f655b2313c Fix default log scale ticks in GR backend. 2017-12-12 16:45:26 +00:00
SimonDanisch 2a819c2849 fix JuliaGL/GLVisualize.jl#238 2017-12-11 12:34:21 +01:00
Michael Krabbe Borregaard 0ef13dcf7a Merge pull request #1300 from mkborregaard/master
RFC: abline! does not change axis limits; fix: #1297
2017-12-11 12:12:52 +01:00
Michael K. Borregaard 5e5f3c1e95 abline! does not change axis limits 2017-12-11 10:26:33 +01:00
Daniel Schwabeneder c76ca2dd6e add showtheme recipe 2017-12-11 09:27:02 +01:00
Daniel Schwabeneder ab490b8f95 Merge pull request #1295 from wkearn/font_bugfix
Use the :fontsize keys so the scalefontsizes command works
2017-12-08 09:52:17 +01:00
Will Kearney bd42d9e7cc Use the :fontsize labels so the scalefontsizes command works
Fixes #1294
2017-12-07 20:56:54 -05:00
Michael Krabbe Borregaard e3d8f4a223 Merge pull request #1291 from mkborregaard/postrelease
reactivate precompilation
2017-12-07 13:13:57 +01:00
Michael K. Borregaard 34567e1282 reactivate precompilation 2017-12-07 13:12:02 +01:00
Daniel Schwabeneder 0f3928ec9a fix kw support 2017-12-05 22:29:56 +01:00
Daniel Schwabeneder a8380334df fix kw support 2017-12-05 22:28:22 +01:00
Daniel Schwabeneder 70bead1eb1 support old PlotTheme type 2017-12-05 22:09:18 +01:00
Daniel Schwabeneder 22d8ecffe5 fix typo 2017-12-04 15:53:45 +01:00
Daniel Schwabeneder b987331b4f update new heme() function 2017-12-04 14:54:35 +01:00
Daniel Schwabeneder 899afd625a add new heme() function 2017-12-04 09:16:00 +01:00
16 changed files with 338 additions and 70 deletions
+26
View File
@@ -11,6 +11,32 @@
---
## (current master)
## 0.14.3
- improve resolution of png output of GR with savefig()
- add check for ticks=nothing
- allow transparency in heatmaps
- fix line_z for GR
- fix legendcolor for pyplot
- fix pyplot ignoring alpha values of images
- don't let `abline!` change subplot limits
- update showtheme recipe
## 0.14.2
- fix plotly bar lines bug
- allow passing multiple series to `ribbon`
- add a new example for `line_z`
## 0.14.1
- Add linestyle argument to the legend
- Plotly: bar_width and stroke_width support for bar plots
- abline! does not change axis limits
- Fix default log scale ticks in GR backend
- Use the :fontsize keys so the scalefontsizes command works
- Prepare support for new PlotTheme type in PlotThemes
## 0.14.0
- remove use of imagemagick; saving gifs now requires ffmpeg
+1 -1
View File
@@ -1,4 +1,4 @@
__precompile__(false)
__precompile__(true)
module Plots
+9 -5
View File
@@ -417,12 +417,13 @@ const _all_defaults = KW[
]
const _initial_defaults = deepcopy(_all_defaults)
const _initial_axis_defaults = deepcopy(_axis_defaults)
# to be able to reset font sizes to initial values
const _initial_fontsizes = Dict(:titlefont => _subplot_defaults[:titlefontsize],
:legendfont => _subplot_defaults[:legendfontsize],
:tickfont => _axis_defaults[:tickfontsize],
:guidefont => _axis_defaults[:guidefontsize])
const _initial_fontsizes = Dict(:titlefontsize => _subplot_defaults[:titlefontsize],
:legendfontsize => _subplot_defaults[:legendfontsize],
:tickfontsize => _axis_defaults[:tickfontsize],
:guidefontsize => _axis_defaults[:guidefontsize])
const _all_args = sort(collect(union(map(keys, _all_defaults)...)))
@@ -616,7 +617,10 @@ function default(d::KW, k::Symbol)
get(d, k, default(k))
end
reset_defaults() = foreach(merge!, _all_defaults, _initial_defaults)
function reset_defaults()
foreach(merge!, _all_defaults, _initial_defaults)
merge!(_axis_defaults, _initial_axis_defaults)
end
# -----------------------------------------------------------------------------
+2 -2
View File
@@ -552,7 +552,7 @@ function axis_drawing_info(sp::Subplot)
end
push!(xaxis_segs, (xmin, y1), (xmax, y1))
# don't show the 0 tick label for the origin framestyle
if sp[:framestyle] == :origin && length(xticks) > 1
if sp[:framestyle] == :origin && !(xticks in (nothing,false)) && length(xticks) > 1
showticks = xticks[1] .!= 0
xticks = (xticks[1][showticks], xticks[2][showticks])
end
@@ -591,7 +591,7 @@ function axis_drawing_info(sp::Subplot)
end
push!(yaxis_segs, (x1, ymin), (x1, ymax))
# don't show the 0 tick label for the origin framestyle
if sp[:framestyle] == :origin && length(yticks) > 1
if sp[:framestyle] == :origin && !(yticks in (nothing,false)) && length(yticks) > 1
showticks = yticks[1] .!= 0
yticks = (yticks[1][showticks], yticks[2][showticks])
end
+4 -4
View File
@@ -336,7 +336,7 @@ end
function extract_stroke(d, kw_args)
extract_c(d, kw_args, :line)
if haskey(d, :linewidth)
kw_args[:thickness] = d[:linewidth] * 3
kw_args[:thickness] = Float32(d[:linewidth] * 3)
end
end
@@ -404,7 +404,7 @@ function extract_linestyle(d, kw_args)
haskey(d, :linestyle) || return
ls = d[:linestyle]
lw = d[:linewidth]
kw_args[:thickness] = lw
kw_args[:thickness] = Float32(lw)
if ls == :dash
points = [0.0, lw, 2lw, 3lw, 4lw]
insert_pattern!(points, kw_args)
@@ -576,7 +576,7 @@ function draw_grid_lines(sp, grid_segs, thickness, style, model, color)
)
d = Dict(
:linestyle => style,
:linewidth => thickness,
:linewidth => Float32(thickness),
:linecolor => color
)
Plots.extract_linestyle(d, kw_args)
@@ -1350,7 +1350,7 @@ function gl_surface(x,y,z, kw_args)
end
color = get(kw_args, :stroke_color, RGBA{Float32}(0,0,0,1))
kw_args[:color] = color
kw_args[:thickness] = get(kw_args, :stroke_width, 1f0)
kw_args[:thickness] = Float32(get(kw_args, :stroke_width, 1f0))
kw_args[:indices] = faces
delete!(kw_args, :stroke_color)
delete!(kw_args, :stroke_width)
+57 -11
View File
@@ -222,6 +222,13 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot)
sinf = sind.(a)
cosf = cosd.(a)
rtick_values, rtick_labels = get_ticks(yaxis)
rtick_labels = if yaxis[:formatter] == :scientific && yaxis[:ticks] == :auto
rtick_labels = string.(convert_sci_unicode.(rtick_labels),"\\ ")
# unicode × messes up superscript alignment so add space to superscript
replace.(rtick_labels, "{", "{ ")
else
rtick_labels
end
#draw angular grid
if xaxis[:grid]
@@ -543,7 +550,7 @@ function gr_set_gradient(c)
end
# this is our new display func... set up the viewport_canvas, compute bounding boxes, and display each subplot
function gr_display(plt::Plot)
function gr_display(plt::Plot, fmt="")
GR.clearws()
# collect some monitor/display sizes in meters and pixels
@@ -554,17 +561,25 @@ function gr_display(plt::Plot)
# compute the viewport_canvas, normalized to the larger dimension
viewport_canvas = Float64[0,1,0,1]
w, h = plt[:size]
if !haskey(ENV, "PLOTS_TEST")
dpi_factor = plt[:dpi] / DPI
if fmt == "png"
dpi_factor *= 6
end
else
dpi_factor = 1
end
gr_plot_size[:] = [w, h]
if w > h
ratio = float(h) / w
msize = display_width_ratio * w
msize = display_width_ratio * w * dpi_factor
GR.setwsviewport(0, msize, 0, msize * ratio)
GR.setwswindow(0, 1, 0, ratio)
viewport_canvas[3] *= ratio
viewport_canvas[4] *= ratio
else
ratio = float(w) / h
msize = display_height_ratio * h
msize = display_height_ratio * h * dpi_factor
GR.setwsviewport(0, msize * ratio, 0, msize)
GR.setwswindow(0, ratio, 0, 1)
viewport_canvas[1] *= ratio
@@ -780,10 +795,23 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
ztick = GR.tick(zmin, zmax) / 2
ticksize = 0.01 * (viewport_plotarea[2] - viewport_plotarea[1])
# GR.setlinetype(GR.LINETYPE_DOTTED)
xaxis[:grid] && GR.grid3d(xtick, 0, 0, xmin, ymax, zmin, 2, 0, 0)
yaxis[:grid] && GR.grid3d(0, ytick, 0, xmin, ymax, zmin, 0, 2, 0)
zaxis[:grid] && GR.grid3d(0, 0, ztick, xmin, ymax, zmin, 0, 0, 2)
if xaxis[:grid]
gr_set_line(xaxis[:gridlinewidth], xaxis[:gridstyle], xaxis[:foreground_color_grid])
GR.settransparency(xaxis[:gridalpha])
GR.grid3d(xtick, 0, 0, xmin, ymax, zmin, 2, 0, 0)
end
if yaxis[:grid]
gr_set_line(yaxis[:gridlinewidth], yaxis[:gridstyle], yaxis[:foreground_color_grid])
GR.settransparency(yaxis[:gridalpha])
GR.grid3d(0, ytick, 0, xmin, ymax, zmin, 0, 2, 0)
end
if zaxis[:grid]
gr_set_line(zaxis[:gridlinewidth], zaxis[:gridstyle], zaxis[:foreground_color_grid])
GR.settransparency(zaxis[:gridalpha])
GR.grid3d(0, 0, ztick, xmin, ymax, zmin, 0, 0, 2)
end
gr_set_line(1, :solid, xaxis[:foreground_color_axis])
GR.settransparency(1)
GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize)
GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize)
@@ -860,7 +888,16 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
# use xor ($) to get the right y coords
xi, yi = GR.wctondc(cv, sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? ymax : ymin)
# @show cv dv ymin xi yi flip mirror (flip $ mirror)
gr_text(xi, yi + (mirror ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0), string(dv))
# ensure correct dispatch in gr_text for automatic log ticks
dv = if xaxis[:scale] in (:ln, :log10, :log2) && xaxis[:ticks] == :auto
string(dv, "\\ ")
elseif xaxis[:formatter] == :scientific && xaxis[:ticks] == :auto
# unicode × messes up superscript alignment so add space to superscript
string(replace(convert_sci_unicode(dv), "{", "{ "), "\\ ")
else
string(dv)
end
gr_text(xi, yi + (mirror ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0), dv)
end
end
@@ -871,7 +908,16 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
# use xor ($) to get the right y coords
xi, yi = GR.wctondc(sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? xmax : xmin, cv)
# @show cv dv xmin xi yi
gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv))
# ensure correct dispatch in gr_text for automatic log ticks
dv = if yaxis[:scale] in (:ln, :log10, :log2) && yaxis[:ticks] == :auto
string(dv, "\\ ")
elseif yaxis[:formatter] == :scientific && yaxis[:ticks] == :auto
# unicode × messes up superscript alignment so add space to superscript
string(replace(convert_sci_unicode(dv), "{", "{ "), "\\ ")
else
string(dv)
end
gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, dv)
end
end
@@ -1057,7 +1103,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
zmin, zmax = clims
GR.setspace(zmin, zmax, 0, 90)
grad = isa(series[:fillcolor], ColorGradient) ? series[:fillcolor] : cgrad()
colors = [grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)] for zi=z]
colors = [plot_color(grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)], series[:fillalpha]) for zi=z]
rgba = map(c -> UInt32( round(Int, alpha(c) * 255) << 24 +
round(Int, blue(c) * 255) << 16 +
round(Int, green(c) * 255) << 8 +
@@ -1331,7 +1377,7 @@ for (mime, fmt) in _gr_mimeformats
env = get(ENV, "GKSwstype", "0")
ENV["GKSwstype"] = $fmt
ENV["GKS_FILEPATH"] = filepath
gr_display(plt)
gr_display(plt, $fmt)
GR.emergencyclosegks()
write(io, readstring(filepath))
rm(filepath)
+5
View File
@@ -272,6 +272,9 @@ function pgf_axis(sp::Subplot, letter)
style = []
kw = KW()
# turn off scaled ticks
push!(style, "scaled $(letter) ticks = false")
# set to supported framestyle
framestyle = pgf_framestyle(sp[:framestyle])
@@ -326,6 +329,7 @@ function pgf_axis(sp::Subplot, letter)
push!(style, string(letter, "ticklabels = {\$", join(tick_labels,"\$,\$"), "\$}"))
elseif axis[:showaxis]
tick_labels = ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2]
tick_labels = axis[:formatter] == :scientific ? string.("\$", convert_sci_unicode.(tick_labels), "\$") : tick_labels
push!(style, string(letter, "ticklabels = {", join(tick_labels,","), "}"))
else
push!(style, string(letter, "ticklabels = {}"))
@@ -497,6 +501,7 @@ end
function _display(plt::Plot{PGFPlotsBackend})
# prepare the object
PGFPlots.pushPGFPlotsPreamble("\\usepackage{fontspec}")
pgfplt = PGFPlots.plot(plt.o)
# save an svg
+8 -6
View File
@@ -259,7 +259,7 @@ function plotly_axis(axis::Axis, sp::Subplot)
ax[:tickangle] = -axis[:rotation]
lims = axis_limits(axis)
ax[:range] = map(scalefunc(axis[:scale]), lims)
if !(axis[:ticks] in (nothing, :none))
ax[:titlefont] = plotly_font(guidefont(axis))
ax[:type] = plotly_scale(axis[:scale])
@@ -289,7 +289,7 @@ function plotly_axis(axis::Axis, sp::Subplot)
ax[:showgrid] = false
end
ax
end
@@ -430,7 +430,7 @@ end
function plotly_colorscale(grad::ColorGradient, α)
[[grad.values[i], rgb_string(grad.colors[i])] for i in 1:length(grad.colors)]
[[grad.values[i], rgba_string(plot_color(grad.colors[i], α))] for i in 1:length(grad.colors)]
end
plotly_colorscale(c, α) = plotly_colorscale(cgrad(alpha=α), α)
# plotly_colorscale(c, alpha = nothing) = plotly_colorscale(cgrad(), alpha)
@@ -541,7 +541,9 @@ function plotly_series(plt::Plot, series::Series)
else
y, x, "h"
end
d_out[:marker] = KW(:color => rgba_string(series[:fillcolor]))
d_out[:width] = series[:bar_width]
d_out[:marker] = KW(:color => _cycle(rgba_string.(series[:fillcolor]),eachindex(series[:x])),
:line => KW(:width => series[:linewidth]))
elseif st == :heatmap
d_out[:type] = "heatmap"
@@ -608,14 +610,14 @@ function plotly_series(plt::Plot, series::Series)
:size => 2 * series[:markersize],
# :color => rgba_string(series[:markercolor]),
:line => KW(
:color => rgba_string(series[:markerstrokecolor]),
:color => _cycle(rgba_string.(series[:markerstrokecolor]),eachindex(series[:x])),
:width => series[:markerstrokewidth],
),
)
# gotta hack this (for now?) since plotly can't handle rgba values inside the gradient
if series[:marker_z] == nothing
d_out[:marker][:color] = rgba_string(series[:markercolor])
d_out[:marker][:color] = _cycle(rgba_string.(series[:markercolor]),eachindex(series[:x]))
else
# grad = ColorGradient(series[:markercolor], alpha=series[:markeralpha])
# grad = as_gradient(series[:markercolor], series[:markeralpha])
+4 -2
View File
@@ -736,7 +736,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
z = if eltype(img) <: Colors.AbstractGray
float(img)
elseif eltype(img) <: Colorant
map(c -> Float64[red(c),green(c),blue(c)], img)
map(c -> Float64[red(c),green(c),blue(c),alpha(c)], img)
else
z # hopefully it's in a data format that will "just work" with imshow
end
@@ -768,6 +768,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
label = series[:label],
zorder = series[:series_plotindex],
cmap = py_fillcolormap(series),
alpha = series[:fillalpha],
# edgecolors = (series[:linewidth] > 0 ? py_linecolor(series) : "face"),
extrakw...
)
@@ -1234,8 +1235,9 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
)
elseif series[:seriestype] == :path
PyPlot.plt[:Line2D]((0,1),(0,0),
color = py_color(_cycle(series[:fillcolor],1)),
color = py_color(_cycle(series[:linecolor],1)),
linewidth = py_dpi_scale(plt, clamp(series[:linewidth], 0, 5)),
linestyle = py_linestyle(:path,series[:linestyle]),
marker = py_marker(series[:markershape]),
markeredgecolor = py_markerstrokecolor(series),
markerfacecolor = py_markercolor(series)
+4 -4
View File
@@ -305,7 +305,7 @@ end
function scalefontsize(k::Symbol, factor::Number)
f = default(k)
f.pointsize = round(Int, factor * f.pointsize)
f = round(Int, factor * f)
default(k, f)
end
@@ -315,7 +315,7 @@ end
Scales all **current** font sizes by `factor`. For example `scalefontsizes(1.1)` increases all current font sizes by 10%. To reset to initial sizes, use `scalefontsizes()`
"""
function scalefontsizes(factor::Number)
for k in (:titlefont, :guidefont, :tickfont, :legendfont)
for k in (:titlefontsize, :guidefontsize, :tickfontsize, :legendfontsize)
scalefontsize(k, factor)
end
end
@@ -326,10 +326,10 @@ end
Resets font sizes to initial default values.
"""
function scalefontsizes()
for k in (:titlefont, :guidefont, :tickfont, :legendfont)
for k in (:titlefontsize, :guidefontsize, :tickfontsize, :legendfontsize)
f = default(k)
if k in keys(_initial_fontsizes)
factor = f.pointsize / _initial_fontsizes[k]
factor = f / _initial_fontsizes[k]
scalefontsize(k, 1.0/factor)
end
end
+16
View File
@@ -416,6 +416,22 @@ attribute. The default framestyle is `:axes`.
end)]
),
PlotExample("Lines and markers with varying colors",
"""
You can use the `line_z` and `marker_z` properties to associate a color with
each line segment or marker in the plot.
""",
[:(begin
t = linspace(0, 1, 100)
θ = 6π .* t
x = t .* cos.(θ)
y = t .* sin.(θ)
p1 = plot(x, y, line_z=t, linewidth=3, legend=false)
p2 = scatter(x, y, marker_z=t, color=:bluesreds, legend=false)
plot(p1, p2)
end)]
),
]
# ---------------------------------------------------------------------------------
+8 -2
View File
@@ -985,9 +985,15 @@ end
# -------------------------------------------------
"Adds a+bx... straight line over the current plot"
"Adds a+bx... straight line over the current plot, without changing the axis limits"
function abline!(plt::Plot, a, b; kw...)
plot!(plt, [ignorenan_extrema(plt)...], x -> b + a*x; kw...)
xl, yl = xlims(plt), ylims(plt)
x1, x2 = max(xl[1], (yl[1] - b)/a), min(xl[2], (yl[2] - b)/a)
if x2 > x1
plot!(plt, x -> b + a*x, x1, x2; kw...)
else
nothing
end
end
abline!(args...; kw...) = abline!(current(), args...; kw...)
+12
View File
@@ -140,6 +140,14 @@ struct SliceIt end
end
mf = length(fillranges)
rib = pop!(plotattributes, :ribbon, nothing)
ribbons, _ = if typeof(rib) <: Number
([fr],nothing)
else
convertToAnyVector(rib, plotattributes)
end
mr = length(ribbons)
# @show zs
mx = length(xs)
@@ -156,6 +164,10 @@ struct SliceIt end
fr = fillranges[mod1(i,mf)]
di[:fillrange] = isa(fr, Function) ? map(fr, di[:x]) : fr
# handle ribbons
rib = ribbons[mod1(i,mr)]
di[:ribbon] = isa(rib, Function) ? map(rib, di[:x]) : rib
push!(series_list, RecipeData(di, ()))
end
end
+154 -32
View File
@@ -4,43 +4,165 @@
Specify the colour theme for plots.
"""
function theme(s::Symbol; kw...)
# reset?
if s == :none || s == :default
PlotUtils.clibrary(:Plots)
PlotUtils.default_cgrad(default = :sequential, sequential = :inferno)
default(;
bg = :white,
bglegend = :match,
bginside = :match,
bgoutside = :match,
fg = :auto,
fglegend = :match,
fggrid = :match,
fgaxis = :match,
fgtext = :match,
fgborder = :match,
fgguide = :match,
palette = :auto
)
return
end
defaults = _get_defaults(s)
_theme(s, defaults; kw...)
end
# update the default gradient and other defaults
function _get_defaults(s::Symbol)
thm = PlotThemes._themes[s]
if thm.gradient != nothing
if :defaults in fieldnames(thm)
return thm.defaults
else # old PlotTheme type
defaults = KW(
:bg => thm.bg_secondary,
:bginside => thm.bg_primary,
:fg => thm.lines,
:fgtext => thm.text,
:fgguide => thm.text,
:fglegend => thm.text,
:palette => thm.palette,
)
if thm.gradient != nothing
push!(defaults, :gradient => thm.gradient)
end
return defaults
end
end
function _theme(s::Symbol, defaults::KW; kw...)
# Reset to defaults to overwrite active theme
reset_defaults()
# Set the theme's gradient as default
if haskey(defaults, :gradient)
PlotUtils.clibrary(:misc)
PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s))
else
PlotUtils.clibrary(:Plots)
PlotUtils.default_cgrad(default = :sequential, sequential = :inferno)
end
default(;
bg = thm.bg_secondary,
bginside = thm.bg_primary,
fg = thm.lines,
fgtext = thm.text,
fgguide = thm.text,
fglegend = thm.text,
palette = thm.palette,
kw...
)
# maybe overwrite the theme's gradient
kw = KW(kw)
if haskey(kw, :gradient)
kwgrad = pop!(kw, :gradient)
for clib in clibraries()
if kwgrad in cgradients(clib)
PlotUtils.clibrary(clib)
PlotUtils.default_cgrad(default = :sequential, sequential = kwgrad)
break
end
end
end
# Set the theme's defaults
default(; defaults..., kw...)
return
end
@deprecate set_theme(s) theme(s)
@userplot ShowTheme
_color_functions = KW(
:protanopic => protanopic,
:deuteranopic => deuteranopic,
:tritanopic => tritanopic,
)
_get_showtheme_args(thm::Symbol) = thm, identity
_get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func, identity)
@recipe function showtheme(st::ShowTheme)
thm, cfunc = _get_showtheme_args(st.args...)
defaults = _get_defaults(thm)
# get the gradient
gradient_colors = get(defaults, :gradient, cgrad(:inferno).colors)
gradient = cgrad(cfunc.(RGB.(gradient_colors)))
# get the palette
palette = get(defaults, :palette, get_color_palette(:auto, plot_color(:white), 17))
palette = cfunc.(RGB.(palette))
# apply the theme
for k in keys(defaults)
k in (:gradient, :palette) && continue
def = defaults[k]
arg = get(_keyAliases, k, k)
plotattributes[arg] = if typeof(def) <: Colorant
cfunc(RGB(def))
elseif eltype(def) <: Colorant
cfunc.(RGB.(def))
elseif contains(string(arg), "color")
cfunc.(RGB.(plot_color.(def)))
else
def
end
end
srand(1)
label := ""
colorbar := false
layout := (2, 3)
for j in 1:4
@series begin
subplot := 1
palette := palette
seriestype := :path
cumsum(randn(50))
end
@series begin
subplot := 2
seriestype := :scatter
palette := palette
marker := (:circle, :diamond, :star5, :square)[j]
randn(10), randn(10)
end
end
@series begin
subplot := 3
seriestype := :histogram
palette := palette
randn(1000) .+ (0:2:4)'
end
f(r) = sin(r) / r
_norm(x, y) = norm([x, y])
x = y = linspace(-3π, 3π, 30)
z = f.(_norm.(x, y'))
wi = 2:3:30
@series begin
subplot := 4
seriestype := :heatmap
seriescolor := gradient
ticks := -5:5:5
x, y, z
end
@series begin
subplot := 5
seriestype := :surface
seriescolor := gradient
x, y, z
end
n = 100
ts = linspace(0, 10π, n)
x = ts .* cos.(ts)
y = (0.1ts) .* sin.(ts)
z = 1:n
@series begin
subplot := 6
seriescolor := gradient
linewidth := 3
line_z := z
x, y, z
end
end
+27 -1
View File
@@ -553,8 +553,9 @@ zlims(sp_idx::Int = 1) = zlims(current(), sp_idx)
function get_clims(sp::Subplot)
zmin, zmax = Inf, -Inf
z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface)
for series in series_list(sp)
for vals in (series[:z], series[:line_z], series[:marker_z], series[:fill_z])
for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z])
if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Real)
zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...)
elseif (vals != nothing) && (eltype(vals) <: Real)
@@ -1047,3 +1048,28 @@ guidefont(ax::Axis) = font(
ax[:guidefontrotation],
ax[:guidefontcolor],
)
# ---------------------------------------------------------------
# converts unicode scientific notation unsupported by pgfplots and gr
# into a format that works
function convert_sci_unicode(label::AbstractString)
unicode_dict = Dict(
'⁰' => "0",
'¹' => "1",
'²' => "2",
'³' => "3",
'⁴' => "4",
'⁵' => "5",
'⁶' => "6",
'⁷' => "7",
'⁸' => "8",
'⁹' => "9",
'⁻' => "-",
"×10" => "×10^{",
)
for key in keys(unicode_dict)
label = replace(label, key, unicode_dict[key])
end
string(label, "}")
end
+1
View File
@@ -8,6 +8,7 @@ default(show=false, reuse=true)
img_eps = isinteractive() ? 1e-2 : 10e-2
@testset "GR" begin
ENV["PLOTS_TEST"] = "true"
ENV["GKSwstype"] = "100"
@test gr() == Plots.GRBackend()
@test backend() == Plots.GRBackend()