2013-03-08 2 views
0

Я пытаюсь извлечь данные о финансовых запасах нескольких компаний из CSV и отобразить данные в виде отдельной серии в линейной диаграмме Highcharts/Highstocks. У меня есть настройка источников, и я могу извлечь данные + конвертировать в JSON, но мне не удается передать данные в Highcharts. Я считаю, что я не использую самый эффективный метод подготовки данных для использования Highcharts, и я надеюсь, что кто-то может дать мне указания относительно того, что я сделал неправильно. Пожалуйста, взгляните на мой код и сообщите мне о любых неэффективности или очевидных ошибках, которые вы видите.Проблемы с передачей данных в Highcharts

PHP код:

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 код:

$(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 
     }); 
    } 
}); 

Если у вас есть какие-либо вопросы или нужна дополнительная информация, пожалуйста, дайте мне знать, с комментарием.

Благодаря

BTW: Я все необходимые активы, которые включены для Highcharts работы; когда я заменяю свой JS + PHP кодом примера с сайта Highcharts, он работает красиво. Таким образом, проблема явно лежит в моем коде JS + PHP.

+0

У вас есть котировки вокруг MSFT, AAPL и FB в вашем коде серииOptions? Достаточно уверен, что это вызовет ошибки для неопределенных переменных. – MatthewKremer

+0

@MatthewKremer Спасибо, только что сделал это изменение. Все еще не работает, но да, это была ошибка с моей стороны. – 585connor

+0

Хммм ... Я попытался скопировать код и поместить его в JSFiddle (просто заменив эхо PHP на статические массивы), и он отлично работал. Не могли бы вы запустить код и просмотреть исходный HTML-код страницы после того, как php будет завершен и помещен здесь? – MatthewKremer

ответ

3

Хорошо, я считаю, что нашел проблему, она заключается в том, что вы храните каждую отдельную точку в массиве.

Вместо этого (который проходит строку х, у, разделенных запятой):

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

Вы будете хотеть использовать что-то вроде этого (Highcharts accepts arrays or associative arrays):

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

Это будет хранить переменные X и Y в виде массива вместо строки, разделенной запятой, для прохождения javascript в качестве данных.

+0

спасибо, но это, похоже, не исправило мою ситуацию. Я думаю, проблема может заключаться в том, что мои массивы данных все завернуты в содержащий массив. Например, сейчас это выглядит так: [[foo, bar], [qux, baz]], когда это должно быть [foo, bar], [qux, baz]. Кажется, это может вызвать проблемы? Если да, то как я могу исправить? – 585connor

+0

@ 585connor Нет, так и должно быть. Это массив массивов координат x, y. Просто любопытно, прямо сейчас у вас есть диаграмма, инициализирующаяся внутри createChart(); Вы называете эту функцию потом? Возможно, вы даже можете удалить часть функции и сразу же инициализировать диаграмму = Highcharts .... – MatthewKremer

+0

Благодаря @MatthewKremer диаграмма теперь отображается, но она отображает только один набор данных (FB) вместо всех трех, которые я загрузил. Любая идея, что может быть причиной этого? – 585connor

Смежные вопросы