建立圖表類型

本頁面說明如何開發自己的圖表類型,並為使用者提供圖表類型。

觀眾

本頁面假設您已閱讀使用圖表頁面。同時假設您已熟悉 JavaScript 和物件導向程式設計。網路上有許多 JavaScript 教學課程

建立圖表

系統會透過您建立的 JavaScript 程式庫向使用者顯示圖表。 建立圖表資料庫的步驟如下:

  1. 選擇程式碼的命名空間。其他網頁將會代管您的程式碼,建議您避免使用命名衝突。
  2. 實作圖表物件。實作會顯示以下項目的 JavaScript 物件:
    • 建構函式
    • draw() 方法中,將物件繪製至傳遞至建構函式的 DOM 元素中,
    • 供用戶端使用的任何其他選用標準方法,例如 getSelection()
    • 任何想要向客戶公開的自訂方法。
  3. [選用] 實作您要讓用戶端擷取的任何事件
  4. 撰寫圖表的說明文件。如未提供該文件,使用者可能無法嵌入。
  5. 將圖表張貼在圖表庫中。

提示

  • 您可以下載 goog.visualization API 類別和方法定義,以便在 IDE (程式碼編輯器) 中啟用自動完成功能。從 http://www.google.com/uds/modules/gviz/gviz-api.js 下載檔案並儲存到您的專案。多數 IDE 會自動建立索引並啟用自動完成功能,但您的 IDE 可能有所不同。請注意,這個檔案不一定是最新的,請參閱參考資料頁面以取得最新的 API 參考資料。

選擇命名空間

您可以將圖表嵌入代管其他圖表或其他不相關的 JavaScript 的網頁。為避免與其他程式碼或 CSS 類別名稱命名,建議您為圖表程式碼選擇專屬的命名空間。命名空間是很好的選擇,也就是用來代管指令碼的網址 (減去 WWW 和任何副檔名)。例如,如果您的圖表將發布於 www.example.com,您將使用 example 做為您的專屬命名空間。您可以新增其他的後置字元,並以 . 分隔。標記,進一步將圖表分組 (Google 所有的圖表都有 google.visualization 命名空間)。請使用命名空間物件來儲存圖表物件,以及任何可能需要的全域變數。

以下範例說明如何建立命名空間物件,來存放名為 MyTable 的圖表類別,以及任何需要的全域變數:

// Namespace, implemented as a global variable.
var example = {};

// MyTable class constructor.
example.MyTable = function(container) {
  // ...
}

// MyTable.draw() method.
example.MyTable.prototype.draw = function(data, options) {
  // ...
}

避免 CSS 衝突

使用 CSS 時,請勿撰寫會影響網頁其他圖表的 CSS 規則。舉例來說,我們非常不建議您使用 td {color: blue;} 等規則,因為這麼做會影響網頁上的任何其他 <td> 元素,而不只是圖表上的值。解決這個問題的一種方式,就是將整個圖表放在含有類別名稱的 <div> 中,並且讓所有 CSS 規則都只套用到屬於該類別名稱的元素子系的元素。舉例來說,下列 CSS 規則只會影響 <td> 元素,其元素類別為「example」為祖系。

td.example {color: blue;}

接著,您可以使用下列方式將圖表包裝在 <div> 中:

<div class="example">
  ...
</div>

實作圖表

您必須以 JavaScript 物件的形式呈現圖表,並公開參考資料部分所述的標準方法。這兩個必要方法為建構函式和 Draw() 方法。也可以向使用者公開適用於圖表的其他任何方法。提醒您,使用上比較方便。

建構函式

您的圖表應公開一個單一參數,該建構函式採用單一參數,也就是您要繪製圖表的 DOM 元素。一般而言,圖表會將這個元素的本機副本儲存在建構函式中,以供日後使用:

function example.MyTable(container) {
  this.container = container
}

draw() 方法

您的圖表類別應在圖表類別的原型中定義 draw() 方法。draw() 方法可接受兩個參數:

  1. 保留資料的 DataTable
  2. 可呈現圖表名稱/值的選項 (選用)。 您可以依照自己的特定圖表,定義選項的名稱和值類型。舉例來說,在下方的 Hello Chart 範例中,圖表支援名為「showLineNumber」的選項,其值為類型布林值。您應該針對每個選項支援預設值,以免使用者傳遞特定選項的值。此參數為選用項目,因此若使用者未傳入此參數,您也應準備使用所有預設值 (更多資訊)。
example.MyTable.prototype.draw = function(data, options) {
  // Process data and options and render output into the container element.
  ...
}

您好:圖表!

以下簡易圖表顯示 DataTable 資料做為 HTML 資料表:

導入程式碼如下:

// Declare a unique namespace.
var example = {};

// Class constructor. Parameter container is a DOM elementon the client that
// that will contain the chart.
example.MyTable = function(container) {
  this.containerElement = container;
}

// Main drawing logic.
// Parameters:
//   data is data to display, type google.visualization.DataTable.
//   options is a name/value map of options. Our example takes one option.
example.MyTable.prototype.draw = function(data, options) {

  // Create an HTML table
  var showLineNumber = options.showLineNumber; // Boolean configuration option.

  var html = [];
  html.push('<table border="1">');

  // Header row
  html.push('<tr>');
  if (showLineNumber) {
    html.push('<th>Seq</th>');
  }
  for (var col = 0; col < data.getNumberOfColumns(); col++) {
    html.push('<th>' + this.escapeHtml(data.getColumnLabel(col)) + '</th>');
  }
  html.push('</tr>');

  for (var row = 0; row < data.getNumberOfRows(); row++) {
    html.push('<tr>');
    if (showLineNumber) {
      html.push('<td align="right">', (row + 1), '</td>');
    }

    for (var col = 0; col < data.getNumberOfColumns(); col++) {
      html.push(data.getColumnType(col) == 'number' ? '<td align="right">' : '<td>');
      html.push(this.escapeHtml(data.getFormattedValue(row, col)));
      html.push('</td>');
    }
    html.push('</tr>');
  }
  html.push('</table>');

  this.containerElement.innerHTML = html.join('');
}

