From 9d3b460758740422ed2e0af8dc4c086633fdb7d5 Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Thu, 20 Feb 2025 13:35:19 +0530 Subject: [PATCH 1/7] transform sizes --- lib/matplotex/figure/areal.ex | 23 +++++++++++++++++++++++ lib/matplotex/figure/lead.ex | 20 ++++++++++++++++++++ test/matplotex/figure/lead_test.exs | 17 +++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/lib/matplotex/figure/areal.ex b/lib/matplotex/figure/areal.ex index 7cce7d4..87dec8e 100644 --- a/lib/matplotex/figure/areal.ex +++ b/lib/matplotex/figure/areal.ex @@ -423,6 +423,29 @@ defmodule Matplotex.Figure.Areal do %Dataset{dataset | transformed: transformed} end +# def do_transform( +# %Dataset{x: x, y: y, sizes: sizes} = dataset, +# xlim, +# ylim, +# width, +# height, +# transition +# ) +# when is_list(sizes) do + + +# transformed = +# x +# |> Enum.zip(y) +# |> Enum.map(fn {x, y} -> +# x +# |> transformation(y, xlim, ylim, width, height, transition) +# |> Algebra.flip_y_coordinate() +# end) + + +# %Dataset{dataset | transformed: transformed} +# end def do_transform(%Dataset{x: x, y: y} = dataset, xlim, ylim, width, height, transition) do transformed = diff --git a/lib/matplotex/figure/lead.ex b/lib/matplotex/figure/lead.ex index 6933343..8653aa4 100644 --- a/lib/matplotex/figure/lead.ex +++ b/lib/matplotex/figure/lead.ex @@ -1,5 +1,7 @@ defmodule Matplotex.Figure.Lead do @moduledoc false + alias Matplotex.InputError + alias Matplotex.Figure.Dataset alias Matplotex.Utils.Algebra alias Matplotex.Figure.Areal.XyRegion.Coords, as: XyCoords alias Matplotex.Figure.Font @@ -44,6 +46,24 @@ defmodule Matplotex.Figure.Lead do ty = fig_height - fig_height * margin %Figure{figure | axes: %{axes | border: {lx, by, rx, ty}}} end + # def transform_sizes(%Figure{axes: %{dataset: dataset, region_content: %Region{width: width_region_content, height: height_region_content}}= axes} = figure) do + # content_area = width_region_content * height_region_content + # total_size = Enum.sum(dataset.sizes) + # area_size_ratio = + # if total_size > 0 do + # content_area / total_size + # else + # raise InputError, message: "Invalid sizes for fractionizing area" + # end + + # sizes = + # dataset.sizes + # |> Nx.tensor() + # |> Nx.multiply(area_size_ratio) + # |> Nx.to_list() + + # %Figure{figure | axes: %{axes | dataset: %Dataset{sizes: sizes}}} + # end defp set_frame_size(%Figure{margin: margin, figsize: {fwidth, fheight}, axes: axes} = figure) do frame_size = {fwidth - fwidth * 2 * margin, fheight - fheight * 2 * margin} diff --git a/test/matplotex/figure/lead_test.exs b/test/matplotex/figure/lead_test.exs index a8cafb6..76ff641 100644 --- a/test/matplotex/figure/lead_test.exs +++ b/test/matplotex/figure/lead_test.exs @@ -1,4 +1,5 @@ defmodule Matplotex.Figure.LeadTest do + alias Matplotex.Figure.Dataset alias Matplotex.Figure.TwoD alias Matplotex.Figure.Areal.Region alias Matplotex.Figure @@ -259,4 +260,20 @@ defmodule Matplotex.Figure.LeadTest do assert cx != 0 && cy != 0 end end + + describe "transform_sizes/1" do + test "converts sizes to equivalent radius to the buble" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + + figure = x|>Matplotex.scatter(y,figsize: {2, 2}, sizes: [1, 2, 3, 4])|> Lead.set_regions_areal() + IO.inspect(figure.axes.dataset, label: "Dataset") + IO.inspect(figure.axes.region_content, label: "Region content") + assert %Figure{axes: %{dataset: %Dataset{sizes: transformed_sizes}}} = + Lead.transform_sizes(figure) + + assert is_list(transformed_sizes) + # assert with actual value + end + end end From bac77ab519034b5ed33cc1cc15559e9a62ada75d Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 12:37:08 +0530 Subject: [PATCH 2/7] size transformation --- lib/matplotex/figure/lead.ex | 41 ++++++++++++++++------------- test/matplotex/figure/lead_test.exs | 13 ++++----- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/lib/matplotex/figure/lead.ex b/lib/matplotex/figure/lead.ex index 8653aa4..fd96c2e 100644 --- a/lib/matplotex/figure/lead.ex +++ b/lib/matplotex/figure/lead.ex @@ -46,24 +46,29 @@ defmodule Matplotex.Figure.Lead do ty = fig_height - fig_height * margin %Figure{figure | axes: %{axes | border: {lx, by, rx, ty}}} end - # def transform_sizes(%Figure{axes: %{dataset: dataset, region_content: %Region{width: width_region_content, height: height_region_content}}= axes} = figure) do - # content_area = width_region_content * height_region_content - # total_size = Enum.sum(dataset.sizes) - # area_size_ratio = - # if total_size > 0 do - # content_area / total_size - # else - # raise InputError, message: "Invalid sizes for fractionizing area" - # end - - # sizes = - # dataset.sizes - # |> Nx.tensor() - # |> Nx.multiply(area_size_ratio) - # |> Nx.to_list() - - # %Figure{figure | axes: %{axes | dataset: %Dataset{sizes: sizes}}} - # end + def transform_sizes(%Figure{axes: %{dataset: datasets} = axes} = figure) do + datasets = transform_dataset_sizes(figure, datasets, []) + %Figure{figure | axes: %{axes | dataset: datasets}} + end + defp transform_dataset_sizes(%Figure{axes: %{region_content: %Region{width: width_region_content, height: height_region_content}}}=figure, [%Dataset{sizes: sizes} = dataset | to_transorm], transformed) do + content_area = width_region_content * height_region_content + total_size = Enum.sum(sizes) + area_size_ratio = + if total_size > 0 do + (content_area / total_size) * 0.7 + else + raise InputError, message: "Invalid sizes for fractionizing area" + end + + sizes = + sizes + |> Nx.tensor() + |> Nx.multiply(area_size_ratio) + |> Nx.to_list() + transform_dataset_sizes(figure, to_transorm, [%Dataset{dataset | sizes: sizes} | transformed]) + end + defp transform_dataset_sizes(_, [], transformed), do: transformed + defp set_frame_size(%Figure{margin: margin, figsize: {fwidth, fheight}, axes: axes} = figure) do frame_size = {fwidth - fwidth * 2 * margin, fheight - fheight * 2 * margin} diff --git a/test/matplotex/figure/lead_test.exs b/test/matplotex/figure/lead_test.exs index 76ff641..6d6b6c1 100644 --- a/test/matplotex/figure/lead_test.exs +++ b/test/matplotex/figure/lead_test.exs @@ -265,15 +265,16 @@ defmodule Matplotex.Figure.LeadTest do test "converts sizes to equivalent radius to the buble" do x = [1,2,3,4,5] y = [10, 20, 30, 40, 50] + sizes = [1, 2, 3, 4, 5] + width = 2 + height = 2 + figure = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes)|> Lead.set_regions_areal() - figure = x|>Matplotex.scatter(y,figsize: {2, 2}, sizes: [1, 2, 3, 4])|> Lead.set_regions_areal() - IO.inspect(figure.axes.dataset, label: "Dataset") - IO.inspect(figure.axes.region_content, label: "Region content") - assert %Figure{axes: %{dataset: %Dataset{sizes: transformed_sizes}}} = + assert %Figure{axes: %{dataset: [%Dataset{sizes: transformed_sizes}]}} = Lead.transform_sizes(figure) - assert is_list(transformed_sizes) - # assert with actual value + assert length(transformed_sizes) == length(sizes) + assert Enum.sum(transformed_sizes) < (width * height) * 0.7 end end end From 20f8abd15c90335623a57d3fead0674cbe4c5f5e Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 15:59:09 +0530 Subject: [PATCH 3/7] passed test --- lib/matplotex/figure/areal.ex | 36 +++++++---------- test/matplotex/figure/areal/scatter_test.exs | 41 ++++++++++++++++++++ 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/lib/matplotex/figure/areal.ex b/lib/matplotex/figure/areal.ex index 87dec8e..6bba06c 100644 --- a/lib/matplotex/figure/areal.ex +++ b/lib/matplotex/figure/areal.ex @@ -423,29 +423,6 @@ defmodule Matplotex.Figure.Areal do %Dataset{dataset | transformed: transformed} end -# def do_transform( -# %Dataset{x: x, y: y, sizes: sizes} = dataset, -# xlim, -# ylim, -# width, -# height, -# transition -# ) -# when is_list(sizes) do - - -# transformed = -# x -# |> Enum.zip(y) -# |> Enum.map(fn {x, y} -> -# x -# |> transformation(y, xlim, ylim, width, height, transition) -# |> Algebra.flip_y_coordinate() -# end) - - -# %Dataset{dataset | transformed: transformed} -# end def do_transform(%Dataset{x: x, y: y} = dataset, xlim, ylim, width, height, transition) do transformed = @@ -456,10 +433,23 @@ defmodule Matplotex.Figure.Areal do |> transformation(y, xlim, ylim, width, height, transition) |> Algebra.flip_y_coordinate() end) + |> maybe_wrap_with_sizes(dataset) + |> maybe_wrap_with_colors() %Dataset{dataset | transformed: transformed} end + defp maybe_wrap_with_sizes(transformed, %Dataset{sizes: sizes} = dataset) when length(transformed) == length(sizes) do + {Enum.zip(transformed,sizes), dataset} + end + defp maybe_wrap_with_sizes(transformed, dataset) do + {transformed, dataset} + end + defp maybe_wrap_with_colors({transformed, %Dataset{colors: colors}}) when length(transformed) == length(colors) do + Enum.zip(transformed, colors) + end + defp maybe_wrap_with_colors({transformed, _dataset}), do: transformed + defp transform_with_bottom(x, y, xlim, ylim, width, height, transition) when is_list(y) do y_top = Enum.sum(y) y_bottom = y |> tl() |> Enum.sum() diff --git a/test/matplotex/figure/areal/scatter_test.exs b/test/matplotex/figure/areal/scatter_test.exs index 9b16fee..5ef0fa8 100644 --- a/test/matplotex/figure/areal/scatter_test.exs +++ b/test/matplotex/figure/areal/scatter_test.exs @@ -1,4 +1,6 @@ defmodule Matplotex.Figure.Areal.ScatterTest do + alias Matplotex.Figure.Areal + alias Matplotex.Figure.Dataset alias Matplotex.Figure.Areal.Scatter alias Matplotex.Figure use Matplotex.PlotCase @@ -24,4 +26,43 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert length(ticks) == 6 end end + describe "do_transform" do + test "zips transformed values with sizes if the dataset contains sizes in eaqual size" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + sizes = [1, 2, 3, 4, 5] + width = 2 + height = 2 + assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes) + assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) + assert Enum.all?(transformed, &match?({{_,_},_}, &1)) + + end + test "zips transformed values with colors if the dataset contanis colors" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + colors = [1, 2, 3, 4, 5] + width = 2 + height = 2 + assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, colors: colors) + assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) + + assert Enum.all?(transformed, &match?({{_,_},_}, &1)) + + end + + test "zips both size and colors if the dataset contains size and color" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + sizes = [1, 2, 3, 4, 5] + colors = [1, 2, 3, 4, 5] + width = 2 + height = 2 + assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes, colors: colors) + assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) + + assert Enum.all?(transformed, &match?({{{_,_},_},_}, &1)) + + end + end end From 06dc79f4f9335e512cdbe21313fe6278289cd09a Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 17:40:43 +0530 Subject: [PATCH 4/7] element creation --- lib/matplotex/figure/areal.ex | 3 +++ lib/matplotex/figure/areal/scatter.ex | 27 +++++++++++++++++++- test/matplotex/figure/areal/scatter_test.exs | 26 ++++++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/matplotex/figure/areal.ex b/lib/matplotex/figure/areal.ex index 6bba06c..caaf78c 100644 --- a/lib/matplotex/figure/areal.ex +++ b/lib/matplotex/figure/areal.ex @@ -442,6 +442,9 @@ defmodule Matplotex.Figure.Areal do defp maybe_wrap_with_sizes(transformed, %Dataset{sizes: sizes} = dataset) when length(transformed) == length(sizes) do {Enum.zip(transformed,sizes), dataset} end + defp maybe_wrap_with_sizes(transformed, %Dataset{colors: colors, marker_size: marker_size} = dataset) when length(transformed) == length(colors) do + {Enum.zip(transformed,List.duplicate(marker_size,length(transformed))),dataset } + end defp maybe_wrap_with_sizes(transformed, dataset) do {transformed, dataset} end diff --git a/lib/matplotex/figure/areal/scatter.ex b/lib/matplotex/figure/areal/scatter.ex index 61a375c..039db7e 100644 --- a/lib/matplotex/figure/areal/scatter.ex +++ b/lib/matplotex/figure/areal/scatter.ex @@ -88,7 +88,6 @@ defmodule Matplotex.Figure.Areal.Scatter do elements = elements ++ line_elements %Figure{figure | axes: %{axes | element: elements}} end - def capture(%Dataset{transformed: transformed} = dataset, concurrency) do if concurrency do process_concurrently(transformed, concurrency, [[], dataset]) @@ -96,6 +95,31 @@ defmodule Matplotex.Figure.Areal.Scatter do capture(transformed, [], dataset) end end + def capture([{{{x, y}, s},color}| to_capture],captured, %Dataset{ + marker: marker, + }= dataset) do + capture( + to_capture, + captured ++ + [ + Marker.generate_marker(marker, x, y, color, s) + ], + dataset + ) + end + def capture([{{x, y}, s}| to_capture],captured, %Dataset{ + color: color, + marker: marker, + }= dataset) do + capture( + to_capture, + captured ++ + [ + Marker.generate_marker(marker, x, y, color, s) + ], + dataset + ) + end def capture( [{x, y} | to_capture], @@ -116,6 +140,7 @@ defmodule Matplotex.Figure.Areal.Scatter do ) end + def capture(_, captured, _), do: captured @impl Areal diff --git a/test/matplotex/figure/areal/scatter_test.exs b/test/matplotex/figure/areal/scatter_test.exs index 5ef0fa8..12ba5aa 100644 --- a/test/matplotex/figure/areal/scatter_test.exs +++ b/test/matplotex/figure/areal/scatter_test.exs @@ -14,6 +14,17 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert %Figure{axes: %{data: {x, _y}, element: elements}} = Scatter.materialize(figure) assert Enum.count(elements, fn elem -> elem.type == "plot.marker" end) == length(x) end + test "generates elements with various saizes if it passed a size attrbute" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + sizes = [1, 2, 3, 4, 5] + assert %Figure{axes: %{element: elements}} = x|>Matplotex.scatter(y, sizes: sizes)|>Figure.materialize() + [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> + x.r + end) + refute Enum.all?(tail, fn x -> x == h end) + + end end describe "generate_ticks/2" do @@ -38,6 +49,16 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert Enum.all?(transformed, &match?({{_,_},_}, &1)) end + test "zips transformed values with marker size if colors exist without sizes" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + colors = [1, 2, 3, 4, 5] + width = 2 + height = 2 + assert %Figure{axes: %{dataset: [%Dataset{marker_size: _marker_size} = dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, colors: colors) + assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) + assert Enum.all?(transformed, &match?({{{_,_},_marker_size},_}, &1)) + end test "zips transformed values with colors if the dataset contanis colors" do x = [1,2,3,4,5] y = [10, 20, 30, 40, 50] @@ -47,7 +68,7 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, colors: colors) assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) - assert Enum.all?(transformed, &match?({{_,_},_}, &1)) + assert Enum.all?(transformed, &match?({{{_,_},_},_}, &1)) end @@ -64,5 +85,8 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert Enum.all?(transformed, &match?({{{_,_},_},_}, &1)) end + end + + end From 08e480b53132cf4ab86ca86843514741e4ab20e1 Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 18:20:39 +0530 Subject: [PATCH 5/7] picking color --- lib/matplotex/figure/areal/scatter.ex | 6 +++++- lib/matplotex/figure/dataset.ex | 7 +++++++ test/matplotex/figure/areal/scatter_test.exs | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/matplotex/figure/areal/scatter.ex b/lib/matplotex/figure/areal/scatter.ex index 039db7e..fa81ce5 100644 --- a/lib/matplotex/figure/areal/scatter.ex +++ b/lib/matplotex/figure/areal/scatter.ex @@ -1,5 +1,6 @@ defmodule Matplotex.Figure.Areal.Scatter do @moduledoc false + alias Matplotex.Colorscheme.Garner alias Matplotex.Figure.Areal.PlotOptions alias Matplotex.Figure.Areal.Region alias Matplotex.Figure.Areal.Ticker @@ -31,7 +32,7 @@ defmodule Matplotex.Figure.Areal.Scatter do def create(%Figure{axes: %__MODULE__{dataset: data} = axes} = figure, {x, y}, opts \\ []) do x = determine_numeric_value(x) y = determine_numeric_value(y) - dataset = Dataset.cast(%Dataset{x: x, y: y}, opts) + dataset = Dataset.cast(%Dataset{x: x, y: y}, opts)|> Dataset.update_cmap() datasets = data ++ [dataset] xydata = flatten_for_data(datasets) @@ -97,7 +98,10 @@ defmodule Matplotex.Figure.Areal.Scatter do end def capture([{{{x, y}, s},color}| to_capture],captured, %Dataset{ marker: marker, + colors: colors, + cmap: cmap }= dataset) do + color = colors |> Enum.min_max()|>Garner.garn_color(color, cmap) capture( to_capture, captured ++ diff --git a/lib/matplotex/figure/dataset.ex b/lib/matplotex/figure/dataset.ex index ae23b1e..380da23 100644 --- a/lib/matplotex/figure/dataset.ex +++ b/lib/matplotex/figure/dataset.ex @@ -1,5 +1,7 @@ defmodule Matplotex.Figure.Dataset do @moduledoc false + alias Matplotex.Colorscheme.Colormap + @default_color "blue" @default_marker "o" @default_linestyle "_" @@ -31,4 +33,9 @@ defmodule Matplotex.Figure.Dataset do def cast(dataset, values) do struct(dataset, values) end + + def update_cmap(%__MODULE__{cmap: cmap} = dataset) do + %__MODULE__{dataset | cmap: Colormap.fetch_cmap(cmap)} + end + end diff --git a/test/matplotex/figure/areal/scatter_test.exs b/test/matplotex/figure/areal/scatter_test.exs index 12ba5aa..208b8ab 100644 --- a/test/matplotex/figure/areal/scatter_test.exs +++ b/test/matplotex/figure/areal/scatter_test.exs @@ -25,6 +25,22 @@ defmodule Matplotex.Figure.Areal.ScatterTest do refute Enum.all?(tail, fn x -> x == h end) end + + test "generates elements with various saizes and colors if it passed a size and color attrbute" do + x = [1,2,3,4,5] + y = [10, 20, 30, 40, 50] + sizes = [1, 2, 3, 4, 5] + assert %Figure{axes: %{element: elements}} = x|>Matplotex.scatter(y, sizes: sizes, colors: sizes)|>Figure.materialize() + [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> + x.r + end) + + refute Enum.all?(tail, fn x -> x == h end) + [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> + x.fill + end) + refute Enum.all?(tail, fn x -> x == h end) + end end describe "generate_ticks/2" do From 9f2b50046fcd3c018d00aa6cfa35cea9b19cc888 Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 18:50:50 +0530 Subject: [PATCH 6/7] fixes --- lib/matplotex/figure/areal.ex | 22 ++- lib/matplotex/figure/areal/scatter.ex | 35 +++-- lib/matplotex/figure/dataset.ex | 1 - lib/matplotex/figure/lead.ex | 38 ++++-- test/matplotex/figure/areal/scatter_test.exs | 133 ++++++++++++++----- test/matplotex/figure/lead_test.exs | 10 +- 6 files changed, 171 insertions(+), 68 deletions(-) diff --git a/lib/matplotex/figure/areal.ex b/lib/matplotex/figure/areal.ex index caaf78c..b4d0bfd 100644 --- a/lib/matplotex/figure/areal.ex +++ b/lib/matplotex/figure/areal.ex @@ -141,6 +141,7 @@ defmodule Matplotex.Figure.Areal do def materialized_by_region(figure) do figure |> Lead.set_regions_areal() + |> Lead.transform_sizes() |> Cast.cast_xticks_by_region() |> Cast.cast_yticks_by_region() |> Cast.cast_hgrids_by_region() @@ -184,6 +185,7 @@ defmodule Matplotex.Figure.Areal do {x, y} end + def flatten_for_data(_, _bottom) do raise InputError, bottom: "Wrong data provided for opts bottom" end @@ -439,18 +441,28 @@ defmodule Matplotex.Figure.Areal do %Dataset{dataset | transformed: transformed} end - defp maybe_wrap_with_sizes(transformed, %Dataset{sizes: sizes} = dataset) when length(transformed) == length(sizes) do - {Enum.zip(transformed,sizes), dataset} + defp maybe_wrap_with_sizes(transformed, %Dataset{sizes: sizes} = dataset) + when length(transformed) == length(sizes) do + {Enum.zip(transformed, sizes), dataset} end - defp maybe_wrap_with_sizes(transformed, %Dataset{colors: colors, marker_size: marker_size} = dataset) when length(transformed) == length(colors) do - {Enum.zip(transformed,List.duplicate(marker_size,length(transformed))),dataset } + + defp maybe_wrap_with_sizes( + transformed, + %Dataset{colors: colors, marker_size: marker_size} = dataset + ) + when length(transformed) == length(colors) do + {Enum.zip(transformed, List.duplicate(marker_size, length(transformed))), dataset} end + defp maybe_wrap_with_sizes(transformed, dataset) do {transformed, dataset} end - defp maybe_wrap_with_colors({transformed, %Dataset{colors: colors}}) when length(transformed) == length(colors) do + + defp maybe_wrap_with_colors({transformed, %Dataset{colors: colors}}) + when length(transformed) == length(colors) do Enum.zip(transformed, colors) end + defp maybe_wrap_with_colors({transformed, _dataset}), do: transformed defp transform_with_bottom(x, y, xlim, ylim, width, height, transition) when is_list(y) do diff --git a/lib/matplotex/figure/areal/scatter.ex b/lib/matplotex/figure/areal/scatter.ex index fa81ce5..0d27832 100644 --- a/lib/matplotex/figure/areal/scatter.ex +++ b/lib/matplotex/figure/areal/scatter.ex @@ -32,7 +32,7 @@ defmodule Matplotex.Figure.Areal.Scatter do def create(%Figure{axes: %__MODULE__{dataset: data} = axes} = figure, {x, y}, opts \\ []) do x = determine_numeric_value(x) y = determine_numeric_value(y) - dataset = Dataset.cast(%Dataset{x: x, y: y}, opts)|> Dataset.update_cmap() + dataset = Dataset.cast(%Dataset{x: x, y: y}, opts) |> Dataset.update_cmap() datasets = data ++ [dataset] xydata = flatten_for_data(datasets) @@ -89,6 +89,7 @@ defmodule Matplotex.Figure.Areal.Scatter do elements = elements ++ line_elements %Figure{figure | axes: %{axes | element: elements}} end + def capture(%Dataset{transformed: transformed} = dataset, concurrency) do if concurrency do process_concurrently(transformed, concurrency, [[], dataset]) @@ -96,12 +97,18 @@ defmodule Matplotex.Figure.Areal.Scatter do capture(transformed, [], dataset) end end - def capture([{{{x, y}, s},color}| to_capture],captured, %Dataset{ - marker: marker, - colors: colors, - cmap: cmap - }= dataset) do - color = colors |> Enum.min_max()|>Garner.garn_color(color, cmap) + + def capture( + [{{{x, y}, s}, color} | to_capture], + captured, + %Dataset{ + marker: marker, + colors: colors, + cmap: cmap + } = dataset + ) do + color = colors |> Enum.min_max() |> Garner.garn_color(color, cmap) + capture( to_capture, captured ++ @@ -111,10 +118,15 @@ defmodule Matplotex.Figure.Areal.Scatter do dataset ) end - def capture([{{x, y}, s}| to_capture],captured, %Dataset{ - color: color, - marker: marker, - }= dataset) do + + def capture( + [{{x, y}, s} | to_capture], + captured, + %Dataset{ + color: color, + marker: marker + } = dataset + ) do capture( to_capture, captured ++ @@ -144,7 +156,6 @@ defmodule Matplotex.Figure.Areal.Scatter do ) end - def capture(_, captured, _), do: captured @impl Areal diff --git a/lib/matplotex/figure/dataset.ex b/lib/matplotex/figure/dataset.ex index 380da23..8006e8b 100644 --- a/lib/matplotex/figure/dataset.ex +++ b/lib/matplotex/figure/dataset.ex @@ -37,5 +37,4 @@ defmodule Matplotex.Figure.Dataset do def update_cmap(%__MODULE__{cmap: cmap} = dataset) do %__MODULE__{dataset | cmap: Colormap.fetch_cmap(cmap)} end - end diff --git a/lib/matplotex/figure/lead.ex b/lib/matplotex/figure/lead.ex index fd96c2e..605bb17 100644 --- a/lib/matplotex/figure/lead.ex +++ b/lib/matplotex/figure/lead.ex @@ -46,29 +46,45 @@ defmodule Matplotex.Figure.Lead do ty = fig_height - fig_height * margin %Figure{figure | axes: %{axes | border: {lx, by, rx, ty}}} end + def transform_sizes(%Figure{axes: %{dataset: datasets} = axes} = figure) do datasets = transform_dataset_sizes(figure, datasets, []) %Figure{figure | axes: %{axes | dataset: datasets}} end - defp transform_dataset_sizes(%Figure{axes: %{region_content: %Region{width: width_region_content, height: height_region_content}}}=figure, [%Dataset{sizes: sizes} = dataset | to_transorm], transformed) do + + defp transform_dataset_sizes(_figure, [%Dataset{sizes: nil}| _to_transorm] = datasets, _),do: datasets + + defp transform_dataset_sizes( + %Figure{ + axes: %{ + region_content: %Region{width: width_region_content, height: height_region_content} + } + } = figure, + [%Dataset{sizes: sizes} = dataset | to_transorm], + transformed + ) when length(sizes) > 0 do content_area = width_region_content * height_region_content total_size = Enum.sum(sizes) + area_size_ratio = - if total_size > 0 do - (content_area / total_size) * 0.7 - else - raise InputError, message: "Invalid sizes for fractionizing area" - end + if total_size > 0 do + content_area / total_size * 2 + else + raise InputError, message: "Invalid sizes for fractionizing area" + end sizes = - sizes - |> Nx.tensor() - |> Nx.multiply(area_size_ratio) - |> Nx.to_list() + sizes + |> Nx.tensor() + |> Nx.multiply(area_size_ratio) + |> Nx.to_list() + transform_dataset_sizes(figure, to_transorm, [%Dataset{dataset | sizes: sizes} | transformed]) end - defp transform_dataset_sizes(_, [], transformed), do: transformed + defp transform_dataset_sizes(_figure, [%Dataset{sizes: []}| _to_transorm] = datasets, _), do: datasets + + defp transform_dataset_sizes(_, [], transformed), do: transformed defp set_frame_size(%Figure{margin: margin, figsize: {fwidth, fheight}, axes: axes} = figure) do frame_size = {fwidth - fwidth * 2 * margin, fheight - fheight * 2 * margin} diff --git a/test/matplotex/figure/areal/scatter_test.exs b/test/matplotex/figure/areal/scatter_test.exs index 208b8ab..c27800d 100644 --- a/test/matplotex/figure/areal/scatter_test.exs +++ b/test/matplotex/figure/areal/scatter_test.exs @@ -14,32 +14,50 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert %Figure{axes: %{data: {x, _y}, element: elements}} = Scatter.materialize(figure) assert Enum.count(elements, fn elem -> elem.type == "plot.marker" end) == length(x) end + test "generates elements with various saizes if it passed a size attrbute" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] sizes = [1, 2, 3, 4, 5] - assert %Figure{axes: %{element: elements}} = x|>Matplotex.scatter(y, sizes: sizes)|>Figure.materialize() - [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> - x.r - end) - refute Enum.all?(tail, fn x -> x == h end) + assert %Figure{axes: %{element: elements}} = + x |> Matplotex.scatter(y, sizes: sizes) |> Figure.materialize() + + [h | tail] = + elements + |> Enum.filter(fn x -> x.type == "plot.marker" end) + |> Enum.map(fn x -> + x.r + end) + + refute Enum.all?(tail, fn x -> x == h end) end test "generates elements with various saizes and colors if it passed a size and color attrbute" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] sizes = [1, 2, 3, 4, 5] - assert %Figure{axes: %{element: elements}} = x|>Matplotex.scatter(y, sizes: sizes, colors: sizes)|>Figure.materialize() - [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> - x.r - end) - - refute Enum.all?(tail, fn x -> x == h end) - [h | tail] = elements|>Enum.filter(fn x -> x.type == "plot.marker" end)|>Enum.map(fn x -> - x.fill - end) - refute Enum.all?(tail, fn x -> x == h end) + + assert %Figure{axes: %{element: elements}} = + x |> Matplotex.scatter(y, sizes: sizes, colors: sizes) |> Figure.materialize() + + [h | tail] = + elements + |> Enum.filter(fn x -> x.type == "plot.marker" end) + |> Enum.map(fn x -> + x.r + end) + + refute Enum.all?(tail, fn x -> x == h end) + + [h | tail] = + elements + |> Enum.filter(fn x -> x.type == "plot.marker" end) + |> Enum.map(fn x -> + x.fill + end) + + refute Enum.all?(tail, fn x -> x == h end) end end @@ -53,56 +71,99 @@ defmodule Matplotex.Figure.Areal.ScatterTest do assert length(ticks) == 6 end end + describe "do_transform" do test "zips transformed values with sizes if the dataset contains sizes in eaqual size" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] sizes = [1, 2, 3, 4, 5] width = 2 height = 2 - assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes) - assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) - assert Enum.all?(transformed, &match?({{_,_},_}, &1)) + assert %Figure{axes: %{dataset: [dataset]}} = + x |> Matplotex.scatter(y, figsize: {width, height}, sizes: sizes) + + assert %Dataset{transformed: transformed} = + Areal.do_transform( + dataset, + Enum.min_max(x), + Enum.min_max(y), + width, + height, + {0, 0} + ) + + assert Enum.all?(transformed, &match?({{_, _}, _}, &1)) end + test "zips transformed values with marker size if colors exist without sizes" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] colors = [1, 2, 3, 4, 5] width = 2 height = 2 - assert %Figure{axes: %{dataset: [%Dataset{marker_size: _marker_size} = dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, colors: colors) - assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) - assert Enum.all?(transformed, &match?({{{_,_},_marker_size},_}, &1)) + + assert %Figure{axes: %{dataset: [%Dataset{marker_size: _marker_size} = dataset]}} = + x |> Matplotex.scatter(y, figsize: {width, height}, colors: colors) + + assert %Dataset{transformed: transformed} = + Areal.do_transform( + dataset, + Enum.min_max(x), + Enum.min_max(y), + width, + height, + {0, 0} + ) + + assert Enum.all?(transformed, &match?({{{_, _}, _marker_size}, _}, &1)) end + test "zips transformed values with colors if the dataset contanis colors" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] colors = [1, 2, 3, 4, 5] width = 2 height = 2 - assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, colors: colors) - assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) - assert Enum.all?(transformed, &match?({{{_,_},_},_}, &1)) + assert %Figure{axes: %{dataset: [dataset]}} = + x |> Matplotex.scatter(y, figsize: {width, height}, colors: colors) + assert %Dataset{transformed: transformed} = + Areal.do_transform( + dataset, + Enum.min_max(x), + Enum.min_max(y), + width, + height, + {0, 0} + ) + + assert Enum.all?(transformed, &match?({{{_, _}, _}, _}, &1)) end test "zips both size and colors if the dataset contains size and color" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] sizes = [1, 2, 3, 4, 5] colors = [1, 2, 3, 4, 5] width = 2 height = 2 - assert %Figure{axes: %{dataset: [dataset]}} = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes, colors: colors) - assert %Dataset{transformed: transformed} = Areal.do_transform(dataset, Enum.min_max(x), Enum.min_max(y),width, height, {0,0}) - assert Enum.all?(transformed, &match?({{{_,_},_},_}, &1)) + assert %Figure{axes: %{dataset: [dataset]}} = + x |> Matplotex.scatter(y, figsize: {width, height}, sizes: sizes, colors: colors) - end + assert %Dataset{transformed: transformed} = + Areal.do_transform( + dataset, + Enum.min_max(x), + Enum.min_max(y), + width, + height, + {0, 0} + ) + assert Enum.all?(transformed, &match?({{{_, _}, _}, _}, &1)) + end end - - end diff --git a/test/matplotex/figure/lead_test.exs b/test/matplotex/figure/lead_test.exs index 6d6b6c1..d8df5f0 100644 --- a/test/matplotex/figure/lead_test.exs +++ b/test/matplotex/figure/lead_test.exs @@ -263,18 +263,22 @@ defmodule Matplotex.Figure.LeadTest do describe "transform_sizes/1" do test "converts sizes to equivalent radius to the buble" do - x = [1,2,3,4,5] + x = [1, 2, 3, 4, 5] y = [10, 20, 30, 40, 50] sizes = [1, 2, 3, 4, 5] width = 2 height = 2 - figure = x|>Matplotex.scatter(y,figsize: {width, height}, sizes: sizes)|> Lead.set_regions_areal() + + figure = + x + |> Matplotex.scatter(y, figsize: {width, height}, sizes: sizes) + |> Lead.set_regions_areal() assert %Figure{axes: %{dataset: [%Dataset{sizes: transformed_sizes}]}} = Lead.transform_sizes(figure) assert length(transformed_sizes) == length(sizes) - assert Enum.sum(transformed_sizes) < (width * height) * 0.7 + assert Enum.sum(transformed_sizes) < width * height * 1.5 end end end From 7ca610b112151921ec109a60dd0805511b064ed3 Mon Sep 17 00:00:00 2001 From: Mohammed Sadique Date: Fri, 21 Feb 2025 18:51:03 +0530 Subject: [PATCH 7/7] format --- lib/matplotex/figure/lead.ex | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/matplotex/figure/lead.ex b/lib/matplotex/figure/lead.ex index 605bb17..cd97368 100644 --- a/lib/matplotex/figure/lead.ex +++ b/lib/matplotex/figure/lead.ex @@ -52,7 +52,8 @@ defmodule Matplotex.Figure.Lead do %Figure{figure | axes: %{axes | dataset: datasets}} end - defp transform_dataset_sizes(_figure, [%Dataset{sizes: nil}| _to_transorm] = datasets, _),do: datasets + defp transform_dataset_sizes(_figure, [%Dataset{sizes: nil} | _to_transorm] = datasets, _), + do: datasets defp transform_dataset_sizes( %Figure{ @@ -62,7 +63,8 @@ defmodule Matplotex.Figure.Lead do } = figure, [%Dataset{sizes: sizes} = dataset | to_transorm], transformed - ) when length(sizes) > 0 do + ) + when length(sizes) > 0 do content_area = width_region_content * height_region_content total_size = Enum.sum(sizes) @@ -81,8 +83,9 @@ defmodule Matplotex.Figure.Lead do transform_dataset_sizes(figure, to_transorm, [%Dataset{dataset | sizes: sizes} | transformed]) end - defp transform_dataset_sizes(_figure, [%Dataset{sizes: []}| _to_transorm] = datasets, _), do: datasets + defp transform_dataset_sizes(_figure, [%Dataset{sizes: []} | _to_transorm] = datasets, _), + do: datasets defp transform_dataset_sizes(_, [], transformed), do: transformed