ChartDirector缺失數據點的表現方法

這個例子演示了各種方法來表現缺失的數據點,這也表明在繪圖區的ChartDirector會自動調整大小以適合圖表。如下圖所示:

141122893.jpg

在ChartDirector中,一系列的數據可能會存在丟失的情況,多使用NoValue來預定義常量。在一個線層裏,在默認的情況下面,缺失值表示在該行的差距。換句話說,就是該線路將被打斷。LineLayer.setGapColor被用來配置的線層加入通過NoValue點,使用的線段可以是具有不同的顏色或風格。

這個例子中,三個數據系列都包含NoValue點。紅線表示了使用差距的默認行爲來表現NoValue點。綠線演示瞭如何使用虛線加入通過NoValue點。橙色線表明使用具有相同的線條樣式來參加正常的數據點加入通過NoValue點。

在整個圖表配置完成之後呢,XYChart.packPlotArea方法將會被用來適應在給定的邊界框力的小區面積和軸。

所使用的源代碼如下:

[ASP.NET - VB Version]


<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="ChartDirector" %>
<%@ Register TagPrefix="chart" Namespace="ChartDirector" Assembly="netchartdir" %>
<script runat="server">
               
'
' Page Load event handler
'
Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
               
    ' The data for the chart
    Dim data0() As Double = {42, 49, Chart.NoValue, 38, 64, 56, 29, 41, 44, 57}
    Dim data1() As Double = {65, 75, 47, 34, 42, 49, 73, Chart.NoValue, 90, 69, 66, _
        78}
    Dim data2() As Double = {Chart.NoValue, Chart.NoValue, 25, 28, 38, 20, 22, _
        Chart.NoValue, 25, 33, 30, 24}
    Dim labels() As String = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", _
        "Aug", "Sep", "Oct", "Nov", "Dec"}
               
    ' Create a XYChart object of size 600 x 360 pixels. Set background color to
    ' brushed silver, with a 2 pixel 3D border. Use rounded corners.
    Dim c As XYChart = New XYChart(600, 360, Chart.brushedSilverColor(), _
        Chart.Transparent, 2)
    c.setRoundedFrame()
               
    ' Add a title using 18 pts Times New Roman Bold Italic font. #Set top/bottom
    ' margins to 6 pixels.
    Dim title As ChartDirector.TextBox = c.addTitle("Product Line Global Revenue", _
        "Times New Roman Bold Italic", 18)
    title.setMargin2(0, 0, 6, 6)
               
    ' Add a separator line just under the title
    c.addLine(10, title.getHeight(), c.getWidth() - 11, title.getHeight(), _
        Chart.LineColor)
               
    ' Add a legend box where the top-center is anchored to the horizontal center of
    ' the chart, just under the title. Use horizontal layout and 10 points Arial Bold
    ' font, and transparent background and border.
    Dim legendBox As LegendBox = c.addLegend(c.getWidth() / 2, title.getHeight(), _
        False, "Arial Bold", 10)
    legendBox.setAlignment(Chart.TopCenter)
    legendBox.setChart.Transparent,  Chart.Transparent)
               
    ' Tentatively set the plotarea at (70, 75) and of 460 x 240 pixels in size. Use
    ' transparent border and black (000000) grid lines
    c.setPlotArea(70, 75, 460, 240, -1, -1, Chart.Transparent, &H000000, -1)
               
    ' Set the x axis labels
    c.xAxis().setLabels(labels)
               
    ' Show the same scale on the left and right y-axes
    c.syncYAxis()
               
    ' Set y-axis tick density to 30 pixels. ChartDirector auto-scaling will use this
    ' as the guideline when putting ticks on the y-axis.
    c.yAxis().setTickDensity(30)
               
    ' Set all axes to transparent
    c.xAxis().setColors(Chart.Transparent)
    c.yAxis().setColors(Chart.Transparent)
    c.yAxis2().setColors(Chart.Transparent)
               
    ' Set the x-axis margins to 15 pixels, so that the horizontal grid lines can
    ' extend beyond the leftmost and rightmost vertical grid lines
    c.xAxis().setMargin(15, 15)
               
    ' Set axis label style to 8pts Arial Bold
    c.xAxis().setLabelStyle("Arial Bold", 8)
    c.yAxis().setLabelStyle("Arial Bold", 8)
    c.yAxis2().setLabelStyle("Arial Bold", 8)
               
    ' Add axis title using 10pts Arial Bold Italic font
    c.yAxis().setTitle("Revenue in USD millions", "Arial Bold Italic", 10)
    c.yAxis2().setTitle("Revenue in USD millions", "Arial Bold Italic", 10)
               
    ' Add the first line. The missing data will be represented as gaps in the line
    ' (the default behaviour)
    Dim layer0 As LineLayer = c.addLineLayer2()
    layer0.addDataSet(data0, &Hff0000, "Quantum Computer").setDataSymbol( _
        Chart.GlassSphere2Shape, 11)
    layer0.setLineWidth(3)
               
    ' Add the second line. The missing data will be represented by using dash lines
    ' to bridge the gap
    Dim layer1 As LineLayer = c.addLineLayer2()
    layer1.addDataSet(data1, &H00ff00, "Atom Synthesizer").setDataSymbol( _
        Chart.GlassSphere2Shape, 11)
    layer1.setLineWidth(3)
    layer1.setGapColor(c.dashLineColor(&H00ff00))
               
    ' Add the third line. The missing data will be ignored - just join the gap with
    ' the original line style.
    Dim layer2 As LineLayer = c.addLineLayer2()
    layer2.addDataSet(data2, &Hff6600, "Proton Cannon").setDataSymbol( _
        Chart.GlassSphere2Shape, 11)
    layer2.setLineWidth(3)
    layer2.setGapColor(Chart.SameAsMainColor)
               
    ' layout the legend so we can get the height of the legend box
    c.layoutLegend()
               
    ' Adjust the plot area size, such that the bounding box (inclusive of axes) is 15
    ' pixels from the left edge, just under the legend box, 16 pixels from the right
    ' edge, and 25 pixels from the bottom edge.
    c.packPlotArea(15, legendBox.getTopY() + legendBox.getHeight(), c.getWidth() - _
        16, c.getHeight() - 25)
               
    ' Output the chart
    WebChartViewer1.Image = c.makeWebImage(Chart.JPG)
               
    ' Include tool tip for the chart
    WebChartViewer1.ImageMap = c.getHTMLImageMap("", "", _
        "title='Revenue of {dataSetName} in {xLabel}: US$ {value}M'")
               
