red-colors 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ module Colors
2
+ module ColormapRegistry
3
+ register_listed_colormap("rocket")
4
+ register_listed_colormap("mako")
5
+ register_listed_colormap("icefire")
6
+ register_listed_colormap("vlag")
7
+ register_listed_colormap("flare")
8
+ register_listed_colormap("crest")
9
+ end
10
+ end
@@ -0,0 +1,62 @@
1
+ module Colors
2
+ module ColormapRegistry
3
+ @registry = {}
4
+
5
+ def self.[](name)
6
+ return name if name.is_a?(Colormap)
7
+
8
+ name = String.try_convert(name)
9
+ if @registry.key?(name)
10
+ return @registry[name]
11
+ else
12
+ raise ArgumentError, "Unknown colormap name: %p" % name
13
+ end
14
+ end
15
+
16
+ def self.register(cmap, name: nil, override_builtin: false)
17
+ case name
18
+ when String, Symbol
19
+ name = name.to_s
20
+ when nil
21
+ name = cmap.name
22
+ if name.nil?
23
+ raise ArgumentError, "`name` cannot be omitted for unnamed colormaps"
24
+ end
25
+ else
26
+ name = String.try_convert(name)
27
+ if name.nil?
28
+ raise ArgumentError, "`name` must be convertible to a String by to_str"
29
+ end
30
+ end
31
+
32
+ if @registry.key?(name)
33
+ existing = @registry[name]
34
+ if BUILTIN_COLORMAPS.key?(name)
35
+ unless override_builtin
36
+ raise ArgumentError,
37
+ "Trying to re-register a builtin colormap: %p" % name
38
+ end
39
+ end
40
+ warn "Trying to re-register the colormap %p which already exists" % name
41
+ end
42
+
43
+ unless cmap.is_a?(Colormap)
44
+ raise ArgumentError,
45
+ "Invalid value for registering a colormap (%p for a Colormap)" % cmap
46
+ end
47
+
48
+ @registry[name] = cmap
49
+ end
50
+
51
+ def self.unregister(name)
52
+ if @registry.key?(name)
53
+ if BUILTIN_COLORMAPS.key?(name)
54
+ raise ArgumentError,
55
+ "Unable to unregister the colormap %p which is a builtin colormap" % name
56
+ end
57
+ else
58
+ @registry.delete(name)
59
+ end
60
+ end
61
+ end
62
+ end
data/lib/colors/helper.rb CHANGED
@@ -7,7 +7,8 @@ module Colors
7
7
 
8
8
  private def check_range(value, range, name)
9
9
  return value if range.cover?(value)
10
- check_fail ArgumentError, "#{name} must be in #{range}, but #{value} is given"
10
+ check_fail ArgumentError,
11
+ "#{name} must be in #{range}, but %p is given" % value
11
12
  end
12
13
 
13
14
  private def check_fail(exc_class, message)
@@ -17,7 +17,7 @@ module Colors
17
17
  else
18
18
  ary = Array.try_convert(colors)
19
19
  if ary.nil?
20
- raise ArgumentError, "colors must be convertible to an array"
20
+ raise ArgumentError, "colors must be convertible to an array: %p for %s" % [colors, name]
21
21
  else
22
22
  colors = ary
23
23
  end
@@ -115,5 +115,23 @@ module Colors
115
115
 
116
116
  return lut.map {|v| v.clamp(0, 1).to_f }
117
117
  end
118
+
119
+ private def make_reverse_colormap(name)
120
+ segmented_data_r = self.segmented_data.map { |key, data|
121
+ data_r = if data.respond_to?(:call)
122
+ make_inverse_func(data)
123
+ else
124
+ data.reverse_each.map do |x, y0, y1|
125
+ [1r - x, y1, y0]
126
+ end
127
+ end
128
+ [key, data_r]
129
+ }.to_h
130
+ LinearSegmentedColormap.new(name, segmented_data_r, n_colors: self.n_colors, gamma: self.gamma)
131
+ end
132
+
133
+ private def make_inverse_func(f)
134
+ ->(x) { f(1 - x) }
135
+ end
118
136
  end
119
137
  end
