在新窗口中的Highchart

时间:2012-03-23 17:38:54

标签: javascript backbone.js highcharts

我使用highcharts在我的页面中显示图表。 它工作正常,但有时候图中的数据太“浓缩”,所以我应该找到一种方法来查看更大尺寸的图形。

我在这个主题上通过互联网阅读了几篇帖子: - 一般来说,他们建议使用highslide,但我不想,因为我的页面已经被脚本覆盖了 - 有人试图在弹出窗口弹出内容,它可能适合我,但我没有成功 - 适合我的唯一准工作示例似乎如下: (在options对象中我添加了这个属性)。

exporting: {
                    buttons: {
                        popUpBtn: {
                            symbol: 'square',
                            _titleKey: 'FullScreenButtonTitle',
                            x: -60,
                            symbolSize:18,
                            symbolFill: '#B5C9DF',
                            hoverSymbolFill: '#779ABF',
                            onclick: function () {
                                var win=window.open('','','location=0,titlebar=0,status=0,width=780,height=350');
                                win.focus();
                                var divtag = win.document.createElement("div");
                                divtag.id = "div1";
                                win.document.body.appendChild(divtag);
                                win.document.write('<script type="text/javascript" src="script/highcharts/js/highcharts.js"></script>\
                                                                    <script type="text/javascript" src="script/highcharts/js/modules/exporting.js"></script>');
                                this.options.renderTo=divtag;
                                var chart = new Highcharts.Chart(this.options);

                                win.document.close();
                            }
                        },
                        exportButton: {
                            enabled: true
                        },
                        printButton: {
                            enabled: true
                        }

                    }
                }

然而它不起作用,因为没有插入div标签,所有我得到的是这个

<html>
 <head>
   <script type="text/javascript" src="script/highcharts/js/highcharts.js">  </script>
    <script type="text/javascript" src="script/highcharts/js/modules/exporting.js"></script>
    </head></html>

我无法理解错误。 我知道这应该是简单的事情,但我无法单独离开。

- 编辑---

我终于明白哪个可能是一个有效的策略:创建一个“chartpopup.html”页面,并传递构建我可视化图形副本所需的参数。

所以现在我有:

的index.html:

    chartOptions = {
            series: [
                {
                    name: 'example',
                    data: [83.6, 78.8, 98.5, 93.4, 106.0]
                }]    
          //// CUT SOME CODE

                exporting: {
                    buttons: {
                        popUpBtn: {
                            enabled:true,
                            symbol: 'square',
                            _titleKey: 'FullScreenButtonTitle',
                            x: -60,
                            symbolSize:18,
                            symbolFill: '#B5C9DF',
                            hoverSymbolFill: '#779ABF',
                            onclick: function () {
                                look this!--------> generalPurposeGlobalVar = this;
                                var win=window.open('./chartpopup.html','Full Size Chart','location=0,titlebar=0,status=0,width=780,height=650');

                            }
                        },
                        exportButton: {
                            enabled: true
                        },
                        printButton: {
                            enabled: true
                        }

                    }
                }
            };
        this.highChart=new Highcharts.Chart(this.chartOptions);

和chartpopup.html:

   <!DOCTYPE html>
   <html>
   <head>
       <meta charset="utf-8">
       <title>Chart full Size</title>
   <script type="text/javascript" src="script/jquery-1.7.1-min.js"></script>
   <script type="text/javascript" src="script/highcharts/js/highcharts.js"></script>
   <script type="text/javascript" src="script/highcharts/js/modules/exporting.js">              </script>

   </head>
   <body>

   <div id="container" style="min-width: 400px; height: 650; margin: 0 auto"></div>

   <script>
   var chart;

   $(document).ready(function() {

       var mychart=window.opener.generalPurposeGlobalVar;

       mychart.options.chart.renderTo= 'container';
       chart = new Highcharts.Chart(mychart.options);


   });
   </script>
   </body>
   </html>

这两个页​​面实际上只与默认图形一起使用。如果我修改并重新渲染图形,我无法在弹出页面上重现它!

我用来修改图形的代码基本上是这样的:

        this.chartOptions.series=[{name:field.split('_').join('\n')}];
        this.highChart.destroy();
        this.highChart=new Highcharts.Chart(this.chartOptions);
        this.highChart.xAxis[0].setCategories(_.isEmpty(mygroups) ? [] : mygroups);
        this.highChart.series[0].setData([]);
        this.highChart.setTitle({text: this.highChart.title.text},{text:(field.split('_').join(' ')),  });
        this.highChart.redraw();//
   [...]
        self.highChart.series[0].addPoint(result);//it's a point I calculated before

