From a4bb94bfdee35c30f376be50a4434670a79bd784 Mon Sep 17 00:00:00 2001 From: Giorgio Calderone Date: Sun, 22 Mar 2020 18:17:19 +0100 Subject: [PATCH] Refactored contourlines function; Dropped unused dependencies --- Project.toml | 2 -- src/Gnuplot.jl | 76 ++++++++++++++++++------------------------------ test/runtests.jl | 38 +++++++++++++++--------- 3 files changed, 53 insertions(+), 63 deletions(-) diff --git a/Project.toml b/Project.toml index 2f11056..e87dfb8 100644 --- a/Project.toml +++ b/Project.toml @@ -4,8 +4,6 @@ uuid = "dc211083-a33a-5b79-959f-2ff34033469d" [deps] ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" ReusePatterns = "a39b5e78-89b5-562b-97d8-70689129df0c" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" StructC14N = "d2514e9c-36c4-5b8e-97e2-51e7675c221c" diff --git a/src/Gnuplot.jl b/src/Gnuplot.jl index 6a222f7..213e6f9 100644 --- a/src/Gnuplot.jl +++ b/src/Gnuplot.jl @@ -1,12 +1,9 @@ module Gnuplot -using StructC14N, ColorTypes, Printf, StatsBase, ReusePatterns, DataFrames -using ColorSchemes +using StatsBase, ColorSchemes, ColorTypes, StructC14N, ReusePatterns import Base.reset import Base.write -import Base.iterate -import Base.convert import Base.string export @gp, @gsp, save, linestyles, palette, contourlines, hist @@ -1069,7 +1066,7 @@ end #= Example: v = randn(1000) -h = hist(v, bs=0.2) +h = hist(v, bs=0.5) @gp h.loc h.counts "w histep" h.loc h.counts "w l" =# function hist(v::Vector{T}; range=[NaN,NaN], bs=NaN, nbins=0, pad=true) where T <: Number @@ -1137,6 +1134,14 @@ end # -------------------------------------------------------------------- +mutable struct ContourLine + level::Int + x::Vector{Float64} + y::Vector{Float64} + z::Float64 + ContourLine(z) = new(1, Vector{Float64}(), Vector{Float64}(), z) +end + function contourlines(args...; cntrparam="level auto 10") tmpfile = Base.Filesystem.tempname() sid = Symbol("j", Base.Libc.getpid()) @@ -1152,62 +1157,37 @@ function contourlines(args...; cntrparam="level auto 10") Gnuplot.exec(sid, "unset table") Gnuplot.exec(sid, "reset") - out = DataFrame() - curlevel = NaN - curx = Vector{Float64}() - cury = Vector{Float64}() - curid = 1 - elength(x, y) = sqrt.((x[2:end] .- x[1:end-1]).^2 .+ - (y[2:end] .- y[1:end-1]).^2) - function dump() - ((length(curx) < 2) || isnan(curlevel)) && return nothing - tmp = DataFrame([Int, Float64, Vector{Float64}, Vector{Float64}, Vector{Float64}], - [:id, :level , :len , :x , :y]) - push!(tmp, (curid, curlevel, [0.; elength(curx, cury)], [curx...], [cury...])) - append!(out, tmp) - curid += 1 - # d = cumsum(elength(curx, cury)) - # i0 = findall(d .<= width); sort!(i0) - # i1 = findall(d .> width) - # if (length(i0) > 0) && (length(i1) > 0) - # rot1 = atan(cury[i0[end]]-cury[i0[1]], curx[i0[end]]-curx[i0[1]]) * 180 / pi - # rot = round(mod(rot1, 360)) - # x = mean(curx[i0]) - # y = mean(cury[i0]) - # push!(outl, "set label " * string(length(outl)+1) * " '$curlevel' at $x, $y center front rotate by $rot") - # curx = curx[i1] - # cury = cury[i1] - # end - empty!(curx) - empty!(cury) - end - + cur = ContourLine(NaN) + out = Vector{ContourLine}() for l in readlines(tmpfile) - if length(strip(l)) == 0 - dump() + l = strip(l) + if l == "" + (length(cur.x) > 2) && push!(out, cur) + cur = ContourLine(cur.z) continue end if !isnothing(findfirst("# Contour ", l)) - dump() - curlevel = Meta.parse(strip(split(l, ':')[2])) + (length(cur.x) > 2) && push!(out, cur) + cur = ContourLine(Meta.parse(strip(split(l, ':')[2]))) continue end (l[1] == '#') && continue n = Meta.parse.(split(l)) @assert length(n) == 3 - push!(curx, n[1]) - push!(cury, n[2]) + push!(cur.x, n[1]) + push!(cur.y, n[2]) end + (length(cur.x) > 2) && push!(out, cur) rm(tmpfile) - if nrow(out) > 0 - levels = unique(out.level) - sort!(levels) - out[!, :levelcount] .= 0 - for i in 1:length(levels) - j = findall(out.level .== levels[i]) - out[j, :levelcount] .= i + if length(out) > 0 + out = out[sortperm(getfield.(out, :z))] + for i in 2:length(out) + @assert out[i].z >= out[i-1].z + if out[i].z > out[i-1].z + out[i].level = out[i-1].level + 1 + end end end return out diff --git a/test/runtests.jl b/test/runtests.jl index 277a642..6ba2efa 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -28,18 +28,30 @@ s = Gnuplot.data2string(x, y, x.+y) z = [X+Y for X in x, Y in y]; s = Gnuplot.data2string(z) -@test all(s .== [" 5" , - " 6" , - " 7" , - "" , - " 6" , - " 7" , - " 8" , - "" , - " 7" , - " 8" , - " 9" ]) +@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"]) +s = Gnuplot.data2string(z, z) +@test all(s .== [" 5 5", + " 6 6", + " 7 7", + "" , + " 6 6", + " 7 7", + " 8 8", + "" , + " 7 7", + " 8 8", + " 9 9"]) s = Gnuplot.data2string(x, y, z) @test all(s .== [" 1 4 5" , @@ -137,7 +149,7 @@ name = "\$MyDataSet1" @gp :- "set multiplot layout 2,1" :- @gp :- "plot $name w points" ylab="Data and model" :- @gp :- "plot $name u 1:(f(\$1)) w lines" :- -@gp :- 2 xlab="X label" ylab="Residuals" :- +@gp :- 2 xlab="X label" ylab="Residuals" :- @gp :- "plot $name u 1:((f(\$1)-\$2) / \$3):(1) w errorbars notit" # Retrieve values for a, b and c @@ -153,7 +165,7 @@ name = "\$MyDataSet1" @gp :- :dry x y+noise e name :- @gp :- :dry "plot $name w points" :- @gp :- :dry "plot $name u 1:(f(\$1)) w lines" :- -@gp :- :dry 2 xlab="X label" ylab="Residuals" :- +@gp :- :dry 2 xlab="X label" ylab="Residuals" :- @gp :- :dry "plot $name u 1:((f(\$1)-\$2) / \$3):(1) w errorbars notit" :- @gp :- :dry save("test.gp") # write on file test.gp