Skip to content

Commit 4ec48f8

Browse files
Added radar chart
1 parent bc3405a commit 4ec48f8

File tree

10 files changed

+430
-206
lines changed

10 files changed

+430
-206
lines changed

css/main.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,27 @@
119119
#tree path {
120120
stroke: #336699;
121121
fill: none;
122+
}
123+
124+
/*Radar*/
125+
126+
.radar path {
127+
opacity: 0.8;
128+
}
129+
130+
.radar text {
131+
font-size: 10px;
132+
}
133+
134+
.pokemon-info {
135+
float: right;
136+
min-width: 140px;
137+
padding: 10px;
138+
border: 1px solid #cccccc;
139+
border-radius: 5px;
140+
background-color: #eeeeee;
141+
}
142+
143+
.pokemon-info .label {
144+
float: right;
122145
}

docs/css/main.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,27 @@
119119
#tree path {
120120
stroke: #336699;
121121
fill: none;
122+
}
123+
124+
/*Radar*/
125+
126+
.radar path {
127+
opacity: 0.8;
128+
}
129+
130+
.radar text {
131+
font-size: 10px;
132+
}
133+
134+
.pokemon-info {
135+
float: right;
136+
min-width: 140px;
137+
padding: 10px;
138+
border: 1px solid #cccccc;
139+
border-radius: 5px;
140+
background-color: #eeeeee;
141+
}
142+
143+
.pokemon-info .label {
144+
float: right;
122145
}

docs/images/Radar chart.png

19.5 KB
Loading

docs/main.js

Lines changed: 212 additions & 204 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/main.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

images/Radar chart.png

19.5 KB
Loading

js/animate.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function interpolate(a, b, t) {
1818
if (typeof b === 'number') {
1919
return a + (b - a) * t;
2020
}
21-
return a;
21+
return b;
2222
}
2323