2 个答案:

答案 0 :(得分:4)

这是一个Highcharts例子,使用“oldschool”弹出窗口:

<强>的index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>highcharts foobar</title>
</head>
<body>
    <a href="javascript:open_chart_popup();">Open Chart Popup</a>
<script>
    function open_chart_popup() {
        window.open('popup.html', 'chart popup title', 'width=1680px height=1050px');
    }
</script>
</body>
</html>

<强> popup.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>highcharts foobar</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="http://code.highcharts.com/highcharts.js"></script>
    <script src="http://code.highcharts.com/modules/exporting.js"></script>
</head>
<body>

<div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>

<script>
var chart;

$(document).ready(function() {
    chart = new Highcharts.Chart({
        chart: {
            renderTo: 'container',
            type: 'line',
            marginRight: 130,
            marginBottom: 25
        },
        title: {
            text: 'Monthly Average Temperature',
            x: -20 //center
        },
        subtitle: {
            text: 'Source: WorldClimate.com',
            x: -20
        },
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
        yAxis: {
            title: {
                text: 'Temperature (°C)'
            },
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        tooltip: {
            formatter: function() {
                return '<b>'+ this.series.name +'</b><br/>'+
                this.x +': '+ this.y +'°C';
            }
        },
        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'top',
            x: -10,
            y: 100,
            borderWidth: 0
        },
        series: [{
            name: 'Tokyo',
            data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
        }, {
            name: 'New York',
            data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
        }, {
            name: 'Berlin',
            data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
        }, {
            name: 'London',
            data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
        }]
    });
});
</script>
</body>
</html>

如果此解决方案不适合您,您能否告诉我们您使用哪些JavaScript库(此示例依赖于jQuery)。正如文档所说,highcharts需要jQuery,Mootools或Prototype:http://www.highcharts.com/documentation/how-to-use

如果你能够使用jQuery,你可以使用一些更酷的效果替换那个弹出窗口:http://jqueryui.com/demos/dialog/

尽管如此,如果你想为脚本提供帮助,你能否考虑制作一个jsfiddle,我无法重现你的错误。

编辑:

好的,所以你有足够的东西来解决这个问题。

我看到两个选项:

  • 您通过AJAX请求将用户输入series JSON数据发送到您的服务器。然后你的服务器会发回一个视图或一堆包含你的用户数据高清图的html / js。回到客户端,你可以看到你想要的那个(比如触发包含图形的弹出窗口)。我对骨干不太满意,但我确信你可以生成一个模板并将其渲染回来(这可能会有所帮助http://japhr.blogspot.fr/2011/08/getting-started-with-backbonejs-view.html

  • 另一个解决方案是直接将模板(包含图形)设置到视图中,但默认情况下隐藏它。然后,当用户正确设置series时,您只需显示模板(例如,在弹出窗口中)。这个解决方案避免了服务器调用,所以我建议。

编辑2:

所以,我已经让jsFiddle显示了一个基于用户输入更新图表的基本示例:http://jsfiddle.net/MxtkM/

该示例更新了图表上所有系列的最后一个值,具体如下:

$('#december_value').bind('keyup', function() {
    var user_input_value = parseFloat($(this).val()); // cast to float

    for (var s in chart.series) { // loop through the series
        var old_data = chart.series[s].data;
        var new_data = [];

        for (var d in old_data ) { // loop through data objects
           new_data.push(old_data[d].config); // config property contains the y value
        }

        new_data[new_data.length - 1] = user_input_value; // update the last value

        chart.series[s].setData(new_data); // use setData method to refresh the datas of the serie
    }
});

此示例通过提供新数据数组来使用方法setData。 如果这不符合您的需求,可以通过执行var chart = new Highcharts.Chart(options);来重新渲染所有图表,从而刷新图表。 (这在上面的链接中有解释)。

这两个链接也很好看:

现在,您可以根据用户输入对图表执行任何操作。

答案 1 :(得分:1)

在四处闲逛并提问之后,我发现最好的方法是全屏显示包含图表的div。

这是一个非常简单的解决方案,但它确实有效。

这篇文章非常有帮助How do I make a div full screen?

如下所示的函数应该在“#graph”div上执行操作:

function fullscr() {

        $('#graph').css({
            width: $(window).width(),
            height: $(window).height()
        });

    }

希望得到这个帮助。