diff --git a/lib/matplotex/colorscheme/colormap.ex b/lib/matplotex/colorscheme/colormap.ex index 90f52c2..91c99d6 100644 --- a/lib/matplotex/colorscheme/colormap.ex +++ b/lib/matplotex/colorscheme/colormap.ex @@ -3,7 +3,7 @@ defmodule Matplotex.Colorscheme.Colormap do defstruct [:color, :offset, opacity: 1] def viridis do - ["#fde725", "#21918c", "#3b528b", "#440154"] + ["#FDE725", "#6CCE59", "#1F9E89", "#482777"] end def plasma do @@ -26,16 +26,16 @@ defmodule Matplotex.Colorscheme.Colormap do def make_colormap(colors) do size = length(colors) + offsets = Nx.linspace(0, 1, n: size) |> Nx.to_list() colors - |> Enum.with_index() - |> Enum.map(&colormap(&1, size)) + |> Enum.zip(offsets) + |> Enum.map(&colormap(&1)) end def default_cmap(), do: viridis() - defp colormap({color, idx}, size) do - offset = idx / size * 100 + defp colormap({color, offset}) do %__MODULE__{color: color, offset: offset} end end diff --git a/lib/matplotex/colorscheme/garner.ex b/lib/matplotex/colorscheme/garner.ex index fa3e08b..71b3887 100644 --- a/lib/matplotex/colorscheme/garner.ex +++ b/lib/matplotex/colorscheme/garner.ex @@ -31,10 +31,10 @@ defmodule Matplotex.Colorscheme.Garner do defp place_edges([preceeding, minor, major, final]) do %__MODULE__{ - preceeding: preceeding.color, - minor: minor.color, - major: major.color, - final: final.color + preceeding: {preceeding.color, preceeding.offset}, + minor: {minor.color, minor.offset}, + major: {major.color, major.offset}, + final: {final.color, final.offset} } end @@ -42,16 +42,39 @@ defmodule Matplotex.Colorscheme.Garner do raise InputError, message: "Invalid colormap" end - defp point_color(%__MODULE__{color_cue: cue, preceeding: preceeding, minor: minor}) - when cue < minor do + defp point_color(%__MODULE__{ + color_cue: cue, + preceeding: {preceeding, preceeding_offset}, + minor: {minor, minor_offset} + }) + when cue <= minor_offset do + cue = mix_perces(cue, preceeding_offset, minor_offset) minor |> Blender.mix(preceeding, cue) |> Rgb.to_string() end - defp point_color(%__MODULE__{color_cue: cue, minor: minor, major: major}) when cue < major do + defp point_color(%__MODULE__{ + color_cue: cue, + minor: {minor, minor_offset}, + major: {major, major_offset} + }) + when cue <= major_offset do + cue = mix_perces(cue, minor_offset, major_offset) major |> Blender.mix(minor, cue) |> Rgb.to_string() end - defp point_color(%__MODULE__{color_cue: cue, major: major, final: final}) when cue >= major do - final |> Blender.mix(major) |> Rgb.to_string() + defp point_color(%__MODULE__{ + color_cue: cue, + major: {major, major_offset}, + final: {final, final_offset} + }) + when cue > major_offset do + cue = mix_perces(cue, major_offset, final_offset) + final |> Blender.mix(major, cue) |> Rgb.to_string() end + + defp mix_perces(cue, preceeding, postceeding) when preceeding != postceeding do + (cue - preceeding) / (postceeding - preceeding) + end + + defp mix_perces(cue, _, _), do: cue end diff --git a/lib/matplotex/element/cmap.ex b/lib/matplotex/element/cmap.ex index ac71971..558a6a8 100644 --- a/lib/matplotex/element/cmap.ex +++ b/lib/matplotex/element/cmap.ex @@ -22,7 +22,7 @@ defmodule Matplotex.Element.Cmap do end def tag_stop(%{offset: offset, color: color, opacity: opacity}) do - ~s() + ~s() end def color_gradient(%__MODULE__{container: container} = element) do diff --git a/lib/matplotex/figure/cast.ex b/lib/matplotex/figure/cast.ex index 801eadd..23188e0 100644 --- a/lib/matplotex/figure/cast.ex +++ b/lib/matplotex/figure/cast.ex @@ -557,7 +557,12 @@ defmodule Matplotex.Figure.Cast do tick_label = Label.cast_label( - %Label{type: "tick.cmap", x: tick_label_x, y: y_cord_tick, text: tick}, + %Label{ + type: "tick.cmap", + x: tick_label_x, + y: y_cord_tick, + text: format_tick_label(tick) + }, cmap_tick_font )