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
)