0

PHPを介してHighstock/Highchartsに3つの別々のデータ系列を渡していますが、何らかの理由で、グラフが読み込まれるときに1つの系列のみが表示されます。これが私のHTML出力が今どのように見えるかの例です:http://bit.ly/15D3Dhiそしてこれが私の完全な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', 'ZNGA' => 'http://ichart.finance.yahoo.com/table.csv?s=ZNGA');
$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[]   = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$MSFT = json_encode($MSFT);

foreach($AAPL_data as $val){
    $AAPL[]   = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$AAPL = json_encode($AAPL);

foreach($FB_data as $val){
    $FB[]   = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$FB = json_encode($FB);

?>
<html>
    <head>
        <title>
            Highcharts + PHP + Stock Data
        </title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
        $(function() {
            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: [{
                name: 'MSFT',
                data: <?php echo $MSFT; ?>
            }, {
                name: 'AAPL',
                data: <?php echo $AAPL; ?>
            }, {
                name: 'FB',
                data: <?php echo $FB; ?>
            }]
                });     
        });
        </script>
    </head>
    <body>
        <script src="http://code.highcharts.com/stock/highstock.js"></script>
        <script src="http://code.highcharts.com/stock/modules/exporting.js"></script>

        <div id="container" style="height: 500px; min-width: 600px"></div>
    </body>
</html>

誰かが私のコードを見て、なぜ1つのシリーズしか表示されないのかを知ることができますか?私のHTML出力のソースを見ると、すべてのデータが同じ方法で渡されたように見えるので、なぜ1つのシリーズだけが表示されるのかはわかりません。

ご不明な点がある場合や詳細情報が必要な場合は、よろしくお願いいたします。

4

1 に答える 1

1

それを見て、私が最初に気付いたのは、コードが非常にきれいであるということですが、JSエラーがあります:

Highcharts error #15: www.highcharts.com/errors/15
Title: Highcharts expects data to be sorted

次に、FBだけが表示されることに気付きましたが、日付範囲を拡大するとFBと別のシリーズが表示されるため、Y軸が原因です。

気まぐれから、私は最初にJSエラーを修正することに決めました、そしてどういうわけかY軸はそれ自身を解決しました。したがって、JSエラーが原因のようです。

編集:585connorの提案に従って、array_unshiftの代わりにはるかに高速なarray_reverseを使用します:

foreach($MSFT_data as $val){
    $MSFT[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$MSFT = json_encode(array_reverse($MSFT));

foreach($AAPL_data as $val){
    $AAPL[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$AAPL = json_encode(array_reverse($AAPL));

foreach($FB_data as $val){
    $FB[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$FB = json_encode(array_reverse($FB));

foreach($ZNGA_data as $val){
    $ZNGA[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$ZNGA = json_encode(array_reverse($ZNGA));
于 2013-03-10T08:20:31.067 に答える