Diagram DataTable

Fungsi ui.Chart merender diagram dari objek JSON sisi klien yang mengikuti struktur yang sama dengan class DataTable Google Charts, tetapi tidak memiliki metode dan kemampuan DataTable. Pada dasarnya, ini adalah tabel 2-D dengan baris yang mewakili pengamatan dan kolom yang mewakili atribut pengamatan. Library ini menyediakan antarmuka dasar yang fleksibel untuk membuat diagram di Earth Engine. Ini adalah opsi yang baik jika penyesuaian diagram tingkat tinggi diperlukan.

Skema DataTable

Ada dua cara untuk menentukan pseudo-DataTable di Earth Engine: array 2-D JavaScript dan objek literal JavaScript. Untuk sebagian besar aplikasi, membuat array 2D akan menjadi pendekatan yang paling sederhana. Dalam kedua kasus tersebut, tabel yang diteruskan ke ui.Chart harus berupa objek sisi klien. Tabel yang dienkode secara manual akan secara inheren berada di sisi klien, sedangkan objek yang dikomputasi harus ditransfer sisi klien menggunakan evaluate. Lihat halaman Klien vs. Server untuk mengetahui informasi selengkapnya tentang perbedaan antara objek sisi server dan sisi klien.

Array JavaScript

DataTable 2D terdiri dari array baris dan kolom. Baris adalah pengamatan dan kolom adalah atribut. Kolom pertama menentukan nilai untuk sumbu x, sedangkan kolom tambahan menentukan nilai untuk deret sumbu y. Baris pertama diharapkan berupa header kolom. Header yang paling sederhana adalah serangkaian label kolom, yang ditunjukkan dalam array DataTable berikut yang mengaitkan populasi menurut negara bagian yang dipilih.

var dataTable = [
  ['State', 'Population'],
  ['CA', 37253956],
  ['NY', 19378102],
  ['IL', 12830632],
  ['MI', 9883640],
  ['OR', 3831074],
];

Atau, kolom dapat ditetapkan ke peran selain menentukan domain (sumbu x) dan data (deret sumbu y), misalnya anotasi, interval, tooltip, atau gaya. Dalam contoh berikut, array header ditampilkan sebagai serangkaian objek, dengan peran setiap kolom ditentukan secara eksplisit. Peran kolom yang dapat diterima untuk setiap jenis Diagram Google dapat ditemukan dalam dokumentasi masing-masing, misalnya Format data Diagram Kolom.

var dataTable = [
  [{role: 'domain'}, {role: 'data'}, {role: 'annotation'}],
  ['CA', 37253956, '37.2e6'],
  ['NY', 19378102, '19.3e6'],
  ['IL', 12830632, '12.8e6'],
  ['MI', 9883640, '9.8e6'],
  ['OR', 3831074, '3.8e6'],
];

Properti kolom ditentukan sebagai berikut:

Parameter Jenis Definisi
type string, direkomendasikan Jenis data kolom: 'string', 'number', 'boolean', 'date', 'datetime', atau 'timeofday'.
label string, direkomendasikan Label untuk kolom, label deret dalam legenda diagram.
role string, direkomendasikan Peran untuk kolom (misalnya, peran untuk Diagram Kolom).
pattern string, opsional String format angka (atau tanggal) yang menentukan cara menampilkan nilai kolom.

Objek JavaScript

DataTable dapat diformat sebagai objek literal JavaScript tempat array objek baris dan kolom disediakan. Lihat panduan ini untuk mengetahui petunjuk cara menentukan parameter kolom dan baris.

var dataTable = {
  cols: [{id: 'name', label: 'State', type: 'string'},
         {id: 'pop', label: 'Population', type: 'number'}],
  rows: [{c: [{v: 'CA'}, {v: 37253956}]},
         {c: [{v: 'NY'}, {v: 19378102}]},
         {c: [{v: 'IL'}, {v: 12830632}]},
         {c: [{v: 'MI'}, {v: 9883640}]},
         {c: [{v: 'OR'}, {v: 3831074}]}]
};

