Skip to content

Commit 5736eec

Browse files
author
Mohammed Sadique
committed
spline ploting
1 parent c58a542 commit 5736eec

6 files changed

Lines changed: 58 additions & 61 deletions

File tree

lib/matplotex/element/polygon.ex

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@ defmodule Matplotex.Element.Polygon do
1515
)
1616
end
1717

18-
defp flip_point(point, height) do
19-
Enum.map(point, &flip_coord(&1, height))
20-
end
21-
22-
defp flip_coord({x, y}, height) do
23-
{x, height - y}
24-
end
2518

2619
defp assemble_point(%{points: point}) do
2720
for {x, y} <- point do

lib/matplotex/element/spline.ex

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
defmodule Matplotex.Element.Spline do
22
alias Matplotex.Element
33
use Element
4+
@default_stroke_width 2
5+
@default_stroke "black"
46

5-
defstruct [:type, :moveto, :cubic, :smooths, :fill, :stroke, :stroke_width]
7+
@fill "none"
8+
defstruct [
9+
:type,
10+
:moveto,
11+
:cubic,
12+
:smooths,
13+
fill: @fill,
14+
stroke: @default_stroke,
15+
stroke_width: @default_stroke_width
16+
]
617

718
@impl Element
819
def assemble(element) do
920
"""
10-
<path d="M #{to_pixel(element.moveto)}}
11-
C #{points(element.cubic)}
12-
#{smooth_beizer(element.smooths)}
21+
<path d="M #{to_pixel(element.moveto)}
22+
C #{points(element.cubic)} #{smooth_beizer(element.smooths)} "
1323
fill="#{element.fill}"
14-
stroke="#{element.storke}"
24+
stroke="#{element.stroke}"
1525
stroke-width="#{element.stroke_width}" />
1626
"""
1727
end
1828

1929
defp points(points) do
2030
for point <- points do
21-
"#{to_pixel(point)}"
31+
"#{to_pixel(point)} "
2232
end
2333
end
2434

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
defmodule Matplotex.Figure.Areal.Spline do
2+
alias Matplotex.Element.Spline
3+
alias Matplotex.Figure.RcParams
24
alias Matplotex.Figure.Areal
35
alias Matplotex.Figure.Dataset
46
alias Matplotex.Figure.Areal.PlotOptions
@@ -27,6 +29,7 @@ defmodule Matplotex.Figure.Areal.Spline do
2729
) do
2830
x = determine_numeric_value(x)
2931
y = determine_numeric_value(y)
32+
opts = Keyword.put_new(opts, :color, "none")
3033
dataset = Dataset.cast(%Dataset{x: x, y: y}, opts)
3134
datasets = data ++ [dataset]
3235
xydata = flatten_for_data(datasets)
@@ -54,12 +57,12 @@ defmodule Matplotex.Figure.Areal.Spline do
5457
},
5558
element: elements
5659
} = axes,
57-
rc_params: %RcParams{x_padding: x_padding, y_padding: y_padding}}) do
60+
rc_params: %RcParams{x_padding: x_padding, y_padding: y_padding}} = figure) do
5861
x_padding_value = width_region_content * x_padding
5962
y_padding_value = height_region_content * y_padding
6063
shrinked_width_region_content = width_region_content - x_padding_value * 2
6164
shrinked_height_region_content = height_region_content - y_padding_value * 2
62-
65+
transition = {x_region_content + x_padding_value, y_region_content + y_padding_value}
6366
line_elements =
6467
data
6568
|> Enum.map(fn dataset ->
@@ -69,9 +72,9 @@ defmodule Matplotex.Figure.Areal.Spline do
6972
ylim,
7073
shrinked_width_region_content,
7174
shrinked_height_region_content,
72-
{x_region_content + x_padding_value, y_region_content + y_padding_value}
75+
transition
7376
)
74-
|> capture()
77+
|> capture(transition)
7578
end)
7679
|> List.flatten()
7780

