From 46f78653cb9c241a8ae3314a92c81b2fa090c3ea Mon Sep 17 00:00:00 2001 From: AmitPress Date: Fri, 14 Oct 2022 20:02:59 +0600 Subject: [PATCH 1/3] add heatmap example --- plot/examples/heatmap.v | 37 +++++++++++++++++++++++++++++++++++++ plot/static/heatmap.png | Bin 0 -> 28015 bytes 2 files changed, 37 insertions(+) create mode 100644 plot/examples/heatmap.v create mode 100644 plot/static/heatmap.png diff --git a/plot/examples/heatmap.v b/plot/examples/heatmap.v new file mode 100644 index 000000000..2defc5821 --- /dev/null +++ b/plot/examples/heatmap.v @@ -0,0 +1,37 @@ +module main +import vsl.plot +import math +// import vsl.util +// phi = (1 + np.sqrt(5) )/2. # golden ratio +// xe = [0, 1, 1+(1/(phi**4)), 1+(1/(phi**3)), phi] +// ye = [0, 1/(phi**3), 1/phi**3+1/phi**4, 1/(phi**2), 1] +phi := (1 + math.sqrt(5)) / 2.0 +xe := [0.0, 1.0, 1+(1/math.pow(phi, 4.0)), 1+(1/math.pow(phi, 3.0)), phi] +ye := [0.0, 1/math.pow(phi, 3), (1/math.pow(phi, 3))+(1/math.pow(phi, 4)), 1/math.pow(phi, 2), 1] +z := [[13.0,3,3,5],[13.0,2,1,5],[13.0,10,11,12],[13.0,8,8,8]] + + +// TODO: Draw Spiral +// a := 1.120529 +// b := 0.306349 + +// theta := util.lin_space(-math.pi/13, 4*math.pi, 1000) +// r := a*math.exp(-b*theta) +// x := r*math.cos(theta) +// y := r*math.sin(theta) + +mut plt := plot.new_plot() + +plt.add_trace( + trace_type: .heatmap + x: xe + y: ye + z: z +) +plt.set_layout( + title: 'Heatmap with Unequal Block Sizes' + width: 750 + height: 750 +) + +plt.show()? \ No newline at end of file diff --git a/plot/static/heatmap.png b/plot/static/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..b057b2177f8355543f282164967f881dd7daa53f GIT binary patch literal 28015 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 JU%BhV{{ge%cfkMv literal 0 HcmV?d00001 From d4da2341e2f69db03c0871befa44b0ade4c24aa4 Mon Sep 17 00:00:00 2001 From: AmitPress Date: Fri, 14 Oct 2022 21:29:26 +0600 Subject: [PATCH 2/3] add histogram support --- plot/examples/histogram.v | 25 +++++++++++++++++++++++++ plot/scripts/plotter.py | 1 + plot/static/histogram.png | Bin 0 -> 29278 bytes plot/trace.v | 2 ++ 4 files changed, 28 insertions(+) create mode 100644 plot/examples/histogram.v create mode 100644 plot/static/histogram.png diff --git a/plot/examples/histogram.v b/plot/examples/histogram.v new file mode 100644 index 000000000..3a0bc6423 --- /dev/null +++ b/plot/examples/histogram.v @@ -0,0 +1,25 @@ +module main + +import vsl.plot +import rand +rand.seed([u32(1), 42]) +mut x1 := []f64{} +for _ in 1..1000{ + x1 << rand.f64n(100) or { 0 } +} +mut plt := plot.new_plot() +plt.add_trace( + trace_type: .histogram + x: x1 + xbins: { + 'start': f32(0), + 'end': f32(100), + 'size': 2 + } +) +plt.set_layout( + title: 'Histogram Example' + width: 750 + height: 750 +) +plt.show()? \ No newline at end of file diff --git a/plot/scripts/plotter.py b/plot/scripts/plotter.py index 4e4304367..c2138b5d6 100644 --- a/plot/scripts/plotter.py +++ b/plot/scripts/plotter.py @@ -72,6 +72,7 @@ def is_valid_file(parser, arg): 3: go.Surface, 4: go.Scatter3d, 5: go.Bar, + 6: go.Histogram } diff --git a/plot/static/histogram.png b/plot/static/histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..e77d06ae0850f07162603937e9bd6a63937760ed GIT binary patch literal 29278 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 PS+2YGeO~n0@wop3FKR2D literal 0 HcmV?d00001 diff --git a/plot/trace.v b/plot/trace.v index a04235522..c2c1193ac 100644 --- a/plot/trace.v +++ b/plot/trace.v @@ -7,6 +7,7 @@ pub enum TraceType { surface scatter3d bar + histogram } pub struct Trace { @@ -14,6 +15,7 @@ pub mut: trace_type TraceType [required] x []f64 x_str []string + xbins map[string]f32 y []f64 z [][]f64 values []f64 From 53f6dc0d257f0988bd91177b85617776e869b0a5 Mon Sep 17 00:00:00 2001 From: AmitPress Date: Mon, 24 Oct 2022 18:31:30 +0600 Subject: [PATCH 3/3] add basic heatmap example --- plot/examples/basic_heatmap.v | 23 ++++++++ .../{heatmap.v => heatmap_golden_ratio.v} | 0 plot/static/basic_heatmap.png | Bin 0 -> 34805 bytes plot/trace.v | 1 + remove.py | 49 ++++++++++++++++++ 5 files changed, 73 insertions(+) create mode 100644 plot/examples/basic_heatmap.v rename plot/examples/{heatmap.v => heatmap_golden_ratio.v} (100%) create mode 100644 plot/static/basic_heatmap.png create mode 100644 remove.py diff --git a/plot/examples/basic_heatmap.v b/plot/examples/basic_heatmap.v new file mode 100644 index 000000000..43d6e8835 --- /dev/null +++ b/plot/examples/basic_heatmap.v @@ -0,0 +1,23 @@ +module main +import vsl.plot + + +z := [[1.0, 0, 30, 50, 1], [20.0, 1, 60, 80, 30], [30.0, 60, 1, -10, 20]] +x := ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] +y := ['Morning', 'Afternoon', 'Evening'] + +mut plt := plot.new_plot() + +plt.add_trace( + trace_type: .heatmap + x_str: x + y_str: y + z: z +) +plt.set_layout( + title: 'Heatmap Basic Implementation' + width: 750 + height: 750 +) + +plt.show()? diff --git a/plot/examples/heatmap.v b/plot/examples/heatmap_golden_ratio.v similarity index 100% rename from plot/examples/heatmap.v rename to plot/examples/heatmap_golden_ratio.v diff --git a/plot/static/basic_heatmap.png b/plot/static/basic_heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..09a7e03de112c224a359bec42dbcc83b05048d31 GIT binary patch literal 34805 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