Diagram DataTable manual

Misalkan Anda memiliki sedikit data statis yang ingin ditampilkan ke diagram. Gunakan spesifikasi array atau objek JavaScript untuk membuat input yang akan diteruskan ke fungsi ui.Chart. Di sini, populasi negara bagian yang dipilih dari sensus Amerika Serikat tahun 2010 dienkode sebagai array JavaScript dengan objek header kolom yang menentukan properti kolom. Perhatikan bahwa kolom ketiga ditetapkan ke peran 'annotation', yang menambahkan populasi sebagai anotasi ke setiap pengamatan dalam diagram.

Editor Kode (JavaScript)

// Define a DataTable using a JavaScript array with a column property header.
var dataTable = [
  [
    {label: 'State', role: 'domain', type: 'string'},
    {label: 'Population', role: 'data', type: 'number'},
    {label: 'Pop. annotation', role: 'annotation', type: 'string'}
  ],
  ['CA', 37253956, '37.2e6'],
  ['NY', 19378102, '19.3e6'],
  ['IL', 12830632, '12.8e6'],
  ['MI', 9883640, '9.8e6'],
  ['OR', 3831074, '3.8e6']
];

// Define the chart and print it to the console.
var chart = ui.Chart(dataTable).setChartType('ColumnChart').setOptions({
  title: 'State Population (US census, 2010)',
  legend: {position: 'none'},
  hAxis: {title: 'State', titleTextStyle: {italic: false, bold: true}},
  vAxis: {title: 'Population', titleTextStyle: {italic: false, bold: true}},
  colors: ['1d6b99']
});
print(chart);

Diagram DataTable yang dihitung

Array DataTable dapat dibuat dari ee.List 2D yang diteruskan dari server ke klien melalui evaluate. Skenario umum adalah mengonversi properti ee.FeatureCollection, ee.ImageCollection, atau pengurangan per elemen ini menjadi DataTable. Strategi yang diterapkan dalam contoh berikut memetakan fungsi di ee.ImageCollection yang mengurangi elemen yang diberikan, mengumpulkan ee.List dari hasil pengurangan, dan melampirkan daftar sebagai properti yang disebut 'row' ke elemen yang ditampilkan. Setiap elemen koleksi baru memiliki ee.List 1-D yang mewakili baris dalam DataTable. Fungsi aggregate_array() digunakan untuk menggabungkan semua properti 'row' ke dalam ee.List induk untuk membuat ee.List sisi server 2-D dalam bentuk yang diperlukan untuk DataTable. Header kolom kustom digabungkan ke tabel dan hasilnya ditransfer sisi klien dengan evaluate, tempatnya dirender menggunakan fungsi ui.Chart.

Deret waktu menurut wilayah

Contoh ini menunjukkan deret waktu indeks vegetasi NDVI dan EVI yang berasal dari MODIS untuk ekoregion berhutan. Setiap gambar dalam seri dikurangi oleh ekorigion dan hasilnya disusun sebagai properti 'row' yang digabungkan ke dalam DataTable untuk diteruskan ke klien dan membuat diagram dengan ui.Chart. Perhatikan bahwa cuplikan ini menghasilkan diagram yang sama dengan diagram yang dihasilkan oleh contoh diagram ui.Chart.image.series.

Editor Kode (JavaScript)

// Import the example feature collection and subset the forest feature.
var forest = ee.FeatureCollection('projects/google/charts_feature_example')
                 .filter(ee.Filter.eq('label', 'Forest'));

// Load MODIS vegetation indices data and subset a decade of images.
var vegIndices = ee.ImageCollection('MODIS/061/MOD13A1')
                     .filter(ee.Filter.date('2010-01-01', '2020-01-01'))
                     .select(['NDVI', 'EVI']);