@@ -81,50 +84,18 @@ defmodule Matplotex.Figure.Areal.Spline do
8184
end
8285

8386

84-
defp capture(%Dataset{transformed: transformed} = dataset) do
85-
capture(transformed, [], dataset)
86-
end
87-
88-
89-
defp capture(%Dataset{transformed: transformed} = dataset, bly, region_width) do
90-
capture(transformed, [], dataset, bly, region_width)
91-
end
9287

93-
defp capture(
94-
[{x, y} | to_capture],
95-
captured,
96-
%Dataset{
97-
color: color,
98-
x: bins,
99-
pos: pos_factor,
100-
edge_color: edge_color,
101-
alpha: alpha
102-
} = dataset,
103-
bly,
104-
region_width
105-
) do
106-
capture(
107-
to_capture,
108-
captured ++
109-
[
110-
%Rect{
111-
type: "figure.histogram",
112-
x: bin_position(x, pos_factor),
113-
y: y,
114-
width: region_width / length(bins),
115-
height: bly - y,
116-
color: color,
117-
stroke: edge_color,
118-
fill_opacity: alpha,
119-
stroke_opacity: alpha
120-
}
121-
],
122-
dataset,
123-
bly,
124-
region_width
125-
)
88+
defp capture(%Dataset{transformed: transformed, color: color,edge_color: edge_color, line_width: stroke_width}, move_to_def) do
89+
{moveto, transformed} = List.pop_at(transformed, 0, move_to_def)
90+
cubic = Enum.slice(transformed, 0..2)
91+
smooths = blend(transformed, 3)
92+
%Spline{type: "figure.spline", moveto: moveto, cubic: cubic, smooths: smooths, fill: color, stroke: edge_color, stroke_width: stroke_width}
12693
end
12794

128-
defp capture([], captured, _dataset, _bly, _region_width), do: captured
95+
defp blend(smooths, start_from) do
96+
smooths
97+
|>Enum.slice(start_from..-1//1)
98+
|>Enum.chunk_every(2)
12999

100+
end
130101
end

lib/matplotex/figure/dataset.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule Matplotex.Figure.Dataset do
66
@default_marker_size 3.5
77
@default_stroke "black"
88
@default_alpha 1.0
9+
@line_width 2
910

1011
defstruct [
1112
:label,
@@ -19,7 +20,8 @@ defmodule Matplotex.Figure.Dataset do
1920
alpha: @default_alpha,
2021
marker: @default_marker,
2122
linestyle: @default_linestyle,
22-
marker_size: @default_marker_size
23+
marker_size: @default_marker_size,
24+
line_width: @line_width
2325
]
2426

2527
def cast(dataset, values) do

lib/matplotex/helpers.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,10 @@ defmodule Matplotex.Helpers do
330330
x = Nx.to_list(x_nx)
331331
y = x_nx |> Nx.sin() |> Nx.to_list()
332332

333-
Matplotex.spline(x, y, x_label: "X", y_label: "Y")
333+
334+
Matplotex.spline(x, y, x_label: "X", y_label: "Y", edge_color: "green")
334335
|> Matplotex.show()
335336
|> copy()
336337
end
338+
337339
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule Matplotex.Figure.Areal.SplineTest do
2+
use Matplotex.PlotCase
3+
alias Matplotex.Figure
4+
alias Matplotex.Figure.Areal.Spline
5+
setup do
6+
x_nx = Nx.linspace(0, 10, n: 100)
7+
x = Nx.to_list(x_nx)
8+
y = x_nx |> Nx.sin() |> Nx.to_list()
9+
10+
figure = Matplotex.spline(x, y, x_label: "X", y_label: "Y")
11+
{:ok, %{figure: figure}}
12+
end
13+
14+
15+
test "adds a spline element in a figure",%{figure: figure} do
16+
assert %Figure{axes: %Spline{element: elements}} =Spline.materialize(figure)
17+
assert Enum.any?(elements, &(&1.type=="figure.spline"))
18+
end
19+
end

0 commit comments

Comments
 (0)