Làm cách nào để tạo biểu đồ phạm vi cột trong Biểu đồ cao bằng cách sử dụng chức năng phạm vi và điều hướng?


90

Tôi có một yêu cầu để vẽ lịch sử chạy của một nhiệm vụ trong Highcharts. Nó cần hiển thị lịch sử chạy của các tác vụ dưới dạng thanh ngang. Có các yêu cầu bổ sung mà tôi đã thêm dưới dạng bản cập nhật bên dưới. Gần đây, tôi phát hiện ra rằng invertedtùy chọn không được hỗ trợ trong StockChart và chỉ có bộ điều hướng & dải ô mới có sẵn trong StockChart. Do đó tôi đang sử dụng các chức năng đó.

Vì vậy, để đạt được yêu cầu, tôi đã tạo một cái gì đó tương tự như ví dụ jsfiddle này (tìm thấy ở đâu đó trong khi duyệt không nhớ nguồn) và kết thúc bằng liên kết plunker này với sự trợ giúp từ câu hỏi trước của tôi , cảm ơn Pawel Fus

Cập nhật câu hỏi để tránh nhầm lẫn

Các yêu cầu bổ sung:

Chỉ hiển thị những tác vụ đã chạy trong một phạm vi ngày và giờ cụ thể . Trong trường hợp có quá nhiều lần chạy, chẳng hạn như hơn 10 lần chạy, thì cần phải có cách để chỉ hiển thị 10 tác vụ một cách rõ ràng với trục y có thể cuộn để hiển thị các tác vụ khác. liên kết plunker đến vấn đề

Giải thích vấn đề của plunker trên.

Nếu bạn kiểm tra ảnh chụp màn hình bên dưới từ plunker trên, phạm vi thời gian là từ 12/12/2014 09:32:26đến 12/12/2014 10:32:26và chỉ có 2 tác vụ đã chạy m_ARRAYV_SALES_ZIG1_CALL2_VOD__C_OB& m_ZIG2_HCP_MERGE_IB_CN. Tuy nhiên, tôi có thể thấy một nhiệm vụ khác LILLY_Cthậm chí không chạy trong phạm vi ngày này. (Trong dữ liệu thực tế, có hơn 10 nhiệm vụ làm lộn xộn biểu đồ này, thậm chí không thuộc phạm vi ngày này)

Ngoài ra, nếu bạn nhận thấy ở góc dưới cùng bên phải thời gian chuyển từ 09:38sang 19:20. 19:20là thời gian kết thúc cho m_ZIG2_HCP_MERGE_IB_CNnhiệm vụ. nhập mô tả hình ảnh ở đây Dưới đây là các tùy chọn biểu đồ của tôi

    var chart_options = {
            chart: {
                renderTo: 'container',
                height: 600
            },
            title: {
            },
            credits: {
                enabled: false
            },
            xAxis: {
                type: 'datetime',
                gridLineWidth: 1,
                tickInterval: 1 * 3600 * 1000,
                dateTimeLabelFormats: {
                    month: '%b %e, %Y'
                }
            },
            yAxis: {                    
                tickInterval: 1,
                gridLineWidth: 1,
                labels: {
                    formatter: function() {
                        if (tasks[this.value]) {
                            return tasks[this.value].name;
                        }
                    }
                },
                startOnTick: false,
                endOnTick: false,
                title: {
                    text: 'Task'
                }
            },
            rangeSelector: {
                selected: 0,
                buttons: [ {
                    type: "minute",
                    count: 60,
                    text: "1h"
                }, {
                    type: "minute",
                    count: 180,
                    text: "3h"
                }, {
                    type: "minute",
                    count: 300,
                    text: "5h"
                }],
                inputDateFormat: '%m/%d/%Y %H:%M:%S',
                inputEditDateFormat: '%m/%d/%Y %H:%M:%S',
                inputBoxWidth: 120
            },
            navigator: {
                enabled: false
            },
            legend: {
                enabled: false
            },
            tooltip: {
                shared: false,
                formatter: function() {
                    var str = '';
                    str += 'Task: ' + this.series.name + '<br>';
                    str += 'From: ' + Highcharts.dateFormat('%m/%d/%y %H:%M', this.point.from) + '<br>';
                    str += 'To: ' + Highcharts.dateFormat('%m/%d/%y %H:%M', this.point.to) + '<br>';
                    return str;
                }
            },
            plotOptions: {
                line: {
                    lineWidth: 10,
                    marker: {
                        enabled: true
                    },
                    dataLabels: {
                        enabled: true,
                        align: 'left',
                        formatter: function() {
                            return this.point.options && this.point.options.label;
                        }
                    },
                    states:{
                        hover:{
                            lineWidth:10
                        }
                    }
                },
                series: {
                    cursor: 'pointer',
                    point: {
                        events: {
                            click: function () {
                                var query = '{ "task_id": "'+this.task_id+'","start_time": '+this.from+',"exclude_interval": '+opExcludeMinutes+',"size": 10 }';
                                $scope.taskName = this.series.name;
                                $scope.isTaskSelected = false;
                                $scope.operationalReportAgentTaskHistoryServiceRequest(query);
                            }
                        }
                    }
                }
            },
            series: seriesData
        };