// Define a function to format an image timestamp as a JavaScript Date string.
function formatDate(img) {
  var millis = img.date().millis().format();
  return ee.String('Date(').cat(millis).cat(')');
}

// Build a feature collection where each feature has a property that represents
// a DataFrame row.
var reductionTable = vegIndices.map(function(img) {
  // Reduce the image to the mean of pixels intersecting the forest ecoregion.
  var stat = img.reduceRegion(
      {reducer: ee.Reducer.mean(), geometry: forest, scale: 500});

  // Extract the reduction results along with the image date.
  var date = formatDate(img);   // x-axis values.
  var evi = stat.get('EVI');    // y-axis series 1 values.
  var ndvi = stat.get('NDVI');  // y-axis series 2 values.

  // Make a list of observation attributes to define a row in the DataTable.
  var row = ee.List([date, evi, ndvi]);

  // Return the row as a property of an ee.Feature.
  return ee.Feature(null, {'row': row});
});

// Aggregate the 'row' property from all features in the new feature collection
// to make a server-side 2-D list (DataTable).
var dataTableServer = reductionTable.aggregate_array('row');

// Define column names and properties for the DataTable. The order should
// correspond to the order in the construction of the 'row' property above.
var columnHeader = ee.List([[
  {label: 'Date', role: 'domain', type: 'date'},
  {label: 'EVI', role: 'data', type: 'number'},
  {label: 'NDVI', role: 'data', type: 'number'}
]]);

// Concatenate the column header to the table.
dataTableServer = columnHeader.cat(dataTableServer);

// Use 'evaluate' to transfer the server-side table to the client, define the
// chart and print it to the console.
dataTableServer.evaluate(function(dataTableClient) {
  var chart = ui.Chart(dataTableClient).setOptions({
    title: 'Average Vegetation Index Value by Date for Forest',
    hAxis: {
      title: 'Date',
      titleTextStyle: {italic: false, bold: true},
    },
    vAxis: {
      title: 'Vegetation index (x1e4)',
      titleTextStyle: {italic: false, bold: true}
    },
    lineWidth: 5,
    colors: ['e37d05', '1d6b99'],
    curveType: 'function'
  });
  print(chart);
});

Diagram interval

Diagram ini memanfaatkan properti 'role' kolom DataTable untuk membuat diagram interval. Diagram ini menghubungkan profil NDVI tahunan dan varian antar-tahunan untuk piksel di dekat Monterey, CA. Median antar-tahun disajikan sebagai garis, sedangkan rentang absolut dan interquartile ditampilkan sebagai band. Kolom tabel yang mewakili setiap interval ditetapkan dengan menetapkan properti kolom 'role' sebagai 'interval'. Band digambar di sekitar garis median dengan menetapkan properti diagram intervals.style sebagai 'area'.

Editor Kode (JavaScript)

// Define a point to extract an NDVI time series for.
var geometry = ee.Geometry.Point([-121.679, 36.479]);

// Define a band of interest (NDVI), import the MODIS vegetation index dataset,
// and select the band.
var band = 'NDVI';
var ndviCol = ee.ImageCollection('MODIS/006/MOD13Q1').select(band);

// Map over the collection to add a day of year (doy) property to each image.
ndviCol = ndviCol.map(function(img) {
  var doy = ee.Date(img.get('system:time_start')).getRelative('day', 'year');
  // Add 8 to day of year number so that the doy label represents the middle of
  // the 16-day MODIS NDVI composite.
  return img.set('doy', ee.Number(doy).add(8));
});

// Join all coincident day of year observations into a set of image collections.
var distinctDOY = ndviCol.filterDate('2013-01-01', '2014-01-01');
var filter = ee.Filter.equals({leftField: 'doy', rightField: 'doy'});
var join = ee.Join.saveAll('doy_matches');
var joinCol = ee.ImageCollection(join.apply(distinctDOY, ndviCol, filter));

