ChartDirector 7.0 (ASP/COM/VB Edition)

Multi-Color Gantt Chart




This example demonstrates a multi-color gantt chart with milestone symbols.

The bars in this chart come from a multi-color box-whisker layer created using XYChart.addBoxWhiskerLayer2. The scatter symbols come from scatter layers created using XYChart.addScatterLayer.

In this example, a data series is used to specify the task number of the bars. This allows multiple bars to associated with the same task. The task numbers act as the x coordinates of the bars and are set to the box-whisker layer using Layer.setXData. Another data series is used to specify the colors of the bars. This allows the bars to have different colors.

Source Code Listing

[Web Version (in ASP)] aspdemo\colorgantt.asp
<%@ language="vbscript" %> <% Set cd = CreateObject("ChartDirector.API") ' The tasks for the gantt chart labels = Array("Market Research", "Define Specifications", "Overall Archiecture", _ "Project Planning", "Detail Design", "Software Development", "Test Plan", "Testing and QA", _ "User Documentation") ' The task index, start date, end date and color for each bar taskNo = Array(0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8) startDate = Array(DateSerial(2018, 8, 16), DateSerial(2018, 10, 4), DateSerial(2018, 8, 30), _ DateSerial(2018, 9, 13), DateSerial(2018, 9, 20), DateSerial(2018, 9, 27), DateSerial(2018, _ 10, 4), DateSerial(2018, 10, 4), DateSerial(2018, 10, 25), DateSerial(2018, 11, 1), _ DateSerial(2018, 10, 18), DateSerial(2018, 11, 8)) endDate = Array(DateSerial(2018, 8, 30), DateSerial(2018, 10, 18), DateSerial(2018, 9, 13), _ DateSerial(2018, 9, 27), DateSerial(2018, 10, 4), DateSerial(2018, 10, 11), DateSerial(2018, _ 11, 8), DateSerial(2018, 10, 18), DateSerial(2018, 11, 8), DateSerial(2018, 11, 22), _ DateSerial(2018, 11, 1), DateSerial(2018, 11, 22)) colors = Array(&H00cc00, &H00cc00, &H00cc00, &H0000cc, &H0000cc, &Hcc0000, &Hcc0000, &H0000cc, _ &Hcc0000, &Hcc0000, &H00cc00, &Hcc0000) ' Create a XYChart object of size 620 x 325 pixels. Set background color to light red (0xffcccc), ' with 1 pixel 3D border effect. Set c = cd.XYChart(620, 325, &Hffcccc, &H000000, 1) ' Add a title to the chart using 15 points Times Bold Itatic font, with white (ffffff) text on a ' dark red (800000) background Call c.addTitle("Mutli-Color Gantt Chart Demo", "Times New Roman Bold Italic", 15, &Hffffff _ ).setBackground(&H800000) ' Set the plotarea at (140, 55) and of size 460 x 200 pixels. Use alternative white/grey background. ' Enable both horizontal and vertical grids by setting their colors to grey (c0c0c0). Set vertical ' major grid (represents month boundaries) 2 pixels in width Call c.setPlotArea(140, 55, 460, 200, &Hffffff, &Heeeeee, cd.LineColor, &Hc0c0c0, &Hc0c0c0 _ ).setGridWidth(2, 1, 1, 1) ' swap the x and y axes to create a horziontal box-whisker chart Call c.swapXY() ' Set the y-axis scale to be date scale from Aug 16, 2018 to Nov 22, 2018, with ticks every 7 days ' (1 week) Call c.yAxis().setDateScale(DateSerial(2018, 8, 16), DateSerial(2018, 11, 22), 86400 * 7) ' Set multi-style axis label formatting. Month labels are in Arial Bold font in "mmm d" format. ' Weekly labels just show the day of month and use minor tick (by using '-' as first character of ' format string). Call c.yAxis().setMultiFormat(cd.StartOfMonthFilter(), "<*font=Arial Bold*>{value|mmm d}", _ cd.StartOfDayFilter(), "-{value|d}") ' Set the y-axis to shown on the top (right + swapXY = top) Call c.setYAxisOnRight() ' Set the labels on the x axis Call c.xAxis().setLabels(labels) ' Reverse the x-axis scale so that it points downwards. Call c.xAxis().setReverse() ' Set the horizontal ticks and grid lines to be between the bars Call c.xAxis().setTickOffset(0.5) ' Add some symbols to the chart to represent milestones. The symbols are added using scatter layers. ' We need to specify the task index, date, name, symbol shape, size and color. Call c.addScatterLayer(Array(1), Array(DateSerial(2018, 9, 13)), "Milestone 1", cd.Cross2Shape(), _ 13, &Hffff00).setHTMLImageMap("{disable}") Call c.addScatterLayer(Array(3), Array(DateSerial(2018, 10, 4)), "Milestone 2", cd.StarShape(5), _ 15, &Hff00ff).setHTMLImageMap("{disable}") Call c.addScatterLayer(Array(5), Array(DateSerial(2018, 11, 8)), "Milestone 3", cd.TriangleSymbol, _ 13, &Hff9933).setHTMLImageMap("{disable}") ' Add a multi-color box-whisker layer to represent the gantt bars Set layer = c.addBoxWhiskerLayer2(startDate, endDate, Empty, Empty, Empty, colors) Call layer.setXData(taskNo) Call layer.setBorderColor(cd.SameAsMainColor) ' Divide the plot area height ( = 200 in this chart) by the number of tasks to get the height of ' each slot. Use 80% of that as the bar height. Call layer.setDataWidth(Int(200 * 0.8 / (UBound(labels) + 1))) ' Add a legend box at (140, 265) - bottom of the plot area. Use 8pt Arial Bold as the font with ' auto-grid layout. Set the width to the same width as the plot area. Set the backgorund to grey ' (dddddd). Set legendBox = c.addLegend2(140, 265, cd.AutoGrid, "Arial Bold", 8) Call legendBox.setWidth(461) Call legendBox.setBackground(&Hdddddd) ' The keys for the scatter layers (milestone symbols) will automatically be added to the legend box. ' We just need to add keys to show the meanings of the bar colors. Call legendBox.addKey("Market Team", &H00cc00) Call legendBox.addKey("Planning Team", &H0000cc) Call legendBox.addKey("Development Team", &Hcc0000) ' Output the chart Set viewer = cd.WebChartViewer(Request, "chart1") Call viewer.setChart(c, cd.SVG) ' Include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("", "", _ "title='{xLabel}: {top|mmm dd, yyyy} to {bottom|mmm dd, yyyy}'") %> <!DOCTYPE html> <html> <head> <title>Multi-Color Gantt Chart</title> <!-- Include ChartDirector Javascript Library to support chart interactions --> <script type="text/javascript" src="cdjcv.js"></script> </head> <body style="margin:5px 0px 0px 5px"> <div style="font:bold 18pt verdana;"> Multi-Color Gantt Chart </div> <hr style="border:solid 1px #000080; background:#000080" /> <div style="font:10pt verdana; margin-bottom:1.5em"> <a href="viewsource.asp?file=<%= Request("SCRIPT_NAME") %>">View Chart Source Code</a> </div> <!-- ****** Here is the chart image ****** --> <%= viewer.renderHTML() %> </body> </html>

[Windows Version (in Visual Basic)] vbdemo\colorgantt.cls
Public Sub createChart(viewer As Object, chartIndex As Integer) Dim cd As New ChartDirector.API ' The tasks for the gantt chart Dim labels() labels = Array("Market Research", "Define Specifications", "Overall Archiecture", _ "Project Planning", "Detail Design", "Software Development", "Test Plan", _ "Testing and QA", "User Documentation") ' The task index, start date, end date and color for each bar Dim taskNo() taskNo = Array(0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8) Dim startDate() startDate = Array(DateSerial(2004, 8, 16), DateSerial(2004, 10, 4), DateSerial(2004, 8, 30), _ DateSerial(2004, 9, 13), DateSerial(2004, 9, 20), DateSerial(2004, 9, 27), DateSerial( _ 2004, 10, 4), DateSerial(2004, 10, 4), DateSerial(2004, 10, 25), DateSerial(2004, 11, 1), _ DateSerial(2004, 10, 18), DateSerial(2004, 11, 8)) Dim endDate() endDate = Array(DateSerial(2004, 8, 30), DateSerial(2004, 10, 18), DateSerial(2004, 9, 13), _ DateSerial(2004, 9, 27), DateSerial(2004, 10, 4), DateSerial(2004, 10, 11), DateSerial( _ 2004, 11, 8), DateSerial(2004, 10, 18), DateSerial(2004, 11, 8), DateSerial(2004, 11, 22), _ DateSerial(2004, 11, 1), DateSerial(2004, 11, 22)) Dim colors() colors = Array(&H00cc00, &H00cc00, &H00cc00, &H0000cc, &H0000cc, &Hcc0000, &Hcc0000, &H0000cc, _ &Hcc0000, &Hcc0000, &H00cc00, &Hcc0000) ' Create a XYChart object of size 620 x 325 pixels. Set background color to light red ' (0xffcccc), with 1 pixel 3D border effect. Dim c As XYChart Set c = cd.XYChart(620, 325, &Hffcccc, &H000000, 1) ' Add a title to the chart using 15 points Times Bold Itatic font, with white (ffffff) text on a ' dark red (800000) background Call c.addTitle("Mutli-Color Gantt Chart Demo", "timesbi.ttf", 15, &Hffffff).setBackground( _ &H800000) ' Set the plotarea at (140, 55) and of size 460 x 200 pixels. Use alternative white/grey ' background. Enable both horizontal and vertical grids by setting their colors to grey ' (c0c0c0). Set vertical major grid (represents month boundaries) 2 pixels in width Call c.setPlotArea(140, 55, 460, 200, &Hffffff, &Heeeeee, cd.LineColor, &Hc0c0c0, &Hc0c0c0 _ ).setGridWidth(2, 1, 1, 1) ' swap the x and y axes to create a horziontal box-whisker chart Call c.swapXY() ' Set the y-axis scale to be date scale from Aug 16, 2004 to Nov 22, 2004, with ticks every 7 ' days (1 week) Call c.yAxis().setDateScale(DateSerial(2004, 8, 16), DateSerial(2004, 11, 22), 86400 * 7) ' Set multi-style axis label formatting. Month labels are in Arial Bold font in "mmm d" format. ' Weekly labels just show the day of month and use minor tick (by using '-' as first character ' of format string). Call c.yAxis().setMultiFormat(cd.StartOfMonthFilter(), "<*font=arialbd.ttf*>{value|mmm d}", _ cd.StartOfDayFilter(), "-{value|d}") ' Set the y-axis to shown on the top (right + swapXY = top) Call c.setYAxisOnRight() ' Set the labels on the x axis Call c.xAxis().setLabels(labels) ' Reverse the x-axis scale so that it points downwards. Call c.xAxis().setReverse() ' Set the horizontal ticks and grid lines to be between the bars Call c.xAxis().setTickOffset(0.5) ' Add some symbols to the chart to represent milestones. The symbols are added using scatter ' layers. We need to specify the task index, date, name, symbol shape, size and color. Call c.addScatterLayer(Array(1), Array(DateSerial(2004, 9, 13)), "Milestone 1", _ cd.Cross2Shape(), 13, &Hffff00).setHTMLImageMap("{disable}") Call c.addScatterLayer(Array(3), Array(DateSerial(2004, 10, 4)), "Milestone 2", cd.StarShape(5 _ ), 15, &Hff00ff).setHTMLImageMap("{disable}") Call c.addScatterLayer(Array(5), Array(DateSerial(2004, 11, 8)), "Milestone 3", _ cd.TriangleSymbol, 13, &Hff9933).setHTMLImageMap("{disable}") ' Add a multi-color box-whisker layer to represent the gantt bars Dim layer As BoxWhiskerLayer Set layer = c.addBoxWhiskerLayer2(startDate, endDate, Empty, Empty, Empty, colors) Call layer.setXData(taskNo) Call layer.setBorderColor(cd.SameAsMainColor) ' Divide the plot area height ( = 200 in this chart) by the number of tasks to get the height of ' each slot. Use 80% of that as the bar height. Call layer.setDataWidth(Int(200 * 4 / 5 / (UBound(labels) + 1))) ' Add a legend box at (140, 265) - bottom of the plot area. Use 8pt Arial Bold as the font with ' auto-grid layout. Set the width to the same width as the plot area. Set the backgorund to grey ' (dddddd). Dim legendBox As LegendBox Set legendBox = c.addLegend2(140, 265, cd.AutoGrid, "arialbd.ttf", 8) Call legendBox.setWidth(461) Call legendBox.setBackground(&Hdddddd) ' The keys for the scatter layers (milestone symbols) will automatically be added to the legend ' box. We just need to add keys to show the meanings of the bar colors. Call legendBox.addKey("Market Team", &H00cc00) Call legendBox.addKey("Planning Team", &H0000cc) Call legendBox.addKey("Development Team", &Hcc0000) ' Output the chart Set viewer.Picture = c.makePicture() 'include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", _ "title='{xLabel}: {top|mmm dd, yyyy} to {bottom|mmm dd, yyyy}'") End Sub