conbask
conbask

Reputation: 10061

Having trouble passing data to Highcharts

I am trying to pull financial stock data of multiple companies from CSVs and display the data as separate series in a Highcharts/Highstocks line chart. I have the sources setup and I am able to pull data + convert to JSON, but I am having trouble passing the data off to Highcharts. I believe I am not using the most efficient method of preparing the data for Highcharts use, and I am hoping someone can give me direction on what I've done incorrectly. Please take a look at my code and make me aware of any inefficiencies or glaring errors you see.

PHP code:

date_default_timezone_set('America/Los_Angeles');

$stocks = array('MSFT' => 'http://ichart.finance.yahoo.com/table.csv?s=MSFT', 'AAPL' => 'http://ichart.finance.yahoo.com/table.csv?s=AAPL', 'FB' => 'http://ichart.finance.yahoo.com/table.csv?s=FB');
$stocks_data = array();

foreach ($stocks as $key=>$stock) {
    $fh = fopen($stock, 'r');
    $header = fgetcsv($fh);

    $varname = $key . '_data';

    $$varname  = array();
    while ($line = fgetcsv($fh)) {
        ${$varname}[count($$varname)] = array_combine($header, $line);
    }

    fclose($fh);
}

foreach($MSFT_data as $val){
    $MSFT[]   = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp
}
$MSFT = json_encode($MSFT);

foreach($AAPL_data as $val){
    $AAPL[]   = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp
}
$AAPL = json_encode($AAPL);

foreach($FB_data as $val){
    $FB[]   = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp
}
$FB = json_encode($FB);

JS code:

$(function () {
    var seriesOptions = [],
        yAxisOptions = [],
        colors = Highcharts.getOptions().colors;

    seriesOptions[0] = {
        name: 'MSFT',
        data: <? php echo $MSFT; ?>
    };

    seriesOptions[1] = {
        name: 'AAPL',
        data: <? php echo $AAPL; ?>
    };

    seriesOptions[2] = {
        name: 'FB',
        data: <? php echo $FB; ?>
    };

    function createChart() {

        chart = new Highcharts.StockChart({
            chart: {
                renderTo: 'container'
            },

            rangeSelector: {
                selected: 4
            },

            yAxis: {
                labels: {
                    formatter: function () {
                        return (this.value > 0 ? '+' : '') + this.value + '%';
                    }
                },
                plotLines: [{
                    value: 0,
                    width: 2,
                    color: 'silver'
                }]
            },
            plotOptions: {
                series: {
                    compare: 'percent'
                }
            },
            tooltip: {
                pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b> ({point.change}%)<br/>',
                valueDecimals: 2
            },
            series: seriesOptions
        });
    }
});

If you have any questions or need further information, please let me know with a comment.

Thanks

BTW: I have all necessary assets included for Highcharts to work; when I replace my JS + PHP with example code from the Highcharts site, it works beautifully. So the problem clearly lies in my JS + PHP code.

Upvotes: 0

Views: 1472

Answers (1)

MatthewKremer
MatthewKremer

Reputation: 1569

Alright, I believe I found the problem, it lies in the way that you are storing each individual point in the array.

Instead of this (which is passing a string x,y separated by a comma):

strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close'];

You are going to want to use something like this (Highcharts accepts arrays or associative arrays):

array((strtotime($val['Date']) * 1000), ((float)$val['Close']));

That will store the X and Y variables as an array instead of comma separated string for the javascript to pass as data.

Upvotes: 3

Related Questions