// Utility function to escape HTML special characters
example.MyTable.prototype.escapeHtml = function(text) {
  if (text == null)
    return '';
  return text.replace(/&/g, '&').replace(/</g, '<')
      .replace(/>/g, '>').replace(/"/g, '"');
}

在網頁中加入圖表

如要使用先前的圖表,請將其儲存在瀏覽器可存取的 .js 檔案中。然後儲存下列程式碼,將 <script> 來源參數變更為指向您的 JavaScript 檔案:

<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript" src="mytablevis.js"></script>
    <script type="text/javascript">
      google.charts.load("current");

      // Set callback to run when API is loaded
      google.charts.setOnLoadCallback(drawVisualization);

      // Called when the Chart API is loaded.
      function drawVisualization() {

        // Create and populate a data table.
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Task');
        data.addColumn('number', 'Daily Hours');
        data.addRows(5);
        data.setCell(0, 0, 'Work');
        data.setCell(0, 1, 11);
        // Add more data rows and cells here

        // Instantiate our table object.
        var vis = new example.MyTable(document.getElementById('mydiv'));

        // Draw our table with the data we created locally.
        vis.draw(data, {showLineNumber: true});
       }
   </script>
  <title>MyTable example page</title></head>
  <body>
    <div id="mydiv"></div>
    <p>This page demonstrates hosting a table visualization.</p>
  </body>
</html>

 

實作事件

如要讓圖表觸發實用事件 (例如計時器事件或使用者啟動的事件 (例如點擊),您必須呼叫 google.visualization.events.trigger 函式,並詳細說明事件的詳細資料 (名稱、要傳送的屬性等)。詳情請參閱活動頁面。 只要將事件屬性新增至事件物件,即可向用戶端公開事件詳細資料,也可以在圖表中顯示某些類型的 get...() 方法,且用戶端可呼叫該方法以取得事件詳細資料。無論是哪一種情況,請妥善記錄您的方法或事件屬性。

記錄圖表

如果您未正確記錄圖表,可能就不會有太多使用者。 請務必記錄以下內容:

  • 請說明你支援的所有方法。draw() 方法在所有圖表中都很常見,但每張圖表可以支援自己的其他方法。(除非建構函式具有非標準行為,因此您可能不需要記錄建構函式)。您可以在參考資料頁面中找到預期方法清單。
  • 請說明 draw() 方法支援的所有選項。包括每個選項的名稱、預期值類型,以及預設值。
  • 請說明你觸發的所有事件。這表示每個事件的名稱和屬性,以及每個事件的觸發時機。
  • 列出應用於用戶端 <script> include 陳述式的圖表程式庫網址,並提供說明文件的網址。
  • 輸入圖表的完整名稱。
  • 建立範例頁面,說明如何透過圖表呈現圖表、支援的選項、事件和自訂方法。
  • 清楚描述圖表的資料政策。大部分圖表會在瀏覽器中處理資料,但有些圖表可能會將資料傳送至伺服器,例如建立圖表或地圖的圖片。如果你確實將資料傳送至伺服器:
    • 清楚定義要傳送的資料。
    • 請注意,資料會在伺服器上保存多久。
    • 記錄哪些實體可以存取資料。例如 XYZ 公司等。
    • 指定是否要記錄資料以及持續時間。

您的文件將和圖表程式碼在同一個位置託管 (請參閱下方的將圖表提交至圖片庫)。

撰寫圖表後,請提交圖表,將圖片提交到圖庫中的「其他圖表」部分。提交圖表代表您必須和 Google 簽署協議,表示他們不會製造惡意軟體,或濫用使用者資料。資料庫只是 Google 所建立或已審核的圖表指標清單;您可以選擇在自己的網站上代管實際 JavaScript 程式庫和說明文件,也可以讓 Google 為您代管程式庫和說明文件。指定您要將圖表張貼到圖片庫時是否要代管圖表。

疑難排解

如果您的程式碼似乎無法運作,以下這些方法可協助您解決問題:

  • 檢查是否有錯字。請記住,JavaScript 語言須區分大小寫。
  • 使用 JavaScript 除錯工具。在 Firefox 中,您可以使用 JavaScript 主控台、Venkman 偵錯工具Firebug 外掛程式。在 IE 中,您可以使用 Microsoft Script Debugger
  • 搜尋 Google Chart API 討論群組。如果找不到解答問題的貼文,請將您的問題張貼到群組中,並附上可呈現該問題的網頁連結。

本地化

若您希望圖表能使用不同國家/地區的使用者,建議您針對不同語言和文化設計圖表。最基本的本地化方式,就是根據使用者的瀏覽器設定,在使用者介面上翻譯標準文字字串。更進階的本地化方式,是根據本地化甚至甚至是使用者介面設計,變更數字格式。如果您決定將圖表本地化,請列出圖表支援的語言,並提供預設設定的預設設定。您也可以在圖表的使用者介面中加入「變更語言」按鈕,以防語言錯誤。偵測瀏覽器語言的常見原因是查看 Accept-Language HTML 標頭。