charty 0.1.4.dev → 0.1.5.dev
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.
- checksums.yaml +4 -4
- data/charty.gemspec +0 -1
- data/examples/active_record.ipynb +34 -34
- data/examples/daru.ipynb +71 -29
- data/examples/iris_dataset.ipynb +12 -5
- data/examples/nmatrix.ipynb +30 -30
- data/examples/numo-narray.ipynb +39 -28
- data/examples/sample_gruff.ipynb +148 -133
- data/examples/sample_images/barh_gruff.png +0 -0
- data/examples/sample_images/{boxplot_pyplot.png → box_plot_pyplot.png} +0 -0
- data/examples/sample_images/{errorbar_pyplot.png → error_bar_pyplot.png} +0 -0
- data/examples/sample_pyplot.ipynb +9 -9
- data/lib/charty.rb +0 -6
- data/lib/charty/backends/bokeh.rb +74 -0
- data/lib/charty/backends/gruff.rb +20 -2
- data/lib/charty/backends/pyplot.rb +9 -1
- data/lib/charty/plotter.rb +11 -3
- data/lib/charty/table.rb +2 -0
- data/lib/charty/version.rb +1 -1
- metadata +6 -18
Binary file
|
File without changes
|
File without changes
|
@@ -2,16 +2,16 @@
|
|
2
2
|
"cells": [
|
3
3
|
{
|
4
4
|
"cell_type": "code",
|
5
|
-
"execution_count":
|
5
|
+
"execution_count": 15,
|
6
6
|
"metadata": {},
|
7
7
|
"outputs": [
|
8
8
|
{
|
9
9
|
"data": {
|
10
10
|
"text/plain": [
|
11
|
-
"[:inline, \"module://matplotlib.
|
11
|
+
"[:inline, \"module://ruby.matplotlib.backend_inline\"]"
|
12
12
|
]
|
13
13
|
},
|
14
|
-
"execution_count":
|
14
|
+
"execution_count": 15,
|
15
15
|
"metadata": {},
|
16
16
|
"output_type": "execute_result"
|
17
17
|
}
|
@@ -20,7 +20,7 @@
|
|
20
20
|
"require 'charty'\n",
|
21
21
|
"\n",
|
22
22
|
"charty = Charty::Plotter.new(:pyplot)\n",
|
23
|
-
"Charty::
|
23
|
+
"Charty::PyPlot.activate_iruby_integration"
|
24
24
|
]
|
25
25
|
},
|
26
26
|
{
|
@@ -200,16 +200,16 @@
|
|
200
200
|
},
|
201
201
|
{
|
202
202
|
"cell_type": "code",
|
203
|
-
"execution_count":
|
203
|
+
"execution_count": 16,
|
204
204
|
"metadata": {},
|
205
205
|
"outputs": [
|
206
206
|
{
|
207
207
|
"data": {
|
208
208
|
"text/plain": [
|
209
|
-
"#<Charty::Layout:
|
209
|
+
"#<Charty::Layout:0x000055f440ba50d8 @frontend=#<Charty::PyPlot:0x000055f440b766c0 @plot=<module 'matplotlib.pyplot' from '/opt/conda/lib/python3.7/site-packages/matplotlib/pyplot.py'>>, @layout=#<Charty::ArrayLayout:0x000055f440ba50b0 @array=[], @direction=:horizontal>>"
|
210
210
|
]
|
211
211
|
},
|
212
|
-
"execution_count":
|
212
|
+
"execution_count": 16,
|
213
213
|
"metadata": {},
|
214
214
|
"output_type": "execute_result"
|
215
215
|
}
|
@@ -376,7 +376,7 @@
|
|
376
376
|
],
|
377
377
|
"metadata": {
|
378
378
|
"kernelspec": {
|
379
|
-
"display_name": "Ruby 2.
|
379
|
+
"display_name": "Ruby 2.6.2",
|
380
380
|
"language": "ruby",
|
381
381
|
"name": "ruby"
|
382
382
|
},
|
@@ -384,7 +384,7 @@
|
|
384
384
|
"file_extension": ".rb",
|
385
385
|
"mimetype": "application/x-ruby",
|
386
386
|
"name": "ruby",
|
387
|
-
"version": "2.
|
387
|
+
"version": "2.6.2"
|
388
388
|
},
|
389
389
|
"toc": {
|
390
390
|
"nav_menu": {},
|
data/lib/charty.rb
CHANGED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'pycall'
|
2
|
+
|
3
|
+
module Charty
|
4
|
+
class Bokeh < PlotterAdapter
|
5
|
+
Name = "bokeh"
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@plot = PyCall.import_module('bokeh.plotting')
|
9
|
+
end
|
10
|
+
|
11
|
+
def series=(series)
|
12
|
+
@series = series
|
13
|
+
end
|
14
|
+
|
15
|
+
def render(context, filename)
|
16
|
+
plot = plot(context)
|
17
|
+
save(plot, context, filename)
|
18
|
+
PyCall.import_module('bokeh.io').show(plot)
|
19
|
+
end
|
20
|
+
|
21
|
+
def save(plot, context, filename)
|
22
|
+
if filename
|
23
|
+
PyCall.import_module('bokeh.io').save(plot, filename)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def plot(context)
|
28
|
+
#TODO To implement boxplot, bublle, error_bar, hist.
|
29
|
+
|
30
|
+
plot = @plot.figure(title: context&.title)
|
31
|
+
plot.xaxis[0].axis_label = context&.xlabel
|
32
|
+
plot.yaxis[0].axis_label = context&.ylabel
|
33
|
+
|
34
|
+
case context.method
|
35
|
+
when :bar
|
36
|
+
context.series.each do |data|
|
37
|
+
diffs = data.xs.to_a.each_cons(2).map {|n, m| (n - m).abs }
|
38
|
+
width = diffs.min * 0.8
|
39
|
+
plot.vbar(data.xs.to_a, width, data.ys.to_a)
|
40
|
+
end
|
41
|
+
|
42
|
+
when :barh
|
43
|
+
context.series.each do |data|
|
44
|
+
diffs = data.xs.to_a.each_cons(2).map {|n, m| (n - m).abs }
|
45
|
+
height = diffs.min * 0.8
|
46
|
+
plot.hbar(data.xs.to_a, height, data.ys.to_a)
|
47
|
+
end
|
48
|
+
|
49
|
+
when :boxplot
|
50
|
+
raise NotImplementedError
|
51
|
+
|
52
|
+
when :bubble
|
53
|
+
raise NotImplementedError
|
54
|
+
|
55
|
+
when :curve
|
56
|
+
context.series.each do |data|
|
57
|
+
plot.line(data.xs.to_a, data.ys.to_a)
|
58
|
+
end
|
59
|
+
|
60
|
+
when :scatter
|
61
|
+
context.series.each do |data|
|
62
|
+
plot.scatter(data.xs.to_a, data.ys.to_a)
|
63
|
+
end
|
64
|
+
|
65
|
+
when :error_bar
|
66
|
+
raise NotImplementedError
|
67
|
+
|
68
|
+
when :hist
|
69
|
+
raise NotImplementedError
|
70
|
+
end
|
71
|
+
plot
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -45,8 +45,26 @@ module Charty
|
|
45
45
|
end
|
46
46
|
p
|
47
47
|
when :barh
|
48
|
-
|
49
|
-
|
48
|
+
p = plot::SideBar.new
|
49
|
+
p.title = context.title if context.title
|
50
|
+
p.x_axis_label = context.xlabel if context.xlabel
|
51
|
+
p.y_axis_label = context.ylabel if context.ylabel
|
52
|
+
labels = context.series.map {|data| data.xs.to_a}.flatten.uniq
|
53
|
+
labels.each do |label|
|
54
|
+
data_ys = context.series.map do |data|
|
55
|
+
if data.xs.to_a.index(label)
|
56
|
+
data.ys.to_a[data.xs.to_a.index(label)]
|
57
|
+
else
|
58
|
+
0
|
59
|
+
end
|
60
|
+
end
|
61
|
+
p.data(label, data_ys)
|
62
|
+
end
|
63
|
+
p.labels = context.series.each_with_index.inject({}) do |attr, (data, i)|
|
64
|
+
attr[i] = data.label
|
65
|
+
attr
|
66
|
+
end
|
67
|
+
p
|
50
68
|
when :box_plot
|
51
69
|
# refs. https://github.com/topfunky/gruff/issues/155
|
52
70
|
raise NotImplementedError
|
@@ -40,6 +40,14 @@ module Charty
|
|
40
40
|
@plot.show
|
41
41
|
end
|
42
42
|
|
43
|
+
def save(context, filename)
|
44
|
+
plot(@plot, context)
|
45
|
+
if filename
|
46
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
47
|
+
@plot.savefig(filename)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
43
51
|
def plot(plot, context, subplot: false)
|
44
52
|
# TODO: Since it is not required, research and change conditions.
|
45
53
|
# case
|
@@ -68,7 +76,7 @@ module Charty
|
|
68
76
|
plot.barh(data.xs.to_a.map(&:to_s), data.ys.to_a)
|
69
77
|
end
|
70
78
|
when :box_plot
|
71
|
-
plot.boxplot(context.data.to_a)
|
79
|
+
plot.boxplot(context.data.to_a, labels: context.labels)
|
72
80
|
when :bubble
|
73
81
|
context.series.each do |data|
|
74
82
|
plot.scatter(data.xs.to_a, data.ys.to_a, s: data.zs.to_a, alpha: 0.5, label: data.label)
|
data/lib/charty/plotter.rb
CHANGED
@@ -155,14 +155,14 @@ module Charty
|
|
155
155
|
Series = Struct.new(:xs, :ys, :zs, :xerr, :yerr, :label)
|
156
156
|
|
157
157
|
class RenderContext
|
158
|
-
attr_reader :function, :range, :series, :method, :data, :title, :xlabel, :ylabel
|
158
|
+
attr_reader :function, :range, :series, :method, :data, :title, :xlabel, :ylabel, :labels
|
159
159
|
|
160
160
|
def initialize(method, **args, &block)
|
161
161
|
@method = method
|
162
162
|
configurator = Configurator.new(**args)
|
163
163
|
configurator.instance_eval &block
|
164
164
|
# TODO: label も外から付けられた方がよさそう
|
165
|
-
(@range, @series, @function, @data, @title, @xlabel, @ylabel) = configurator.to_a
|
165
|
+
(@range, @series, @function, @data, @title, @xlabel, @ylabel, @labels) = configurator.to_a
|
166
166
|
end
|
167
167
|
|
168
168
|
class Configurator
|
@@ -191,6 +191,10 @@ module Charty
|
|
191
191
|
@ylabel = ylabel
|
192
192
|
end
|
193
193
|
|
194
|
+
def labels(labels)
|
195
|
+
@labels = labels
|
196
|
+
end
|
197
|
+
|
194
198
|
def label(x, y)
|
195
199
|
|
196
200
|
end
|
@@ -204,7 +208,7 @@ module Charty
|
|
204
208
|
end
|
205
209
|
|
206
210
|
def to_a
|
207
|
-
[@range, @series, @function, @data, @title, @xlabel, @ylabel]
|
211
|
+
[@range, @series, @function, @data, @title, @xlabel, @ylabel, @labels]
|
208
212
|
end
|
209
213
|
|
210
214
|
def method_missing(method, *args)
|
@@ -228,6 +232,10 @@ module Charty
|
|
228
232
|
@plotter_adapter.render(self, filename)
|
229
233
|
end
|
230
234
|
|
235
|
+
def save(filename=nil)
|
236
|
+
@plotter_adapter.save(self, filename)
|
237
|
+
end
|
238
|
+
|
231
239
|
def apply(plotter_adapter)
|
232
240
|
case
|
233
241
|
when !@series.empty?
|
data/lib/charty/table.rb
CHANGED
data/lib/charty/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: charty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5.dev
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youchan
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-07-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -68,20 +68,6 @@ dependencies:
|
|
68
68
|
- - ">="
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '0'
|
71
|
-
- !ruby/object:Gem::Dependency
|
72
|
-
name: gruff
|
73
|
-
requirement: !ruby/object:Gem::Requirement
|
74
|
-
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
|
-
type: :development
|
79
|
-
prerelease: false
|
80
|
-
version_requirements: !ruby/object:Gem::Requirement
|
81
|
-
requirements:
|
82
|
-
- - ">="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: '0'
|
85
71
|
description: Visualizing your data in a simple way.
|
86
72
|
email:
|
87
73
|
- youchan01@gmail.com
|
@@ -113,8 +99,9 @@ files:
|
|
113
99
|
- examples/sample_images/bar_gruff.png
|
114
100
|
- examples/sample_images/bar_pyplot.png
|
115
101
|
- examples/sample_images/bar_rubyplot.png
|
102
|
+
- examples/sample_images/barh_gruff.png
|
116
103
|
- examples/sample_images/barh_pyplot.png
|
117
|
-
- examples/sample_images/
|
104
|
+
- examples/sample_images/box_plot_pyplot.png
|
118
105
|
- examples/sample_images/bubble_pyplot.png
|
119
106
|
- examples/sample_images/bubble_rubyplot.png
|
120
107
|
- examples/sample_images/curve_gruff.png
|
@@ -122,7 +109,7 @@ files:
|
|
122
109
|
- examples/sample_images/curve_rubyplot.png
|
123
110
|
- examples/sample_images/curve_with_function_pyplot.png
|
124
111
|
- examples/sample_images/curve_with_function_rubyplot.png
|
125
|
-
- examples/sample_images/
|
112
|
+
- examples/sample_images/error_bar_pyplot.png
|
126
113
|
- examples/sample_images/hist_pyplot.png
|
127
114
|
- examples/sample_images/scatter_gruff.png
|
128
115
|
- examples/sample_images/scatter_pyplot.png
|
@@ -133,6 +120,7 @@ files:
|
|
133
120
|
- examples/sample_rubyplot.ipynb
|
134
121
|
- images/design_concept.png
|
135
122
|
- lib/charty.rb
|
123
|
+
- lib/charty/backends/bokeh.rb
|
136
124
|
- lib/charty/backends/google_chart.rb
|
137
125
|
- lib/charty/backends/gruff.rb
|
138
126
|
- lib/charty/backends/pyplot.rb
|