mirror of
https://github.com/seigler/neat-charts
synced 2025-07-26 17:06:09 +00:00
added candlesticks
This commit is contained in:
parent
0fda243f2b
commit
6f33d2b1d4
2 changed files with 124 additions and 7 deletions
27
demo.php
27
demo.php
File diff suppressed because one or more lines are too long
104
src/NeatCharts/CandlestickChart.php
Normal file
104
src/NeatCharts/CandlestickChart.php
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?php
|
||||
namespace NeatCharts {
|
||||
class CandlestickChart extends NeatChart {
|
||||
public function setOptions($options) {
|
||||
$this->options = [ // BarChart defaults
|
||||
'width' => 1200,
|
||||
'height' => 300,
|
||||
'barColor' => '#000',
|
||||
'risingFillColor' => '#0D0',
|
||||
'fallingFillColor' => '#D00',
|
||||
'markerColor' => '#000',
|
||||
'labelColor' => '#000',
|
||||
'fontSize' => 15,
|
||||
'yAxisEnabled'=>true,
|
||||
'xAxisEnabled'=>false,
|
||||
'yAxisZero'=>false
|
||||
];
|
||||
parent::setOptions($options);
|
||||
}
|
||||
|
||||
public function setData($chartData) { // this directly uses the poloniex historical data format for $chartData
|
||||
// $key = index, $value = ["date":1405699200,"high":0.0045388,"low":0.00403001,"open":0.00404545,"close":0.00435873,"volume":44.34555992,"quoteVolume":10311.88079097,"weightedAverage":0.00430043]
|
||||
// we assume $chartData is sorted by date and values are all numeric
|
||||
$this->xMax = end($chartData)->date;
|
||||
$this->xMin = reset($chartData)->date;
|
||||
$this->xRange = $this->xMax - $this->xMin;
|
||||
$this->yMin = ($this->options['yAxisZero'] ? 0 : INF);
|
||||
$this->yMax = ($this->options['yAxisZero'] ? 0 : -INF);
|
||||
|
||||
foreach ($chartData as $v) {
|
||||
if ($v->low < $this->yMin) {
|
||||
$this->yMin = $v->low;
|
||||
$yMinX = $v->date;
|
||||
}
|
||||
if ($v->high > $this->yMax) {
|
||||
$this->yMax = $v->high;
|
||||
$yMaxX = $v->date;
|
||||
}
|
||||
}
|
||||
$this->yRange = $this->yMax - $this->yMin;
|
||||
|
||||
$count = count($chartData);
|
||||
$deltaX = $this->xRange / $count;
|
||||
$this->xMin -= $deltaX / 2;
|
||||
$this->xMax += $deltaX / 2;
|
||||
$this->xRange += $deltaX;
|
||||
|
||||
$gridLabelXML = $this->buildGridLabelXML();
|
||||
// this also sets $this->width and $this->height
|
||||
|
||||
$barRadius = min($this->width / $count / 2.5, $this->width / $count / 2 - 1);
|
||||
|
||||
$risingPoints = '';
|
||||
$fallingPoints = '';
|
||||
$whiskerPoints = '';
|
||||
foreach($chartData as $v) {
|
||||
$barX = $this->transformX($v->date);
|
||||
$barY0 = $this->transformY($v->open);
|
||||
$barY1 = $this->transformY($v->close);
|
||||
$whiskerY0 = $this->transformY($v->low);
|
||||
$whiskerY1 = $this->transformY($v->high);
|
||||
if ($v->close > $v->open) {
|
||||
$whiskerPoints .= ' M'.($barX).','.($whiskerY0).' '.($barX).','.($whiskerY1);
|
||||
$risingPoints .= ' M'.($barX - $barRadius).','.$barY0.' '.($barX + $barRadius).','.$barY0.' '.($barX + $barRadius).','.$barY1.' '.($barX - $barRadius).','.$barY1.' Z';
|
||||
} else {
|
||||
$whiskerPoints .= ' M'.($barX).','.($whiskerY1).' '.($barX).','.($whiskerY0);
|
||||
$fallingPoints .= ' M'.($barX - $barRadius).','.$barY0.' '.($barX + $barRadius).','.$barY0.' '.($barX + $barRadius).','.$barY1.' '.($barX - $barRadius).','.$barY1.' Z';
|
||||
}
|
||||
}
|
||||
|
||||
$this->output = '<svg viewBox="-'.( $this->padding['left'] ).' -'.( $this->padding['top'] ).' '.( $this->options['width'] ).' '.( $this->options['height'] ).'" width="'.( $this->options['width'] ).'" height="'.( $this->options['height'] ).'" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g class="neatchart">'.
|
||||
$gridLabelXML.'
|
||||
<g
|
||||
class="chart__bars"
|
||||
stroke="'.( $this->options['barColor'] ).'"
|
||||
stroke-width="1"
|
||||
stroke-linecap="round"
|
||||
>
|
||||
<g
|
||||
class="chart__whiskers"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
>
|
||||
<path d="'.( $whiskerPoints ).'" />
|
||||
</g>
|
||||
<g
|
||||
class="chart__rising-bars"
|
||||
fill="'.( $this->options['risingFillColor'] ).'"
|
||||
>
|
||||
<path d="'.( $risingPoints ).'" />
|
||||
</g>
|
||||
<g
|
||||
class="chart__falling-bars"
|
||||
fill="'.( $this->options['fallingFillColor'] ).'"
|
||||
>
|
||||
<path d="'.( $fallingPoints ).'" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>';
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue