//Main code for creating charts public void createChart(WinChartViewer viewer, int chartIndex) { // The value to display on the meter double value = 75.35; // Create a LinearMeter object of size 250 x 75 pixels with very light grey (0xeeeeee) // backgruond and a light grey (0xccccccc) 3-pixel thick rounded frame LinearMeter m = new LinearMeter(70, 260, 0xeeeeee, 0xcccccc); m.setRoundedFrame(Chart.Transparent); m.setThickFrame(3); // Set the scale region top-left corner at (28, 30), with size of 20 x 196 pixels. The // scale labels are located on the left (default - implies vertical meter) m.setMeter(28, 30, 20, 196); // Set meter scale from 0 - 100, with a tick every 10 units m.setScale(0, 100, 10); // Demostrate different types of color scales and putting them at different positions double[] smoothColorScale = { 0, 0x6666ff, 25, 0x00bbbb, 50, 0x00ff00, 75, 0xffff00, 100, 0xff0000 }; double[] stepColorScale = { 0, 0x33ff33, 50, 0xffff33, 80, 0xff3333, 100 }; double[] highLowColorScale = { 0, 0x6666ff, 70, Chart.Transparent, 100, 0xff0000 }; if (chartIndex == 0) { // Add the smooth color scale at the default position m.addColorScale(smoothColorScale); } else if (chartIndex == 1) { // Add the step color scale at the default position m.addColorScale(stepColorScale); } else if (chartIndex == 2) { // Add the high low scale at the default position m.addColorScale(highLowColorScale); } else if (chartIndex == 3) { // Add the smooth color scale starting at x = 28 (left of scale) with zero width and // ending at x = 28 with 20 pixels width m.addColorScale(smoothColorScale, 28, 0, 28, 20); } else if (chartIndex == 4) { // Add the smooth color scale starting at x = 38 (center of scale) with zero width // and ending at x = 28 with 20 pixels width m.addColorScale(smoothColorScale, 38, 0, 28, 20); } else { // Add the smooth color scale starting at x = 48 (right of scale) with zero width // and ending at x = 28 with 20 pixels width m.addColorScale(smoothColorScale, 48, 0, 28, 20); } // In this demo, we demostrate pointers of different shapes if (chartIndex < 3) { // Add a blue (0x0000cc) pointer of default shape at the specified value m.addPointer(value, 0x0000cc); } else { // Add a blue (0x0000cc) pointer of triangular shape the specified value m.addPointer(value, 0x0000cc).setShape(Chart.TriangularPointer, 0.7, 0.5); } // Add a title using 8pt Arial Bold font with a border color background m.addTitle("Temp C", "Arial Bold", 8, Chart.TextColor).setBackground(0xcccccc); // Add a text box at the bottom-center. Display the value using white (0xffffff) 8pt // Arial Bold font on a black (0x000000) background with rounded border. ChartDirector.TextBox t = m.addText(m.getWidth() / 2, m.getHeight() - 8, m.formatValue( value, "2"), "Arial Bold", 8, 0xffffff, Chart.Bottom); t.setBackground(0x000000); t.setRoundedCorners(3); t.setMargin(5, 5, 2, 1); // Output the chart viewer.Chart = m; }
// // Draw the chart // private void drawChart(WPFChartViewer viewer) { // Have not started collecting data ??? if (currentIndex <= 0) { return; } // The start time is equal to the latest time minus the time range of the chart double startTime = timeStamps[currentIndex - 1] - timeRange; int startIndex = (int)Math.Ceiling(Chart.bSearch(timeStamps, 0, currentIndex, startTime) - 0.1); // For a sweep chart, if the line goes beyond the right border, it will wrap back to // the left. We need to determine the wrap position (the right border). double wrapTime = Math.Floor(startTime / timeRange + 1) * timeRange; double wrapIndex = Chart.bSearch(timeStamps, 0, currentIndex, wrapTime); int wrapIndexA = (int)Math.Ceiling(wrapIndex); int wrapIndexB = (int)Math.Floor(wrapIndex); // The data arrays and the colors and names of the data series var allArrays = new[] { timeStamps, channel1, channel2 }; int[] colors = { 0xff0000, 0x00cc00 }; string[] names = { "Channel 1", "Channel 2" }; // Split all data arrays into two parts A and B at the wrap position. The B part is the // part that is wrapped back to the left. var allArraysA = new double[allArrays.Length][]; var allArraysB = new double[allArrays.Length][]; for (int i = 0; i < allArrays.Length; ++i) { allArraysA[i] = (double[])Chart.arraySlice(allArrays[i], startIndex, wrapIndexA - startIndex + 1); allArraysB[i] = (double[])Chart.arraySlice(allArrays[i], wrapIndexB, currentIndex - wrapIndexB); } // Normalize the plotted timeStamps (the first element of allArrays) to start from 0 for (int i = 0; i < allArraysA[0].Length; ++i) { allArraysA[0][i] -= wrapTime - timeRange; } for (int i = 0; i < allArraysB[0].Length; ++i) { allArraysB[0][i] -= wrapTime; } // // Now we have prepared all the data and can plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object the same size as WPFChartViewer, with a minimum of 300 x 150 XYChart c = new XYChart(Math.Max(300, (int)viewer.ActualWidth), Math.Max(150, (int)viewer.ActualHeight)); // Set the plotarea at (0, 0) with width 1 pixel less than chart width, and height 20 pixels // less than chart height. Use a vertical gradient from light blue (f0f6ff) to sky blue (a0c0ff) // as background. Set border to transparent and grid lines to white (ffffff). c.setPlotArea(0, 0, c.getWidth() - 1, c.getHeight() - 20, c.linearGradientColor(0, 0, 0, c.getHeight() - 20, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // In our code, we can overdraw the line slightly, so we clip it to the plot area. c.setClipping(); // Add a legend box at the right side using horizontal layout. Use 10pt Arial Bold as font. Set // the background and border color to Transparent and use line style legend key. LegendBox b = c.addLegend(c.getWidth() - 1, 10, false, "Arial Bold", 10); b.setBackground(Chart.Transparent); b.setAlignment(Chart.Right); b.setLineStyleKey(); // Set the x and y axis stems to transparent and the label font to 10pt Arial c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); c.xAxis().setLabelStyle("Arial", 10); c.yAxis().setLabelStyle("Arial", 10, 0x336699); // Configure the y-axis label to be inside the plot area and above the horizontal grid lines c.yAxis().setLabelGap(-1); c.yAxis().setMargin(20); c.yAxis().setLabelAlignment(1); // Configure the x-axis labels to be to the left of the vertical grid lines c.xAxis().setLabelAlignment(1); //================================================================================ // Add data to chart //================================================================================ // Draw the lines, which consists of A segments and B segments (the wrapped segments) foreach (var dataArrays in new[] { allArraysA, allArraysB }) { LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); // The first element of dataArrays is the timeStamp, and the rest are the data. layer.setXData(dataArrays[0]); for (int i = 1; i < dataArrays.Length; ++i) { layer.addDataSet(dataArrays[i], colors[i - 1], names[i - 1]); } // Disable legend entries for the B lines to avoid duplication with the A lines if (dataArrays == allArraysB) { layer.setLegend(Chart.NoLegend); } } // The B segments contain the latest data. We add a vertical line at the latest position. int lastIndex = allArraysB[0].Length - 1; Mark m = c.xAxis().addMark(allArraysB[0][lastIndex], -1); m.setMarkColor(0x0000ff, Chart.Transparent, Chart.Transparent); m.setDrawOnTop(false); // We also add a symbol and a label for each data series at the latest position for (int i = 1; i < allArraysB.Length; ++i) { // Add the symbol Layer layer = c.addScatterLayer(new double[] { allArraysB[0][lastIndex] }, new double[] { allArraysB[i][lastIndex] }, "", Chart.CircleSymbol, 9, colors[i - 1], colors[i - 1]); layer.moveFront(); // Add the label string label = "<*font,bgColor=" + colors[i - 1].ToString("x") + "*> {value|P4} <*/font*>"; layer.setDataLabelFormat(label); // The label style ChartDirector.TextBox t = layer.setDataLabelStyle("Arial Bold", 10, 0xffffff); bool isOnLeft = allArraysB[0][lastIndex] <= timeRange / 2; t.setAlignment(isOnLeft ? Chart.Left : Chart.Right); t.setMargin(isOnLeft ? 5 : 0, isOnLeft ? 0 : 5, 0, 0); } //================================================================================ // Configure axis scale and labelling //================================================================================ c.xAxis().setLinearScale(0, timeRange); // For the automatic axis labels, set the minimum spacing to 75/40 pixels for the x/y axis. c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(40); // Set the auto-scale margin to 0.05, and the zero affinity to 0.6 c.yAxis().setAutoScale(0.05, 0.05, 0.6); //================================================================================ // Output the chart //================================================================================ viewer.Chart = c; }
//Main code for creating charts public void createChart(WinChartViewer viewer, int chartIndex) { // The value to display on the meter double value = 74.25; // Create a LinearMeter object of size 70 x 260 pixels with very light grey (0xeeeeee) // backgruond and a grey (0xbbbbbb) 3-pixel thick rounded frame LinearMeter m = new LinearMeter(70, 260, 0xeeeeee, 0xbbbbbb); m.setRoundedFrame(Chart.Transparent); m.setThickFrame(3); // Set the scale region top-left corner at (28, 33), with size of 20 x 194 pixels. The // scale labels are located on the left (default - implies vertical meter). m.setMeter(28, 33, 20, 194); // Set meter scale from 0 - 100, with a tick every 10 units m.setScale(0, 100, 10); // Demostrate different types of color scales double[] smoothColorScale = { 0, 0x0000ff, 25, 0x0088ff, 50, 0x00ff00, 75, 0xdddd00, 100, 0xff0000 }; double[] stepColorScale = { 0, 0x00dd00, 50, 0xffff00, 80, 0xff0000, 100 }; double[] highColorScale = { 70, Chart.Transparent, 100, 0xff0000 }; double[] lowColorScale = { 0, 0x0000ff, 30, Chart.Transparent }; if (chartIndex == 0) { // Add a blue (0x0088ff) bar from 0 to value with glass effect and 4 pixel rounded // corners m.addBar(0, value, 0x0088ff, Chart.glassEffect(Chart.NormalGlare, Chart.Left), 4); // Add a 6-pixel thick smooth color scale at x = 53 (right of meter scale) m.addColorScale(smoothColorScale, 53, 6); } else if (chartIndex == 1) { // Add a green (0x00cc00) bar from 0 to value with bar lighting effect and 4 pixel // rounded corners m.addBar(0, value, 0x00cc00, Chart.barLighting(), 4); // Add a high only color scale at x = 52 (right of meter scale) with thickness // varying from 0 to 8 m.addColorScale(highColorScale, 52, 0, 52, 8); // Add a low only color scale at x = 52 (right of meter scale) with thickness // varying from 8 to 0 m.addColorScale(lowColorScale, 52, 8, 52, 0); } else if (chartIndex == 2) { // Add a purple (0x0088ff) bar from 0 to value with glass effect and 4 pixel rounded // corners m.addBar(0, value, 0x8833dd, Chart.glassEffect(Chart.NormalGlare, Chart.Left), 4); // Add a high only color scale at x = 52 (right of meter scale) with thickness // varying from 0 to 8 m.addColorScale(highColorScale, 52, 0, 52, 8); } else if (chartIndex == 3) { // Add a orange (0xff8800) bar from 0 to value with cylinder lighting effect m.addBar(0, value, 0xff8800, Chart.cylinderEffect()); // Add a high only color scale at x = 53 (right of meter scale) m.addColorScale(highColorScale, 53, 6); } else if (chartIndex == 4) { // Add a red (0xee3333) bar from 0 to value with glass effect and 4 pixel rounded // corners m.addBar(0, value, 0xee3333, Chart.glassEffect(Chart.NormalGlare, Chart.Left), 4); // Add a step color scale at x = 53 (right of meter scale) m.addColorScale(stepColorScale, 53, 6); } else { // Add a grey (0xaaaaaa) bar from 0 to value m.addBar(0, value, 0xaaaaaa); // Add a smooth color scale at x = 52 (right of meter scale) with thickness varying // from 0 to 8 m.addColorScale(smoothColorScale, 52, 0, 52, 8); } // Add a title using 8pt Arial Bold font with grey (0xbbbbbb) background m.addTitle("Temp C", "Arial Bold", 8, Chart.TextColor).setBackground(0xbbbbbb); // Add a text box at the bottom-center. Display the value using white (0xffffff) 8pt // Arial Bold font on a black (0x000000) background with rounded border. ChartDirector.TextBox t = m.addText(m.getWidth() / 2, m.getHeight() - 8, m.formatValue( value, "2"), "Arial Bold", 8, 0xffffff, Chart.Bottom); t.setBackground(0x000000); t.setRoundedCorners(3); t.setMargin(5, 5, 2, 1); // Output the chart viewer.Chart = m; }