2424
function copy(obj) {

js/components/composite.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var Voronoi = require('./voronoi.jsx');
1616
var Graph = require('./graph.jsx');
1717
var Sankey = require('./sankey.jsx');
1818
var Waterfall = require('./waterfall.jsx');
19+
var Radar = require('./radar.jsx');
1920
var Disclaimer = require('./disclaimer.jsx');
2021

2122
module.exports = React.createClass({
@@ -75,6 +76,10 @@ module.exports = React.createClass({
7576
<Panel key="waterfall" title="Waterfall diagram" text="A breakdown of incomes and costs for each month"
7677
sources={ ['components/waterfall', 'data/waterfall'] }>
7778
<Waterfall />
79+
</Panel>,
80+
<Panel key="radar" title="Radar chart" text="Here is a radar chart showing Pokémon stats. Try changing Pokémon"
81+
sources={ ['components/radar', 'data/pokemon'] }>
82+
<Radar />
7883
</Panel>
7984
],
8085

js/components/radar.jsx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
var React = require('react');
2+
var Input = require('react-bootstrap/Input');
3+
var Radar = require('paths-js/radar');
4+
var Colors = require('../palette/colors.jsx');
5+
var util = require('../palette/util.jsx');
6+
var Animate = require('../animate.jsx');
7+
var data = require('../data/pokemon.json');
8+
9+
function keyAccessor(keys) {
10+
var a = {};
11+
keys.forEach(function(key) {
12+
a[key] = function(obj) { return obj[key]; }
13+
});
14+
return a;
15+
}
16+
17+
var labels = ['hp', 'attack', 'defense', 'sp_attack', 'sp_defense', 'speed'];
18+
var palette = Colors.mix({r: 130, g: 140, b: 210}, {r: 180, g: 205, b: 150});
19+
var colors = util.palette_to_function(palette);
20+
21+
module.exports = React.createClass({
22+
mixins: [Animate.Mixin],
23+
getInitialState: function() {
24+
return {
25+
pokemon: data[0],
26+
color: palette[0]
27+
};
28+
},
29+
select: function(e) {
30+
this.animateState({
31+
pokemon: data[e.target.value],
32+
color: palette[e.target.value]
33+
});
34+
},
35+
render: function() {
36+
var radar = Radar({
37+
data: [this.state.pokemon],
38+
accessor: keyAccessor(labels),
39+
center: [0, 0],
40+
r: 130,
41+
max: 100
42+
});
43+
var color = this.state.color;
44+
var rings = radar.rings.map(function(r, i) {
45+
if (i == 2) {
46+
var lines = r.path.points().map(function(p, j) {
47+
var x = p[0];
48+
var y = p[1];
49+
var transform = 'translate(' + Math.floor(1.2 * x) + ',' + Math.floor(1.2 * y) + ')';
50+
return <g>
51+
<text textAnchor="middle" transform={ transform }>{ labels[j] }</text>
52+
<line x1={ x } y1={ y } x2={ 0 } y2={ 0 } stroke="gray" />
53+
</g>
54+
});
55+
return <g>{ lines }</g>
56+
} else {
57+
return <path d={ r.path.print() } fill="none" stroke="gray" />
58+
}
59+
});
60+
var poly = radar.curves.map(function(c) {
61+
return <path d={ c.polygon.path.print() }
62+
fill={ Colors.string(Colors.lighten(color)) } stroke={ Colors.string(color) } />
63+
});
64+
var options = data.map(function(p, i) {
65+
return <option value={ i }>{ p.name }</option>
66+
});
67+
68+
return (
69+
<div className="radar">
70+
<Input type="select" onChange={ this.select }>
71+
{ options }
72+
</Input>
73+
<div className="pokemon-info">
74+
<h4>{ this.state.pokemon.name }</h4>
75+
<p>HP: <span className="label label-info">{ Math.floor(this.state.pokemon.hp) }</span></p>
76+
<p>Attack: <span className="label label-info">{ Math.floor(this.state.pokemon.attack) }</span></p>
77+
<p>Defense: <span className="label label-info">{ Math.floor(this.state.pokemon.defense) }</span></p>
78+
<p>Sp. Attack: <span className="label label-info">{ Math.floor(this.state.pokemon.sp_attack) }</span></p>
79+
<p>Sp. Defense: <span className="label label-info">{ Math.floor(this.state.pokemon.sp_defense) }</span></p>
80+
<p>Speed: <span className="label label-info">{ Math.floor(this.state.pokemon.speed) }</span></p>
81+
</div>
82+
<svg width={ 375 } height={ 400 }>
83+
<g transform="translate(200, 200)">
84+
{ rings }
85+
{ poly }
86+
</g>
87+
</svg>
88+
</div>
89+
);
90+
}
91+
});

js/data/pokemon.json

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
[
2+
{
3+
"name":"Bulbasaur",
4+
"hp":45,
5+
"attack":49,
6+
"defense":49,
7+
"sp_attack":65,
8+
"sp_defense":65,
9+
"speed":45
10+
},
11+
{
12+
"name":"Ivysaur",
13+
"hp":60,
14+
"attack":62,
15+
"defense":63,
16+
"sp_attack":80,
17+
"sp_defense":80,
18+
"speed":60
19+
},
20+
{
21+
"name":"Venusaur",
22+
"hp":80,
23+
"attack":82,
24+
"defense":83,
25+
"sp_attack":100,
26+
"sp_defense":100,
27+
"speed":80
28+
},
29+
{
30+
"name":"Kakuna",
31+
"hp":45,
32+
"attack":25,
33+
"defense":50,
34+
"sp_attack":25,
35+
"sp_defense":25,
36+
"speed":35
37+
},
38+
{
39+
"name":"Charmeleon",
40+
"hp":58,
41+
"attack":64,
42+
"defense":58,
43+
"sp_attack":80,
44+
"sp_defense":65,
45+
"speed":80
46+
},
47+
{
48+
"name":"Squirtle",
49+
"hp":44,
50+
"attack":48,
51+
"defense":65,
52+
"sp_attack":50,
53+
"sp_defense":64,
54+
"speed":43
55+
},
56+
{
57+
"name":"Blastoise",
58+
"hp":79,
59+
"attack":83,
60+
"defense":100,
61+
"sp_attack":85,
62+
"sp_defense":105,
63+
"speed":78
64+
},
65+
{
66+
"name":"Butterfree",
67+
"hp":60,
68+
"attack":45,
69+
"defense":50,
70+
"sp_attack":90,
71+
"sp_defense":80,
72+
"speed":70
73+
}
74+
]

0 commit comments

Comments
 (0)