【问题标题】:Multiple Highcharts in one page - only one chart displays一页中有多个 Highcharts - 仅显示一个图表
【发布时间】:2019-02-23 00:10:56
【问题描述】:

我正在创建一个 Flask 应用程序,对于我想使用 Highcharts 的图表元素,我已经设法让一个图表显示在网页上,但是一旦我尝试显示多个图表只有一个渲染。

我已经尝试了很多方法来开始,更改变量名称,逐行检查代码以查看一个图表是否存在问题。注释掉一个图表然后另一个,以确保它们都有效。最后,我检查了 Chrome 中的脚本以查看返回的内容,一切正常。

我认为问题出在脚本元素中的变量声明中。如果我将两者都保留为 chart_id,我认为第一个图表将被覆盖,但是如果我将 var 更改为 chart_id1 和 chart_id2,图表都不返回?

我尝试将“div id={{ chart1ID|safe }}”下的所有变量标记为 chart1_id、series1 等 ....并将“id={{ chart2ID|safe }}”下的所有变量标记为2. 当我在 Chrome 中检查代码时,一切看起来都正确返回,但没有图表呈现。

.../static/main.js
$(document).ready(function() {
$(chart1_id).highcharts({
    chart1: chart1,
    title1: title1,
    xAxis1: xAxis1,
    yAxis1: yAxis1,
    series1: series1
})
});

$(document).ready(function() {
$(chart2_id).highcharts({
    chart2: chart2,
    title2: title2,
    xAxis2: xAxis2,
    yAxis2: yAxis2,
    series2: series2
})});

HTML

..../templates/index.html
    <body>

<div id={{ chart1ID|safe }} class="chart1" style="height: 500px; width: 500px">
    <script>
        var chart_id = {{ chart1ID|safe }}
        var series = {{ series1|safe }}
        var title = {{ title1|safe }}
        var xAxis = {{ xAxis1|safe }}
        var yAxis = {{ yAxis1|safe }}
        var chart = {{ chart1|safe }}
    </script>
    </div>

    <br>
    <P>***********************************************************************************</P>

    <div id={{ chart2ID|safe }} class="chart2" style="height: 500px; width: 500px">
    <script>
        var chart_id = {{ chart2ID|safe }}
        var series = {{ series2|safe }}
        var title = {{ title2|safe }}
        var xAxis = {{ xAxis2|safe }}
        var yAxis = {{ yAxis2|safe }}
        var chart = {{ chart2|safe }}
    </script>
    </div>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script src="http://code.highcharts.com/highcharts.js"></script>
        <script src="../static/main.js"></script>
</body>

Python

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
@app.route('/index')
def index(chart1ID = 'chart1_ID', chart1_type = 'line', chart1_height = 500, chart2ID = 'chart2_ID', chart2_type = 'line', chart2_height = 500):
  chart1 = {"renderTo": chart1ID, "type": chart1_type, "height": chart1_height,}
  series1 = [{"name": 'Label1', "data": [1,2,3]}, {"name": 'Label2', "data": [9, 10, 11]}]
  title1 = {"text": 'Chart 1 Title'}
  xAxis1 = {"categories": ['xAxis Data1', 'xAxis Data2', 'xAxis Data3']}
  yAxis1 = {"title": {"text": 'yAxis Label'}}

  chart2 = {"renderTo": chart2ID, "type": chart2_type, "height": chart2_height,}
  series2 = [{"name": 'Label1', "data": [1,2,3]}, {"name": 'Label2', "data": [14, 15, 20]}]
  title2 = {"text": 'Second Chart Title'}
  xAxis2 = {"categories": ['xAxis Data1', 'xAxis Data2', 'xAxis Data3']}
  yAxis2 = {"title": {"text": 'yAxis Label'}}
  return render_template('index.html',
                         chart1ID=chart1ID, chart1=chart1, series1=series1, title1=title1, xAxis1=xAxis1, yAxis1=yAxis1,
                         chart2ID=chart2ID, chart2=chart2, series2=series2, title2=title2, xAxis2=xAxis2, yAxis2=yAxis2)

