A bubble chart

by Christiaan Westerbeek

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script src="https://npmcdn.com/[email protected]/dist/react-with-addons.min.js"></script>
<script src="https://npmcdn.com/[email protected]/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/prop-types/prop-types.min.js"></script>
<script src="https://npmcdn.com/recharts/umd/Recharts.min.js"></script>
<div id="container">
    <!-- This element's contents will be replaced with your component. -->
</div>

CSS

body {
  margin: 0;
}
#container {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  padding: 10px;
  width: 800px;
  height: 800px;
  background-color: #fff;
}

Babel + JSX

const {ScatterChart, Scatter, XAxis, YAxis, ZAxis, CartesianGrid, Tooltip, Legend} = Recharts;

const data01 = [
  { delta_minute: 3, hour: '12a', index: 0, value: 170 },
  { delta_minute: 4, hour: '1a', index: 0, value: 180 },
  { delta_minute: 5, hour: '2a', index: 0, value: 150 },
  { delta_minute: 6, hour: '3a', index: 0, value: 120 },
  { delta_minute: 7, hour: '4a', index: 0, value: 200 },
  { delta_minute: 8, hour: '5a', index: 0, value: 300 },
  { delta_minute: 9, hour: '6a', index: 0, value: 400 },
  { delta_minute: 14, hour: '7a', index: 0, value: 200 },
  { delta_minute: 20, hour: '8a', index: 0, value: 100 },
  { delta_minute: 30, hour: '9a', index: 0, value: 150 },
];

const parseDomain = () => {
  return [
    0,
    Math.max.apply(null, [
      ...data01.map(entry => entry.value)
    ])
  ];
};

const ThreeDimScatterChart = React.createClass({
	renderTooltip(props) {
    const { active, payload } = props;

    if (active && payload && payload.length) {
      const data = payload[0].payload;

      return (
        <div style={{ backgroundColor: '#fff', border: '1px solid #999', margin: 0, padding: 10 }}>
          <p>{data.hour}</p>
          <p><span>value: </span>{data.value}</p>
        </div>
      );
    }

    return null;
  },
  
	render () {
  	const domain = parseDomain();
    const range = [16, 225];

    return (
      <div>
        <ScatterChart width={800} height={60} margin={{top: 10, right: 0, bottom: 0, left: 0}}>
          <XAxis type="number" dataKey="delta_minute" interval={0} tick={false} stroke="red" strokeWidth="4" />
          <YAxis type="number" dataKey="index" name="sunday" height={10} width={80} tick={false} tickLine={false} axisLine={false} label={{ value: 'Sunday', position: 'insideRight' }}/>
          <ZAxis type="number" dataKey="value" domain={domain} range={range} />
          <Tooltip cursor={{strokeDasharray: '3 3'}} wrapperStyle={{ zIndex: 100 }} content={this.renderTooltip} />
          <Scatter data={data01}...