Bugfix; Added palette facilities

This commit is contained in:
Giorgio Calderone 2020-03-17 15:00:41 +01:00
parent 5487e60222
commit 1bd7875d73
6 changed files with 104 additions and 45 deletions

View File

@ -4,11 +4,13 @@ uuid = "dc211083-a33a-5b79-959f-2ff34033469d"
[deps]
ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
ReusePatterns = "a39b5e78-89b5-562b-97d8-70689129df0c"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
StructC14N = "d2514e9c-36c4-5b8e-97e2-51e7675c221c"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
ZipFile = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea"
[compat]
julia = "≥ 1.0.0"

View File

@ -231,3 +231,24 @@ or
push!(Gnuplot.options.init, "set term sixelgd")
```
Note that the latter requires Sixel graphics to be enabled (e.g. `xterm -ti vt340`).
## Palettes
The **Gnuplot.jl** package comes with all the [Gnuplot palettes](https://github.com/Gnuplotting/gnuplot-palettes)) readily available.
The whole list can be retrieved with `print(Gnuplot.palette_list())`.
Individual palette can be accessed with `Gnuplot.palette()` and used as any other command, as in the following example:
```julia
pal1 = Gnuplot.palette("rdylgn")
pal2 = Gnuplot.palette("viridis")
x = -8:0.25:8
y = -8:0.25:8
r = [x.^2 .+ y.^2 for x in x, y in y]
z = sin.(sqrt.(r)) ./ sqrt.(r)
@gsp "set multiplot layout 1,2" "set pm3d depthorder" "set border 0"
@gsp :- "unset key" "unset xtics" "unset ytics" "unset ztics" "unset colorbox"
@gsp :- "set view 60, 30, 1.5, 0.9"
@gsp :- 1 title="rdylgn" pal1 x y z "w pm3d" 2 tit="viridis" pal2 x y z "w pm3d"
```

View File

@ -7,7 +7,7 @@ x = LinRange(-10, 10, 25)
y = LinRange(-10, 10, 25)
@gsp "set xyplane at 0"
@gsp :- "unset key"
@gsp :- "unset key" :-
@gsp :- "set palette rgbformulae 31,-11,32"
@gsp :- "set style fill solid 0.5"
@gsp :- "set cbrange [-1:1]"

View File

@ -7,35 +7,35 @@ using Gnuplot
U = LinRange(-pi, pi, 100); # 50
V = LinRange(-pi, pi, 20);
@gsp :- "unset key" :-
@gsp :- "unset xtics" :-
@gsp :- "unset ytics" :-
@gsp :- "unset ztics" :-
@gsp :- "set border 0" :-
@gsp :- "set view 60, 30, 1.5, 0.9" :-
@gsp :- "unset colorbox" :-
@gsp :- "set colorbox vertical user origin 0.9, 0.15 size 0.02, 0.50" :-
@gsp :- "set format cb '%.1f'" :-
@gsp :- "unset key"
@gsp :- "unset xtics"
@gsp :- "unset ytics"
@gsp :- "unset ztics"
@gsp :- "set border 0"
@gsp :- "set view 60, 30, 1.5, 0.9"
@gsp :- "unset colorbox"
@gsp :- "set colorbox vertical user origin 0.9, 0.15 size 0.02, 0.50"
@gsp :- "set format cb '%.1f'"
for loop in 1:2
if loop == 1
@gsp :- 1 title="PM3D surface\\nno depth sorting" :-
@gsp :- "set origin -0.02,0.0" :-
@gsp :- "set size 0.55, 0.9" :-
@gsp :- 1 title="PM3D surface\\nno depth sorting"
@gsp :- "set origin -0.02,0.0"
@gsp :- "set size 0.55, 0.9"
@gsp :- "set pm3d scansforward" :- # scansbackward
else
@gsp :- 2 title="PM3D surface\\ndepth sorting" :-
@gsp :- "set origin 0.40,0.0" :-
@gsp :- "set size 0.55, 0.9" :-
@gsp :- "set pm3d depthorder" :-
@gsp :- 2 title="PM3D surface\\ndepth sorting"
@gsp :- "set origin 0.40,0.0"
@gsp :- "set size 0.55, 0.9"
@gsp :- "set pm3d depthorder"
end
x = [cos(u) + .5 * cos(u) * cos(v) for u in U, v in V]; x = reshape(x, :)
y = [sin(u) + .5 * sin(u) * cos(v) for u in U, v in V]; y = reshape(y, :)
z = [.5 * sin(v) for u in U, v in V]; # Note: this must be a 2D array
x = [cos(u) + .5 * cos(u) * cos(v) for u in U, v in V]
y = [sin(u) + .5 * sin(u) * cos(v) for u in U, v in V]
z = [.5 * sin(v) for u in U, v in V]
@gsp :- x y z "w pm3d"
x = [1 + cos(u) + .5 * cos(u) * cos(v) for u in U, v in V]; x = reshape(x, :)
y = [.5 * sin(v) for u in U, v in V]; y = reshape(y, :)
z = [sin(u) + .5 * sin(u) * cos(v) for u in U, v in V]; # Note: this must be a 2D array
x = [1 + cos(u) + .5 * cos(u) * cos(v) for u in U, v in V]
y = [.5 * sin(v) for u in U, v in V]
z = [sin(u) + .5 * sin(u) * cos(v) for u in U, v in V]
@gsp :- x y z "w pm3d"
end

View File

@ -1,6 +1,7 @@
module Gnuplot
using StructC14N, ColorTypes, Printf, StatsBase, ReusePatterns, DataFrames
using Pkg.Artifacts, ZipFile
import Base.reset
import Base.println
@ -59,8 +60,7 @@ Base.@kwdef mutable struct Options
end
const sessions = Dict{Symbol, DrySession}()
const options = Options()
const dpalettes = Dict{String, String}()
# ╭───────────────────────────────────────────────────────────────────╮
# │ LOW LEVEL FUNCTIONS │
@ -70,7 +70,40 @@ function string(c::ColorTypes.RGB)
return string(float(c.r)*255) * " " * string(float(c.g)*255) * " " * string(float(c.b)*255)
end
# ---------------------------------------------------------------------
palette_list() = keys(dpalettes)
function palette(choice="")
if length(dpalettes) == 0
function path()
name = "gnuplot-palettes"
toml = joinpath(@__DIR__, "Artifacts.toml")
hash = artifact_hash(name, toml)
if hash == nothing || !artifact_exists(hash)
hash = create_artifact() do artifact_dir
download("https://github.com/Gnuplotting/gnuplot-palettes/archive/master.zip", joinpath(artifact_dir, name * ".zip"))
end
bind_artifact!(toml, name, hash)
end
return joinpath(artifact_path(hash), name * ".zip")
end
dir = ZipFile.Reader(path())
out = Vector{String}()
for entry in dir.files
(_, file) = splitdir(entry.name)
(length(file) > 4) || continue
(file[end-3:end] == ".pal") || continue
file = file[1:end-4]
dpalettes[file] = join(Char.(read(entry)))
end
close(dir)
end
(choice in keys(dpalettes)) && (return dpalettes[choice])
return " "
end
palette() # Populate dictionary
# ---------------------------------------------------------------------
"""
# CheckGnuplotVersion
@ -202,7 +235,7 @@ function data2string(args...)
return accum
end
# Multidimensional, add independent indices
# Multidimensional, no independent indices
if firstMultiDim == 1
#@info "Case 2"
@assert minimum(lengths) == maximum(lengths) "Array size are incompatible"
@ -210,7 +243,7 @@ function data2string(args...)
for CIndex in CartesianIndices(size(args[1]))
indices = Tuple(CIndex)
(i > 1) && (indices[end-1] == 1) && (push!(accum, "")) # blank line
v = " " * join(string.(getindex.(Ref(Tuple(indices)), 1:ndims(args[1]))), " ")
v = "" # * join(string.(getindex.(Ref(Tuple(indices)), 1:ndims(args[1]))), " ")
for iarg in 1:length(args)
d = args[iarg]
v *= " " * string(d[i])
@ -413,7 +446,7 @@ function println(gp::GPSession, d::DataSet)
if options.verbose
v = ""
printstyled(color=:light_black, "GNUPLOT ($(gp.sid)) $(d.name) << EOD\n")
n = min(options.printlines, length(d.lines))
n = min(options.datalines, length(d.lines))
for i in 1:n
printstyled(color=:light_black, "GNUPLOT ($(gp.sid)) $(d.lines[i])\n")
end
@ -563,9 +596,11 @@ function dump(gp::DrySession, stream; term::AbstractString="", output::AbstractS
for j in 1:length(d.cmds)
println(stream, d.cmds[j])
end
s = (d.flag3d ? "splot " : "plot ") * " \\\n " *
join(d.elems, ", \\\n ")
println(stream, s)
if length(d.elems) > 0
s = (d.flag3d ? "splot " : "plot ") * " \\\n " *
join(d.elems, ", \\\n ")
println(stream, s)
end
end
(length(gp.plots) > 1) && println(stream, "unset multiplot")
(output != "") && println(stream, "set output")
@ -637,7 +672,7 @@ function driver(args...; flag3d=false)
if typeof(arg) == Symbol
if arg == :-
(loop == 1) && (iarg < length(args)) && (doReset = false)
(loop == 1) && (iarg > 1) && (doDump = false)
(loop == 1) && (iarg > 1 ) && (doDump = false)
else
(loop == 1) && (gp = getsession(arg))
end
@ -659,6 +694,7 @@ function driver(args...; flag3d=false)
(loop == 2) && (@assert arg > 0)
(loop == 2) && (dataplot = ""; dataCompleted())
(loop == 2) && setmulti(gp, arg)
(loop == 2) && (gp.plots[gp.curmid].flag3d = flag3d)
elseif isa(arg, String)
# Either a dataname, a plot or a command
if loop == 2
@ -669,9 +705,9 @@ function driver(args...; flag3d=false)
dataplot = arg
dataCompleted()
else
(isPlot, flag3d, cmd) = isPlotCmd(arg)
(isPlot, is3d, cmd) = isPlotCmd(arg)
if isPlot
gp.plots[gp.curmid].flag3d = flag3d
gp.plots[gp.curmid].flag3d = is3d
newplot(gp, cmd)
else
newcmd(gp, arg)

View File

@ -26,17 +26,17 @@ s = Gnuplot.data2string(x, y, x.+y)
z = [X+Y for X in x, Y in y];
s = Gnuplot.data2string(z)
@test all(s .== [" 1 1 5" ,
" 2 1 6" ,
" 3 1 7" ,
"" ,
" 1 2 6" ,
" 2 2 7" ,
" 3 2 8" ,
"" ,
" 1 3 7" ,
" 2 3 8" ,
" 3 3 9" ])
@test all(s .== [" 5" ,
" 6" ,
" 7" ,
"" ,
" 6" ,
" 7" ,
" 8" ,
"" ,
" 7" ,
" 8" ,
" 9" ])
s = Gnuplot.data2string(x, y, z)