Biểu đồ Vega

Tổng quan

VegaChart là một trong nhiều hình ảnh trực quan có thể được tạo bằng cách sử dụng Vega Visual Semantic, là một ngôn ngữ khai báo để tạo, lưu và chia sẻ các thiết kế hình ảnh trực quan tương tác. Với Vega, bạn có thể mô tả giao diện trực quan và hành vi tương tác của hình ảnh trực quan ở định dạng JSON và tạo thành phần hiển thị dựa trên nền tảng web bằng Canvas hoặc SVG.

Khi vẽ VegaChart, bạn phải bao gồm trong các tùy chọn thông số kỹ thuật về cách xây dựng biểu đồ trong ngữ pháp hình ảnh hóa Vega. Dưới đây là một số ví dụ về các thông số kỹ thuật đó và một số ví dụ khác trên trang Ví dụ của VegaChart.

Lưu ý: Mặc dù Biểu đồ VegaChart của Google có thể vẽ bất kỳ biểu đồ Vega nào mà bạn có thể chỉ định bằng Thông số kỹ thuật Vega JSON (bao gồm tất cả mọi thứ trong Thư viện ví dụ), các tính năng bổ sung yêu cầu lệnh gọi đến API Vega vẫn chưa có sẵn.

Ví dụ đơn giản: Biểu đồ thanh

Dưới đây là một ví dụ đơn giản về Biểu đồ VegaChart vẽ Biểu đồ thanh. (Xem ví dụ gốc, hướng dẫn chi tiếtBiểu đồ thanh trong trình chỉnh sửa biểu đồ Vega.)

Mặc dù đây là một cách khác để tạo biểu đồ thanh trong Biểu đồ của Google, nhưng chúng tôi dự định tích hợp tất cả tính năng của biểu đồ Thanh và Cột khác vào nội dung triển khai mới dựa trên VegaChart này.

Lưu ý:

  'data': [{'name': 'table', 'source': 'datatable'}],