@@ -37,5 +37,9 @@ module Colors
37
37
  @initialized = true
38
38
  update_extreme_colors
39
39
  end
40
+
41
+ private def make_reverse_colormap(name)
42
+ ListedColormap.new(self.colors.reverse, name: name, n_colors: self.n_colors)
43
+ end
40
44
  end
41
45
  end
@@ -1,3 +1,3 @@
1
1
  module Colors
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/red-colors.gemspec CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  "#{spec.name}.gemspec",
28
28
  ]
29
29
  spec.files += [".yardopts"]
30
+ spec.files += Dir.glob("data/colormaps/*.json")
30
31
  spec.files += Dir.glob("lib/**/*.rb")
31
32
  spec.files += Dir.glob("image/*.*")
32
33
  spec.files += Dir.glob("doc/text/*")
@@ -115,5 +115,24 @@ class ColorsLinearSegmentedColormapTest < Test::Unit::TestCase
115
115
  after
116
116
  ])
117
117
  end
118
+
119
+ def test_reversed
120
+ cm = Colors::LinearSegmentedColormap.new_from_list("four", [:red, :magenta, :green, :yellow, :blue], n_colors: 5)
121
+ cm.under_color = :black
122
+ cm.over_color = :white
123
+ rev = cm.reversed
124
+ assert_equal([
125
+ "four_r",
126
+ cm[[0, 1, 2, 3, 4]],
127
+ Colors[:black],
128
+ Colors[:white]
129
+ ],
130
+ [
131
+ rev.name,
132
+ rev[[4, 3, 2, 1, 0]],
133
+ rev.under_color,
134
+ rev.over_color
135
+ ])
136
+ end
118
137
  end
119
138
 
@@ -112,4 +112,23 @@ class ColorsListedColormapTest < Test::Unit::TestCase
112
112
  after
113
113
  ])
114
114
  end
115
+
116
+ def test_reversed
117
+ cm = Colors::ListedColormap.new([:red, :green, :blue], name: "three")
118
+ cm.under_color = :orange
119
+ cm.over_color = :yellow
120
+ rev = cm.reversed
121
+ assert_equal([
122
+ "three_r",
123
+ cm[[0, 1, 2]],
124
+ Colors[:orange],
125
+ Colors[:yellow]
126
+ ],
127
+ [
128
+ rev.name,
129
+ rev[[2, 1, 0]],
130
+ rev.under_color,
131
+ rev.over_color
132
+ ])
133
+ end
115
134
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red-colors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenta Murata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-12 00:00:00.000000000 Z
11
+ date: 2021-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: matrix
@@ -106,11 +106,33 @@ files:
106
106
  - LICENSE.txt
107
107
  - README.md
108
108
  - Rakefile
109
+ - data/colormaps/cividis.json
110
+ - data/colormaps/coolwarm.json
111
+ - data/colormaps/crest.json
112
+ - data/colormaps/flare.json
113
+ - data/colormaps/gist_earth.json
114
+ - data/colormaps/gist_ncar.json
115
+ - data/colormaps/icefire.json
116
+ - data/colormaps/inferno.json
117
+ - data/colormaps/magma.json
118
+ - data/colormaps/mako.json
119
+ - data/colormaps/nipy_spectral.json
120
+ - data/colormaps/pink.json
121
+ - data/colormaps/plasma.json
122
+ - data/colormaps/rocket.json
123
+ - data/colormaps/turbo.json
124
+ - data/colormaps/twilight.json
125
+ - data/colormaps/viridis.json
126
+ - data/colormaps/vlag.json
109
127
  - lib/colors.rb
110
128
  - lib/colors/abstract_color.rb
111
129
  - lib/colors/alpha_component.rb
112
130
  - lib/colors/color_data.rb
113
131
  - lib/colors/colormap.rb
132
+ - lib/colors/colormap_data.rb
133
+ - lib/colors/colormap_data/matplotlib_builtin.rb
134
+ - lib/colors/colormap_data/seaborn_builtin.rb
135
+ - lib/colors/colormap_registry.rb
114
136
  - lib/colors/convert.rb
115
137
  - lib/colors/helper.rb
116
138
  - lib/colors/hsl.rb