// Calculate the absolute range, interquartile range, and median for the set
// of images composing each coincident doy observation group. The result is
// an image collection with an image representative per unique doy observation
// with bands that describe the 0, 25, 50, 75, 100 percentiles for the set of
// coincident doy images.
var comp = ee.ImageCollection(joinCol.map(function(img) {
  var doyCol = ee.ImageCollection.fromImages(img.get('doy_matches'));

  return doyCol
      .reduce(ee.Reducer.percentile(
          [0, 25, 50, 75, 100], ['p0', 'p25', 'p50', 'p75', 'p100']))
      .set({'doy': img.get('doy')});
}));

// Extract the inter-annual NDVI doy percentile statistics for the
// point of interest per unique doy representative. The result is
// is a feature collection where each feature is a doy representative that
// contains a property (row) describing the respective inter-annual NDVI
// variance, formatted as a list of values.
var reductionTable = comp.map(function(img) {
  var stats = ee.Dictionary(img.reduceRegion(
      {reducer: ee.Reducer.first(), geometry: geometry, scale: 250}));

  // Order the percentile reduction elements according to how you want columns
  // in the DataTable arranged (x-axis values need to be first).
  var row = ee.List([
    img.get('doy'),            // x-axis, day of year.
    stats.get(band + '_p50'),  // y-axis, median.
    stats.get(band + '_p0'),   // y-axis, min interval.
    stats.get(band + '_p25'),  // y-axis, 1st quartile interval.
    stats.get(band + '_p75'),  // y-axis, 3rd quartile interval.
    stats.get(band + '_p100')  // y-axis, max interval.
  ]);

  // Return the row as a property of an ee.Feature.
  return ee.Feature(null, {row: row});
});

// Aggregate the 'row' properties to make a server-side 2-D array (DataTable).
var dataTableServer = reductionTable.aggregate_array('row');

// Define column names and properties for the DataTable. The order should
// correspond to the order in the construction of the 'row' property above.
var columnHeader = ee.List([[
  {label: 'Day of year', role: 'domain'},
  {label: 'Median', role: 'data'},
  {label: 'p0', role: 'interval'},
  {label: 'p25', role: 'interval'},
  {label: 'p75', role: 'interval'},
  {label: 'p100', role: 'interval'}
]]);

// Concatenate the column header to the table.
dataTableServer = columnHeader.cat(dataTableServer);

// Use 'evaluate' to transfer the server-side table to the client, define the
// chart and print it to the console.
dataTableServer.evaluate(function(dataTableClient) {
  var chart = ui.Chart(dataTableClient).setChartType('LineChart').setOptions({
    title: 'Annual NDVI Time Series with Inter-Annual Variance',
    intervals: {style: 'area'},
    hAxis: {
      title: 'Day of year',
      titleTextStyle: {italic: false, bold: true},
    },
    vAxis: {title: 'NDVI (x1e4)', titleTextStyle: {italic: false, bold: true}},
    colors: ['0f8755'],
    legend: {position: 'none'}
  });
  print(chart);
});

Ada banyak cara untuk merepresentasikan interval. Dalam contoh berikut, kotak digunakan, bukan band, dengan mengubah properti intervals.style menjadi 'boxes' dengan gaya visual kotak masing-masing.

dataTableServer.evaluate(function(dataTableClient) {
  var chart = ui.Chart(dataTableClient).setChartType('LineChart').setOptions({
    title: 'Annual NDVI Time Series with Inter-Annual Variance',
    intervals: {style: 'boxes', barWidth: 1, boxWidth: 1, lineWidth: 0},
    hAxis: {
      title: 'Day of year',
      titleTextStyle: {italic: false, bold: true},
    },
    vAxis: {title: 'NDVI (x1e4)', titleTextStyle: {italic: false, bold: true}},
    colors: ['0f8755'],
    legend: {position: 'none'}
  });
  print(chart);
});