<html>
  <head>
    <script src='https://www.gstatic.com/charts/loader.js'></script>
    <script>
      google.charts.load('upcoming', {'packages': ['vegachart']}).then(drawChart);

      function drawChart() {
        const dataTable = new google.visualization.DataTable();
        dataTable.addColumn({type: 'string', 'id': 'category'});
        dataTable.addColumn({type: 'number', 'id': 'amount'});
        dataTable.addRows([
          ['A', 28],
          ['B', 55],
          ['C', 43],
          ['D', 91],
          ['E', 81],
          ['F', 53],
          ['G', 19],
          ['H', 87],
        ]);

        const options = {
          "vega": {
            "$schema": "https://vega.github.io/schema/vega/v4.json",
            "width": 500,
            "height": 200,
            "padding": 5,

            'data': [{'name': 'table', 'source': 'datatable'}],

            "signals": [
              {
                "name": "tooltip",
                "value": {},
                "on": [
                  {"events": "rect:mouseover", "update": "datum"},
                  {"events": "rect:mouseout",  "update": "{}"}
                ]
              }
            ],

            "scales": [
              {
                "name": "xscale",
                "type": "band",
                "domain": {"data": "table", "field": "category"},
                "range": "width",
                "padding": 0.05,
                "round": true
              },
              {
                "name": "yscale",
                "domain": {"data": "table", "field": "amount"},
                "nice": true,
                "range": "height"
              }
            ],

            "axes": [
              { "orient": "bottom", "scale": "xscale" },
              { "orient": "left", "scale": "yscale" }
            ],

            "marks": [
              {
                "type": "rect",
                "from": {"data":"table"},
                "encode": {
                  "enter": {
                    "x": {"scale": "xscale", "field": "category"},
                    "width": {"scale": "xscale", "band": 1},
                    "y": {"scale": "yscale", "field": "amount"},
                    "y2": {"scale": "yscale", "value": 0}
                  },
                  "update": {
                    "fill": {"value": "steelblue"}
                  },
                  "hover": {
                    "fill": {"value": "red"}
                  }
                }
              },
              {
                "type": "text",
                "encode": {
                  "enter": {
                    "align": {"value": "center"},
                    "baseline": {"value": "bottom"},
                    "fill": {"value": "#333"}
                  },
                  "update": {
                    "x": {"scale": "xscale", "signal": "tooltip.category", "band": 0.5},
                    "y": {"scale": "yscale", "signal": "tooltip.amount", "offset": -2},
                    "text": {"signal": "tooltip.amount"},
                    "fillOpacity": [
                      {"test": "datum === tooltip", "value": 0},
                      {"value": 1}
                    ]
                  }
                }
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(document.getElementById('chart-div'));
        chart.draw(dataTable, options);
      }
    </script>
  </head>

  <body>
    <div id="chart-div" style="width: 700px; height: 250px;"></div>
  </body>

</html>


Đang tải

Tên gói google.charts.load"vegachart".

google.charts.load("current", {packages: ["vegachart"]});

Tên lớp của hình ảnh trực quan là google.visualization.VegaChart.

var visualization = new google.visualization.VegaChart(container);

Định dạng dữ liệu

Dữ liệu có thể được chuyển đến VegaChart theo cách rất giống với các Biểu đồ khác của Google, sử dụng DataTable (hoặc DataView). Điểm khác biệt chính là thay vì dựa vào thứ tự của các cột để xác định cách sử dụng, VegaChart dựa vào mã nhận dạng của từng cột giống với nội dung dự kiến cho hình ảnh Vega cụ thể mà bạn đã chỉ định. Ví dụ: Bảng dữ liệu sau đây được tạo bằng các cột có mã nhận dạng cho 'category''amount', và các mã nhận dạng đó được dùng trong tuỳ chọn "vega" để tham chiếu đến các cột này.

Với DataTable
        const dataTable = new google.visualization.DataTable();
        dataTable.addColumn({type: 'string', 'id': 'category'});
        dataTable.addColumn({type: 'number', 'id': 'amount'});
        dataTable.addRows([
          ['A', 28],
          ['B', 55],
          ['C', 43],
        ]);

        const options = {
          'vega': {
            ...
            // Here we create the Vega data object named 'datatable',
            // which will be passed in via the draw() call with a DataTable.
            'data': {'name': 'datatable'},

            'scales': [
              {
                'name': 'yscale',
                // Here is an example of how to use the 'amount' field from 'datatable'.
                'domain': {'data': 'datatable', 'field': 'amount'},
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(
          document.getElementById('chart-div'));
        chart.draw(dataTable, options);
    
Với dữ liệu cùng dòng của Vega
        // A DataTable is required, but it may be empty.
        const dataTable = new google.visualization.DataTable();
        const options = {
          'vega': {
            // Here the data is specified inline in the Vega specification.
            "data": [
              {
               "name": "table",
                "values": [
                  {"category": "A", "amount": 28},
                  {"category": "B", "amount": 55},
                  {"category": "C", "amount": 43},
                ]
              }
            ],

            'scales': [
              {
                'name': 'yscale',
                // Here is how Vega normally uses the 'amount' field from 'table'.
                "domain": {"data": "table", "field": "category"},
              }
            ]
          }
        };

        const chart = new google.visualization.VegaChart(
          document.getElementById('chart-div'));
        chart.draw(dataTable, options);
    

Tuy nhiên, bạn chỉ có thể truyền một bảng DataData như vậy vào VegaChart theo cách này, trong khi một số biểu đồ Vega yêu cầu nhiều bảng dữ liệu. Chúng tôi sẽ giải quyết hạn chế này trong bản phát hành sau này của Biểu đồ Google.

Trong thời gian chờ đợi, bạn có thể chỉ định bất kỳ dữ liệu bổ sung nào mà bạn cần sử dụng trong tùy chọn 'vega' 'data', bằng cách cùng dòng hoặc tải dữ liệu này từ một URL. Bạn có thể xem ví dụ về cả hai ví dụ này bên dưới.

Các tuỳ chọn cấu hình

Tên
Khu vực

Một đối tượng có thành viên để định cấu hình vị trí và kích thước của khu vực biểu đồ (chính là biểu đồ sẽ được vẽ, ngoại trừ trục và chú giải). Có hai định dạng được hỗ trợ: số hoặc số theo sau là %. Số đơn giản là giá trị tính bằng pixel; số theo sau là % là phần trăm. Ví dụ: chartArea:{left:20,top:0,width:'50%',height:'75%'}

Loại: đối tượng
Mặc định: rỗng
ChartArea.bottom

Khoảng cách để vẽ biểu đồ từ đường viền dưới cùng.

Loại: số hoặc chuỗi
Mặc định: tự động
ChartArea.left

Khoảng cách để vẽ biểu đồ từ đường viền trái.

Loại: số hoặc chuỗi
Mặc định: tự động
ChartArea.right

Khoảng cách để vẽ biểu đồ từ đường viền phải.

Loại: số hoặc chuỗi
Mặc định: tự động
ChartArea.top

Khoảng cách để vẽ biểu đồ từ đường viền trên.

Loại: số hoặc chuỗi
Mặc định: tự động
vấn đề

Chiều rộng khu vực trên biểu đồ.

Loại: số hoặc chuỗi
Mặc định: tự động
vấn đề

Chiều cao khu vực trên biểu đồ.

Loại: số hoặc chuỗi
Mặc định: tự động
độ cao

Chiều cao của biểu đồ, tính bằng pixel.

Loại: số
Mặc định: chiều cao của phần tử chứa
chiều rộng

Chiều rộng của biểu đồ, tính bằng pixel.

Loại: số
Mặc định: chiều rộng của phần tử chứa

Phương thức

Phương thức
draw(data, options)

Vẽ biểu đồ. Biểu đồ chỉ chấp nhận các lệnh gọi phương thức khác sau khi sự kiện ready được kích hoạt. Extended description

Loại dữ liệu trả về: không có
getAction(actionID)

Trả về đối tượng hành động trên chú giải công cụ có actionID được yêu cầu.

Loại dữ liệu trả về: đối tượng
getBoundingBox(id)

Trả về một đối tượng chứa thành phần bên trái, trên cùng, chiều rộng và chiều cao của phần tử biểu đồ id. Định dạng cho id chưa được ghi lại (đây là giá trị trả về của trình xử lý sự kiện) nhưng dưới đây là một số ví dụ:

var cli = chart.getChartLayoutInterface();

Chiều cao vùng biểu đồ
cli.getBoundingBox('chartarea').height
Chiều rộng của thanh thứ ba trong chuỗi biểu đồ thanh hoặc cột đầu tiên
cli.getBoundingBox('bar#0#2').width
Hộp giới hạn của nêm thứ năm của biểu đồ hình tròn
cli.getBoundingBox('slice#4')
Hộp ranh giới dữ liệu biểu đồ của biểu đồ dọc (ví dụ: cột):
cli.getBoundingBox('vAxis#0#gridline')
Hộp giới hạn dữ liệu biểu đồ của biểu đồ ngang (ví dụ: thanh):
cli.getBoundingBox('hAxis#0#gridline')

Giá trị tương ứng với vùng chứa của biểu đồ. Gọi hàm này sau khi biểu đồ được vẽ.

Loại dữ liệu trả về: đối tượng
getChartAreaBoundingBox()

Trả về một đối tượng chứa nội dung bên trái, trên cùng, chiều rộng và chiều cao của nội dung biểu đồ (tức là không bao gồm nhãn và chú giải):

var cli = chart.getChartLayoutInterface();

cli.getChartAreaBoundingBox().left
cli.getChartAreaBoundingBox().top
cli.getChartAreaBoundingBox().height
cli.getChartAreaBoundingBox().width

Giá trị tương ứng với vùng chứa của biểu đồ. Gọi hàm này sau khi biểu đồ được vẽ.

Loại dữ liệu trả về: đối tượng
getChartLayoutInterface()

Trả về một đối tượng chứa thông tin về vị trí trên màn hình của biểu đồ và các phần tử của biểu đồ.

Bạn có thể gọi các phương thức sau trên đối tượng được trả về:

  • getBoundingBox
  • getChartAreaBoundingBox
  • getHAxisValue
  • getVAxisValue
  • getXLocation
  • getYLocation

Gọi hàm này sau khi biểu đồ được vẽ.

Loại dữ liệu trả về: đối tượng
getHAxisValue(xPosition, optional_axis_index)

Trả về giá trị dữ liệu theo chiều ngang tại xPosition, là một giá trị bù trừ pixel từ cạnh bên của vùng chứa biểu đồ. Có thể âm.

Ví dụ: chart.getChartLayoutInterface().getHAxisValue(400)

Gọi hàm này sau khi biểu đồ được vẽ.

Loại trả về: số
getImageURI()

Trả về biểu đồ được chuyển đổi tuần tự dưới dạng một URI hình ảnh.

Gọi hàm này sau khi biểu đồ được vẽ.

Xem phần In biểu đồ PNG.

Loại trả về: chuỗi
getSelection()

Trả về một mảng các thực thể biểu đồ đã chọn. Đối với biểu đồ này, chỉ có thể chọn một thực thể vào bất kỳ thời điểm nào. Extended description .

Loại dữ liệu trả về: Một mảng các phần tử lựa chọn
getVAxisValue(yPosition, optional_axis_index)

Trả về giá trị dữ liệu dọc tại yPosition, giá trị này bù trừ pixel từ cạnh trên cùng của vùng chứa biểu đồ. Có thể âm.

Ví dụ: chart.getChartLayoutInterface().getVAxisValue(300)

Gọi hàm này sau khi biểu đồ được vẽ.

Loại trả về: số
getXLocation(dataValue, optional_axis_index)

Trả về toạ độ x của pixel theo dataValue so với cạnh trái của vùng chứa của biểu đồ.

Ví dụ: chart.getChartLayoutInterface().getXLocation(400)

Gọi hàm này sau khi biểu đồ được vẽ.

Loại trả về: số
getYLocation(dataValue, optional_axis_index)

Trả về toạ độ y pixel của dataValue so với cạnh trên của vùng chứa của biểu đồ.

Ví dụ: chart.getChartLayoutInterface().getYLocation(300)

Gọi hàm này sau khi biểu đồ được vẽ.

Loại trả về: số
removeAction(actionID)

Xoá thao tác chú giải công cụ với actionID được yêu cầu khỏi biểu đồ.

Loại dữ liệu trả về: none
setAction(action)

Đặt hành động trong chú giải công cụ sẽ được thực thi khi người dùng nhấp vào văn bản hành động.

Phương thức setAction lấy một đối tượng làm tham số hành động. Đối tượng này phải chỉ định 3 thuộc tính: id – mã nhận dạng cho thao tác được đặt, text – văn bản sẽ xuất hiện trong chú giải công cụ cho thao tác và action – hàm sẽ chạy khi người dùng nhấp vào văn bản thao tác.

Bạn phải thiết lập tất cả hành động trong chú giải công cụ trước khi gọi phương thức draw() của biểu đồ. Nội dung mô tả mở rộng.

Loại dữ liệu trả về: none
setSelection()

Chọn các thực thể biểu đồ đã chỉ định. Hủy mọi lựa chọn trước đó. Đối với biểu đồ này, mỗi lần bạn chỉ có thể chọn một thực thể. Extended description .

Loại dữ liệu trả về: không có
clearChart()

Xoá biểu đồ và giải phóng tất cả tài nguyên được phân bổ của biểu đồ.

Loại dữ liệu trả về: không có

Sự kiện

Để biết thêm thông tin về cách sử dụng những sự kiện này, hãy xem bài viết Hoạt động tương tác cơ bản, Xử lý sự kiệnSự kiện kích hoạt.

Tên
animationfinish

Được kích hoạt khi ảnh động chuyển đổi hoàn tất.

Thuộc tính: không có
click

Được kích hoạt khi người dùng nhấp vào bên trong biểu đồ. Có thể được dùng để xác định thời điểm người dùng nhấp vào tiêu đề, các phần tử dữ liệu, mục nhập chú giải, trục, đường lưới, hoặc nhãn.

Thuộc tính: targetID
error

Được kích hoạt khi xảy ra lỗi khi cố gắng hiển thị biểu đồ.

Thuộc tính: mã nhận dạng, thông báo
legendpagination

Được kích hoạt khi người dùng nhấp vào mũi tên phân trang chú giải. Trả về chỉ mục trang dựa trên 0 chú giải hiện tại và tổng số trang.

Thuộc tính: currentPageIndex, totalPages
onmouseover

Được kích hoạt khi người dùng di chuột qua một thực thể hình ảnh. Truyền lại các chỉ mục hàng và cột của phần tử bảng dữ liệu tương ứng.

Tài sản: hàng, cột
onmouseout

Được kích hoạt khi người dùng di chuột khỏi một thực thể hình ảnh. Chuyển trở lại các chỉ mục hàng và cột của phần tử bảng dữ liệu tương ứng.

Tài sản: hàng, cột
ready

Biểu đồ đã sẵn sàng cho các lệnh gọi phương thức bên ngoài. Nếu muốn tương tác với biểu đồ và gọi các phương thức sau khi vẽ, bạn nên thiết lập trình nghe cho sự kiện này trước khi bạn gọi phương thức draw và chỉ gọi các phương thức này sau khi sự kiện được kích hoạt.

Thuộc tính: không có
select

Được kích hoạt khi người dùng nhấp vào một thực thể hình ảnh. Để tìm hiểu những mục bạn đã chọn, hãy gọi getSelection().

Thuộc tính: không có

Chính sách dữ liệu

Toàn bộ mã và dữ liệu đều được xử lý và kết xuất trong trình duyệt. Dữ liệu không được gửi đến bất kỳ máy chủ nào.