Last active
April 12, 2018 23:49
-
-
Save htakeuchi/8b1ce2b37919352b8b94ceca13b35729 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"if(window['d3'] === undefined ||\n", | |
" window['Nyaplot'] === undefined){\n", | |
" var path = {\"d3\":\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\",\"downloadable\":\"http://cdn.rawgit.com/domitry/d3-downloadable/master/d3-downloadable\"};\n", | |
"\n", | |
"\n", | |
"\n", | |
" var shim = {\"d3\":{\"exports\":\"d3\"},\"downloadable\":{\"exports\":\"downloadable\"}};\n", | |
"\n", | |
" require.config({paths: path, shim:shim});\n", | |
"\n", | |
"\n", | |
"require(['d3'], function(d3){window['d3']=d3;console.log('finished loading d3');require(['downloadable'], function(downloadable){window['downloadable']=downloadable;console.log('finished loading downloadable');\n", | |
"\n", | |
"\tvar script = d3.select(\"head\")\n", | |
"\t .append(\"script\")\n", | |
"\t .attr(\"src\", \"http://cdn.rawgit.com/domitry/Nyaplotjs/master/release/nyaplot.js\")\n", | |
"\t .attr(\"async\", true);\n", | |
"\n", | |
"\tscript[0][0].onload = script[0][0].onreadystatechange = function(){\n", | |
"\n", | |
"\n", | |
"\t var event = document.createEvent(\"HTMLEvents\");\n", | |
"\t event.initEvent(\"load_nyaplot\",false,false);\n", | |
"\t window.dispatchEvent(event);\n", | |
"\t console.log('Finished loading Nyaplotjs');\n", | |
"\n", | |
"\t};\n", | |
"\n", | |
"\n", | |
"});});\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"\"if(window['d3'] === undefined ||\\n window['Nyaplot'] === undefined){\\n var path = {\\\"d3\\\":\\\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\\\",\\\"downloadable\\\":\\\"http://cdn.rawgit.com/domitry/d3-downloadable/master/d3-downloadable\\\"};\\n\\n\\n\\n var shim = {\\\"d3\\\":{\\\"exports\\\":\\\"d3\\\"},\\\"downloadable\\\":{\\\"exports\\\":\\\"downloadable\\\"}};\\n\\n require.config({paths: path, shim:shim});\\n\\n\\nrequire(['d3'], function(d3){window['d3']=d3;console.log('finished loading d3');require(['downloadable'], function(downloadable){window['downloadable']=downloadable;console.log('finished loading downloadable');\\n\\n\\tvar script = d3.select(\\\"head\\\")\\n\\t .append(\\\"script\\\")\\n\\t .attr(\\\"src\\\", \\\"http://cdn.rawgit.com/domitry/Nyaplotjs/master/release/nyaplot.js\\\")\\n\\t .attr(\\\"async\\\", true);\\n\\n\\tscript[0][0].onload = script[0][0].onreadystatechange = function(){\\n\\n\\n\\t var event = document.createEvent(\\\"HTMLEvents\\\");\\n\\t event.initEvent(\\\"load_nyaplot\\\",false,false);\\n\\t window.dispatchEvent(event);\\n\\t console.log('Finished loading Nyaplotjs');\\n\\n\\t};\\n\\n\\n});});\\n}\\n\"" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<div id='vis-863d6c79-e0e6-4b08-b2a1-25be1aa74488'></div>\n", | |
"<script>\n", | |
"(function(){\n", | |
" var render = function(){\n", | |
" var model = {\"panes\":[{\"diagrams\":[{\"type\":\"scatter\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"}],\"options\":{\"zoom\":true,\"width\":700,\"xrange\":[0,4],\"yrange\":[-5,4]}}],\"data\":{\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\":[{\"data0\":0,\"data1\":-1},{\"data0\":1,\"data1\":2},{\"data0\":2,\"data1\":-3},{\"data0\":3,\"data1\":4},{\"data0\":4,\"data1\":-5}]},\"extension\":[]}\n", | |
" var id_name = '#vis-863d6c79-e0e6-4b08-b2a1-25be1aa74488';\n", | |
" Nyaplot.core.parse(model, id_name);\n", | |
"\n", | |
" require(['downloadable'], function(downloadable){\n", | |
" var svg = d3.select(id_name).select(\"svg\");\n", | |
"\t if(!svg.empty())\n", | |
"\t svg.call(downloadable().filename('fig'));\n", | |
"\t});\n", | |
" };\n", | |
" if(window['Nyaplot']==undefined){\n", | |
" window.addEventListener('load_nyaplot', render, false);\n", | |
"\treturn;\n", | |
" } else {\n", | |
" render();\n", | |
" }\n", | |
"})();\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"#<Nyaplot::Frame:0x000055a604027f38 @properties={:panes=>[#<Nyaplot::Plot:0x000055a603ae6100 @properties={:diagrams=>[#<Nyaplot::Diagram:0x000055a603ae4b48 @properties={:type=>:scatter, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"}, @xrange=[0, 4], @yrange=[-5, 4]>], :options=>{:zoom=>true, :width=>700, :xrange=>[0, 4], :yrange=>[-5, 4]}}>], :data=>{\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"=>#<Nyaplot::DataFrame:0x000055a603ae5840 @name=\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\", @rows=[{:data0=>0, :data1=>-1}, {:data0=>1, :data1=>2}, {:data0=>2, :data1=>-3}, {:data0=>3, :data1=>4}, {:data0=>4, :data1=>-5}]>}, :extension=>[]}>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"require 'nyaplot'\n", | |
"plot = Nyaplot::Plot.new\n", | |
"sc = plot.add(:scatter, [0,1,2,3,4], [-1,2,-3,4,-5])\n", | |
"plot.show" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div id='vis-3f80b0c1-3c6d-496d-89e0-e9cf969baed6'></div>\n", | |
"<script>\n", | |
"(function(){\n", | |
" var render = function(){\n", | |
" var model = {\"panes\":[{\"diagrams\":[{\"type\":\"scatter\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"},{\"type\":\"scatter\",\"options\":{\"x\":\"a\",\"y\":\"b\",\"fill_by\":\"type\"},\"data\":\"6274a1e0-9714-4845-8b77-e39072c2be36\"}],\"options\":{\"zoom\":true,\"width\":700,\"xrange\":[0,4],\"yrange\":[-5,4]}}],\"data\":{\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\":[{\"data0\":0,\"data1\":-1},{\"data0\":1,\"data1\":2},{\"data0\":2,\"data1\":-3},{\"data0\":3,\"data1\":4},{\"data0\":4,\"data1\":-5}],\"6274a1e0-9714-4845-8b77-e39072c2be36\":[{\"a\":0,\"b\":-1,\"type\":\"a\"},{\"a\":1,\"b\":2,\"type\":\"b\"},{\"a\":2,\"b\":-3,\"type\":\"a\"},{\"a\":3,\"b\":4,\"type\":\"a\"},{\"a\":4,\"b\":-5,\"type\":\"b\"}]},\"extension\":[]}\n", | |
" var id_name = '#vis-3f80b0c1-3c6d-496d-89e0-e9cf969baed6';\n", | |
" Nyaplot.core.parse(model, id_name);\n", | |
"\n", | |
" require(['downloadable'], function(downloadable){\n", | |
" var svg = d3.select(id_name).select(\"svg\");\n", | |
"\t if(!svg.empty())\n", | |
"\t svg.call(downloadable().filename('fig'));\n", | |
"\t});\n", | |
" };\n", | |
" if(window['Nyaplot']==undefined){\n", | |
" window.addEventListener('load_nyaplot', render, false);\n", | |
"\treturn;\n", | |
" } else {\n", | |
" render();\n", | |
" }\n", | |
"})();\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"#<Nyaplot::Frame:0x000055a603ec1fe0 @properties={:panes=>[#<Nyaplot::Plot:0x000055a603ae6100 @properties={:diagrams=>[#<Nyaplot::Diagram:0x000055a603ae4b48 @properties={:type=>:scatter, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"}, @xrange=[0, 4], @yrange=[-5, 4]>, #<Nyaplot::Diagram:0x000055a603ec3200 @properties={:type=>:scatter, :options=>{:x=>:a, :y=>:b, :fill_by=>:type}, :data=>\"6274a1e0-9714-4845-8b77-e39072c2be36\"}, @xrange=[0, 4], @yrange=[-5, 4]>], :options=>{:zoom=>true, :width=>700, :xrange=>[0, 4], :yrange=>[-5, 4]}}>], :data=>{\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\"=>#<Nyaplot::DataFrame:0x000055a603ae5840 @name=\"c2f4f9e5-7261-4bc4-9c0c-8f39534b0630\", @rows=[{:data0=>0, :data1=>-1}, {:data0=>1, :data1=>2}, {:data0=>2, :data1=>-3}, {:data0=>3, :data1=>4}, {:data0=>4, :data1=>-5}]>, \"6274a1e0-9714-4845-8b77-e39072c2be36\"=>#<Nyaplot::DataFrame:0x000055a603f051f0 @name=\"6274a1e0-9714-4845-8b77-e39072c2be36\", @rows=[{:a=>0, :b=>-1, :type=>\"a\"}, {:a=>1, :b=>2, :type=>\"b\"}, {:a=>2, :b=>-3, :type=>\"a\"}, {:a=>3, :b=>4, :type=>\"a\"}, {:a=>4, :b=>-5, :type=>\"b\"}]>}, :extension=>[]}>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"df = Nyaplot::DataFrame.new({a: [0,1,2,3,4], b: [-1,2,-3,4,-5], type: ['a','b','a','a','b']})\n", | |
"sc = plot.add_with_df(df, :scatter, :a, :b)\n", | |
"sc.fill_by(:type)\n", | |
"plot.show" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"\n", | |
" <script>\n", | |
" requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min'] }})\n", | |
" </script>\n", | |
"\n", | |
"\n", | |
"<div id=\"4070247b-c1fb-4598-bdc1-848f50a0a147\" style=\"height: 100%; width: 100%;\"></div>\n", | |
"\n", | |
"<script>\n", | |
" require(['plotly'], function(Plotly) { \n", | |
"Plotly.newPlot(\n", | |
" '4070247b-c1fb-4598-bdc1-848f50a0a147',\n", | |
" [{\"x\":[1,2,3,4,5,6],\"y\":[100,200,300,400,500,600]},{\"x\":[1,2,3,4,5,6],\"y\":[600,500,400,300,200,100]}],\n", | |
" {},\n", | |
" {\"linkText\":\"Export to plot.ly\",\"showLink\":true}\n", | |
")\n", | |
"\n", | |
"window.addEventListener('resize', function() {\n", | |
" Plotly.Plots.resize(document.getElementById('4070247b-c1fb-4598-bdc1-848f50a0a147'))\n", | |
"})\n", | |
" }) \n", | |
"</script>" | |
], | |
"text/plain": [ | |
"#<Plotly::Offline::HTML:0x000055e973af52f0 @id=\"4070247b-c1fb-4598-bdc1-848f50a0a147\", @data=[{:x=>[1, 2, 3, 4, 5, 6], :y=>[100, 200, 300, 400, 500, 600]}, {:x=>[1, 2, 3, 4, 5, 6], :y=>[600, 500, 400, 300, 200, 100]}], @layout={}, @config={:linkText=>\"Export to plot.ly\", :showLink=>true}, @embedded=true>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"require 'rbplotly'\n", | |
"\n", | |
"trace1 = { x: [1,2,3,4,5,6], y: [100,200,300,400,500,600] }\n", | |
"trace2 = { x: [1,2,3,4,5,6], y: [600,500,400,300,200,100] }\n", | |
"traces = [trace1, trace2]\n", | |
"pl = Plotly::Plot.new(data: traces)\n", | |
"pl.show" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<b> Daru::DataFrame(107x6) </b>\n", | |
"<table>\n", | |
" <thead>\n", | |
" \n", | |
" <tr>\n", | |
" <th></th>\n", | |
" \n", | |
" <th>year</th>\n", | |
" \n", | |
" <th>month</th>\n", | |
" \n", | |
" <th>age</th>\n", | |
" \n", | |
" <th>male</th>\n", | |
" \n", | |
" <th>female</th>\n", | |
" \n", | |
" <th>total_count</th>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
"</thead>\n", | |
" <tbody>\n", | |
" \n", | |
" <tr>\n", | |
" <td>0</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>0</td>\n", | |
" \n", | |
" <td>427</td>\n", | |
" \n", | |
" <td>416</td>\n", | |
" \n", | |
" <td>843</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>1</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>1</td>\n", | |
" \n", | |
" <td>424</td>\n", | |
" \n", | |
" <td>456</td>\n", | |
" \n", | |
" <td>880</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>2</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>2</td>\n", | |
" \n", | |
" <td>474</td>\n", | |
" \n", | |
" <td>453</td>\n", | |
" \n", | |
" <td>927</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>3</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>3</td>\n", | |
" \n", | |
" <td>476</td>\n", | |
" \n", | |
" <td>457</td>\n", | |
" \n", | |
" <td>933</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>501</td>\n", | |
" \n", | |
" <td>442</td>\n", | |
" \n", | |
" <td>943</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>5</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>5</td>\n", | |
" \n", | |
" <td>491</td>\n", | |
" \n", | |
" <td>434</td>\n", | |
" \n", | |
" <td>925</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>6</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>6</td>\n", | |
" \n", | |
" <td>490</td>\n", | |
" \n", | |
" <td>478</td>\n", | |
" \n", | |
" <td>968</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>7</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>7</td>\n", | |
" \n", | |
" <td>536</td>\n", | |
" \n", | |
" <td>486</td>\n", | |
" \n", | |
" <td>1022</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>8</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>8</td>\n", | |
" \n", | |
" <td>515</td>\n", | |
" \n", | |
" <td>464</td>\n", | |
" \n", | |
" <td>979</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>9</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>9</td>\n", | |
" \n", | |
" <td>543</td>\n", | |
" \n", | |
" <td>504</td>\n", | |
" \n", | |
" <td>1047</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>10</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>10</td>\n", | |
" \n", | |
" <td>527</td>\n", | |
" \n", | |
" <td>537</td>\n", | |
" \n", | |
" <td>1064</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>11</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>11</td>\n", | |
" \n", | |
" <td>545</td>\n", | |
" \n", | |
" <td>516</td>\n", | |
" \n", | |
" <td>1061</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>12</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>12</td>\n", | |
" \n", | |
" <td>542</td>\n", | |
" \n", | |
" <td>502</td>\n", | |
" \n", | |
" <td>1044</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>13</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>13</td>\n", | |
" \n", | |
" <td>571</td>\n", | |
" \n", | |
" <td>556</td>\n", | |
" \n", | |
" <td>1127</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>14</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>14</td>\n", | |
" \n", | |
" <td>590</td>\n", | |
" \n", | |
" <td>546</td>\n", | |
" \n", | |
" <td>1136</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>15</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>15</td>\n", | |
" \n", | |
" <td>585</td>\n", | |
" \n", | |
" <td>569</td>\n", | |
" \n", | |
" <td>1154</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>16</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>16</td>\n", | |
" \n", | |
" <td>654</td>\n", | |
" \n", | |
" <td>623</td>\n", | |
" \n", | |
" <td>1277</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>17</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>17</td>\n", | |
" \n", | |
" <td>630</td>\n", | |
" \n", | |
" <td>651</td>\n", | |
" \n", | |
" <td>1281</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>18</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>18</td>\n", | |
" \n", | |
" <td>544</td>\n", | |
" \n", | |
" <td>592</td>\n", | |
" \n", | |
" <td>1136</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>19</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>19</td>\n", | |
" \n", | |
" <td>603</td>\n", | |
" \n", | |
" <td>581</td>\n", | |
" \n", | |
" <td>1184</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>20</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>20</td>\n", | |
" \n", | |
" <td>515</td>\n", | |
" \n", | |
" <td>512</td>\n", | |
" \n", | |
" <td>1027</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>21</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>21</td>\n", | |
" \n", | |
" <td>550</td>\n", | |
" \n", | |
" <td>556</td>\n", | |
" \n", | |
" <td>1106</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>22</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>22</td>\n", | |
" \n", | |
" <td>466</td>\n", | |
" \n", | |
" <td>488</td>\n", | |
" \n", | |
" <td>954</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>23</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>23</td>\n", | |
" \n", | |
" <td>543</td>\n", | |
" \n", | |
" <td>522</td>\n", | |
" \n", | |
" <td>1065</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>24</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>24</td>\n", | |
" \n", | |
" <td>506</td>\n", | |
" \n", | |
" <td>507</td>\n", | |
" \n", | |
" <td>1013</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>25</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>25</td>\n", | |
" \n", | |
" <td>532</td>\n", | |
" \n", | |
" <td>493</td>\n", | |
" \n", | |
" <td>1025</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>26</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>26</td>\n", | |
" \n", | |
" <td>555</td>\n", | |
" \n", | |
" <td>543</td>\n", | |
" \n", | |
" <td>1098</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>27</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>27</td>\n", | |
" \n", | |
" <td>531</td>\n", | |
" \n", | |
" <td>515</td>\n", | |
" \n", | |
" <td>1046</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>28</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>28</td>\n", | |
" \n", | |
" <td>577</td>\n", | |
" \n", | |
" <td>532</td>\n", | |
" \n", | |
" <td>1109</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
" <tr>\n", | |
" <td>29</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>29</td>\n", | |
" \n", | |
" <td>601</td>\n", | |
" \n", | |
" <td>589</td>\n", | |
" \n", | |
" <td>1190</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
"\n", | |
" \n", | |
" <tr>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" <td>...</td>\n", | |
" \n", | |
" </tr>\n", | |
"\n", | |
" \n", | |
"\n", | |
" <tr>\n", | |
" <td>106</td>\n", | |
" \n", | |
" <td>2018</td>\n", | |
" \n", | |
" <td>4</td>\n", | |
" \n", | |
" <td>106</td>\n", | |
" \n", | |
" <td>1</td>\n", | |
" \n", | |
" <td>1</td>\n", | |
" \n", | |
" <td>2</td>\n", | |
" \n", | |
" </tr>\n", | |
" \n", | |
"</tbody>\n", | |
"</table>" | |
], | |
"text/plain": [ | |
"#<Daru::DataFrame(107x6)>\n", | |
" year month age male female total_coun\n", | |
" 0 2018 4 0 427 416 843\n", | |
" 1 2018 4 1 424 456 880\n", | |
" 2 2018 4 2 474 453 927\n", | |
" 3 2018 4 3 476 457 933\n", | |
" 4 2018 4 4 501 442 943\n", | |
" 5 2018 4 5 491 434 925\n", | |
" 6 2018 4 6 490 478 968\n", | |
" 7 2018 4 7 536 486 1022\n", | |
" 8 2018 4 8 515 464 979\n", | |
" 9 2018 4 9 543 504 1047\n", | |
" 10 2018 4 10 527 537 1064\n", | |
" 11 2018 4 11 545 516 1061\n", | |
" 12 2018 4 12 542 502 1044\n", | |
" 13 2018 4 13 571 556 1127\n", | |
" 14 2018 4 14 590 546 1136\n", | |
" ... ... ... ... ... ... ..." | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"require 'daru'\n", | |
"\n", | |
"df = Daru::DataFrame.from_csv('./O_TUKIBETSU_NENREI.csv')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"\n", | |
" <script>\n", | |
" requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min'] }})\n", | |
" </script>\n", | |
"\n", | |
"\n", | |
"<div id=\"fef89892-6842-47e9-9509-6d91959594ea\" style=\"height: 100%; width: 100%;\"></div>\n", | |
"\n", | |
"<script>\n", | |
" require(['plotly'], function(Plotly) { \n", | |
"Plotly.newPlot(\n", | |
" 'fef89892-6842-47e9-9509-6d91959594ea',\n", | |
" [{\"x\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],\"y\":[843,880,927,933,943,925,968,1022,979,1047,1064,1061,1044,1127,1136,1154,1277,1281,1136,1184,1027,1106,954,1065,1013,1025,1098,1046,1109,1190,1242,1185,1218,1216,1333,1304,1284,1314,1386,1370,1474,1488,1545,1571,1616,1659,1505,1564,1480,1511,1572,1364,1407,1608,1540,1603,1658,1642,1632,1750,1610,1710,1735,1806,1760,1822,1886,2012,2109,1863,1963,1512,945,1313,1483,1344,1367,1403,1219,1155,1294,1143,1169,1093,945,1009,838,822,652,626,520,488,377,324,238,150,112,104,47,44,23,20,4,8,4,3,2],\"type\":null,\"mode\":\"\",\"name\":\"total_count\"},{\"x\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],\"y\":[427,424,474,476,501,491,490,536,515,543,527,545,542,571,590,585,654,630,544,603,515,550,466,543,506,532,555,531,577,601,632,598,645,613,701,655,616,675,723,712,776,750,778,798,786,831,752,744,754,712,772,677,704,815,746,773,808,769,812,880,784,849,863,912,828,895,921,959,1045,928,923,742,435,615,664,600,573,597,516,422,465,456,438,396,311,322,269,272,203,181,136,139,96,68,51,26,18,26,6,4,2,3,2,3,0,1,1],\"type\":null,\"mode\":\"\",\"name\":\"male\"},{\"x\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],\"y\":[416,456,453,457,442,434,478,486,464,504,537,516,502,556,546,569,623,651,592,581,512,556,488,522,507,493,543,515,532,589,610,587,573,603,632,649,668,639,663,658,698,738,767,773,830,828,753,820,726,799,800,687,703,793,794,830,850,873,820,870,826,861,872,894,932,927,965,1053,1064,935,1040,770,510,698,819,744,794,806,703,733,829,687,731,697,634,687,569,550,449,445,384,349,281,256,187,124,94,78,41,40,21,17,2,5,4,2,1],\"type\":null,\"mode\":\"\",\"name\":\"female\"}],\n", | |
" {\"width\":1000,\"height\":500},\n", | |
" {\"linkText\":\"Export to plot.ly\",\"showLink\":true}\n", | |
")\n", | |
"\n", | |
"window.addEventListener('resize', function() {\n", | |
" Plotly.Plots.resize(document.getElementById('fef89892-6842-47e9-9509-6d91959594ea'))\n", | |
"})\n", | |
" }) \n", | |
"</script>" | |
], | |
"text/plain": [ | |
"#<Plotly::Offline::HTML:0x000055a603d349e8 @id=\"fef89892-6842-47e9-9509-6d91959594ea\", @data=[{:x=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106], :y=>[843, 880, 927, 933, 943, 925, 968, 1022, 979, 1047, 1064, 1061, 1044, 1127, 1136, 1154, 1277, 1281, 1136, 1184, 1027, 1106, 954, 1065, 1013, 1025, 1098, 1046, 1109, 1190, 1242, 1185, 1218, 1216, 1333, 1304, 1284, 1314, 1386, 1370, 1474, 1488, 1545, 1571, 1616, 1659, 1505, 1564, 1480, 1511, 1572, 1364, 1407, 1608, 1540, 1603, 1658, 1642, 1632, 1750, 1610, 1710, 1735, 1806, 1760, 1822, 1886, 2012, 2109, 1863, 1963, 1512, 945, 1313, 1483, 1344, 1367, 1403, 1219, 1155, 1294, 1143, 1169, 1093, 945, 1009, 838, 822, 652, 626, 520, 488, 377, 324, 238, 150, 112, 104, 47, 44, 23, 20, 4, 8, 4, 3, 2], :type=>nil, :mode=>\"\", :name=>\"total_count\"}, {:x=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106], :y=>[427, 424, 474, 476, 501, 491, 490, 536, 515, 543, 527, 545, 542, 571, 590, 585, 654, 630, 544, 603, 515, 550, 466, 543, 506, 532, 555, 531, 577, 601, 632, 598, 645, 613, 701, 655, 616, 675, 723, 712, 776, 750, 778, 798, 786, 831, 752, 744, 754, 712, 772, 677, 704, 815, 746, 773, 808, 769, 812, 880, 784, 849, 863, 912, 828, 895, 921, 959, 1045, 928, 923, 742, 435, 615, 664, 600, 573, 597, 516, 422, 465, 456, 438, 396, 311, 322, 269, 272, 203, 181, 136, 139, 96, 68, 51, 26, 18, 26, 6, 4, 2, 3, 2, 3, 0, 1, 1], :type=>nil, :mode=>\"\", :name=>\"male\"}, {:x=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106], :y=>[416, 456, 453, 457, 442, 434, 478, 486, 464, 504, 537, 516, 502, 556, 546, 569, 623, 651, 592, 581, 512, 556, 488, 522, 507, 493, 543, 515, 532, 589, 610, 587, 573, 603, 632, 649, 668, 639, 663, 658, 698, 738, 767, 773, 830, 828, 753, 820, 726, 799, 800, 687, 703, 793, 794, 830, 850, 873, 820, 870, 826, 861, 872, 894, 932, 927, 965, 1053, 1064, 935, 1040, 770, 510, 698, 819, 744, 794, 806, 703, 733, 829, 687, 731, 697, 634, 687, 569, 550, 449, 445, 384, 349, 281, 256, 187, 124, 94, 78, 41, 40, 21, 17, 2, 5, 4, 2, 1], :type=>nil, :mode=>\"\", :name=>\"female\"}], @layout={:width=>1000, :height=>500}, @config={:linkText=>\"Export to plot.ly\", :showLink=>true}, @embedded=true>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"require 'daru/plotly'\n", | |
"include Daru::Plotly::Methods # plotメソッドが使えるようになる\n", | |
"\n", | |
"plot(df, x: 'age', y: 'total_count')\n", | |
"plot(df, x: 'age', y: ['total_count', 'male', 'female']).show" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(107, 6)\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"(107, 6)" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"require 'pandas'\n", | |
"pd = Pandas\n", | |
"x = pd.read_csv('./O_TUKIBETSU_NENREI.csv')\n", | |
"p x.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"\n" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Ruby 2.5.1", | |
"language": "ruby", | |
"name": "ruby" | |
}, | |
"language_info": { | |
"file_extension": ".rb", | |
"mimetype": "application/x-ruby", | |
"name": "ruby", | |
"version": "2.5.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
year | month | age | male | female | total_count | |
---|---|---|---|---|---|---|
2018 | 4 | 0 | 427 | 416 | 843 | |
2018 | 4 | 1 | 424 | 456 | 880 | |
2018 | 4 | 2 | 474 | 453 | 927 | |
2018 | 4 | 3 | 476 | 457 | 933 | |
2018 | 4 | 4 | 501 | 442 | 943 | |
2018 | 4 | 5 | 491 | 434 | 925 | |
2018 | 4 | 6 | 490 | 478 | 968 | |
2018 | 4 | 7 | 536 | 486 | 1022 | |
2018 | 4 | 8 | 515 | 464 | 979 | |
2018 | 4 | 9 | 543 | 504 | 1047 | |
2018 | 4 | 10 | 527 | 537 | 1064 | |
2018 | 4 | 11 | 545 | 516 | 1061 | |
2018 | 4 | 12 | 542 | 502 | 1044 | |
2018 | 4 | 13 | 571 | 556 | 1127 | |
2018 | 4 | 14 | 590 | 546 | 1136 | |
2018 | 4 | 15 | 585 | 569 | 1154 | |
2018 | 4 | 16 | 654 | 623 | 1277 | |
2018 | 4 | 17 | 630 | 651 | 1281 | |
2018 | 4 | 18 | 544 | 592 | 1136 | |
2018 | 4 | 19 | 603 | 581 | 1184 | |
2018 | 4 | 20 | 515 | 512 | 1027 | |
2018 | 4 | 21 | 550 | 556 | 1106 | |
2018 | 4 | 22 | 466 | 488 | 954 | |
2018 | 4 | 23 | 543 | 522 | 1065 | |
2018 | 4 | 24 | 506 | 507 | 1013 | |
2018 | 4 | 25 | 532 | 493 | 1025 | |
2018 | 4 | 26 | 555 | 543 | 1098 | |
2018 | 4 | 27 | 531 | 515 | 1046 | |
2018 | 4 | 28 | 577 | 532 | 1109 | |
2018 | 4 | 29 | 601 | 589 | 1190 | |
2018 | 4 | 30 | 632 | 610 | 1242 | |
2018 | 4 | 31 | 598 | 587 | 1185 | |
2018 | 4 | 32 | 645 | 573 | 1218 | |
2018 | 4 | 33 | 613 | 603 | 1216 | |
2018 | 4 | 34 | 701 | 632 | 1333 | |
2018 | 4 | 35 | 655 | 649 | 1304 | |
2018 | 4 | 36 | 616 | 668 | 1284 | |
2018 | 4 | 37 | 675 | 639 | 1314 | |
2018 | 4 | 38 | 723 | 663 | 1386 | |
2018 | 4 | 39 | 712 | 658 | 1370 | |
2018 | 4 | 40 | 776 | 698 | 1474 | |
2018 | 4 | 41 | 750 | 738 | 1488 | |
2018 | 4 | 42 | 778 | 767 | 1545 | |
2018 | 4 | 43 | 798 | 773 | 1571 | |
2018 | 4 | 44 | 786 | 830 | 1616 | |
2018 | 4 | 45 | 831 | 828 | 1659 | |
2018 | 4 | 46 | 752 | 753 | 1505 | |
2018 | 4 | 47 | 744 | 820 | 1564 | |
2018 | 4 | 48 | 754 | 726 | 1480 | |
2018 | 4 | 49 | 712 | 799 | 1511 | |
2018 | 4 | 50 | 772 | 800 | 1572 | |
2018 | 4 | 51 | 677 | 687 | 1364 | |
2018 | 4 | 52 | 704 | 703 | 1407 | |
2018 | 4 | 53 | 815 | 793 | 1608 | |
2018 | 4 | 54 | 746 | 794 | 1540 | |
2018 | 4 | 55 | 773 | 830 | 1603 | |
2018 | 4 | 56 | 808 | 850 | 1658 | |
2018 | 4 | 57 | 769 | 873 | 1642 | |
2018 | 4 | 58 | 812 | 820 | 1632 | |
2018 | 4 | 59 | 880 | 870 | 1750 | |
2018 | 4 | 60 | 784 | 826 | 1610 | |
2018 | 4 | 61 | 849 | 861 | 1710 | |
2018 | 4 | 62 | 863 | 872 | 1735 | |
2018 | 4 | 63 | 912 | 894 | 1806 | |
2018 | 4 | 64 | 828 | 932 | 1760 | |
2018 | 4 | 65 | 895 | 927 | 1822 | |
2018 | 4 | 66 | 921 | 965 | 1886 | |
2018 | 4 | 67 | 959 | 1053 | 2012 | |
2018 | 4 | 68 | 1045 | 1064 | 2109 | |
2018 | 4 | 69 | 928 | 935 | 1863 | |
2018 | 4 | 70 | 923 | 1040 | 1963 | |
2018 | 4 | 71 | 742 | 770 | 1512 | |
2018 | 4 | 72 | 435 | 510 | 945 | |
2018 | 4 | 73 | 615 | 698 | 1313 | |
2018 | 4 | 74 | 664 | 819 | 1483 | |
2018 | 4 | 75 | 600 | 744 | 1344 | |
2018 | 4 | 76 | 573 | 794 | 1367 | |
2018 | 4 | 77 | 597 | 806 | 1403 | |
2018 | 4 | 78 | 516 | 703 | 1219 | |
2018 | 4 | 79 | 422 | 733 | 1155 | |
2018 | 4 | 80 | 465 | 829 | 1294 | |
2018 | 4 | 81 | 456 | 687 | 1143 | |
2018 | 4 | 82 | 438 | 731 | 1169 | |
2018 | 4 | 83 | 396 | 697 | 1093 | |
2018 | 4 | 84 | 311 | 634 | 945 | |
2018 | 4 | 85 | 322 | 687 | 1009 | |
2018 | 4 | 86 | 269 | 569 | 838 | |
2018 | 4 | 87 | 272 | 550 | 822 | |
2018 | 4 | 88 | 203 | 449 | 652 | |
2018 | 4 | 89 | 181 | 445 | 626 | |
2018 | 4 | 90 | 136 | 384 | 520 | |
2018 | 4 | 91 | 139 | 349 | 488 | |
2018 | 4 | 92 | 96 | 281 | 377 | |
2018 | 4 | 93 | 68 | 256 | 324 | |
2018 | 4 | 94 | 51 | 187 | 238 | |
2018 | 4 | 95 | 26 | 124 | 150 | |
2018 | 4 | 96 | 18 | 94 | 112 | |
2018 | 4 | 97 | 26 | 78 | 104 | |
2018 | 4 | 98 | 6 | 41 | 47 | |
2018 | 4 | 99 | 4 | 40 | 44 | |
2018 | 4 | 100 | 2 | 21 | 23 | |
2018 | 4 | 101 | 3 | 17 | 20 | |
2018 | 4 | 102 | 2 | 2 | 4 | |
2018 | 4 | 103 | 3 | 5 | 8 | |
2018 | 4 | 104 | 0 | 4 | 4 | |
2018 | 4 | 105 | 1 | 2 | 3 | |
2018 | 4 | 106 | 1 | 1 | 2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment