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); });