6
Đặt độ rộng vạch phổ trong hover nhà nước, ví dụ: jsfiddle.net/bx2000cb/8
Sebastian Bochan

5
Như bạn biết Highcharts error #15là do lỗi trong việc sắp xếp dữ liệu của bạn. Bạn đang gán dữ liệu của mình nhưng không theo thứ tự tăng dần. Vui lòng kiểm tra, có thể kiểm tra kỹ vì tôi thấy rất nhiều vấn đề này vì nhà phát triển không tìm thấy vấn đề trong dữ liệu được sắp xếp bằng cách nào đó của họ.
Raein Hashemi

4
Nếu bạn không cố gắng, sau đó bạn sẽ không biết ..
Paweł Fus

4
Tôi không biết các bạn đang nói về cái gì, đó có phải là chiếc plunker thực sự không? Câu hỏi này là một mớ hỗn độn lớn. Tôi khuyên bạn nên bắt đầu với việc đọc và hiểu mã bạn có để tạo biểu đồ. Ngoài ra, tôi khuyên bạn nên đọc một số hướng dẫn về Highcharts, chỉ để hiểu cách nó hoạt động.
Paweł Fus

1
Tôi chạy phạm vi này và thấy hai tác vụ, không có thêm điều gì bạn mô tả.
Sebastian Bochan

Câu trả lời:


6

Vì vậy, sau vài giờ đào bới, tôi mới tìm ra thủ phạm (hoặc tôi thực sự hy vọng như vậy). Vấn đề là định nghĩa của bạn về trình yAxisđịnh dạng nhãn:

yAxis: {
  tickInterval: 1,
    gridLineWidth: 1,
    labels: {
    formatter: function() { // THIS IS THE PROBLEM
      if (tasks[this.value]) {
        return tasks[this.value].name;
      }
    }
  },
  startOnTick: false,
    endOnTick: false,
    title: {
    text: 'Task'
  }
},

Bạn không thực sự kiểm tra xem bạn có nên hiển thị nhãn theo task.intervals(xem json.js) hay không. Một bản cập nhật đơn giản ( Plunker ) của trình định dạng dường như hoạt động:

  yAxis: {
    tickInterval: 1,
    gridLineWidth: 1,
    labels: {
      formatter: function () {
        console.log("scripts.js - yAxis.labels.formatter", this.value);
        if (tasks[this.value]) {

          //if (tasks[this.value].name === 'LILLY_C') {
            var _xAxis = this.chart.axes[0];
            var _task = tasks[this.value];
            var _show = false;

            // Not optimized for large collections
            for (var _i = 0; _i < _task.intervals.length; _i++) {
              var _int = _task.intervals[_i];
              if (_xAxis.min <= _int.to) {
                _show = true;
              }
            }

            console.log("scripts.js - yAxis.labels.formatter",
              tasks[this.value].name,
              _show,
              _xAxis.min,
              _xAxis.max,
              _task.intervals
            );

            if (_show) {
              return tasks[this.value].name;
            } else {
              return;
            }
          //}

          //return tasks[this.value].name;
        }
      }
    },
    startOnTick: false,
    endOnTick: false,
    title: {
      text: 'Task'
    }
  },

Xem Plunker cho bản demo .

Ý nghĩa của các nhãn yAxis là: Hiển thị nhãn nếu bạn thấy một lần chạy trong biểu đồ hoặc nếu có một lần chạy ở bên phải biểu đồ. Vui lòng sửa đổi điều kiện

if (_xAxis.min <= _int.to) {

như bạn thấy phù hợp.

Tuyên bố từ chối trách nhiệm: Tôi không sử dụng Highcharts, vì vậy câu trả lời này cố gắng giải thích vấn đề chứ không phải đề xuất cách giải quyết vấn đề trên Highcharts.


Bài học kinh nghiệm:

  • yaxis-plugin.js không liên quan đến vấn đề.
  • Highstock.js là một thư viện mã nguồn mở ( highstock.src.js ). Mọi gỡ lỗi sẽ dễ dàng hơn nhiều nếu bạn gỡ lỗi mã nguồn gốc. Mã được rút gọn làm tăng thêm sự phức tạp và phỏng đoán không cần thiết. Tôi đã tải xuống thư viện và thêm một số console.log()để tìm hiểu điều gì đang xảy ra.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.