he<5BI31@w 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 literal 0 HcmV?d00001 diff --git a/plot/trace.v b/plot/trace.v index 7953c2ff3..82e7874bb 100644 --- a/plot/trace.v +++ b/plot/trace.v @@ -15,6 +15,7 @@ pub mut: trace_type TraceType [required] x []f64 x_str []string + y_str []string xbins map[string]f32 y []f64 z [][]f64 diff --git a/remove.py b/remove.py new file mode 100644 index 000000000..a5b3bc1ca --- /dev/null +++ b/remove.py @@ -0,0 +1,49 @@ +import plotly.graph_objects as go +import numpy as np + +# Build the rectangles as a heatmap +# specify the edges of the heatmap squares +phi = (1 + np.sqrt(5) )/2. # golden ratio +xe = [0, 1, 1+(1/(phi**4)), 1+(1/(phi**3)), phi] +ye = [0, 1/(phi**3), 1/phi**3+1/phi**4, 1/(phi**2), 1] + +z = [ [13,3,3,5], + [13,2,1,5], + [13,10,11,12], + [13,8,8,8] + ] + +fig = go.Figure(data=go.Heatmap( + x = np.sort(xe), + y = np.sort(ye), + z = z, + type = 'heatmap', + colorscale = 'Viridis')) + +# Add spiral line plot + +def spiral(th): + a = 1.120529 + b = 0.306349 + r = a*np.exp(-b*th) + return (r*np.cos(th), r*np.sin(th)) + +theta = np.linspace(-np.pi/13,4*np.pi,1000); # angle +(x,y) = spiral(theta) + +fig.add_trace(go.Scatter(x= -x+x[0], y= y-y[0], + line =dict(color='white',width=3))) + +axis_template = dict(range = [0,1.6], autorange = False, + showgrid = False, zeroline = False, + linecolor = 'black', showticklabels = False, + ticks = '' ) + +fig.update_layout(margin = dict(t=200,r=200,b=200,l=200), + xaxis = axis_template, + yaxis = axis_template, + showlegend = False, + width = 700, height = 700, + autosize = False ) + +fig.show() \ No newline at end of file