if __name__ == "__main__":
    app.run(debug = True)

我现在看不到树木的树木,我想这是我忽略的基本东西。这是我目前正在使用的所有代码,我从一个更大的应用程序中删除了它,以便在发布问题时更清楚。

谢谢

【问题讨论】:

    标签: javascript flask highcharts


    【解决方案1】:

    您只需将 HTML 文档中的 var 更改为 var series1、title1 等。 我的工作代码:

    HTML:

    <html lang="en">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="">
        <meta name="keywords" content="">
        <meta name="author" content="">
        <meta charset="utf-8">
        {% block head %}
            <title>{% block title %}Title!{% endblock %}</title>
        {% endblock %}
    </head>
    
    <body>
        <div id={{ chart1ID|safe }} class="chart1" style="height: 500px; width: 1000px"></div>
        <script>
            var chart1_id = {{ chart1ID|safe }}
            var series1 = {{ series1|safe }}
            var title1 = {{ title1|safe }}
            var xAxis1 = {{ xAxis1|safe }}
            var yAxis1 = {{ yAxis1|safe }}
            var chart1 = {{ chart1|safe }}
        </script>
    
        <div id={{ chart2ID|safe }} class="chart2" style="height: 500px; width: 1000px">
     <script>
             var chart2_id = {{ chart2ID|safe }}
             var series2 = {{ series2|safe }}
             var title2 = {{ title2|safe }}
             var xAxis2 = {{ xAxis2|safe }}
             var yAxis2 = {{ yAxis2|safe }}
             var chart2 = {{ chart2|safe }}
     </script>
     </div>
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
            <script src="http://code.highcharts.com/highcharts.js"></script>
      <script src="../static/js/graph.js"></script>
    </body>
    

    JavaScript:

     $(document).ready(function() {
      $(chart1_id).highcharts({
        chart: chart1,
        title: title1,
        xAxis: xAxis1,
        yAxis: yAxis1,
        series: series1
     });
    });
    
    $(document).ready(function() {
     $(chart2_id).highcharts({
      chart: chart2,
      title: title2,
      xAxis: xAxis2,
      yAxis: yAxis2,
      series: series2
    })});
    

    还有 Python:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    @app.route('/index')
    def index(chart1ID = 'chart1_ID', chart1_type = 'line', chart1_height = 500, 
    chart2ID = 'chart2_ID', chart2_type = 'line', chart2_height = 500):
      chart1 = {"renderTo": chart1ID, "type": chart1_type, "height": chart1_height,}
      series1 = [{"name": 'Label1', "data": [1,2,3]}, {"name": 'Label2', "data": [9, 10, 11]}]
      title1 = {"text": 'Chart 1 Title'}
      xAxis1 = {"categories": ['xAxis Data1', 'xAxis Data2', 'xAxis Data3']}
      yAxis1 = {"title": {"text": 'yAxis Label'}}
    
    
      chart2 = {"renderTo": chart2ID, "type": chart2_type, "height": chart2_height,}
      series2 = [{"name": 'Label1', "data": [1,2,3]}, {"name": 'Label2', "data": [14, 15, 20]}]
      title2 = {"text": 'Second Chart Title'}
      xAxis2 = {"categories": ['xAxis Data1', 'xAxis Data2', 'xAxis Data3']}
      yAxis2 = {"title": {"text": 'yAxis Label'}}
      return render_template('index.html', chart1ID=chart1ID, chart1=chart1, series1=series1, title1=title1, xAxis1=xAxis1, yAxis1=yAxis1, chart2ID=chart2ID, chart2=chart2, series2=series2, title2=title2, xAxis2=xAxis2, yAxis2=yAxis2)
    
    if __name__ == "__main__":
     app.run(debug = True, host='127.0.0.1', port=5000, passthrough_errors=True)
    

    当您尝试复制此 Python 代码时,请记住在变量前格式化等于空格(例如,每个变量前一个制表符 - [tab]chart1 = {...} [tab]series1 = {...} 等) .

    【讨论】:

    • 感谢您的反馈,我刚刚运行它,它返回一个空白页。 html 页面中的脚本获取这些值,当我检查时可以看到它们,但是,在控制台元素中它现在声明“未捕获的 ReferenceError:chart_id 未定义”
    • 如果我将该部分的 var chart1_id 更改为 var chart_id 等等并重新运行,此图表将呈现。 var chart_id = {{ chart1ID|safe }} var series = {{ series1|safe }} var title = {{ title1|safe }} var xAxis = {{ xAxis1|safe }} var yAxis = {{ yAxis1|safe }} var chart = {{ chart1|safe }} ..但我不能对两个图表都这样做,我目前看不到如何显示多个,因为唯一有效的 var 名称是 chart_id???
    【解决方案2】:

    在您的第一个代码块中,您向 highcharts 提供图表选项为 chart1, title1 等。Highcharts 期望这些选项为 chart, title 并且此结构在两个图表中必须相同(API:https://api.highcharts.com/highcharts/):

    .../static/main.js
    $(document).ready(function() {
    $(chart1_id).highcharts({
        chart: chart1,
        title: title1,
        xAxis: xAxis1,
        yAxis: yAxis1,
        series: series1
    })
    });
    
    $(document).ready(function() {
    $(chart2_id).highcharts({
        chart: chart2,
        title: title2,
        xAxis: xAxis2,
        yAxis: yAxis2,
        series: series2
    })});
    

    在 HTML 代码中,您创建了在两个地方都具有相同名称的全局 js 变量,这就是为什么第二个图表的选项将覆盖第一个图表的原因。也许更好的想法是创建两个带有图表选项的全局对象(chartOptions1 和 chartOptions2),然后使用这些对象来初始化图表,或者直接使用 python 变量来初始化 highcharts 图表对象中的图表:

    HTML:

    ..../templates/index.html
    <body>
    
        <div id={{ chart1ID|safe }} class="chart1" style="height: 500px; width: 500px"></div>
    
        <br>
        <P>***********************************************************************************</P>
    
        <div id={{ chart2ID|safe }} class="chart2" style="height: 500px; width: 500px"></div>
    
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script src="http://code.highcharts.com/highcharts.js"></script>
        <script src="../static/main.js"></script>
        <script>
            $(document).ready(function() {
            var chart1_id = {{ chart1ID|safe }};
            var chart2_id = {{ chart2ID|safe }};
    
            $('#' + chart1_id).highcharts({
                chart: {{ chart1|safe }},
                title: {{ title1|safe }},
                xAxis: {{ xAxis1|safe }},
                yAxis: {{ yAxis1|safe }},
                series: {{ series1|safe }}
            });
    
            $('#' + chart2_id).highcharts({
                chart: {{ chart2|safe }},
                title: {{ title2|safe }},
                xAxis: {{ xAxis2|safe }},
                yAxis: {{ yAxis2|safe }},
                series: {{ series2|safe }}
            });
          });
        </script>
    </body>
    

    【讨论】:

    • 感谢@Wojciech 的回复,但这不起作用/我仍然有问题。没有错误,但图表不会显示,只是一个空白页?
    • 上述解决方案出现以下错误:Uncaught ReferenceError: chart_id is not defined。
    • 我在上面发送给您的代码中找不到chart_id。也许您在这里更改了变量名称,并在某处留下了旧名称 chart_id。该错误应该准确地指出问题出在哪里。请更正并重新检查。
    • 它不识别chart1_id,它要求一个chart_id。这在代码中没有提到。
    • 这个错误不是Highcharts造成的,而是JS本身造成的。您只是在使用一个从未声明过的变量。不幸的是,我无法告诉你错误在哪里。
    【解决方案3】:

    * 更新 * 所以我不明白为什么这不起作用。似乎太简单而无法工作,上面提供了两个很好的答案。

    我删除了我正在处理的项目(内置于 PyCharm),然后重新构建项目并重新启动。使用上面的塞巴斯蒂安示例,我能够毫无问题地显示两个图表。我不知道是否存在缓存问题,某处有尾随空格或项目已损坏。为遇到此问题的其他人提供更新。

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多