End Sub
               
</script>
<html>
<body>
    <chart:WebChartViewer id="WebChartViewer1" runat="server" />
</body>
</html>

[ASP.NET - C# Version]

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="ChartDirector" %>
<%@ Register TagPrefix="chart" Namespace="ChartDirector" Assembly="netchartdir" %>
<script runat="server">
     
//
// Page Load event handler
//
protected void Page_Load(object sender, EventArgs e)
{
    // The data for the chart
    double[] data0 = {42, 49, Chart.NoValue, 38, 64, 56, 29, 41, 44, 57};
    double[] data1 = {65, 75, 47, 34, 42, 49, 73, Chart.NoValue, 90, 69, 66, 78};
    double[] data2 = {Chart.NoValue, Chart.NoValue, 25, 28, 38, 20, 22,
        Chart.NoValue, 25, 33, 30, 24};
    string[] labels = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
        "Oct", "Nov", "Dec"};
     
    // Create a XYChart object of size 600 x 360 pixels. Set background color to
    // brushed silver, with a 2 pixel 3D border. Use rounded corners.
    XYChart c = new XYChart(600, 360, Chart.brushedSilverColor(), Chart.Transparent,
        2);
    c.setRoundedFrame();
     
    // Add a title using 18 pts Times New Roman Bold Italic font. #Set top/bottom
    // margins to 6 pixels.
    ChartDirector.TextBox title = c.addTitle("Product Line Global Revenue",
        "Times New Roman Bold Italic", 18);
    title.setMargin2(0, 0, 6, 6);
     
    // Add a separator line just under the title
    c.addLine(10, title.getHeight(), c.getWidth() - 11, title.getHeight(),
        Chart.LineColor);
     
    // Add a legend box where the top-center is anchored to the horizontal center of
    // the chart, just under the title. Use horizontal layout and 10 points Arial
    // Bold font, and transparent background and border.
    LegendBox legendBox = c.addLegend(c.getWidth() / 2, title.getHeight(), false,
        "Arial Bold", 10);
    legendBox.setAlignment(Chart.TopCenter);
    legendBox.setChart.Transparent,  Chart.Transparent);
     
    // Tentatively set the plotarea at (70, 75) and of 460 x 240 pixels in size. Use
    // transparent border and black (000000) grid lines
    c.setPlotArea(70, 75, 460, 240, -1, -1, Chart.Transparent, 0x000000, -1);
     
    // Set the x axis labels
    c.xAxis().setLabels(labels);
     
    // Show the same scale on the left and right y-axes
    c.syncYAxis();
     
    // Set y-axis tick density to 30 pixels. ChartDirector auto-scaling will use this
    // as the guideline when putting ticks on the y-axis.
    c.yAxis().setTickDensity(30);
     
    // Set all axes to transparent
    c.xAxis().setColors(Chart.Transparent);
    c.yAxis().setColors(Chart.Transparent);
    c.yAxis2().setColors(Chart.Transparent);
     
    // Set the x-axis margins to 15 pixels, so that the horizontal grid lines can
    // extend beyond the leftmost and rightmost vertical grid lines
    c.xAxis().setMargin(15, 15);
     
    // Set axis label style to 8pts Arial Bold
    c.xAxis().setLabelStyle("Arial Bold", 8);
    c.yAxis().setLabelStyle("Arial Bold", 8);
    c.yAxis2().setLabelStyle("Arial Bold", 8);
     
    // Add axis title using 10pts Arial Bold Italic font
    c.yAxis().setTitle("Revenue in USD millions", "Arial Bold Italic", 10);
    c.yAxis2().setTitle("Revenue in USD millions", "Arial Bold Italic", 10);
     
    // Add the first line. The missing data will be represented as gaps in the line
    // (the default behaviour)
    LineLayer layer0 = c.addLineLayer2();
    layer0.addDataSet(data0, 0xff0000, "Quantum Computer").setDataSymbol(
        Chart.GlassSphere2Shape, 11);
    layer0.setLineWidth(3);
     
    // Add the second line. The missing data will be represented by using dash lines
    // to bridge the gap
    LineLayer layer1 = c.addLineLayer2();
    layer1.addDataSet(data1, 0x00ff00, "Atom Synthesizer").setDataSymbol(
        Chart.GlassSphere2Shape, 11);
    layer1.setLineWidth(3);
    layer1.setGapColor(c.dashLineColor(0x00ff00));
     
    // Add the third line. The missing data will be ignored - just join the gap with
    // the original line style.
    LineLayer layer2 = c.addLineLayer2();
    layer2.addDataSet(data2, 0xff6600, "Proton Cannon").setDataSymbol(
        Chart.GlassSphere2Shape, 11);
    layer2.setLineWidth(3);
    layer2.setGapColor(Chart.SameAsMainColor);
     
    // layout the legend so we can get the height of the legend box
    c.layoutLegend();
     
    // Adjust the plot area size, such that the bounding box (inclusive of axes) is
    // 15 pixels from the left edge, just under the legend box, 16 pixels from the
    // right edge, and 25 pixels from the bottom edge.
    c.packPlotArea(15, legendBox.getTopY() + legendBox.getHeight(), c.getWidth() -
        16, c.getHeight() - 25);
     
    // Output the chart
    WebChartViewer1.Image = c.makeWebImage(Chart.JPG);
     
    // Include tool tip for the chart
    WebChartViewer1.ImageMap = c.getHTMLImageMap("", "",
        "title='Revenue of {dataSetName} in {xLabel}: US$ {value}M'");
}
     
</script>
<html>
<body>
    <chart:WebChartViewer id="WebChartViewer1" runat="server" />
</body>
</html>


參考資料:ChartDirector使用教程


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章