Omówienie
Wykres Gantta to typ wykresu ilustrujący podział projektu na zadania składowe. Wykresy Google Gantta ilustrują początek, koniec i czas trwania zadań w projekcie, a także wszelkie zależności, jakie może ono mieć. Wykresy Google Gantta są renderowane w przeglądarce za pomocą SVG. Podobnie jak wszystkie wykresy Google, wykresy Gantta wyświetlają etykietki, gdy użytkownik najedzie na dane.
Uwaga: Wykresy Gantta nie będą działać w starszych wersjach Internet Explorera. (IE8 i starsze wersje nie obsługują SVG, co wymaga wykresów Gantta).
Prosty przykład
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['gantt']});
google.charts.setOnLoadCallback(drawChart);
function daysToMilliseconds(days) {
return days * 24 * 60 * 60 * 1000;
}
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Task ID');
data.addColumn('string', 'Task Name');
data.addColumn('date', 'Start Date');
data.addColumn('date', 'End Date');
data.addColumn('number', 'Duration');
data.addColumn('number', 'Percent Complete');
data.addColumn('string', 'Dependencies');
data.addRows([
['Research', 'Find sources',
new Date(2015, 0, 1), new Date(2015, 0, 5), null, 100, null],
['Write', 'Write paper',
null, new Date(2015, 0, 9), daysToMilliseconds(3), 25, 'Research,Outline'],
['Cite', 'Create bibliography',
null, new Date(2015, 0, 7), daysToMilliseconds(1), 20, 'Research'],
['Complete', 'Hand in paper',
null, new Date(2015, 0, 10), daysToMilliseconds(1), 0, 'Cite,Write'],
['Outline', 'Outline paper',
null, new Date(2015, 0, 6), daysToMilliseconds(1), 100, 'Research']
]);
var options = {
height: 275
};
var chart = new google.visualization.Gantt(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
Brak zależności
Aby utworzyć wykres Gantta bez zależności, upewnij się, że ostatnia wartość każdego wiersza w tabeli danych jest ustawiona na null
.
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['gantt']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Task ID');
data.addColumn('string', 'Task Name');
data.addColumn('string', 'Resource');
data.addColumn('date', 'Start Date');
data.addColumn('date', 'End Date');
data.addColumn('number', 'Duration');
data.addColumn('number', 'Percent Complete');
data.addColumn('string', 'Dependencies');
data.addRows([
['2014Spring', 'Spring 2014', 'spring',
new Date(2014, 2, 22), new Date(2014, 5, 20), null, 100, null],
['2014Summer', 'Summer 2014', 'summer',
new Date(2014, 5, 21), new Date(2014, 8, 20), null, 100, null],
['2014Autumn', 'Autumn 2014', 'autumn',
new Date(2014, 8, 21), new Date(2014, 11, 20), null, 100, null],
['2014Winter', 'Winter 2014', 'winter',
new Date(2014, 11, 21), new Date(2015, 2, 21), null, 100, null],
['2015Spring', 'Spring 2015', 'spring',
new Date(2015, 2, 22), new Date(2015, 5, 20), null, 50, null],
['2015Summer', 'Summer 2015', 'summer',
new Date(2015, 5, 21), new Date(2015, 8, 20), null, 0, null],
['2015Autumn', 'Autumn 2015', 'autumn',
new Date(2015, 8, 21), new Date(2015, 11, 20), null, 0, null],
['2015Winter', 'Winter 2015', 'winter',
new Date(2015, 11, 21), new Date(2016, 2, 21), null, 0, null],
['Football', 'Football Season', 'sports',
new Date(2014, 8, 4), new Date(2015, 1, 1), null, 100, null],
['Baseball', 'Baseball Season', 'sports',
new Date(2015, 2, 31), new Date(2015, 9, 20), null, 14, null],
['Basketball', 'Basketball Season', 'sports',
new Date(2014, 9, 28), new Date(2015, 5, 20), null, 86, null],
['Hockey', 'Hockey Season', 'sports',
new Date(2014, 9, 8), new Date(2015, 5, 21), null, 89, null]
]);
var options = {
height: 400,
gantt: {
trackHeight: 30
}
};
var chart = new google.visualization.Gantt(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
Grupowanie zasobów
Zadania o podobnym charakterze można grupować za pomocą zasobów. Dodaj do danych kolumnę typu string
(po kolumnach Task ID
i Task Name
) i sprawdź, czy wszystkie zadania, które mają zostać zgrupowane w zasób, mają ten sam identyfikator zasobu. Zasoby zostaną pogrupowane według koloru.
<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['gantt']});
google.charts.setOnLoadCallback(drawChart);
function daysToMilliseconds(days) {
return days * 24 * 60 * 60 * 1000;
}
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Task ID');
data.addColumn('string', 'Task Name');
data.addColumn('string', 'Resource');
data.addColumn('date', 'Start Date');
data.addColumn('date', 'End Date');
data.addColumn('number', 'Duration');
data.addColumn('number', 'Percent Complete');
data.addColumn('string', 'Dependencies');
data.addRows([
['Research', 'Find sources', null,
new Date(2015, 0, 1), new Date(2015, 0, 5), null, 100, null],
['Write', 'Write paper', 'write',
null, new Date(2015, 0, 9), daysToMilliseconds(3), 25, 'Research,Outline'],
['Cite', 'Create bibliography', 'write',
null, new Date(2015, 0, 7), daysToMilliseconds(1), 20, 'Research'],
['Complete', 'Hand in paper', 'complete',
null, new Date(2015, 0, 10), daysToMilliseconds(1), 0, 'Cite,Write'],
['Outline', 'Outline paper', 'write',
null, new Date(2015, 0, 6), daysToMilliseconds(1), 100, 'Research']
]);
var options = {
height: 275
};
var chart = new google.visualization.Gantt(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
Obliczanie rozpoczęcia/zakończenia/czasu trwania
Wykresy Gantta przyjmują 3 wartości związane z czasem trwania zadania: datę rozpoczęcia, datę zakończenia i czas trwania (w milisekundach). Jeśli na przykład nie ma daty rozpoczęcia, wykres może obliczyć brakujący czas na podstawie daty zakończenia i czasu trwania. To samo dotyczy obliczania daty zakończenia. Jeśli podasz zarówno datę rozpoczęcia, jak i datę zakończenia, czas trwania można obliczyć między tymi datami.
W tabeli poniżej znajdziesz listę tego, jak Gant postępuje w przypadku obecności początku, końca i czasu trwania w różnych okolicznościach.
Uruchom | Zakończ | Czas trwania | Wyniki |
---|---|---|---|
Wyświetl prezentację | Wyświetl prezentację | Wyświetl prezentację | Sprawdź, czy czas trwania jest zgodny z godziną rozpoczęcia i zakończenia. W przypadku niespójności zwraca błąd. |
Wyświetl prezentację | Wyświetl prezentację | Null | Oblicza czas trwania od godziny rozpoczęcia i zakończenia. |
Wyświetl prezentację | Null | Wyświetl prezentację | Oblicza czas zakończenia. |
Wyświetl prezentację | Null | Null | Zgłasza błąd polegający na tym, że nie można obliczyć czasu trwania lub czasu zakończenia. |
Null | Wyświetl prezentację | Wyświetl prezentację | Oblicza czas rozpoczęcia. |
Null | Null | Wyświetl prezentację |
Oblicza czas rozpoczęcia na podstawie zależności. W połączeniu z właściwością defaultStartDate umożliwia rysowanie wykresu tylko przy użyciu czasów trwania.
|
Null | Wyświetl prezentację | Null | Zgłasza błąd polegający na tym, że nie można obliczyć czasu rozpoczęcia lub czasu trwania. |
Null | Null | Null | Zgłasza błąd polegający na tym, że nie można obliczyć czasu rozpoczęcia, zakończenia lub czasu trwania. |
Mając to na uwadze, możesz utworzyć wykres przedstawiający typową trasę do pracy, wykorzystując tylko czas trwania każdego zadania.
<html>
<head>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
google.charts.load("current", { packages: ["gantt"] });
google.charts.setOnLoadCallback(drawChart);
function toMilliseconds(minutes) {
return minutes * 60 * 1000;
}
function drawChart() {
var otherData = new google.visualization.DataTable();
otherData.addColumn("string", "Task ID");
otherData.addColumn("string", "Task Name");
otherData.addColumn("string", "Resource");
otherData.addColumn("date", "Start");
otherData.addColumn("date", "End");
otherData.addColumn("number", "Duration");
otherData.addColumn("number", "Percent Complete");
otherData.addColumn("string", "Dependencies");
otherData.addRows([
[
"toTrain",
"Walk to train stop",
"walk",
null,
null,
toMilliseconds(5),
100,
null,
],
[
"music",
"Listen to music",
"music",
null,
null,
toMilliseconds(70),
100,
null,
],
[
"wait",
"Wait for train",
"wait",
null,
null,
toMilliseconds(10),
100,
"toTrain",
],
[
"train",
"Train ride",
"train",
null,
null,
toMilliseconds(45),
75,
"wait",
],
[
"toWork",
"Walk to work",
"walk",
null,
null,
toMilliseconds(10),
0,
"train",
],
[
"work",
"Sit down at desk",
null,
null,
null,
toMilliseconds(2),
0,
"toWork",
],
]);
var options = {
height: 275,
gantt: {
defaultStartDate: new Date(2015, 3, 28),
},
};
var chart = new google.visualization.Gantt(
document.getElementById("chart_div")
);
chart.draw(otherData, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
Ścieżka krytyczna
Ścieżka krytyczna na wykresie Gantta to ścieżki, które bezpośrednio wpływają na datę zakończenia. Ścieżka krytyczna na wykresach Google Gantta jest domyślnie w kolorze czerwonym. Można ją dostosować za pomocą opcji criticalPathStyle
. Ścieżkę krytyczną możesz też wyłączyć, ustawiając criticalPathEnabled
na false
.
var options = {
height: 275,
gantt: {
criticalPathEnabled: true,
criticalPathStyle: {
stroke: '#e64a19',
strokeWidth: 5
}
}
};
Strzałki określające style
Możesz zmienić styl strzałek zależności między zadaniami za pomocą opcji gantt.arrow
:
var options = {
height: 275,
gantt: {
criticalPathEnabled: false, // Critical path arrows will be the same as other arrows.
arrow: {
angle: 100,
width: 5,
color: 'green',
radius: 0
}
}
};
Stylizacja ścieżek
Style siatki są obsługiwane za pomocą kombinacji atrybutów innerGridHorizLine
, innerGridTrack
i innerGridDarkTrack
. Gdy ustawisz tylko
innerGridTrack
, na wykresie obliczymy ciemniejszy kolor dla
danych innerGridDarkTrack
. Jeśli ustawisz tylko
kolor innerGridDarkTrack
, innerGridTrack
użyje koloru domyślnego i nie obliczy koloru jaśniejszego.
var options = {
height: 275,
gantt: {
criticalPathEnabled: false,
innerGridHorizLine: {
stroke: '#ffe0b2',
strokeWidth: 2
},
innerGridTrack: {fill: '#fff3e0'},
innerGridDarkTrack: {fill: '#ffcc80'}
}
};
Wczytuję
Nazwa pakietu google.charts.load
to "gantt"
.
google.charts.load("current", {packages: ["gantt"]});
Nazwa klasy wizualizacji to google.visualization.Gantt
.
var chart = new google.visualization.Gantt(container);
Format danych
Wiersze: każdy wiersz tabeli odpowiada zadaniu.
Kolumny:
Kolumna 0 | Kolumna 1 | Kolumna 2 | Kolumna 3 | Kolumna 4 | Kolumna 5 | Kolumna 6 | Kolumna 7 | |
---|---|---|---|---|---|---|---|---|
Przeznaczenie: | Identyfikator zadania | Nazwa zadania | Identyfikator zasobu (opcjonalnie) | Uruchom | Zakończ | Czas trwania (w milisekundach) | Procent ukończenia | Zależności |
Typ danych: | string, | string, | string, | date | date | Liczba | Liczba | string, |
Rola: | domena | dane | dane | dane | dane | dane | dane | dane |
Opcje konfiguracji
Nazwa | Typ | Domyślne | Opis |
---|---|---|---|
backgroundColor.fill | string, | 'biały' | Kolor wypełnienia wykresu jako ciąg znaków HTML koloru. |
gantt.arrow | obiekt | brak |
W przypadku wykresów Gantta zasada gantt.arrow kontroluje różne właściwości strzałek łączących zadania.
|
gantt.arrow.angle | Liczba | 45 | Kąt łebka strzałki. |
gantt.arrow.color | string, | „#000” | Kolor strzałek. |
gantt.arrow.length | Liczba | 8 | Długość grotu strzałki. |
gantt.arrow.radius | Liczba | 15 | Promień definiowania krzywej strzałki między 2 zadaniami. |
gantt.arrow.spaceAfter | Liczba | 4 | Odstęp między głowicą strzałki a zadaniem, do którego ma ona służyć. |
gantt.arrow.width | Liczba | 1.4 | Szerokość strzałek. |
gantt.barCornerRadius | Liczba | 2 | Promień służący do definiowania krzywej narożników słupka. |
gantt.barHeight | Liczba | brak | Wysokość słupków zadań. |
gantt.criticalPathEnabled | boolean | prawda |
Jeśli true , którekolwiek strzałki na ścieżce krytycznej będą miały inny styl.
|
gantt.criticalPathStyle | obiekt | brak | Obiekt zawierający styl dla wszystkich strzałek ścieżki krytycznej. |
gantt.criticalPathStyle.stroke | string, | brak | Kolor dowolnych strzałek ścieżki krytycznej. |
gantt.criticalPathStyle.strokeWidth | Liczba | 1.4 | Grubość wszystkich strzałek krytycznej ścieżki. |
gantt.defaultStartDate | data/numer | brak |
Jeśli nie można obliczyć daty rozpoczęcia na podstawie wartości w tabeli DataTable, zostanie ona ustawiona na taką datę. Akceptuje wartość date (new Date(YYYY, M, D) ) lub liczbę, która jest używana w milisekundach.
|
gantt.innerGridHorizLine | obiekt | brak | Określa styl wewnętrznych poziomych linii siatki. |
gantt.innerGridHorizLine.stroke | string, | brak | Kolor wewnętrznych poziomych linii siatki. |
gantt.innerGridHorizLine.strokeWidth | Liczba | 1 | Szerokość wewnętrznych poziomych linii siatki. |
gantt.innerGridTrack.fill | string, | brak |
Kolor wypełnienia wewnętrznej ścieżki siatki. Jeśli nie określisz elementu innerGridDarkTrack.fill , zostanie on zastosowany do każdej ścieżki siatki.
|
gantt.innerGridDarkTrack.fill | string, | brak | Kolor wypełnienia innej, ciemnej wewnętrznej ścieżki siatki. |
gantt.labelMaxWidth | Liczba | 300 | Maksymalna ilość miejsca na każdą etykietę zadania. |
gantt.labelStyle | obiekt | brak |
Obiekt zawierający style etykiet zadań. labelStyle: { fontName: Roboto2, fontSize: 14, color: '#757575' }, |
gantt.percentEnabled | boolean | prawda | Wypełnia pasek aplikacji na podstawie odsetka ukończenia zadania. |
gantt.percentStyle.fill | string, | brak | Kolor odsetka ukończonych elementów na pasku zadań. |
gantt.shadowEnabled | boolean | prawda |
Jeśli zasada ma wartość true , pod każdym paskiem zadań, który zawiera zależności, rysuje cień.
|
gantt.shadowColor | string, | „#000” | Określa kolor cieni pod dowolnym paskiem zadań, w przypadku którego występują zależności. |
gantt.shadowOffset | Liczba | 1 | Określa odsunięcie cieni pod paskiem zadań, w przypadku którego występują zależności, w pikselach. |
gantt.sortTasks | boolean | prawda | Określa, że zadania powinny być sortowane topologicznie (jeśli jest prawda). W przeciwnym razie używana jest ta sama kolejność co w odpowiednich wierszach tabeli DataTable. |
gantt.trackHeight | Liczba | brak | Wysokość torów. |
szerokość | Liczba | szerokość elementu | Szerokość wykresu w pikselach. |
wysokość | Liczba | wysokość elementu, | wysokość wykresu w pikselach. |
Metody
Metoda | Opis |
---|---|
draw(data, options) |
Rysuje wykres. Wykres akceptuje kolejne wywołania metod dopiero po wywołaniu zdarzenia Return Type: brak
|
getSelection() |
Zwraca tablicę wybranych elementów wykresu.
Elementy, które można wybrać, to paski, wpisy z legendy i kategorie.
Na tym wykresie w danym momencie można wybrać tylko 1 element.
Return Type: tablica elementów zaznaczenia.
|
setSelection() |
Wybiera określone elementy wykresu. Anuluje wcześniejszy wybór.
Elementy, które można wybrać, to paski, wpisy z legendy i kategorie.
Na tym wykresie można wybrać tylko 1 element naraz.
Return Type: brak
|
clearChart() |
Czyści wykres i zwalnia wszystkie przydzielone Ci zasoby. Return Type: brak
|
Zdarzenia
Zdarzenie | Opis |
---|---|
click |
Uruchamiane, gdy użytkownik kliknie wykres. Pozwala określić, kiedy klikane są tytuł, elementy danych, wpisy legendy, osie, linie siatki lub etykiety. Właściwości: targetID
|
error |
Uruchamiane, gdy podczas próby wyrenderowania wykresu wystąpi błąd. Właściwości: identyfikator, komunikat
|
ready |
Wykres jest gotowy do obsługi wywołań metod zewnętrznych. Jeśli chcesz korzystać z wykresu i metod wywołań po jego narysowaniu, skonfiguruj detektor tego zdarzenia przed wywołaniem metody Właściwości: brak
|
select |
Uruchamiane, gdy użytkownik kliknie element wizualny. Aby dowiedzieć się, co zostało wybrane, zadzwoń pod numer Właściwości: brak
|
Zasady dotyczące danych
Cały kod i dane są przetwarzane i renderowane w przeglądarce. Żadne dane nie są wysyłane na żaden serwer.