hyper-d3 1.0.0.lap23
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 +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +313 -0
- data/README.md +118 -0
- data/Rakefile +31 -0
- data/hyper-d3.gemspec +27 -0
- data/lib/d3.rb +68 -0
- data/lib/d3/arc.rb +29 -0
- data/lib/d3/area.rb +53 -0
- data/lib/d3/axis.rb +79 -0
- data/lib/d3/band_scale.rb +30 -0
- data/lib/d3/collections.rb +9 -0
- data/lib/d3/color.rb +76 -0
- data/lib/d3/color_schemes.rb +34 -0
- data/lib/d3/continuous_scale.rb +60 -0
- data/lib/d3/creator.rb +11 -0
- data/lib/d3/curve.rb +74 -0
- data/lib/d3/dsv.rb +103 -0
- data/lib/d3/ease.rb +319 -0
- data/lib/d3/format.rb +95 -0
- data/lib/d3/histograms.rb +46 -0
- data/lib/d3/interpolate.rb +125 -0
- data/lib/d3/line.rb +27 -0
- data/lib/d3/map.rb +48 -0
- data/lib/d3/misc.rb +15 -0
- data/lib/d3/native.rb +112 -0
- data/lib/d3/nest.rb +100 -0
- data/lib/d3/ordinal_scale.rb +39 -0
- data/lib/d3/path.rb +24 -0
- data/lib/d3/pie.rb +25 -0
- data/lib/d3/point_scale.rb +27 -0
- data/lib/d3/polygon.rb +18 -0
- data/lib/d3/quadtree.rb +89 -0
- data/lib/d3/quantile_scale.rb +19 -0
- data/lib/d3/quantize_scale.rb +20 -0
- data/lib/d3/radial_area.rb +55 -0
- data/lib/d3/radial_line.rb +27 -0
- data/lib/d3/random.rb +14 -0
- data/lib/d3/search.rb +30 -0
- data/lib/d3/selection.rb +151 -0
- data/lib/d3/sequential_scale.rb +31 -0
- data/lib/d3/set.rb +30 -0
- data/lib/d3/source/d3-drag.js +234 -0
- data/lib/d3/source/d3-scale-chromatic.js +484 -0
- data/lib/d3/source/d3.js +17178 -0
- data/lib/d3/stack.rb +13 -0
- data/lib/d3/statistics.rb +81 -0
- data/lib/d3/symbol.rb +70 -0
- data/lib/d3/threshold_scale.rb +22 -0
- data/lib/d3/time_format.rb +47 -0
- data/lib/d3/time_interval.rb +85 -0
- data/lib/d3/transformations.rb +16 -0
- data/lib/hyper-d3.rb +17 -0
- data/lib/hyperloop/d3/component.rb +12 -0
- data/lib/hyperloop/d3/mixin.rb +59 -0
- data/lib/hyperloop/d3/version.rb +5 -0
- data/spec/arc_spec.rb +80 -0
- data/spec/area_spec.rb +98 -0
- data/spec/axis_spec.rb +174 -0
- data/spec/band_scale_spec.rb +73 -0
- data/spec/color_spec.rb +74 -0
- data/spec/continuous_scale_spec.rb +217 -0
- data/spec/coverage_spec.rb +16 -0
- data/spec/creator_spec.rb +15 -0
- data/spec/curve_spec.rb +206 -0
- data/spec/dsv_spec.rb +194 -0
- data/spec/ease_spec.rb +370 -0
- data/spec/format_spec.rb +87 -0
- data/spec/histograms_spec.rb +61 -0
- data/spec/html/index.html.erb +11 -0
- data/spec/interpolate_spec.rb +152 -0
- data/spec/line_spec.rb +54 -0
- data/spec/map_spec.rb +80 -0
- data/spec/misc_spec.rb +21 -0
- data/spec/nest_spec.rb +89 -0
- data/spec/objects_spec.rb +22 -0
- data/spec/ordinal_scale_spec.rb +59 -0
- data/spec/path_spec.rb +65 -0
- data/spec/pie_spec.rb +114 -0
- data/spec/point_scale_spec.rb +58 -0
- data/spec/polygon_spec.rb +51 -0
- data/spec/quadtree_spec.rb +128 -0
- data/spec/quantile_scale_spec.rb +24 -0
- data/spec/quantize_scale_spec.rb +40 -0
- data/spec/radial_area_spec.rb +123 -0
- data/spec/radial_line_spec.rb +50 -0
- data/spec/random_spec.rb +34 -0
- data/spec/search_spec.rb +69 -0
- data/spec/selection_data_spec.rb +64 -0
- data/spec/selection_manipulation_spec.rb +166 -0
- data/spec/selection_spec.rb +187 -0
- data/spec/sequential_scale_spec.rb +90 -0
- data/spec/set_spec.rb +57 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/stack_spec.rb +5 -0
- data/spec/statistics_spec.rb +65 -0
- data/spec/symbol_spec.rb +116 -0
- data/spec/test_app/.gitignore +23 -0
- data/spec/test_app/Gemfile +7 -0
- data/spec/test_app/Gemfile.lock +206 -0
- data/spec/test_app/README.md +9 -0
- data/spec/test_app/Rakefile +6 -0
- data/spec/test_app/app/assets/config/manifest.js +3 -0
- data/spec/test_app/app/assets/images/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/application.js +13 -0
- data/spec/test_app/app/assets/javascripts/cable.js +13 -0
- data/spec/test_app/app/assets/javascripts/channels/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/data/elections_2016.rb +10 -0
- data/spec/test_app/app/assets/javascripts/data/harry_potter.rb +19 -0
- data/spec/test_app/app/assets/javascripts/data/iphones.rb +29 -0
- data/spec/test_app/app/assets/javascripts/data/london_population.rb +26 -0
- data/spec/test_app/app/assets/javascripts/data/man_vs_horse.rb +55 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_colors.rb +96 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_creatures.rb +116 -0
- data/spec/test_app/app/assets/javascripts/data/olympics_2016_medals.rb +100 -0
- data/spec/test_app/app/assets/javascripts/data/paradox.rb +60 -0
- data/spec/test_app/app/assets/javascripts/data/polish_pms.rb +28 -0
- data/spec/test_app/app/assets/javascripts/data/star_trek_voyager.rb +183 -0
- data/spec/test_app/app/assets/javascripts/data/weather_in_london.rb +381 -0
- data/spec/test_app/app/assets/javascripts/elections_2016.rb +27 -0
- data/spec/test_app/app/assets/javascripts/harry_potter.rb +42 -0
- data/spec/test_app/app/assets/javascripts/iphones.rb +54 -0
- data/spec/test_app/app/assets/javascripts/london_population.rb +53 -0
- data/spec/test_app/app/assets/javascripts/london_population_area.rb +49 -0
- data/spec/test_app/app/assets/javascripts/man_vs_horse.rb +60 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_colors.rb +56 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_creatures.rb +70 -0
- data/spec/test_app/app/assets/javascripts/olympics_2016_medals.rb +62 -0
- data/spec/test_app/app/assets/javascripts/paradox.rb +64 -0
- data/spec/test_app/app/assets/javascripts/polish_pms.rb +60 -0
- data/spec/test_app/app/assets/javascripts/star_trek_voyager.rb +44 -0
- data/spec/test_app/app/assets/javascripts/weather_in_london.rb +69 -0
- data/spec/test_app/app/assets/stylesheets/application.css +15 -0
- data/spec/test_app/app/channels/application_cable/channel.rb +4 -0
- data/spec/test_app/app/channels/application_cable/connection.rb +4 -0
- data/spec/test_app/app/controllers/application_controller.rb +27 -0
- data/spec/test_app/app/controllers/concerns/.keep +0 -0
- data/spec/test_app/app/helpers/application_helper.rb +2 -0
- data/spec/test_app/app/jobs/application_job.rb +2 -0
- data/spec/test_app/app/mailers/application_mailer.rb +4 -0
- data/spec/test_app/app/models/application_record.rb +3 -0
- data/spec/test_app/app/models/concerns/.keep +0 -0
- data/spec/test_app/app/views/application/index.erb +18 -0
- data/spec/test_app/app/views/application/visualization.erb +28 -0
- data/spec/test_app/app/views/layouts/application.html.erb +13 -0
- data/spec/test_app/bin/bundle +3 -0
- data/spec/test_app/bin/rails +4 -0
- data/spec/test_app/bin/rake +4 -0
- data/spec/test_app/bin/setup +38 -0
- data/spec/test_app/bin/update +29 -0
- data/spec/test_app/bin/yarn +11 -0
- data/spec/test_app/config.ru +5 -0
- data/spec/test_app/config/application.rb +18 -0
- data/spec/test_app/config/boot.rb +3 -0
- data/spec/test_app/config/cable.yml +10 -0
- data/spec/test_app/config/database.yml +25 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/environments/development.rb +54 -0
- data/spec/test_app/config/environments/production.rb +91 -0
- data/spec/test_app/config/environments/test.rb +42 -0
- data/spec/test_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/test_app/config/initializers/assets.rb +14 -0
- data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/test_app/config/initializers/cookies_serializer.rb +5 -0
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/test_app/config/initializers/inflections.rb +16 -0
- data/spec/test_app/config/initializers/mime_types.rb +4 -0
- data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/test_app/config/locales/en.yml +33 -0
- data/spec/test_app/config/puma.rb +56 -0
- data/spec/test_app/config/routes.rb +5 -0
- data/spec/test_app/config/secrets.yml +32 -0
- data/spec/test_app/config/spring.rb +6 -0
- data/spec/test_app/db/seeds.rb +7 -0
- data/spec/test_app/lib/assets/.keep +0 -0
- data/spec/test_app/lib/tasks/.keep +0 -0
- data/spec/test_app/log/.keep +0 -0
- data/spec/test_app/package.json +5 -0
- data/spec/test_app/public/404.html +67 -0
- data/spec/test_app/public/422.html +67 -0
- data/spec/test_app/public/500.html +66 -0
- data/spec/test_app/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/test_app/public/apple-touch-icon.png +0 -0
- data/spec/test_app/public/favicon.ico +0 -0
- data/spec/test_app/public/robots.txt +1 -0
- data/spec/test_app/test/application_system_test_case.rb +5 -0
- data/spec/test_app/test/controllers/.keep +0 -0
- data/spec/test_app/test/fixtures/.keep +0 -0
- data/spec/test_app/test/fixtures/files/.keep +0 -0
- data/spec/test_app/test/helpers/.keep +0 -0
- data/spec/test_app/test/integration/.keep +0 -0
- data/spec/test_app/test/mailers/.keep +0 -0
- data/spec/test_app/test/models/.keep +0 -0
- data/spec/test_app/test/system/.keep +0 -0
- data/spec/test_app/test/test_helper.rb +10 -0
- data/spec/test_app/tmp/.keep +0 -0
- data/spec/test_app/vendor/.keep +0 -0
- data/spec/threshold_scale_spec.rb +28 -0
- data/spec/time_format_spec.rb +100 -0
- data/spec/time_interval_spec.rb +314 -0
- data/spec/transformations_spec.rb +51 -0
- data/startrekvoyager.png +0 -0
- metadata +529 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require "hyper-d3"
|
|
2
|
+
require "data/paradox"
|
|
3
|
+
|
|
4
|
+
class ParadoxComponent
|
|
5
|
+
include Hyperloop::D3::Mixin
|
|
6
|
+
|
|
7
|
+
render_with_selection do |selection, paradox_data|
|
|
8
|
+
svg = selection
|
|
9
|
+
.attr("height", "600px")
|
|
10
|
+
.attr("width", "100%")
|
|
11
|
+
width = svg.style("width").to_i
|
|
12
|
+
|
|
13
|
+
min_date, max_date = paradox_data.map(&:time).minmax
|
|
14
|
+
count = paradox_data.map{|g| [g.series, g.number]}.uniq.size
|
|
15
|
+
bar_height = 580 / count
|
|
16
|
+
|
|
17
|
+
x = D3.scale_linear.domain([min_date, max_date]).range([0,width-220])
|
|
18
|
+
y = D3.scale_ordinal.range(count.times.map{|x| bar_height * x})
|
|
19
|
+
c = D3.scale_ordinal.range(D3.scheme_category_10)
|
|
20
|
+
stripes = D3.scale_ordinal.range([0,1])
|
|
21
|
+
|
|
22
|
+
graph_area = svg.append("g")
|
|
23
|
+
.attr("transform", "translate(200, 20)")
|
|
24
|
+
|
|
25
|
+
paradox_data.each do |game|
|
|
26
|
+
dlc = (game.dlc != "")
|
|
27
|
+
full_game = "#{game.series} #{game.number}"
|
|
28
|
+
|
|
29
|
+
graph_area.append("circle")
|
|
30
|
+
.attr("cx", x.(game.time))
|
|
31
|
+
.attr("cy", y.(full_game))
|
|
32
|
+
.attr("r", dlc ? 8 : 12)
|
|
33
|
+
.attr("fill", c.("#{game.series}"))
|
|
34
|
+
.attr("opacity", 0.6)
|
|
35
|
+
.attr("stroke-width", "1px")
|
|
36
|
+
.attr("stroke", "black")
|
|
37
|
+
|
|
38
|
+
unless dlc
|
|
39
|
+
graph_area.append("text")
|
|
40
|
+
.attr("x", -200 + 5)
|
|
41
|
+
.attr("y", y.(full_game) + 4)
|
|
42
|
+
.text(full_game)
|
|
43
|
+
|
|
44
|
+
color = D3.color(c.("#{game.series}"))
|
|
45
|
+
color = color.brighter(stripes.("#{full_game}"))
|
|
46
|
+
graph_area.append("rect")
|
|
47
|
+
.attr("x", -200)
|
|
48
|
+
.attr("width", width)
|
|
49
|
+
.attr("y", y.(full_game) - bar_height/2)
|
|
50
|
+
.attr("height", bar_height)
|
|
51
|
+
.attr("fill", color)
|
|
52
|
+
.attr("opacity", 0.2)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
axis_bottom = D3.axis_bottom(x)
|
|
58
|
+
.tick_format(D3.time_format("%B %Y"))
|
|
59
|
+
graph_area.append("g").attr("transform", "translate(0, 560)").call(axis_bottom)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# manual mount of component, usually you would use the react_component view helper for example
|
|
64
|
+
React.render(React.create_element(ParadoxComponent, data: ParadoxGames), `document.body.querySelector("#visualization")`)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require "react/test/utils" # just for mounting manually here, please ignore
|
|
2
|
+
require "data/polish_pms"
|
|
3
|
+
|
|
4
|
+
class PolishPMsComponent
|
|
5
|
+
include Hyperloop::D3::Mixin
|
|
6
|
+
|
|
7
|
+
render_with_selection do |selection, pm_data|
|
|
8
|
+
svg = selection
|
|
9
|
+
.attr("height", "600px")
|
|
10
|
+
.attr("width", "100%")
|
|
11
|
+
width = svg.style("width").to_i
|
|
12
|
+
|
|
13
|
+
min_date = pm_data.map(&:start).min
|
|
14
|
+
max_date = pm_data.map(&:end).max
|
|
15
|
+
|
|
16
|
+
x = D3.scale_linear.domain([min_date, max_date]).range([100,width-90])
|
|
17
|
+
y = D3.scale_linear.domain([0, pm_data.size+1]).range([0, 580])
|
|
18
|
+
c = D3.scale_ordinal.range(D3.scheme_category_20)
|
|
19
|
+
|
|
20
|
+
graph_area = svg.append("g")
|
|
21
|
+
.attr("transform", "translate(60, 20)")
|
|
22
|
+
|
|
23
|
+
graph_area.append("g")
|
|
24
|
+
.select_all("rect")
|
|
25
|
+
.data(pm_data).enter
|
|
26
|
+
.append("rect")
|
|
27
|
+
.attr("x"){|d| x.(d.start) }
|
|
28
|
+
.attr("y"){|d,i| y.(i) }
|
|
29
|
+
.attr("width"){|d| x.(d.end) - x.(d.start) }
|
|
30
|
+
.attr("height"){|d,i| 0.8 * (y.(i+1) - y.(i)) }
|
|
31
|
+
.attr("fill"){|d| c.(d.party)}
|
|
32
|
+
|
|
33
|
+
graph_area.append("g")
|
|
34
|
+
.select_all("text")
|
|
35
|
+
.data(pm_data).enter
|
|
36
|
+
.append("text")
|
|
37
|
+
.text{|d| d.name}
|
|
38
|
+
.attr("x"){|d| x.(d.start) - 4 }
|
|
39
|
+
.attr("y"){|d,i| y.(i+0.5) }
|
|
40
|
+
.attr("text-anchor", "end")
|
|
41
|
+
.style("font-size", "12px")
|
|
42
|
+
|
|
43
|
+
graph_area.append("g")
|
|
44
|
+
.select_all("text")
|
|
45
|
+
.data(pm_data).enter
|
|
46
|
+
.append("text")
|
|
47
|
+
.text{|d| d.party }
|
|
48
|
+
.attr("x"){|d| x.(d.start) + 4 }
|
|
49
|
+
.attr("y"){|d,i| y.(i+0.5) }
|
|
50
|
+
.attr("text-anchor", "begin")
|
|
51
|
+
.style("font-size", "12px")
|
|
52
|
+
|
|
53
|
+
axis_bottom = D3.axis_bottom(x)
|
|
54
|
+
.tick_format(D3.time_format("%B %Y"))
|
|
55
|
+
graph_area.append("g").attr("transform", "translate(0, 560)").call(axis_bottom)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# manual mount of component, usually you would use the react_component view helper for example
|
|
60
|
+
React.render(React.create_element(PolishPMsComponent, data: PolishPMs), `document.body.querySelector("#visualization")`)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require "react/test/utils" # just for mounting manually here, please ignore
|
|
2
|
+
require "data/star_trek_voyager"
|
|
3
|
+
|
|
4
|
+
class StarTrekVoyagerComponent < Hyperloop::D3::Component
|
|
5
|
+
render_with_selection('DIV') do |selection, voyager_data|
|
|
6
|
+
svg = selection.append("svg")
|
|
7
|
+
.attr("height", "600px")
|
|
8
|
+
.attr("width", "100%")
|
|
9
|
+
width = svg.style("width").to_i
|
|
10
|
+
|
|
11
|
+
x = D3.scale_linear.domain([0, voyager_data.size-1]).range([40, width-20])
|
|
12
|
+
y = D3.scale_linear.domain(voyager_data.map(&:rating).minmax).range([550, 50])
|
|
13
|
+
c = D3.scale_ordinal.range(D3.scheme_category_10)
|
|
14
|
+
|
|
15
|
+
(1..7).each do |season|
|
|
16
|
+
episodes = voyager_data.select{|episode| episode.season == season }
|
|
17
|
+
avg = D3.mean(episodes.map(&:rating))
|
|
18
|
+
svg.append("line")
|
|
19
|
+
.attr("x1", x.(episodes.map(&:number).min))
|
|
20
|
+
.attr("x2", x.(episodes.map(&:number).max))
|
|
21
|
+
.attr("y1", y.(avg))
|
|
22
|
+
.attr("y2", y.(avg))
|
|
23
|
+
.attr("stroke", c.(season))
|
|
24
|
+
.attr("stroke-width", 2)
|
|
25
|
+
.attr("opacity", 0.4)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
voyager_data.each do |episode|
|
|
29
|
+
svg.append("circle")
|
|
30
|
+
.attr("cx", x.(episode.number))
|
|
31
|
+
.attr("cy", y.(episode.rating))
|
|
32
|
+
.attr("r", 4)
|
|
33
|
+
.attr("fill", c.(episode.season))
|
|
34
|
+
.attr("opacity", 0.6)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
axis = D3.axis_left(y)
|
|
38
|
+
svg.append("g").attr("transform","translate(30, 0)")
|
|
39
|
+
.call(axis)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# manual mount of component, usually you would use the react_component view helper for example
|
|
44
|
+
React.render(React.create_element(StarTrekVoyagerComponent, data: StarTrekVoyager), `document.body.querySelector("#visualization")`)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require "react/test/utils" # just for mounting manually here, please ignore
|
|
2
|
+
require "data/weather_in_london"
|
|
3
|
+
|
|
4
|
+
class WeatherInLondonComponent
|
|
5
|
+
include Hyperloop::D3::Mixin
|
|
6
|
+
|
|
7
|
+
render_with_selection('DIV') do |selection, data|
|
|
8
|
+
row = selection.append("div").attr("class", "row")
|
|
9
|
+
min_temp = data.map(&:min).min
|
|
10
|
+
max_temp = data.map(&:max).max
|
|
11
|
+
|
|
12
|
+
x = D3.scale_linear.domain([1,31]).range([30, 190])
|
|
13
|
+
y = D3.scale_linear.domain([min_temp, max_temp]).range([180, 20])
|
|
14
|
+
|
|
15
|
+
(1..12).each do |month|
|
|
16
|
+
header = D3.time_format("%B").(Time.parse("2016-#{month}-01"))
|
|
17
|
+
panel = row.append("div").attr("class", "col-xs-6 col-sm-4")
|
|
18
|
+
panel.append("h3").text(header)
|
|
19
|
+
svg = panel.append("svg")
|
|
20
|
+
.attr("height", "200px")
|
|
21
|
+
.attr("width", "200px")
|
|
22
|
+
|
|
23
|
+
svg.append("rect")
|
|
24
|
+
.attr("x", 20)
|
|
25
|
+
.attr("y", 10)
|
|
26
|
+
.attr("width", 180)
|
|
27
|
+
.attr("height", 180)
|
|
28
|
+
.attr("fill", "lightgrey")
|
|
29
|
+
|
|
30
|
+
m_data = data.select{|row| row.month == month}
|
|
31
|
+
|
|
32
|
+
max_temp = D3.line
|
|
33
|
+
.x{|d| x.(d.day) }
|
|
34
|
+
.y{|d| y.(d.max) }
|
|
35
|
+
.curve(D3.curve_natural)
|
|
36
|
+
svg.append("path")
|
|
37
|
+
.attr("d", max_temp.(m_data))
|
|
38
|
+
.attr("stroke", "red")
|
|
39
|
+
.attr("stroke-width", "2px")
|
|
40
|
+
.attr("fill", "none")
|
|
41
|
+
|
|
42
|
+
mean_temp = D3.line
|
|
43
|
+
.x{|d| x.(d.day) }
|
|
44
|
+
.y{|d| y.(d.mean) }
|
|
45
|
+
.curve(D3.curve_natural)
|
|
46
|
+
svg.append("path")
|
|
47
|
+
.attr("d", mean_temp.(m_data))
|
|
48
|
+
.attr("stroke", "black")
|
|
49
|
+
.attr("stroke-width", "2px")
|
|
50
|
+
.attr("fill", "none")
|
|
51
|
+
|
|
52
|
+
min_temp = D3.line
|
|
53
|
+
.x{|d| x.(d.day) }
|
|
54
|
+
.y{|d| y.(d.min) }
|
|
55
|
+
.curve(D3.curve_natural)
|
|
56
|
+
svg.append("path")
|
|
57
|
+
.attr("d", min_temp.(m_data))
|
|
58
|
+
.attr("stroke", "blue")
|
|
59
|
+
.attr("stroke-width", "2px")
|
|
60
|
+
.attr("fill", "none")
|
|
61
|
+
|
|
62
|
+
axis_left = D3.axis_left(y).tick_size(2)
|
|
63
|
+
svg.append("g").attr("transform", "translate(20,0)").call(axis_left)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# manual mount of component, usually you would use the react_component view helper for example
|
|
69
|
+
React.render(React.create_element(WeatherInLondonComponent, data: WeatherInLondon), `document.body.querySelector("#visualization")`)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
|
3
|
+
* listed below.
|
|
4
|
+
*
|
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
|
|
6
|
+
* vendor/assets/stylesheets directory can be referenced here using a relative path.
|
|
7
|
+
*
|
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
|
11
|
+
* It is generally better to create a new file per style scope.
|
|
12
|
+
*
|
|
13
|
+
*= require_tree .
|
|
14
|
+
*= require_self
|
|
15
|
+
*/
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class ApplicationController < ActionController::Base
|
|
2
|
+
protect_from_forgery with: :exception
|
|
3
|
+
|
|
4
|
+
@@visualizations = {
|
|
5
|
+
elections_2016: "Elections 2016",
|
|
6
|
+
london_population: "London Population",
|
|
7
|
+
london_population_area: "London Population - Area Chart",
|
|
8
|
+
olympics_2016_medals: "Olympics 2016 Medals",
|
|
9
|
+
iphones: "iPhones",
|
|
10
|
+
polish_pms: "Polish Prime Ministers",
|
|
11
|
+
man_vs_horse: "Man versus Horse Marathon",
|
|
12
|
+
paradox: "Paradox Interactive Games",
|
|
13
|
+
weather_in_london: "Weather in London",
|
|
14
|
+
harry_potter: "Harry Potter Books",
|
|
15
|
+
mtg_modern_creatures: "MTG: Creatures in Modern",
|
|
16
|
+
mtg_modern_colors: "MTG: Spell Cards in Modern",
|
|
17
|
+
star_trek_voyager: "Star Trek: Voyager",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
def index
|
|
21
|
+
@visualizations = @@visualizations
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def visualization
|
|
25
|
+
@visualizations = @@visualizations
|
|
26
|
+
end
|
|
27
|
+
end
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Demos</title>
|
|
6
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="container">
|
|
10
|
+
<h1>Hyper-D3 Demos</h1>
|
|
11
|
+
<ul>
|
|
12
|
+
<% @visualizations.sort.each do |script, title| %>
|
|
13
|
+
<li><%= link_to title, "/visualizations/#{script}" %></li>
|
|
14
|
+
<% end %>
|
|
15
|
+
</ul>
|
|
16
|
+
</div>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title><%= @visualizations[params[:id].to_sym] %></title>
|
|
6
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
|
|
7
|
+
<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/styles/default.min.css' rel='stylesheet'/>
|
|
8
|
+
<script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/highlight.min.js'></script>
|
|
9
|
+
<%= javascript_include_tag 'application' %>
|
|
10
|
+
<script>hljs.initHighlightingOnLoad();</script>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<div class="container">
|
|
14
|
+
<h1><%= @visualizations[params[:id].to_sym] %></h1>
|
|
15
|
+
<div id="visualization"></div>
|
|
16
|
+
<div id="code">
|
|
17
|
+
<h1>Code</h1>
|
|
18
|
+
<pre><code><%=
|
|
19
|
+
open("#{__dir__}/../../assets/javascripts/#{params[:id]}.rb").read
|
|
20
|
+
%></code></pre>
|
|
21
|
+
</div>
|
|
22
|
+
<script src="../assets/<%= params[:id] %>.js"></script>
|
|
23
|
+
<script>
|
|
24
|
+
window.onload = function() { Opal.load("<%= params[:id] %>"); }
|
|
25
|
+
</script>
|
|
26
|
+
</div>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'pathname'
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
include FileUtils
|
|
5
|
+
|
|
6
|
+
# path to your application root.
|
|
7
|
+
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
|
|
8
|
+
|
|
9
|
+
def system!(*args)
|
|
10
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
chdir APP_ROOT do
|
|
14
|
+
# This script is a starting point to setup your application.
|
|
15
|
+
# Add necessary setup steps to this file.
|
|
16
|
+
|
|
17
|
+
puts '== Installing dependencies =='
|
|
18
|
+
system! 'gem install bundler --conservative'
|
|
19
|
+
system('bundle check') || system!('bundle install')
|
|
20
|
+
|
|
21
|
+
# Install JavaScript dependencies if using Yarn
|
|
22
|
+
# system('bin/yarn')
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# puts "\n== Copying sample files =="
|
|
26
|
+
# unless File.exist?('config/database.yml')
|
|
27
|
+
# cp 'config/database.yml.sample', 'config/database.yml'
|
|
28
|
+
# end
|
|
29
|
+
|
|
30
|
+
puts "\n== Preparing database =="
|
|
31
|
+
system! 'bin/rails db:setup'
|
|
32
|
+
|
|
33
|
+
puts "\n== Removing old logs and tempfiles =="
|
|
34
|
+
system! 'bin/rails log:clear tmp:clear'
|
|
35
|
+
|
|
36
|
+
puts "\n== Restarting application server =="
|
|
37
|
+
system! 'bin/rails restart'
|
|
38
|
+
end
|