public void createChartWeight(WebChartViewer Wviewer, Double[] Weight, Double[] BMI, DateTime[] YearWeightBMI) { XYChart c = new XYChart(900, 570, 0xddddff, 0x000000, 1); c.addLegend(90, 10, false, "Arial Bold", 7).setBackground(0xcccccc); c.setPlotArea(60, 60, 700, 430, 0xffffff).setGridColor(0xcccccc, 0xccccccc); c.xAxis().setTitle("Year"); c.xAxis().setLabelStyle("Arial", 8, 1).setFontAngle(90); c.yAxis().setLinearScale(0, 200, 10, 0); c.yAxis2().setLogScale(0, 1000, 10); LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.addDataSet(Weight, 0xff0000, "Weight").setDataSymbol(Chart.CircleShape, 5); int count = YearWeightBMI.Length; layer.setXData(YearWeightBMI); LineLayer layer1 = c.addLineLayer2(); layer1.setLineWidth(2); layer1.setUseYAxis2(); layer1.addDataSet(BMI, 0x008800, "BMI").setDataSymbol(Chart.CircleShape, 5); layer1.setXData(YearWeightBMI); // Output the chart Wviewer.Image = c.makeWebImage(Chart.PNG); //Include tool tip for the chart Wviewer.ImageMap = c.getHTMLImageMap("", "", "title='{dataSetName} Count on {xLabel}={value}'"); }
private void createChartCD4(WebChartViewer viewer, Double[] CD4, Double[] ViralLoad, DateTime[] YearCD4, DateTime[] YearVL, DateTime[] Year) { XYChart c = new XYChart(900, 570, 0xddddff, 0x000000, 1); c.addLegend(90, 10, false, "Arial Bold", 7).setBackground(0xcccccc); c.setPlotArea(60, 60, 700, 430, 0xffffff).setGridColor(0xcccccc, 0xccccccc); c.xAxis().setTitle("Year"); c.xAxis().setLabelStyle("Arial", 8, 1).setFontAngle(90); c.yAxis().setLinearScale(0, 1500, 100, 0); c.yAxis2().setLogScale(10, 10000, 10); LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.addDataSet(CD4, 0xff0000, "CD4").setDataSymbol(Chart.CircleShape, 5); layer.setXData(YearCD4); LineLayer layer1 = c.addLineLayer2(); layer1.setLineWidth(2); layer1.setUseYAxis2(); layer1.addDataSet(ViralLoad, 0x008800, "Viralload").setDataSymbol(Chart.CircleShape, 5); layer1.setXData(YearVL); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); viewer.ImageMap = c.getHTMLImageMap("", "", "title='{dataSetName} Count on {xLabel}={value}'"); }
// // Create chart // private void createChart(RazorChartViewer viewer) { // Data for the chart as 2 random data series RanSeries r = new RanSeries(127); double[] data0 = r.getSeries(180, 10, -1.5, 1.5); double[] data1 = r.getSeries(180, 150, -15, 15); DateTime[] timeStamps = r.getDateSeries(180, new DateTime(2011, 1, 1), 86400); // Create a XYChart object of size 670 x 400 pixels XYChart c = new XYChart(670, 400); // Add a title to the chart using 18pt Times New Roman Bold Italic font c.addTitle("Plasma Stabilizer Energy Usage", "Times New Roman Bold Italic", 18); // Set the plotarea at (50, 55) with width 100 pixels less than chart width, and height 90 // 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(50, 55, c.getWidth() - 100, c.getHeight() - 90, c.linearGradientColor(0, 55, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // Add a legend box at (50, 25) using horizontal layout. Use 10pt Arial Bold as font. Set the // background and border color to Transparent. c.addLegend(50, 25, false, "Arial Bold", 10).setBackground(Chart.Transparent); // Set axis label style to 8pt Arial Bold c.xAxis().setLabelStyle("Arial Bold", 8); c.yAxis().setLabelStyle("Arial Bold", 8); c.yAxis2().setLabelStyle("Arial Bold", 8); // Set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); c.yAxis2().setColors(Chart.Transparent); // Configure x-axis label format c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "{value|mm/yyyy} ", Chart.StartOfMonthFilter(), "{value|mm}"); // Add axis title using 10pt Arial Bold Italic font c.yAxis().setTitle("Power Usage (Watt)", "Arial Bold Italic", 10); c.yAxis2().setTitle("Effective Load (kg)", "Arial Bold Italic", 10); // Add a line layer to the chart using a line width of 2 pixels. LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // Add 2 data series to the line layer layer.setXData(timeStamps); layer.addDataSet(data0, 0xcc0000, "Power Usage"); layer.addDataSet(data1, 0x008800, "Effective Load").setUseYAxis2(); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Output Javascript chart model to the browser to suppport tracking cursor viewer.ChartModel = c.getJsChartModel(); }
private void Window_Loaded(object sender, RoutedEventArgs e) { // Data for the chart as 3 random data series RanSeries r = new RanSeries(127); double[] data0 = r.getSeries(100, 100, -15, 15); double[] data1 = r.getSeries(100, 150, -15, 15); double[] data2 = r.getSeries(100, 200, -15, 15); DateTime[] timeStamps = r.getDateSeries(100, new DateTime(2011, 1, 1), 86400); // Create a XYChart object of size 640 x 400 pixels XYChart c = new XYChart(640, 400); // Add a title to the chart using 18pt Times New Roman Bold Italic font c.addTitle(" Product Line Global Revenue", "Times New Roman Bold Italic", 18); // Set the plotarea at (50, 55) with width 70 pixels less than chart width, and height 90 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(50, 55, c.getWidth() - 70, c.getHeight() - 90, c.linearGradientColor(0, 55, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // Set legend icon style to use line style icon, sized for 8pt font c.getLegend().setLineStyleKey(); c.getLegend().setFontSize(8); // Set axis label style to 8pt Arial Bold c.xAxis().setLabelStyle("Arial Bold", 8); c.yAxis().setLabelStyle("Arial Bold", 8); // Set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); // Configure x-axis label format c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "{value|mm/yyyy} ", Chart.StartOfMonthFilter( ), "{value|mm}"); // Add axis title using 10pt Arial Bold Italic font c.yAxis().setTitle("USD millions", "Arial Bold Italic", 10); // Add a line layer to the chart using a line width of 2 pixels. LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // Add 3 data series to the line layer layer.setXData(timeStamps); layer.addDataSet(data0, 0xff3333, "Alpha"); layer.addDataSet(data1, 0x008800, "Beta"); layer.addDataSet(data2, 0x3333cc, "Gamma"); // Include track line with legend for the latest data values trackLineLegend(c, c.getPlotArea().getRightX()); // Assign the chart to the WPFChartViewer WPFChartViewer1.Chart = c; }
// // Create chart // private void createChart(RazorChartViewer viewer) { // Data for the chart as 3 random data series RanSeries r = new RanSeries(127); double[] data0 = r.getSeries(100, 100, -15, 15); double[] data1 = r.getSeries(100, 150, -15, 15); double[] data2 = r.getSeries(100, 200, -15, 15); DateTime[] timeStamps = r.getDateSeries(100, new DateTime(2011, 1, 1), 86400); // Create a XYChart object of size 640 x 400 pixels XYChart c = new XYChart(640, 400); // Add a title to the chart using 18pt Times New Roman Bold Italic font c.addTitle(" Product Line Global Revenue", "Times New Roman Bold Italic", 18); // Set the plotarea at (50, 55) with width 70 pixels less than chart width, and height 90 // 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(50, 55, c.getWidth() - 70, c.getHeight() - 90, c.linearGradientColor(0, 55, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // Set axis label style to 8pt Arial Bold c.xAxis().setLabelStyle("Arial Bold", 8); c.yAxis().setLabelStyle("Arial Bold", 8); // Set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); // Configure x-axis label format c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "{value|mm/yyyy} ", Chart.StartOfMonthFilter(), "{value|mm}"); // Add axis title using 10pt Arial Bold Italic font c.yAxis().setTitle("USD millions", "Arial Bold Italic", 10); // Add a line layer to the chart using a line width of 2 pixels. LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // Add 3 data series to the line layer layer.setXData(timeStamps); layer.addDataSet(data0, 0xff3333, "Alpha"); layer.addDataSet(data1, 0x008800, "Beta"); layer.addDataSet(data2, 0x3333cc, "Gamma"); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Output Javascript chart model to the browser to suppport tracking cursor viewer.ChartModel = c.getJsChartModel(); }
private void drawFullChart(WPFViewPortControl vpc, WPFChartViewer viewer) { // Create an XYChart object of size 640 x 60 pixels XYChart c = new XYChart(640, 60); // Set the plotarea with the same horizontal position as that in the main chart for alignment. c.setPlotArea(55, 0, c.getWidth() - 80, c.getHeight() - 1, 0xc0d8ff, -1, 0x888888, Chart.Transparent, 0xffffff); // Set the x axis stem to transparent and the label font to 10pt Arial c.xAxis().setColors(Chart.Transparent); c.xAxis().setLabelStyle("Arial", 10); // Put the x-axis labels inside the plot area by setting a negative label gap. Use // setLabelAlignment to put the label at the right side of the tick. c.xAxis().setLabelGap(-1); c.xAxis().setLabelAlignment(1); // Set the y axis stem and labels to transparent (that is, hide the labels) c.yAxis().setColors(Chart.Transparent, Chart.Transparent); // Add a line layer for the lines with fast line mode enabled LineLayer layer = c.addLineLayer(); layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (0xff3333), green // (0x008800) and blue (0x3333cc) layer.setXData(timeStamps); layer.addDataSet(dataSeriesA, 0xff3333); layer.addDataSet(dataSeriesB, 0x008800); layer.addDataSet(dataSeriesC, 0x3333cc); // The x axis scales should reflect the full range of the view port c.xAxis().setDateScale(viewer.getValueAtViewPort("x", 0), viewer.getValueAtViewPort("x", 1)); // For the automatic x-axis labels, set the minimum spacing to 75 pixels. c.xAxis().setTickDensity(75); // For the auto-scaled y-axis, as we hide the labels, we can disable axis rounding. This can // make the axis scale fit the data tighter. c.yAxis().setRounding(false, false); // Output the chart vpc.Chart = c; }
private void drawChart(WinChartViewer viewer) { // get the start index that are visible on the chart double viewPortStartIndex = viewer.getValueAtViewPort("x", viewer.ViewPortLeft); double viewPortEndIndex = viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth); // Get the array indexes that corresponds to the visible start and end int startIndex = 0; int endIndex = 0; if (showInFrame) { startIndex = (int)Math.Floor(Chart.bSearch(indexForFrame, viewPortStartIndex)); endIndex = (int)Math.Ceiling(Chart.bSearch(indexForFrame, viewPortEndIndex)); Console.WriteLine("port start: " + viewPortStartIndex + " port end: " + viewPortEndIndex + " start: " + startIndex + " end: " + endIndex + " index length: " + indexForFrame.Length); } else { startIndex = (int)Math.Floor(Chart.bSearch(indexForSecond, viewPortStartIndex)); endIndex = (int)Math.Ceiling(Chart.bSearch(indexForSecond, viewPortEndIndex)); Console.WriteLine("port start: " + viewPortStartIndex + " port end: " + viewPortEndIndex + " start: " + startIndex + " end: " + endIndex + " index length: " + indexForSecond.Length); } int noOfPoints = endIndex - startIndex + 1; // declaration the data set double[] viewPortDataSeriesCpuInFrame; double[] viewPortDataSeriesGpuInFrame; double[] viewPortDataSeriesFpsInFrame; double[] viewPortDataSeriesFpsInSecond; double[] viewPortDataSeriesCpuInSecond; double[] viewPortDataSeriesGpuInSecond; double[] viewPortIndex; if (showInFrame) { viewPortIndex = (double[])Chart.arraySlice(indexForFrame, startIndex, noOfPoints); if (this.showCpu) { viewPortDataSeriesCpuInFrame = (double[])Chart.arraySlice(cpuInFrame, startIndex, noOfPoints); } if (this.showGpu) { viewPortDataSeriesGpuInFrame = (double[])Chart.arraySlice(gpuInFrame, startIndex, noOfPoints); } if (this.showFps) { viewPortDataSeriesFpsInFrame = (double[])Chart.arraySlice(fpsInFrame, startIndex, noOfPoints); } } else { viewPortIndex = (double[])Chart.arraySlice(indexForSecond, startIndex, noOfPoints); if (this.showCpu) { viewPortDataSeriesCpuInSecond = (double[])Chart.arraySlice(cpuInSecond, startIndex, noOfPoints); } if (this.showGpu) { viewPortDataSeriesGpuInSecond = (double[])Chart.arraySlice(gpuInSecond, startIndex, noOfPoints); } if (this.showFps) { viewPortDataSeriesFpsInSecond = (double[])Chart.arraySlice(fpsInSecond, startIndex, noOfPoints); } } // configure overall chart apperance XYChart c = new XYChart(807, 371); c.setPlotArea(55, 50, c.getWidth() - 80, c.getHeight() - 85, c.linearGradientColor(0, 50, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xfffff); c.setClipping(); c.addTitle("Charactor for game", "Times New Roman Bold Italic", 10); // Set legend icon style to use line style icon, sized for 8pt font c.getLegend().setLineStyleKey(); c.getLegend().setFontSize(8); //LegendBox b = c.addLegend(55, 25, false, "Arial Bold", 8); //b.setBackground(Chart.Transparent); //b.setLineStyleKey(); // set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); // add the y axixs title c.yAxis().setTitle("chractor", "Arial Bold Italic", 10); // add data to chart LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); if (this.showInFrame) { layer.setXData(this.indexForFrame); } else { layer.setXData(this.indexForSecond); } /* * layer.addDataSet(viewPortDataSeriesCpu, 0xff3333, "CPU"); * layer.addDataSet(viewPortDataSeriesGpu, 0x008800, "GPU"); * layer.addDataSet(viewPortDataSeriesFps, 0x3333cc, "FPS"); */ if (this.showInFrame) { if (this.showCpu) { layer.addDataSet(cpuInFrame, 0xff3333, "CPU In Frame"); } if (this.showGpu) { layer.addDataSet(gpuInFrame, 0x008800, "GPU In Frame"); } if (this.showFps) { layer.addDataSet(fpsInFrame, 0xcccccc, "FPS In Frame"); } } else { if (this.showCpu) { layer.addDataSet(cpuInSecond, 0x33cc33, "CPU In Second"); } if (this.showGpu) { layer.addDataSet(gpuInSecond, 0xff8833, "GPU In Second"); } if (this.showFps) { layer.addDataSet(fpsInSecond, 0xcccccc, "FPS In Second"); } } // configure the axis scale and labeling //viewer.syncDateAxisWithViewPort("x", c.xAxis()); viewer.syncLinearAxisWithViewPort("x", c.xAxis()); // If all ticks are yearly aligned, then we use "yyyy" as the label format. //c.xAxis().setFormatCondition("align", 32); //c.xAxis().setLabelFormat("{value|p4}"); viewer.Chart = c; }
// // Draw the chart // private void drawChart(RazorChartViewer viewer) { // // Data to draw the chart. In this demo, the data buffer will be filled by a random data // generator. In real life, the data is probably stored in a buffer (eg. a database table, a // text file, or some global memory) and updated by other means. // // We use a data buffer to emulate the last 240 samples. int sampleSize = 240; double[] dataSeries1 = new double[sampleSize]; double[] dataSeries2 = new double[sampleSize]; double[] dataSeries3 = new double[sampleSize]; DateTime[] timeStamps = new DateTime[sampleSize]; // Our pseudo random number generator DateTime firstDate = DateTime.Now.AddSeconds(-timeStamps.Length); for (int i = 0; i < timeStamps.Length; ++i) { timeStamps[i] = firstDate.AddSeconds(i); double p = timeStamps[i].Ticks / 10000000; dataSeries1[i] = Math.Cos(p * 2.1) * 10 + 1 / (Math.Cos(p) * Math.Cos(p) + 0.01) + 20; dataSeries2[i] = 100 * Math.Sin(p / 27.7) * Math.Sin(p / 10.1) + 150; dataSeries3[i] = 100 * Math.Cos(p / 6.7) * Math.Cos(p / 11.9) + 150; } // Create an XYChart object 600 x 270 pixels in size, with light grey (f4f4f4) background, // black (000000) border, 1 pixel raised effect, and with a rounded frame. XYChart c = new XYChart(600, 270, 0xf4f4f4, 0x000000, 0); c.setRoundedFrame(); // Set the plotarea at (55, 57) and of size 520 x 185 pixels. Use white (ffffff) background. // Enable both horizontal and vertical grids by setting their colors to grey (cccccc). Set // clipping mode to clip the data lines to the plot area. c.setPlotArea(55, 57, 520, 185, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); c.setClipping(); // Add a title to the chart using 15pt Times New Roman Bold Italic font, with a light grey // (dddddd) background, black (000000) border, and a glass like raised effect. c.addTitle("Field Intensity at Observation Satellite", "Times New Roman Bold Italic", 15 ).setBackground(0xdddddd, 0x000000, Chart.glassEffect()); // Configure the y-axis with a 10pt Arial Bold axis title c.yAxis().setTitle("Intensity (V/m)", "Arial Bold", 10); // Configure the x-axis to auto-scale with at least 75 pixels between major tick and 15 // pixels between minor ticks. This shows more minor grid lines on the chart. c.xAxis().setTickDensity(75, 15); // Set the axes width to 2 pixels c.xAxis().setWidth(2); c.yAxis().setWidth(2); // Set the x-axis label format c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // Create a line layer to plot the lines LineLayer layer = c.addLineLayer2(); // The x-coordinates are the timeStamps. layer.setXData(timeStamps); // The 3 data series are used to draw 3 lines. Here we put the latest data values as part of // the data set name, so you can see them updated in the legend box. layer.addDataSet(dataSeries1, 0xff0000, "Alpha"); layer.addDataSet(dataSeries2, 0x00cc00, "Beta"); layer.addDataSet(dataSeries3, 0x0000ff, "Gamma"); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Output Javascript chart model to the browser to suppport tracking cursor viewer.ChartModel = c.getJsChartModel(); }
// // Draw the chart. // private void drawChart(WPFChartViewer viewer) { // Get the start date and end date that are visible on the chart. DateTime viewPortStartDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft)); DateTime viewPortEndDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth)); // Get the array indexes that corresponds to the visible start and end dates int startIndex = (int)Math.Floor(Chart.bSearch(timeStamps, viewPortStartDate)); int endIndex = (int)Math.Ceiling(Chart.bSearch(timeStamps, viewPortEndDate)); int noOfPoints = endIndex - startIndex + 1; // Extract the part of the data array that are visible. DateTime[] viewPortTimeStamps = (DateTime[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); double[] viewPortDataSeriesA = (double[])Chart.arraySlice(dataSeriesA, startIndex, noOfPoints); double[] viewPortDataSeriesB = (double[])Chart.arraySlice(dataSeriesB, startIndex, noOfPoints); double[] viewPortDataSeriesC = (double[])Chart.arraySlice(dataSeriesC, startIndex, noOfPoints); // // At this stage, we have extracted the visible data. We can use those data to plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object of size 640 x 400 pixels XYChart c = new XYChart(640, 400); // Set the plotarea at (55, 55) with width 80 pixels less than chart width, and height 90 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(55, 55, c.getWidth() - 80, c.getHeight() - 90, c.linearGradientColor(0, 55, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // As the data can lie outside the plotarea in a zoomed chart, we need enable clipping. c.setClipping(); // Add a title to the chart using 15pt Arial Bold font c.addTitle(" Zooming and Scrolling with Viewport Control", "Arial Bold", 15); // Set legend icon style to use line style icon, sized for 10pt font c.getLegend().setLineStyleKey(); c.getLegend().setFontSize(10); // 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); // Add axis title using 10pt Arial Bold font c.yAxis().setTitle("Ionic Temperature (C)", "Arial Bold", 10); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use other // representations (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // In this demo, we do not have too many data points. In real code, the chart may contain a lot // of data points when fully zoomed out - much more than the number of horizontal pixels in this // plot area. So it is a good idea to use fast line mode. layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (ff33333), green (008800) // and blue (3333cc) layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortDataSeriesA, 0xff3333, "Alpha"); layer.addDataSet(viewPortDataSeriesB, 0x008800, "Beta"); layer.addDataSet(viewPortDataSeriesC, 0x3333cc, "Gamma"); //================================================================================ // Configure axis scale and labelling //================================================================================ // Set the x-axis as a date/time axis with the scale according to the view port x range. viewer.syncDateAxisWithViewPort("x", c.xAxis()); // For the automatic y-axis labels, set the minimum spacing to 30 pixels. c.yAxis().setTickDensity(30); // // In this demo, the time range can be from a few years to a few days. We demonstrate how to set // up different date/time format based on the time range. // // If all ticks are yearly aligned, then we use "yyyy" as the label format. c.xAxis().setFormatCondition("align", 360 * 86400); c.xAxis().setLabelFormat("{value|yyyy}"); // If all ticks are monthly aligned, then we use "mmm yyyy" in bold font as the first label of a // year, and "mmm" for other labels. c.xAxis().setFormatCondition("align", 30 * 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*font=bold*>{value|mmm<*br*>yyyy}", Chart.AllPassFilter(), "{value|mmm}"); // If all ticks are daily algined, then we use "mmm dd<*br*>yyyy" in bold font as the first // label of a year, and "mmm dd" in bold font as the first label of a month, and "dd" for other // labels. c.xAxis().setFormatCondition("align", 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*block,halign=left*><*font=bold*>{value|mmm dd<*br*>yyyy}", Chart.StartOfMonthFilter(), "<*font=bold*>{value|mmm dd}"); c.xAxis().setMultiFormat2(Chart.AllPassFilter(), "{value|dd}"); // For all other cases (sub-daily ticks), use "hh:nn<*br*>mmm dd" for the first label of a day, // and "hh:nn" for other labels. c.xAxis().setFormatCondition("else"); c.xAxis().setMultiFormat(Chart.StartOfDayFilter(), "<*font=bold*>{value|hh:nn<*br*>mmm dd}", Chart.AllPassFilter(), "{value|hh:nn}"); //================================================================================ // Output the chart //================================================================================ // We need to update the track line too. If the mouse is moving on the chart (eg. if // the user drags the mouse on the chart to scroll it), the track line will be updated // in the MouseMovePlotArea event. Otherwise, we need to update the track line here. if (!viewer.IsInMouseMoveEvent) { trackLineLegend(c, (null == viewer.Chart) ? c.getPlotArea().getRightX() : viewer.PlotAreaMouseX); } viewer.Chart = c; }
private void drawChart(WinChartViewer viewer) { // get the start index that are visible on the chart double viewPortStartIndex = viewer.getValueAtViewPort("x", viewer.ViewPortLeft); double viewPortEndIndex = viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth); // Get the array indexes that corresponds to the visible start and end int startIndex = (int)Math.Floor(Chart.bSearch(index, viewPortStartIndex)); int endIndex = (int)Math.Ceiling(Chart.bSearch(index, viewPortEndIndex)); Console.WriteLine("port start: " + viewPortStartIndex + " port end: " + viewPortEndIndex + " start: " + startIndex + " end: " + endIndex + " index length: " + index.Length); int noOfPoints = endIndex - startIndex + 1; // declaration the data set double[] viewPortDataSeriesCpu; double[] viewPortDataSeriesGpu; double[] viewPortDataSeriesFps; double[] viewPortDataSeriesCmd; double[] viewPortDataSeriesObj; double[] viewPortDataSeriesTriangle; double[] viewPortDataSeriesDrawTime; double[] viewPortDataSeriesDataSize; double[] viewPortDataSeriesIbLock; double[] viewPortDataSeriesIbSize; double[] viewPortDataSeriesVbLock; double[] viewPortDataSeriesVbSize; double[] viewPortDataSeriesParamSize; double[] viewPortDataSeriesRemoteParamSize; double[] viewPortDataSeriesSurLock; double[] viewPortDataSeriesSurSize; double[] viewPortDataSeriesTexLock; double[] viewPortDataSeriesTexSize; double[] viewPortDataSeriesSetTexture; double[] viewPortDataSeriesStateBlock; double[] viewPortDataSeriesVShaderCmd; double[] viewPortDataSeriesVShaderConst; double[] viewPortDataSeriesPShaderCmd; double[] viewPortDataSeriesPShaderConst; double[] viewPortIndex = (double[])Chart.arraySlice(index, startIndex, noOfPoints); if (this.showCpu) { viewPortDataSeriesCpu = (double[])Chart.arraySlice(cpu, startIndex, noOfPoints); } if (this.showGpu) { viewPortDataSeriesGpu = (double[])Chart.arraySlice(gpu, startIndex, noOfPoints); } if (this.showFps) { viewPortDataSeriesFps = (double[])Chart.arraySlice(fps, startIndex, noOfPoints); } if (this.showCmd) { viewPortDataSeriesCmd = (double[])Chart.arraySlice(cmd, startIndex, noOfPoints); } if (this.showObj) { viewPortDataSeriesObj = (double[])Chart.arraySlice(obj, startIndex, noOfPoints); } if (this.showTriangle) { viewPortDataSeriesTriangle = (double[])Chart.arraySlice(triangle, startIndex, noOfPoints); } if (this.showDrawTime) { viewPortDataSeriesDrawTime = (double[])Chart.arraySlice(draw, startIndex, noOfPoints); } if (this.showDataSize) { viewPortDataSeriesDataSize = (double[])Chart.arraySlice(data, startIndex, noOfPoints); } if (this.showIbLock) { viewPortDataSeriesIbLock = (double[])Chart.arraySlice(ibLock, startIndex, noOfPoints); } if (this.showIbSize) { viewPortDataSeriesIbSize = (double[])Chart.arraySlice(ibSize, startIndex, noOfPoints); } if (this.showVbLock) { viewPortDataSeriesVbLock = (double[])Chart.arraySlice(vbLock, startIndex, noOfPoints); } if (this.showVbSize) { viewPortDataSeriesVbSize = (double[])Chart.arraySlice(vbSize, startIndex, noOfPoints); } if (this.showParamSize) { viewPortDataSeriesParamSize = (double[])Chart.arraySlice(parameterSize, startIndex, noOfPoints); } if (this.showRemoteParamSize) { viewPortDataSeriesRemoteParamSize = (double[])Chart.arraySlice(remoteParamSize, startIndex, noOfPoints); } if (this.showSurLock) { viewPortDataSeriesSurLock = (double[])Chart.arraySlice(surLock, startIndex, noOfPoints); } if (this.showSurSize) { viewPortDataSeriesSurSize = (double[])Chart.arraySlice(surSize, startIndex, noOfPoints); } if (this.showTexLock) { viewPortDataSeriesTexLock = (double[])Chart.arraySlice(texLock, startIndex, noOfPoints); } if (this.showTexSize) { viewPortDataSeriesTexSize = (double[])Chart.arraySlice(texSize, startIndex, noOfPoints); } if (this.showSetTexTime) { viewPortDataSeriesSetTexture = (double[])Chart.arraySlice(setTex, startIndex, noOfPoints); } if (this.showStateBlock) { viewPortDataSeriesStateBlock = (double[])Chart.arraySlice(stateBlock, startIndex, noOfPoints); } if (this.showVShaderCmd) { viewPortDataSeriesVShaderCmd = (double[])Chart.arraySlice(vShaderCmd, startIndex, noOfPoints); } if (this.showVShaderConst) { viewPortDataSeriesVShaderConst = (double[])Chart.arraySlice(vShaderConst, startIndex, noOfPoints); } if (this.showPShaderCmd) { viewPortDataSeriesPShaderCmd = (double[])Chart.arraySlice(pShaderCmd, startIndex, noOfPoints); } if (this.showPShaderConst) { viewPortDataSeriesPShaderConst = (double[])Chart.arraySlice(pShaderConst, startIndex, noOfPoints); } // configure overall chart apperance XYChart c = new XYChart(820, 490); c.setPlotArea(55, 50, c.getWidth() - 80, c.getHeight() - 85, c.linearGradientColor(0, 50, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xfffff); c.setClipping(); c.addTitle(" All charactor for game", "Times New Roman Bold Italic", 10); // Set legend icon style to use line style icon, sized for 8pt font c.getLegend().setLineStyleKey(); c.getLegend().setFontSize(8); //LegendBox b = c.addLegend(55, 25, false, "Arial Bold", 8); //b.setBackground(Chart.Transparent); //b.setLineStyleKey(); // set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); // add the y axixs title c.yAxis().setTitle("chractor", "Arial Bold Italic", 10); // add data to chart LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); layer.setXData(this.index); /* * layer.addDataSet(viewPortDataSeriesCpu, 0xff3333, "CPU"); * layer.addDataSet(viewPortDataSeriesGpu, 0x008800, "GPU"); * layer.addDataSet(viewPortDataSeriesFps, 0x3333cc, "FPS"); */ if (this.showCpu) { layer.addDataSet(cpu, 0xff3333, "CPU"); } if (this.showGpu) { layer.addDataSet(gpu, 0x008800, "GPU"); } if (this.showFps) { layer.addDataSet(fps, 0x3333cc, "FPS"); } if (this.showCmd) { layer.addDataSet(cmd, 0x3388cc, "CMD"); } if (this.showObj) { layer.addDataSet(obj, 0x8833cc, "OBJ"); } if (this.showTriangle) { layer.addDataSet(triangle, 0x333388, "TRI"); } if (this.showDrawTime) { layer.addDataSet(draw, 0xff0000, "DRAW"); } if (this.showDataSize) { layer.addDataSet(data, 0xff00cc, "DATA"); } if (this.showIbLock) { layer.addDataSet(ibLock, 0x8888cc, "IBLOCK"); } if (this.showIbSize) { layer.addDataSet(ibSize, 0x8833cc, "IBSIZE"); } if (this.showVbLock) { layer.addDataSet(vbLock, 0x3333cc, "VBLOCK"); } if (this.showVbSize) { layer.addDataSet(vbSize, 0x3333cc, "VBSIZE"); } if (this.showParamSize) { layer.addDataSet(parameterSize, 0x3333cc, "PARAM"); } if (this.showRemoteParamSize) { layer.addDataSet(remoteParamSize, 0x3333cc, "REMOTE"); } if (this.showSurLock) { layer.addDataSet(surLock, 0x3333cc, "SURLOCK"); } if (this.showSurSize) { layer.addDataSet(surSize, 0x3333cc, "SURSIZE"); } if (this.showTexLock) { layer.addDataSet(texLock, 0x3333cc, "TEXLOCK"); } if (this.showTexSize) { layer.addDataSet(texSize, 0x3333cc, "TEXSIZE"); } if (this.showSetTexTime) { layer.addDataSet(setTex, 0x3333cc, "SETTEX"); } if (this.showStateBlock) { layer.addDataSet(stateBlock, 0x3333cc, "STATEBLOCK"); } if (this.showVShaderCmd) { layer.addDataSet(vShaderCmd, 0x3333cc, "VSC"); } if (this.showVShaderConst) { layer.addDataSet(vShaderConst, 0x3333cc, "VSCONST"); } if (this.showPShaderCmd) { layer.addDataSet(pShaderCmd, 0x3333cc, "PSC"); } if (this.showPShaderConst) { layer.addDataSet(pShaderConst, 0x3333cc, "PSCONST"); } // configure the axis scale and labeling //viewer.syncDateAxisWithViewPort("x", c.xAxis()); viewer.syncLinearAxisWithViewPort("x", c.xAxis()); // If all ticks are yearly aligned, then we use "yyyy" as the label format. //c.xAxis().setFormatCondition("align", 32); //c.xAxis().setLabelFormat("{value|p4}"); viewer.Chart = c; }
private void drawFullChart(RazorViewPortControl vp, RazorChartViewer viewer) { // We need to draw a small thumbnail chart for the full data range. The simplest method is to // simply get the full data to draw the chart. If the full data are very large (eg. millions // of points), for such a small thumbnail chart, it is often acceptable to just retreive a // small sample of the data. // // In this example, there are only around 5500 points for the 3 data series. This amount is // not large to ChartDirector, so we simply pass all the data to ChartDirector. RanTable r = getRandomTable(); // Get all the data from the random table DateTime[] timeStamps = Chart.NTime(r.getCol(0)); double[] dataSeriesA = r.getCol(1); double[] dataSeriesB = r.getCol(2); double[] dataSeriesC = r.getCol(3); // Create an XYChart object of size 640 x 60 pixels XYChart c = new XYChart(640, 60); // Set the plotarea with the same horizontal position as that in the main chart for // alignment. The vertical position is set to equal to the chart height. c.setPlotArea(55, 0, c.getWidth() - 80, c.getHeight() - 1, 0xc0d8ff, -1, 0x888888, Chart.Transparent, 0xffffff); // Set the x axis stem to transparent and the label font to 10pt Arial c.xAxis().setColors(Chart.Transparent); c.xAxis().setLabelStyle("Arial", 10); // Put the x-axis labels inside the plot area by setting a negative label gap. Use // setLabelAlignment to put the label at the right side of the tick. c.xAxis().setLabelGap(-1); c.xAxis().setLabelAlignment(1); // Set the y axis stem and labels to transparent (that is, hide the labels) c.yAxis().setColors(Chart.Transparent, Chart.Transparent); // Add a line layer for the lines with fast line mode enabled LineLayer layer = c.addLineLayer2(); layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (0xff3333), green // (0x008800) and blue (0x3333cc) layer.setXData(timeStamps); layer.addDataSet(dataSeriesA, 0xff3333); layer.addDataSet(dataSeriesB, 0x008800); layer.addDataSet(dataSeriesC, 0x3333cc); // The x axis scales should reflect the full range of the view port c.xAxis().setDateScale(viewer.getValueAtViewPort("x", 0), viewer.getValueAtViewPort("x", 1)); // For the automatic x-axis labels, set the minimum spacing to 75 pixels. c.xAxis().setTickDensity(75); // For the auto-scaled y-axis, as we hide the labels, we can disable axis rounding. This can // make the axis scale fit the data tighter. c.yAxis().setRounding(false, false); // Output the chart vp.Image = c.makeWebImage(Chart.PNG); }
//Main code for creating chart. //Note: the argument chartIndex is unused because this demo only has 1 chart. public void createChart(WPFChartViewer viewer, int chartIndex) { // // We use a random table to simulate generating 12 months of data // // Create the random table object with 4 cols * 12 rows, using 3 as seed RanTable rantable = new RanTable(3, 4, 12); // Set the 1st column to be the 12 months of year 2002 rantable.setDateCol(0, new DateTime(2002, 1, 1), 86400 * 30); // Set the 2nd, 3rd and 4th columns to be random numbers starting from 125, 75, and 100 // respectively. The change between rows is set to -35 to + 35. The minimum value of any // cell is 0. rantable.setCol(1, 125, -35, 35, 0); rantable.setCol(2, 75, -35, 35, 0); rantable.setCol(3, 100, -35, 35, 0); // Get the 1st column (time) as the x data double[] dataX = rantable.getCol(0); // Get the 2nd, 3rd and 4th columns as 3 data sets double[] dataY0 = rantable.getCol(1); double[] dataY1 = rantable.getCol(2); double[] dataY2 = rantable.getCol(3); // Create a XYChart object of size 360 x 400 pixels XYChart c = new XYChart(360, 400); // Add a title to the chart c.addTitle("<*underline=2*>Rotated Line Chart Demo", "Times New Roman Bold Italic", 14); // Set the plotarea at (60, 75) and of size 190 x 320 pixels. Turn on both horizontal // and vertical grid lines with light grey color (0xc0c0c0) c.setPlotArea(60, 75, 190, 320).setGridColor(0xc0c0c0, 0xc0c0c0); // Add a legend box at (270, 75) c.addLegend(270, 75); // Swap the x and y axis to become a rotated chart c.swapXY(); // Set the y axis on the top side (right + rotated = top) c.setYAxisOnRight(); // Add a title to the y axis c.yAxis().setTitle("Throughput (MBytes)"); // Reverse the x axis so it is pointing downwards c.xAxis().setReverse(); // Add a line chart layer using the given data LineLayer layer = c.addLineLayer2(); layer.setXData(dataX); layer.addDataSet(dataY0, 0xff0000, "Server A"); layer.addDataSet(dataY1, 0x338033, "Server B"); layer.addDataSet(dataY2, 0x0000ff, "Server C"); // Set the line width to 2 pixels layer.setLineWidth(2); // Output the chart viewer.Chart = c; //include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", "title='[{dataSetName}] {x|mm/yyyy}: {value|0} MByte'"); }
// // Draw the chart and display it in the given viewer. // private void drawChart(WPFChartViewer viewer) { // Create an XYChart object 600 x 270 pixels in size, with light grey (f4f4f4) // background, black (000000) border, 1 pixel raised effect, and with a rounded frame. XYChart c = new XYChart(600, 270, 0xf4f4f4, 0x000000, 1); c.setRoundedFrame(0xffffff); // Set the plotarea at (55, 62) and of size 520 x 175 pixels. Use white (ffffff) // background. Enable both horizontal and vertical grids by setting their colors to // grey (cccccc). Set clipping mode to clip the data lines to the plot area. c.setPlotArea(55, 62, 520, 175, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); c.setClipping(); // Add a title to the chart using 15 pts Times New Roman Bold Italic font, with a light // grey (dddddd) background, black (000000) border, and a glass like raised effect. c.addTitle("Field Intensity at Observation Satellite", "Times New Roman Bold Italic", 15 ).setBackground(0xdddddd, 0x000000, Chart.glassEffect()); // Add a legend box at the top of the plot area with 9pts Arial Bold font. We set the // legend box to the same width as the plot area and use grid layout (as opposed to // flow or top/down layout). This distributes the 3 legend icons evenly on top of the // plot area. LegendBox b = c.addLegend2(55, 33, 3, "Arial Bold", 9); b.setBackground(Chart.Transparent, Chart.Transparent); b.setWidth(520); // Configure the y-axis with a 10pts Arial Bold axis title c.yAxis().setTitle("Intensity (V/m)", "Arial Bold", 10); // Configure the x-axis to auto-scale with at least 75 pixels between major tick and 15 // pixels between minor ticks. This shows more minor grid lines on the chart. c.xAxis().setTickDensity(75, 15); // Set the axes width to 2 pixels c.xAxis().setWidth(2); c.yAxis().setWidth(2); // Now we add the data to the chart DateTime lastTime = timeStamps[timeStamps.Length - 1]; if (lastTime != DateTime.MinValue) { // Set up the x-axis scale. In this demo, we set the x-axis to show the last 240 // samples, with 250ms per sample. c.xAxis().setDateScale(lastTime.AddSeconds( -dataRateTimer.Interval.TotalSeconds * timeStamps.Length), lastTime); // Set the x-axis label format c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // Create a line layer to plot the lines LineLayer layer = c.addLineLayer2(); // The x-coordinates are the timeStamps. layer.setXData(timeStamps); // The 3 data series are used to draw 3 lines. Here we put the latest data values // as part of the data set name, so you can see them updated in the legend box. layer.addDataSet(dataSeriesA, 0xff0000, "Alpha: <*bgColor=FFCCCC*>" + c.formatValue(dataSeriesA[dataSeriesA.Length - 1], " {value|2} ")); layer.addDataSet(dataSeriesB, 0x00cc00, "Beta: <*bgColor=CCFFCC*>" + c.formatValue(dataSeriesB[dataSeriesB.Length - 1], " {value|2} ")); layer.addDataSet(dataSeriesC, 0x0000ff, "Gamma: <*bgColor=CCCCFF*>" + c.formatValue(dataSeriesC[dataSeriesC.Length - 1], " {value|2} ")); } // Assign the chart to the WinChartViewer viewer.Chart = c; }
// // 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; }
// // Draw the chart and display it in the given viewer. // private void drawChart(WinChartViewer viewer) { // Create an XYChart object 600 x 270 pixels in size, with light grey (f4f4f4) // background, black (000000) border, 1 pixel raised effect, and with a rounded frame. XYChart c = new XYChart(600, 270, 0xf4f4f4, 0x000000, 1); c.setRoundedFrame(Chart.CColor(BackColor)); // Set the plotarea at (55, 55) and of size 520 x 185 pixels. Use white (ffffff) // background. Enable both horizontal and vertical grids by setting their colors to // grey (cccccc). Set clipping mode to clip the data lines to the plot area. c.setPlotArea(55, 55, 520, 185, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); c.setClipping(); // Add a title to the chart using 15 pts Times New Roman Bold Italic font, with a light // grey (dddddd) background, black (000000) border, and a glass like raised effect. c.addTitle("Field Intensity at Observation Satellite", "Times New Roman Bold Italic", 15 ).setBackground(0xdddddd, 0x000000, Chart.glassEffect()); // Set the reference font size of the legend box c.getLegend().setFontSize(8); // Configure the y-axis with a 10pts Arial Bold axis title c.yAxis().setTitle("Intensity (V/m)", "Arial Bold", 10); // Configure the x-axis to auto-scale with at least 75 pixels between major tick and 15 // pixels between minor ticks. This shows more minor grid lines on the chart. c.xAxis().setTickDensity(75, 15); // Set the axes width to 2 pixels c.xAxis().setWidth(2); c.yAxis().setWidth(2); // Now we add the data to the chart DateTime firstTime = timeStamps[0]; if (firstTime != DateTime.MinValue) { // Set up the x-axis scale. In this demo, we set the x-axis to show the 240 samples, // with 250ms per sample. c.xAxis().setDateScale(firstTime, firstTime.AddSeconds( dataRateTimer.Interval * timeStamps.Length / 1000)); // Set the x-axis label format c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // Create a line layer to plot the lines LineLayer layer = c.addLineLayer2(); // The x-coordinates are the timeStamps. layer.setXData(timeStamps); // The 3 data series are used to draw 3 lines. layer.addDataSet(dataSeriesA, 0xff0000, "Alpha"); layer.addDataSet(dataSeriesB, 0x00cc00, "Beta"); layer.addDataSet(dataSeriesC, 0x0000ff, "Gamma"); } // Include track line with legend. If the mouse is on the plot area, show the track // line with legend at the mouse position; otherwise, show them for the latest data // values (that is, at the rightmost position). trackLineLegend(c, viewer.IsMouseOnPlotArea ? viewer.PlotAreaMouseX : c.getPlotArea().getRightX()); // Assign the chart to the WinChartViewer viewer.Chart = c; }
// // Draw the chart // private void drawChart(RazorChartViewer viewer) { // Determine the visible x-axis range DateTime viewPortStartDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft)) ; DateTime viewPortEndDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth)); // We need to get the data within the visible x-axis range. In real code, this can be by // using a database query or some other means as specific to the application. In this demo, // we just generate a random data table, and then select the data within the table. RanTable r = getRandomTable(); // Select the data for the visible date range viewPortStartDate to viewPortEndDate. It is // possible there is no data point at exactly viewPortStartDate or viewPortEndDate. In this // case, we also need the data points that are just outside the visible date range to // "overdraw" the line a little bit (the "overdrawn" part will be clipped to the plot area) // In this demo, we do this by adding a one day margin to the date range when selecting the // data. r.selectDate(0, viewPortStartDate.AddDays(-1), viewPortEndDate.AddDays(1)); // The selected data from the random data table DateTime[] timeStamps = Chart.NTime(r.getCol(0)); double[] dataSeriesA = r.getCol(1); double[] dataSeriesB = r.getCol(2); double[] dataSeriesC = r.getCol(3); // // Now we have obtained the data, we can plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object of size 640 x 350 pixels XYChart c = new XYChart(640, 350); // Set the plotarea at (55, 55) with width 80 pixels less than chart width, and height 90 // 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(55, 55, c.getWidth() - 80, c.getHeight() - 90, c.linearGradientColor(0, 55, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // As the data can lie outside the plotarea in a zoomed chart, we need to enable clipping. c.setClipping(); // Add a title to the chart using 18pt Times New Roman Bold Italic font c.addTitle(" Zooming and Scrolling with Track Line", "Times New Roman Bold Italic", 18); // Set the axis stem to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().setColors(Chart.Transparent); // Add axis title using 10pt Arial Bold Italic font c.yAxis().setTitle("Ionic Temperature (C)", "Arial Bold Italic", 10); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use // other layer types (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // In this demo, we do not have too many data points. In real code, the chart may contain a // lot of data points when fully zoomed out - much more than the number of horizontal pixels // in this plot area. So it is a good idea to use fast line mode. layer.setFastLineMode(); // Add up to 3 data series to a line layer, depending on whether the user has selected the // data series. layer.setXData(timeStamps); if (viewer.GetCustomAttr("data0CheckBox") != "F") { layer.addDataSet(dataSeriesA, 0xff3333, "Alpha Series"); } if (viewer.GetCustomAttr("data1CheckBox") != "F") { layer.addDataSet(dataSeriesB, 0x008800, "Beta Series"); } if (viewer.GetCustomAttr("data2CheckBox") != "F") { layer.addDataSet(dataSeriesC, 0x3333cc, "Gamma Series"); } //================================================================================ // Configure axis scale and labelling //================================================================================ // Set the x-axis as a date/time axis with the scale according to the view port x range. viewer.syncDateAxisWithViewPort("x", c.xAxis()); // // In this demo, the time range can be from a few years to a few days. We demonstrate how to // set up different date/time format based on the time range. // // If all ticks are yearly aligned, then we use "yyyy" as the label format. c.xAxis().setFormatCondition("align", 360 * 86400); c.xAxis().setLabelFormat("{value|yyyy}"); // If all ticks are monthly aligned, then we use "mmm yyyy" in bold font as the first label // of a year, and "mmm" for other labels. c.xAxis().setFormatCondition("align", 30 * 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*font=bold*>{value|mmm yyyy}", Chart.AllPassFilter(), "{value|mmm}"); // If all ticks are daily algined, then we use "mmm dd<*br*>yyyy" in bold font as the first // label of a year, and "mmm dd" in bold font as the first label of a month, and "dd" for // other labels. c.xAxis().setFormatCondition("align", 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*block,halign=left*><*font=bold*>{value|mmm dd<*br*>yyyy}", Chart.StartOfMonthFilter(), "<*font=bold*>{value|mmm dd}"); c.xAxis().setMultiFormat2(Chart.AllPassFilter(), "{value|dd}"); // For all other cases (sub-daily ticks), use "hh:nn<*br*>mmm dd" for the first label of a // day, and "hh:nn" for other labels. c.xAxis().setFormatCondition("else"); c.xAxis().setMultiFormat(Chart.StartOfDayFilter(), "<*font=bold*>{value|hh:nn<*br*>mmm dd}", Chart.AllPassFilter(), "{value|hh:nn}"); //================================================================================ // Step 5 - Output the chart //================================================================================ // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Output Javascript chart model to the browser to suppport tracking cursor viewer.ChartModel = c.getJsChartModel(); }
//public void createChart(WinChartViewer viewer, int chartIndex) public void drawChart(WinChartViewer viewer, double[] data, int color, bool init) { int startIndex, endIndex; // Get the start date and end date that are visible on the chart. DateTime viewPortStartDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft)); DateTime viewPortEndDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth)); // Extract the part of the data arrays that are visible. DateTime[] viewPortTimeStamps = null; double[] viewPortData = null; if (init == true) { startIndex = 0; endIndex = data.Length; } else { startIndex = (int)Math.Floor(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortStartDate)); //Real Trend endIndex = (int)Math.Ceiling(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortEndDate)); //Real Trend } int noOfPoints = endIndex - startIndex + 1; viewPortTimeStamps = (DateTime[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); viewPortData = (double[])Chart.arraySlice(data, startIndex, noOfPoints); XYChart c = new XYChart(776, 197, 0x787878, 0x787878); /* c.setPlotArea(30, 10, c.getWidth() - 40, c.getHeight() - 50, * 0x787878, -1, Chart.Transparent, * c.dashLineColor(0xffffff, 0x000303), c.dashLineColor(0xffffff, 0x000303)); */ c.setPlotArea(30, 10, c.getWidth() - 40, c.getHeight() - 50, 0x000000, 0x000000, Chart.LineColor, 0xc0c0c0, 0x000000 ).setGridWidth(2, 1, 1, 1); /* c.setPlotArea(30, 10, c.getWidth() - 40, c.getHeight() - 50, c.linearGradientColor(0, 55, 0, * c.getHeight() - 35, 0xf5f5f5, 0x787878), -1, Chart.Transparent, 0xffffff, 0xffffff);*/ c.xAxis().setColors(0xffffff, 0xffffff, 0xffffff); c.yAxis().setColors(0xffffff, 0xffffff, 0xffffff); c.setClipping(); sb_d.Clear(); sb_d.AppendFormat("{{value|hh:nn:ss.f}}"); c.xAxis().setLabelFormat(sb_d.ToString()); c.setClipping(); LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortData, color, "Heart"); if (currentIndex > 0) { c.xAxis().setDateScale(viewPortStartDate, viewPortEndDate); } //viewer.syncDateAxisWithViewPort("x", c.xAxis()); c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(30); c.xAxis().setLabelStep(100); c.xAxis().setMinTickInc(1); viewer.Chart = c; if (viewer.ImageMap == null) { viewer.ImageMap = viewer.Chart.getHTMLImageMap("", "", ""); } }
// // Draw the chart // private void drawChart(RazorChartViewer viewer) { // // Data to draw the chart. In this demo, the data buffer will be filled by a random data // generator. In real life, the data is probably stored in a buffer (eg. a database table, a // text file, or some global memory) and updated by other means. // // We use a data buffer to emulate the last 240 samples. int sampleSize = 240; double[] dataSeries1 = new double[sampleSize]; double[] dataSeries2 = new double[sampleSize]; double[] dataSeries3 = new double[sampleSize]; DateTime[] timeStamps = new DateTime[sampleSize]; // Our pseudo random number generator DateTime firstDate = DateTime.Now.AddSeconds(-timeStamps.Length); for (int i = 0; i < timeStamps.Length; ++i) { timeStamps[i] = firstDate.AddSeconds(i); double p = timeStamps[i].Ticks / 10000000; dataSeries1[i] = Math.Cos(p * 2.1) * 10 + 1 / (Math.Cos(p) * Math.Cos(p) + 0.01) + 20; dataSeries2[i] = 100 * Math.Sin(p / 27.7) * Math.Sin(p / 10.1) + 150; dataSeries3[i] = 100 * Math.Cos(p / 6.7) * Math.Cos(p / 11.9) + 150; } // Create an XYChart object 600 x 320 pixels in size XYChart c = new XYChart(600, 320); // Set the plotarea at (55, 60) and of size 520 x 235 pixels with transparent background and // border. Enable both horizontal and vertical grids by setting their colors to grey // (cccccc). Set clipping mode to clip the data lines to the plot area. c.setPlotArea(55, 60, 520, 235, -1, -1, Chart.Transparent, 0xcccccc, 0xcccccc); c.setClipping(); // Add a title to the chart using dark grey (0x333333) 20pt Arial Bold font c.addTitle("Realtime Chart with Snapshot", "Arial Bold", 20, 0x333333); // Add a legend box at the top of the plot area using horizontal layout. Use 10pt Arial Bold // font, transparent background and border, and line style legend icon. LegendBox b = c.addLegend(55, 30, false, "Arial Bold", 10); b.setBackground(Chart.Transparent, Chart.Transparent); 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); // Add y-axis title using 12pt Arial font c.yAxis().setTitle("Y-Axis Title Placeholder", "Arial", 12); // For the automatic x and y axis labels, set the minimum spacing to 75 and 30 pixels. c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(30); // Set the x-axis label format c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // Create a line layer to plot the lines LineLayer layer = c.addLineLayer2(); // The x-coordinates are the timeStamps. layer.setXData(timeStamps); // The 3 data series are used to draw 3 lines. Here we put the latest data values as part of // the data set name, so you can see them updated in the legend box. layer.addDataSet(dataSeries1, 0xff0000, c.formatValue(dataSeries1[dataSeries1.Length - 1], "Alpha: {value|2}")); layer.addDataSet(dataSeries2, 0x00cc00, c.formatValue(dataSeries2[dataSeries2.Length - 1], "Beta: {value|2}")); layer.addDataSet(dataSeries3, 0x0000ff, c.formatValue(dataSeries3[dataSeries3.Length - 1], "Gamma: {value|2}")); // Determine the output format if (Request["download"] == "pdf") { viewer.Image = c.makeWebImage(Chart.PDF); } else { viewer.Image = c.makeWebImage(Chart.PNG); } }
// // Create chart // private void createChart(RazorChartViewer viewer) { // In this example, we simply use random data for the 2 data series. RanSeries r = new RanSeries(127); double[] data0 = r.getSeries(180, 70, -5, 5); double[] data1 = r.getSeries(180, 150, -15, 15); DateTime[] timeStamps = r.getDateSeries(180, new DateTime(2014, 3, 1), 86400); // Create a XYChart object of size 640 x 420 pixels XYChart c = new XYChart(640, 420); // Add a title to the chart using 20pt Arial font c.addTitle(" Plasma Stabilizer Energy Usage", "Arial", 20); // Set the plotarea at (55, 60) and of size 560 x 330 pixels, with transparent background and // border and light grey (0xcccccc) horizontal grid lines c.setPlotArea(55, 60, 560, 330, -1, -1, Chart.Transparent, 0xcccccc); // Add a legend box at (55, 30) using horizontal layout, with 10pt Arial Bold as font and // transparent background and border. c.addLegend(55, 30, false, "Arial Bold", 10).setBackground(Chart.Transparent); // Set axis label style to 10pt Arial c.xAxis().setLabelStyle("Arial", 10); c.yAxis().setLabelStyle("Arial", 10); // Set the x and y axis stems to transparent, and the x-axis tick color to grey (0xcccccc) c.xAxis().setColors(Chart.Transparent, Chart.TextColor, Chart.TextColor, 0xcccccc); c.yAxis().setColors(Chart.Transparent); // Configure the x-axis tick lengtht to 10 pixels internal to the plot area c.xAxis().setTickLength(-10, 0); // With the ticks internal to the plot area, the x-axis labels will come very close to the // axis stem, so we configure a wider gap. c.xAxis().setLabelGap(10); // For the automatic axis labels, set the minimum spacing to 80/40 pixels for the x/y axis. c.xAxis().setTickDensity(80); c.yAxis().setTickDensity(40); // Use "mm/yyyy" as the x-axis label format for the first plotted month of a year, and "mm" // for other months c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "{value|mm/yyyy} ", Chart.StartOfMonthFilter(), "{value|mm}"); // Add a title to the y axis using dark grey (0x555555) 12pt Arial Bold font c.yAxis().setTitle("Energy (kWh)", "Arial Bold", 14, 0x555555); // Add a line layer with 2-pixel line width LineLayer layer0 = c.addLineLayer(data0, 0xcc0000, "Power Usage"); layer0.setXData(timeStamps); layer0.setLineWidth(2); // Add an area layer using semi-transparent blue (0x7f0044cc) as the fill color AreaLayer layer1 = c.addAreaLayer(data1, 0x7f0044cc, "Effective Load"); layer1.setXData(timeStamps); layer1.setBorderColor(Chart.SameAsMainColor); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Output Javascript chart model to the browser to suppport tracking cursor viewer.ChartModel = c.getJsChartModel(); }
// // Create chart // private void createChart(RazorChartViewer viewer) { // Data points which more unevenly spaced in time double[] data0Y = { 62, 69, 53, 58, 84, 76, 49, 61, 64, 77, 79 }; DateTime[] data0X = { new DateTime(2007, 1, 1), new DateTime(2007, 1, 2), new DateTime(2007, 1, 5), new DateTime(2007, 1, 7), new DateTime(2007, 1,10), new DateTime(2007, 1, 14), new DateTime(2007, 1, 17), new DateTime(2007, 1, 18), new DateTime(2007, 1, 19), new DateTime(2007, 1, 20), new DateTime(2007, 1, 21) }; // Data points which are evenly spaced in a certain time range double[] data1Y = { 36, 25, 28, 38, 20, 30, 27, 35, 65, 60, 40, 73, 62, 90, 75, 72 }; DateTime data1Start = new DateTime(2007, 1, 1); DateTime data1End = new DateTime(2007, 1, 16); // Data points which are evenly spaced in another time range, in which the spacing is // different from the above series double[] data2Y = { 25, 15, 30, 23, 32, 55, 45 }; DateTime data2Start = new DateTime(2007, 1, 9); DateTime data2End = new DateTime(2007, 1, 21); // Create a XYChart object of size 600 x 400 pixels. Use a vertical gradient color from light // blue (99ccff) to white (ffffff) spanning the top 100 pixels as background. Set border to // grey (888888). Use rounded corners. Enable soft drop shadow. XYChart c = new XYChart(600, 400); c.setBackground(c.linearGradientColor(0, 0, 0, 100, 0x99ccff, 0xffffff), 0x888888); c.setRoundedFrame(); c.setDropShadow(); // Add a title using 18pt Times New Roman Bold Italic font. Set top margin to 16 pixels. c.addTitle("Product Line Order Backlog", "Times New Roman Bold Italic", 18).setMargin2(0, 0, 16, 0); // Set the plotarea at (60, 80) and of 510 x 275 pixels in size. Use transparent border and // dark grey (444444) dotted grid lines PlotArea plotArea = c.setPlotArea(60, 80, 510, 275, -1, -1, Chart.Transparent, c.dashLineColor(0x444444, 0x0101), -1); // Add a legend box where the top-center is anchored to the horizontal center of the plot // area at y = 45. Use horizontal layout and 10 points Arial Bold font, and transparent // background and border. LegendBox legendBox = c.addLegend(plotArea.getLeftX() + plotArea.getWidth() / 2, 45, false, "Arial Bold", 10); legendBox.setAlignment(Chart.TopCenter); legendBox.setBackground(Chart.Transparent, Chart.Transparent); // Set x-axis tick density to 75 pixels and y-axis tick density to 30 pixels. ChartDirector // auto-scaling will use this as the guidelines when putting ticks on the x-axis and y-axis. c.yAxis().setTickDensity(30); c.xAxis().setTickDensity(75); // Set all axes to transparent c.xAxis().setColors(Chart.Transparent); c.yAxis().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 8pt Arial Bold c.xAxis().setLabelStyle("Arial Bold", 8); c.yAxis().setLabelStyle("Arial Bold", 8); c.yAxis2().setLabelStyle("Arial Bold", 8); // Add axis title using 10pt Arial Bold Italic font c.yAxis().setTitle("Backlog in USD millions", "Arial Bold Italic", 10); // Add the first data series LineLayer layer0 = c.addLineLayer2(); layer0.addDataSet(data0Y, 0xff0000, "Quantum Computer").setDataSymbol( Chart.GlassSphere2Shape, 11); layer0.setXData(data0X); layer0.setLineWidth(3); // Add the second data series LineLayer layer1 = c.addLineLayer2(); layer1.addDataSet(data1Y, 0x00ff00, "Atom Synthesizer").setDataSymbol( Chart.GlassSphere2Shape, 11); layer1.setXData2(data1Start, data1End); layer1.setLineWidth(3); // Add the third data series LineLayer layer2 = c.addLineLayer2(); layer2.addDataSet(data2Y, 0xff6600, "Proton Cannon").setDataSymbol(Chart.GlassSphere2Shape, 11); layer2.setXData2(data2Start, data2End); layer2.setLineWidth(3); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("", "", "title='Backlog of {dataSetName} at {x|mm/dd/yyyy}: US$ {value}M'"); }
//Main code for creating chart. //Note: the argument img is unused because this demo only has 1 chart. public void createChart(WinChartViewer viewer, string img) { // The (x, y) data for the first line double[] dataX0 = { 20, 90, 40, 30, 12 }; double[] dataY0 = { 10, 40, 75, 54, 20 }; // The (x, y) data for the second line double[] dataX1 = { 10, 40, 75, 54, 60 }; double[] dataY1 = { 50, 90, 40, 30, 10 }; // Create a XYChart object of size 450 x 450 pixels XYChart c = new XYChart(450, 450); // Set the plotarea at (55, 65) and of size 350 x 300 pixels, with white // background and a light grey border (0xc0c0c0). Turn on both horizontal // and vertical grid lines with light grey color (0xc0c0c0) c.setPlotArea(55, 65, 350, 300, 0xffffff, -1, 0xc0c0c0, 0xc0c0c0, -1); // Add a legend box at (50, 30) (top of the chart) with horizontal // layout. Use 12 pts Times Bold Italic font. Set the background and // border color to Transparent. c.addLegend(50, 30, false, "Times New Roman Bold Italic", 12 ).setBackground(Chart.Transparent); // Add a title to the chart using 18 pts Times Bold Itatic font c.addTitle("Reaction Path", "Times New Roman Bold Italic", 18); // Add a title to the y axis using 12 pts Arial Bold Italic font c.yAxis().setTitle("Temperature (Celcius)", "Arial Bold Italic", 12); // Set the y axis line width to 3 pixels c.yAxis().setWidth(3); // Add a title to the x axis using 12 pts Arial Bold Italic font c.xAxis().setTitle("Pressure (Pa)", "Arial Bold Italic", 12); // Set the x axis line width to 3 pixels c.xAxis().setWidth(3); // Add a red (0xff3333) line layer using dataX0 and dataY0 LineLayer layer1 = c.addLineLayer(dataY0, 0xff3333, "Compound AAA"); layer1.setXData(dataX0); // Set the line width to 3 pixels layer1.setLineWidth(3); // Use 9 pixel square symbols for the data points layer1.getDataSet(0).setDataSymbol(Chart.SquareSymbol, 9); // Add custom text labels to the first and last point on the scatter plot // using Arial Bold font layer1.addCustomDataLabel(0, 0, "Start", "Arial Bold"); layer1.addCustomDataLabel(0, 4, "End", "Arial Bold"); // Add a green (0x33ff33) line layer using dataX1 and dataY1 LineLayer layer2 = c.addLineLayer(dataY1, 0x33ff33, "Compound BBB"); layer2.setXData(dataX1); // Set the line width to 3 pixels layer2.setLineWidth(3); // Use 11 pixel diamond symbols for the data points layer2.getDataSet(0).setDataSymbol(Chart.DiamondSymbol, 11); // Add custom text labels to the first and last point on the scatter plot // using Arial Bold font layer2.addCustomDataLabel(0, 0, "Start", "Arial Bold"); layer2.addCustomDataLabel(0, 4, "End", "Arial Bold"); // Output the chart viewer.Image = c.makeImage(); //include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", "title='[{dataSetName}] Pressure = {x} Pa, Temperature = {value} C'") ; }
//Main code for creating chart. //Note: the argument chartIndex is unused because this demo only has 1 chart. public void createChart(WinChartViewer viewer, int chartIndex) { // In this example, we simply use random data for the 3 data series. RanSeries r = new RanSeries(129); double[] data0 = r.getSeries(100, 100, -15, 15); double[] data1 = r.getSeries(100, 160, -15, 15); double[] data2 = r.getSeries(100, 220, -15, 15); DateTime[] timeStamps = r.getDateSeries(100, new DateTime(2014, 1, 1), 86400); // Create a XYChart object of size 600 x 400 pixels XYChart c = new XYChart(600, 400); // Set default text color to dark grey (0x333333) c.setColor(Chart.TextColor, 0x333333); // Add a title box using grey (0x555555) 20pt Arial font c.addTitle(" Multi-Line Chart Demonstration", "Arial", 20, 0x555555); // Set the plotarea at (70, 70) and of size 500 x 300 pixels, with transparent // background and border and light grey (0xcccccc) horizontal grid lines c.setPlotArea(70, 70, 500, 300, Chart.Transparent, -1, Chart.Transparent, 0xcccccc); // Add a legend box with horizontal layout above the plot area at (70, 35). Use 12pt // Arial font, transparent background and border, and line style legend icon. LegendBox b = c.addLegend(70, 35, false, "Arial", 12); b.setBackground(Chart.Transparent, Chart.Transparent); b.setLineStyleKey(); // Set axis label font to 12pt Arial c.xAxis().setLabelStyle("Arial", 12); c.yAxis().setLabelStyle("Arial", 12); // Set the x and y axis stems to transparent, and the x-axis tick color to grey // (0xaaaaaa) c.xAxis().setColors(Chart.Transparent, Chart.TextColor, Chart.TextColor, 0xaaaaaa); c.yAxis().setColors(Chart.Transparent); // Set the major/minor tick lengths for the x-axis to 10 and 0. c.xAxis().setTickLength(10, 0); // For the automatic axis labels, set the minimum spacing to 80/40 pixels for the x/y // axis. c.xAxis().setTickDensity(80); c.yAxis().setTickDensity(40); // Add a title to the y axis using dark grey (0x555555) 14pt Arial font c.yAxis().setTitle("Y-Axis Title Placeholder", "Arial", 14, 0x555555); // Add a line layer to the chart with 3-pixel line width LineLayer layer = c.addLineLayer2(); layer.setLineWidth(3); // Add 3 data series to the line layer layer.addDataSet(data0, 0x5588cc, "Alpha"); layer.addDataSet(data1, 0xee9944, "Beta"); layer.addDataSet(data2, 0x99bb55, "Gamma"); // The x-coordinates for the line layer layer.setXData(timeStamps); // Output the chart viewer.Chart = c; //include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", "title='[{x|mm/dd/yyyy}] {dataSetName}: {value}'"); }
//Main code for creating chart. //Note: the argument chartIndex is unused because this demo only has 1 chart. public void createChart(WPFChartViewer viewer, int chartIndex) { // The data for the upper and lower bounding lines double[] upperY = { 60, 60, 100, 100, 60, 60 }; double[] lowerY = { 40, 40, 80, 80, 40, 40 }; double[] zoneX = { 0, 2.5, 3.5, 5.5, 6.5, 10 }; // The data for the spline curve double[] curveY = { 50, 44, 54, 48, 58, 50, 90, 85, 104, 82, 96, 90, 74, 52, 35, 58, 46, 54, 48, 52, 50 }; double[] curveX = { 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10 }; // Create a XYChart object of size 600 x 300 pixels, with a light grey (cccccc) // background, black border, and 1 pixel 3D border effect. XYChart c = new XYChart(600, 300, 0xcccccc, 0x000000, 1); // Set the plotarea at (55, 58) and of size 520 x 195 pixels, with white background. // Turn on both horizontal and vertical grid lines with light grey color (cccccc) c.setPlotArea(55, 58, 520, 195, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); // Add a legend box at (55, 32) (top of the chart) with horizontal layout. Use 9pt Arial // Bold font. Set the background and border color to Transparent. c.addLegend(55, 32, false, "Arial Bold", 9).setBackground(Chart.Transparent); // Add a title box to the chart using 15pt Times Bold Italic font. The title is in CDML // and includes embedded images for highlight. The text is white (ffffff) on a black // background, with a 1 pixel 3D border. c.addTitle( "<*block,valign=absmiddle*><*img=star.png*><*img=star.png*> Performance Enhancer " + "<*img=star.png*><*img=star.png*><*/*>", "Times New Roman Bold Italic", 15, 0xffffff ).setBackground(0x000000, -1, 1); // Add a title to the y axis c.yAxis().setTitle("Temperature"); // Add a title to the x axis using CMDL c.xAxis().setTitle( "<*block,valign=absmiddle*><*img=clock.png*> Elapsed Time (hour)<*/*>"); // Set the axes width to 2 pixels c.xAxis().setWidth(2); c.yAxis().setWidth(2); // Add a purple (800080) spline layer to the chart with a line width of 2 pixels SplineLayer splineLayer = c.addSplineLayer(curveY, 0x800080, "Molecular Temperature"); splineLayer.setXData(curveX); splineLayer.setLineWidth(2); // Add a line layer to the chart with two dark green (338033) data sets, and a line // width of 2 pixels LineLayer lineLayer = c.addLineLayer2(); lineLayer.addDataSet(upperY, 0x338033, "Target Zone"); lineLayer.addDataSet(lowerY, 0x338033); lineLayer.setXData(zoneX); lineLayer.setLineWidth(2); // Color the zone between the upper zone line and lower zone line as semi-transparent // light green (8099ff99) c.addInterLineLayer(lineLayer.getLine(0), lineLayer.getLine(1), unchecked ((int)0x8099ff99), unchecked ((int)0x8099ff99)); // If the spline line gets above the upper zone line, color to area between the lines // red (ff0000) c.addInterLineLayer(splineLayer.getLine(0), lineLayer.getLine(0), 0xff0000, Chart.Transparent); // If the spline line gets below the lower zone line, color to area between the lines // blue (0000ff) c.addInterLineLayer(splineLayer.getLine(0), lineLayer.getLine(1), Chart.Transparent, 0x0000ff); // Add a custom CDML text at the bottom right of the plot area as the logo c.addText(575, 250, "<*block,valign=absmiddle*><*img=small_molecule.png*> <*block*><*font=Times New " + "Roman Bold Italic,size=10,color=804040*>Molecular\nEngineering<*/*>").setAlignment( Chart.BottomRight); // Output the chart viewer.Chart = c; //include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", "title='Temperature at hour {x}: {value} C'"); }
private void DrawChart(RazorChartViewer viewer) { //Currently this has been implemented to skip random amount of records //from the list, because I dont have an live updating database int sampleSize = 250; Random rnd = new Random(); int skip = rnd.Next(1, 10); var data = stripData.Skip(skip).Take(sampleSize).ToList(); double[] dataSeries1 = new double[sampleSize]; double[] dataSeries2 = new double[sampleSize]; double[] dataSeries3 = new double[sampleSize]; DateTime[] timeStamps = new DateTime[sampleSize]; DateTime firstDate = DateTime.Now.AddSeconds(-timeStamps.Length); for (int i = 0; i < timeStamps.Length; ++i) { timeStamps[i] = firstDate.AddSeconds(i); dataSeries1[i] = data[i].FHR1; dataSeries2[i] = data[i].FHR2; dataSeries3[i] = data[i].TOCO1; } XYChart c = new XYChart(1200, 400, 0xf4f4f4, 0x000000, 0); c.setRoundedFrame(); // Set the plotarea at (55, 62) and of size 520 x 175 pixels. Use white (ffffff) background. // Enable both horizontal and vertical grids by setting their colors to grey (cccccc). Set // clipping mode to clip the data lines to the plot area. c.setPlotArea(55, 62, 800, 300, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); c.setClipping(); // Add a title to the chart using 15pt Times New Roman Bold Italic font, with a light grey // (dddddd) background, black (000000) border, and a glass like raised effect. c.addTitle("Field Intensity at Observation Satellite", "Times New Roman Bold Italic", 15 ).setBackground(0xdddddd, 0x000000, Chart.glassEffect()); // Add a legend box at the top of the plot area with 9pt Arial Bold font. We set the legend // box to the same width as the plot area and use grid layout (as opposed to flow or top/down // layout). This distributes the 3 legend icons evenly on top of the plot area. LegendBox b = c.addLegend2(55, 33, 3, "Arial Bold", 9); b.setBackground(Chart.Transparent, Chart.Transparent); b.setWidth(520); // Configure the y-axis with a 10pt Arial Bold axis title c.yAxis().setTitle("Intensity (V/m)", "Arial Bold", 10); // Configure the x-axis to auto-scale with at least 75 pixels between major tick and 15 // pixels between minor ticks. This shows more minor grid lines on the chart. c.xAxis().setTickDensity(75, 15); // Set the axes width to 2 pixels c.xAxis().setWidth(2); c.yAxis().setWidth(2); // Set the x-axis label format c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // Create a line layer to plot the lines LineLayer layer = c.addLineLayer2(); // The x-coordinates are the timeStamps. layer.setXData(timeStamps); // The 3 data series are used to draw 3 lines. Here we put the latest data values as part of // the data set name, so you can see them updated in the legend box. layer.addDataSet(dataSeries1, 0xff0000, c.formatValue(dataSeries1[dataSeries1.Length - 1], "Alpha: <*bgColor=FFCCCC*> {value|2} ")); layer.addDataSet(dataSeries2, 0x00cc00, c.formatValue(dataSeries2[dataSeries2.Length - 1], "Beta: <*bgColor=CCFFCC*> {value|2} ")); layer.addDataSet(dataSeries3, 0x0000ff, c.formatValue(dataSeries3[dataSeries3.Length - 1], "Gamma: <*bgColor=CCCCFF*> {value|2} ")); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); }
// // Draw the chart. // private void drawChart(WinChartViewer viewer) { // Get the start date and end date that are visible on the chart. DateTime viewPortStartDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft)); DateTime viewPortEndDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth)); // Get the array indexes that corresponds to the visible start and end dates int startIndex = (int)Math.Floor(Chart.bSearch(timeStamps, viewPortStartDate)); int endIndex = (int)Math.Ceiling(Chart.bSearch(timeStamps, viewPortEndDate)); int noOfPoints = endIndex - startIndex + 1; // Extract the part of the data array that are visible. DateTime[] viewPortTimeStamps = (DateTime[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); double[] viewPortDataSeriesA = (double[])Chart.arraySlice(dataSeriesA, startIndex, noOfPoints); double[] viewPortDataSeriesB = (double[])Chart.arraySlice(dataSeriesB, startIndex, noOfPoints); double[] viewPortDataSeriesC = (double[])Chart.arraySlice(dataSeriesC, startIndex, noOfPoints); // // At this stage, we have extracted the visible data. We can use those data to plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object 600 x 300 pixels in size, with pale blue (0xf0f0ff) background, // black (000000) rounded border, 1 pixel raised effect. XYChart c = new XYChart(600, 300, 0xf0f0ff, 0, 1); c.setRoundedFrame(Chart.CColor(BackColor)); // Set the plotarea at (52, 60) and of size 520 x 205 pixels. Use white (ffffff) background. // Enable both horizontal and vertical grids by setting their colors to grey (cccccc). Set // clipping mode to clip the data lines to the plot area. c.setPlotArea(52, 60, 520, 205, 0xffffff, -1, -1, 0xcccccc, 0xcccccc); // As the data can lie outside the plotarea in a zoomed chart, we need to enable clipping. c.setClipping(); // Add a top title to the chart using 15 pts Times New Roman Bold Italic font, with a light blue // (ccccff) background, black (000000) border, and a glass like raised effect. c.addTitle("Simple Zooming and Scrolling", "Times New Roman Bold Italic", 15 ).setBackground(0xccccff, 0x0, Chart.glassEffect()); // Add a legend box at the top of the plot area with 9pts Arial Bold font with flow layout. c.addLegend(50, 33, false, "Arial Bold", 9).setBackground(Chart.Transparent, Chart.Transparent); // Set axes width to 2 pixels c.yAxis().setWidth(2); c.xAxis().setWidth(2); // Add a title to the y-axis c.yAxis().setTitle("Price (USD)", "Arial Bold", 9); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use other // representations (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); // In this demo, we do not have too many data points. In real code, the chart may contain a lot // of data points when fully zoomed out - much more than the number of horizontal pixels in this // plot area. So it is a good idea to use fast line mode. layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (ff0000), green (00cc00) // and blue (0000ff) layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortDataSeriesA, 0xff0000, "Product Alpha"); layer.addDataSet(viewPortDataSeriesB, 0x00cc00, "Product Beta"); layer.addDataSet(viewPortDataSeriesC, 0x0000ff, "Product Gamma"); //================================================================================ // Configure axis scale and labelling //================================================================================ // Set the x-axis as a date/time axis with the scale according to the view port x range. viewer.syncDateAxisWithViewPort("x", c.xAxis()); // In this demo, we rely on ChartDirector to auto-label the axis. We ask ChartDirector to ensure // the x-axis labels are at least 75 pixels apart to avoid too many labels. c.xAxis().setTickDensity(75); //================================================================================ // Output the chart //================================================================================ viewer.Chart = c; }
// // Draw the chart. // private void drawChart(WPFChartViewer viewer) { // Get the start date and end date that are visible on the chart. double viewPortStartDate = viewer.getValueAtViewPort("x", viewer.ViewPortLeft); double viewPortEndDate = viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth); // Extract the part of the data arrays that are visible. double[] viewPortTimeStamps = null; double[] viewPortDataSeriesA = null; double[] viewPortDataSeriesB = null; if (currentIndex > 0) { // Get the array indexes that corresponds to the visible start and end dates int startIndex = (int)Math.Floor(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortStartDate)); int endIndex = (int)Math.Ceiling(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortEndDate)); int noOfPoints = endIndex - startIndex + 1; // Extract the visible data viewPortTimeStamps = (double[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); viewPortDataSeriesA = (double[])Chart.arraySlice(dataSeriesA, startIndex, noOfPoints); viewPortDataSeriesB = (double[])Chart.arraySlice(dataSeriesB, startIndex, noOfPoints); // Keep track of the latest available data at chart plotting time trackLineEndPos = timeStamps[currentIndex - 1]; } // // At this stage, we have extracted the visible data. We can use those data to plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object of size 640 x 350 pixels XYChart c = new XYChart(640, 350); // Set the plotarea at (55, 50) with width 85 pixels less than chart width, and height 80 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(55, 50, c.getWidth() - 85, c.getHeight() - 80, c.linearGradientColor(0, 50, 0, c.getHeight() - 30, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // As the data can lie outside the plotarea in a zoomed chart, we need enable clipping. c.setClipping(); // Add a title to the chart using 18 pts Times New Roman Bold Italic font c.addTitle(" Multithreading Real-Time Chart", "Arial", 18); // Add a legend box at (55, 25) using horizontal layout. Use 8pts Arial Bold as font. Set the // background and border color to Transparent and use line style legend key. LegendBox b = c.addLegend(55, 25, false, "Arial Bold", 10); b.setBackground(Chart.Transparent); 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); // Add axis title using 10pts Arial Bold Italic font c.yAxis().setTitle("Ionic Temperature (C)", "Arial Bold", 10); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use other // representations (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (ff0000), green (00cc00) // and blue (0000ff) layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortDataSeriesA, 0xff0000, "Alpha"); layer.addDataSet(viewPortDataSeriesB, 0x00cc00, "Beta"); //================================================================================ // Configure axis scale and labelling //================================================================================ if (currentIndex > 0) { c.xAxis().setDateScale(viewPortStartDate, viewPortEndDate); } // For the automatic axis labels, set the minimum spacing to 75/30 pixels for the x/y axis. c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(30); // We use "hh:nn:ss" as the axis label format. c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // We make sure the tick increment must be at least 1 second. c.xAxis().setMinTickInc(1); // 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 //================================================================================ // We need to update the track line too. If the mouse is moving on the chart (eg. if // the user drags the mouse on the chart to scroll it), the track line will be updated // in the MouseMovePlotArea event. Otherwise, we need to update the track line here. if (!WPFChartViewer1.IsInMouseMoveEvent) { trackLineLabel(c, trackLineIsAtEnd ? c.getWidth() : viewer.PlotAreaMouseX); } viewer.Chart = c; }
// // Draw the chart. // private void drawChart(WinChartViewer viewer) { // Get the start date and end date that are visible on the chart. double viewPortStartDate = viewer.getValueAtViewPort("x", viewer.ViewPortLeft); double viewPortEndDate = viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth); // Extract the part of the data arrays that are visible. double[] viewPortTimeStamps = null; double[] viewPortDataSeriesA = null; double[] viewPortDataSeriesB = null; if (currentIndex > 0) { // Get the array indexes that corresponds to the visible start and end dates int startIndex = (int)Math.Floor(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortStartDate)); int endIndex = (int)Math.Ceiling(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortEndDate)); int noOfPoints = endIndex - startIndex + 1; // Extract the visible data viewPortTimeStamps = (double[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); viewPortDataSeriesA = (double[])Chart.arraySlice(dataSeriesA, startIndex, noOfPoints); viewPortDataSeriesB = (double[])Chart.arraySlice(dataSeriesB, startIndex, noOfPoints); chartTimeLimit = timeStamps[currentIndex - 1]; } // // At this stage, we have extracted the visible data. We can use those data to plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object of size 640 x 350 pixels XYChart c = new XYChart(512, 288); // Set the position, size and colors of the plot area c.setPlotArea(23, 33, c.getWidth() - 41, c.getHeight() - 53, c.linearGradientColor(0, 33, 0, c.getHeight() - 53, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // As the data can lie outside the plotarea in a zoomed chart, we need enable clipping. c.setClipping(); // Add a title to the chart using 18 pts Arial font c.addTitle("Gerçek Zamanlı Motor Verileri", "Arial", 18); // Add a legend box at (60, 28) using horizontal layout. Use 8pts Arial Bold as font. Set the // background and border color to Transparent and use line style legend key. LegendBox b = c.addLegend(60, 28, false, "Arial Bold", 10); b.setBackground(Chart.Transparent); 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 Bold", 10, 0x336699); // Set the y-axis tick length to 0 to disable the tick and put the labels closer to the axis. c.yAxis().setLabelGap(-1); c.yAxis().setLabelAlignment(1); c.yAxis().setTickLength(0); c.yAxis().setMargin(20); // Add axis title using 12pts Arial Bold Italic font c.yAxis().setTitle("Angular Rate", "Arial Bold", 12); // Configure the x-axis tick length to 1 to put the labels closer to the axis. c.xAxis().setTickLength(1); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use other // representations (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (ff0000), green (00cc00) // and blue (0000ff) layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortDataSeriesA, 0x00cc00, "Motor Devir"); layer.addDataSet(viewPortDataSeriesB, 0x0000ff, "Motor Sicaklik"); //================================================================================ // Configure axis scale and labelling //================================================================================ if (currentIndex > 0) { c.xAxis().setDateScale(viewPortStartDate, viewPortEndDate); } // For the automatic axis labels, set the minimum spacing to 75/30 pixels for the x/y axis. c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(30); // We use "hh:nn:ss" as the axis label format. c.xAxis().setLabelFormat("{value|nn:ss}"); // We make sure the tick increment must be at least 1 second. c.xAxis().setMinTickInc(1); //================================================================================ // Output the chart //================================================================================ // We need to update the track line too. trackLineLabel(c); // Set the chart image to the WinChartViewer viewer.Chart = c; }
// // Draw the chart. // private void drawChart(WPFChartViewer viewer) { // Get the start date and end date that are visible on the chart. DateTime viewPortStartDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft)); DateTime viewPortEndDate = Chart.NTime(viewer.getValueAtViewPort("x", viewer.ViewPortLeft + viewer.ViewPortWidth)); // Extract the part of the data arrays that are visible. DateTime[] viewPortTimeStamps = null; double[] viewPortDataSeriesA = null; double[] viewPortDataSeriesB = null; double[] viewPortDataSeriesC = null; if (currentIndex > 0) { // Get the array indexes that corresponds to the visible start and end dates int startIndex = (int)Math.Floor(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortStartDate)); int endIndex = (int)Math.Ceiling(Chart.bSearch2(timeStamps, 0, currentIndex, viewPortEndDate)); int noOfPoints = endIndex - startIndex + 1; // Extract the visible data viewPortTimeStamps = (DateTime[])Chart.arraySlice(timeStamps, startIndex, noOfPoints); viewPortDataSeriesA = (double[])Chart.arraySlice(dataSeriesA, startIndex, noOfPoints); viewPortDataSeriesB = (double[])Chart.arraySlice(dataSeriesB, startIndex, noOfPoints); viewPortDataSeriesC = (double[])Chart.arraySlice(dataSeriesC, startIndex, noOfPoints); } // // At this stage, we have extracted the visible data. We can use those data to plot the chart. // //================================================================================ // Configure overall chart appearance. //================================================================================ // Create an XYChart object of size 640 x 350 pixels XYChart c = new XYChart(640, 350); // Set the plotarea at (55, 50) with width 80 pixels less than chart width, and height 85 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(55, 50, c.getWidth() - 85, c.getHeight() - 80, c.linearGradientColor(0, 50, 0, c.getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Chart.Transparent, 0xffffff, 0xffffff); // As the data can lie outside the plotarea in a zoomed chart, we need enable clipping. c.setClipping(); // Add a title to the chart using 18 pts Times New Roman Bold Italic font c.addTitle(" Realtime Chart with Zoom/Scroll and Track Line", "Arial", 18); // Add a legend box at (55, 25) using horizontal layout. Use 8pts Arial Bold as font. Set the // background and border color to Transparent and use line style legend key. LegendBox b = c.addLegend(55, 25, false, "Arial Bold", 10); b.setBackground(Chart.Transparent); 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); // Add axis title using 10pts Arial Bold Italic font c.yAxis().setTitle("Ionic Temperature (C)", "Arial Bold", 10); //================================================================================ // Add data to chart //================================================================================ // // In this example, we represent the data by lines. You may modify the code below to use other // representations (areas, scatter plot, etc). // // Add a line layer for the lines, using a line width of 2 pixels LineLayer layer = c.addLineLayer2(); layer.setLineWidth(2); layer.setFastLineMode(); // Now we add the 3 data series to a line layer, using the color red (ff0000), green (00cc00) // and blue (0000ff) layer.setXData(viewPortTimeStamps); layer.addDataSet(viewPortDataSeriesA, 0xff0000, "Alpha"); layer.addDataSet(viewPortDataSeriesB, 0x00cc00, "Beta"); layer.addDataSet(viewPortDataSeriesC, 0x0000ff, "Gamma"); //================================================================================ // Configure axis scale and labelling //================================================================================ if (currentIndex > 0) { c.xAxis().setDateScale(viewPortStartDate, viewPortEndDate); } // For the automatic axis labels, set the minimum spacing to 75/30 pixels for the x/y axis. c.xAxis().setTickDensity(75); c.yAxis().setTickDensity(30); // // In a zoomable chart, the time range can be from a few years to a few seconds. We can need // to define the date/time format the various cases. // // If all ticks are year aligned, we use "yyyy" as the label format. c.xAxis().setFormatCondition("align", 360 * 86400); c.xAxis().setLabelFormat("{value|yyyy}"); // If all ticks are month aligned, we use "mmm yyyy" in bold font as the first label of a year, // and "mmm" for other labels. c.xAxis().setFormatCondition("align", 30 * 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*font=bold*>{value|mmm yyyy}", Chart.AllPassFilter(), "{value|mmm}"); // If all ticks are day algined, we use "mmm dd<*br*>yyyy" in bold font as the first label of a // year, and "mmm dd" in bold font as the first label of a month, and "dd" for other labels. c.xAxis().setFormatCondition("align", 86400); c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "<*block,halign=left*><*font=bold*>{value|mmm dd<*br*>yyyy}", Chart.StartOfMonthFilter(), "<*font=bold*>{value|mmm dd}"); c.xAxis().setMultiFormat2(Chart.AllPassFilter(), "{value|dd}"); // If all ticks are hour algined, we use "hh:nn<*br*>mmm dd" in bold font as the first label of // the Day, and "hh:nn" for other labels. c.xAxis().setFormatCondition("align", 3600); c.xAxis().setMultiFormat(Chart.StartOfDayFilter(), "<*font=bold*>{value|hh:nn<*br*>mmm dd}", Chart.AllPassFilter(), "{value|hh:nn}"); // If all ticks are minute algined, then we use "hh:nn" as the label format. c.xAxis().setFormatCondition("align", 60); c.xAxis().setLabelFormat("{value|hh:nn}"); // If all other cases, we use "hh:nn:ss" as the label format. c.xAxis().setFormatCondition("else"); c.xAxis().setLabelFormat("{value|hh:nn:ss}"); // We make sure the tick increment must be at least 1 second. c.xAxis().setMinTickInc(1); //================================================================================ // Output the chart //================================================================================ // We need to update the track line too. If the mouse is moving on the chart (eg. if // the user drags the mouse on the chart to scroll it), the track line will be updated // in the MouseMovePlotArea event. Otherwise, we need to update the track line here. if (!viewer.IsInMouseMoveEvent) { trackLineLabel(c, (null == viewer.Chart) ? c.getPlotArea().getRightX() : viewer.PlotAreaMouseX); } viewer.Chart = c; }
// // Create chart // private void createChart(RazorChartViewer viewer) { // In this example, the data points are unevenly spaced on the x-axis double[] dataY = { 4.7, 4.7, 6.6, 2.2, 4.7, 4.0, 4.0, 5.1, 4.5, 4.5, 6.8, 4.5, 4, 2.1, 3, 2.5, 2.5, 3.1 }; DateTime[] dataX = { new DateTime(1999, 7, 1), new DateTime(2000, 1, 1), new DateTime(2000, 2, 1), new DateTime(2000, 4, 1), new DateTime(2000, 5, 8), new DateTime(2000, 7, 5), new DateTime(2001, 3, 5), new DateTime(2001, 4, 7), new DateTime(2001, 5, 9), new DateTime(2002, 2, 4), new DateTime(2002, 4, 4), new DateTime(2002, 5, 8), new DateTime(2002, 7, 7), new DateTime(2002, 8, 30), new DateTime(2003, 1, 2), new DateTime(2003, 2, 16), new DateTime(2003, 11, 6), new DateTime(2004, 1, 4) }; // Data points are assigned different symbols based on point type double[] pointType = { 0, 1, 0, 1, 2, 1, 0, 0, 1, 1, 2, 2, 1, 0, 2, 1, 2, 0 }; // Create a XYChart object of size 480 x 320 pixels. Use a vertical gradient color from pale // blue (e8f0f8) to sky blue (aaccff) spanning half the chart height as background. Set // border to blue (88aaee). Use rounded corners. Enable soft drop shadow. XYChart c = new XYChart(480, 320); c.setBackground(c.linearGradientColor(0, 0, 0, c.getHeight() / 2, 0xe8f0f8, 0xaaccff), 0x88aaee); c.setRoundedFrame(); c.setDropShadow(); // Add a title to the chart using 15 points Arial Italic font. Set top/bottom margins to 12 // pixels. ChartDirector.TextBox title = c.addTitle("Multi-Symbol Line Chart Demo", "Arial Italic", 15); title.setMargin2(0, 0, 12, 12); // Tentatively set the plotarea to 50 pixels from the left edge to allow for the y-axis, and // to just under the title. Set the width to 65 pixels less than the chart width, and the // height to reserve 90 pixels at the bottom for the x-axis and the legend box. Use pale blue // (e8f0f8) background, transparent border, and grey (888888) dotted horizontal and vertical // grid lines. c.setPlotArea(50, title.getHeight(), c.getWidth() - 65, c.getHeight() - title.getHeight() - 90, 0xe8f0f8, -1, Chart.Transparent, c.dashLineColor(0x888888, Chart.DotLine), -1); // Add a legend box where the bottom-center is anchored to the 12 pixels above the // bottom-center of the chart. Use horizontal layout and 8 points Arial font. LegendBox legendBox = c.addLegend(c.getWidth() / 2, c.getHeight() - 12, false, "Arial Bold", 8); legendBox.setAlignment(Chart.BottomCenter); // Set the legend box background and border to pale blue (e8f0f8) and bluish grey (445566) legendBox.setBackground(0xe8f0f8, 0x445566); // Use rounded corners of 5 pixel radius for the legend box legendBox.setRoundedCorners(5); // Set the y axis label format to display a percentage sign c.yAxis().setLabelFormat("{value}%"); // Set y-axis title to use 10 points Arial Bold Italic font c.yAxis().setTitle("Axis Title Placeholder", "Arial Bold Italic", 10); // Set axis labels to use Arial Bold font c.yAxis().setLabelStyle("Arial Bold"); c.xAxis().setLabelStyle("Arial Bold"); // We add the different data symbols using scatter layers. The scatter layers are added // before the line layer to make sure the data symbols stay on top of the line layer. // We select the points with pointType = 0 (the non-selected points will be set to NoValue), // and use yellow (ffff00) 15 pixels high 5 pointed star shape symbols for the points. (This // example uses both x and y coordinates. For charts that have no x explicitly coordinates, // use an empty array as dataX.) c.addScatterLayer(Chart.CTime(dataX), new ArrayMath(dataY).selectEQZ(pointType, Chart.NoValue ).result(), "Point Type 0", Chart.StarShape(5), 15, 0xffff00); // Similar to above, we select the points with pointType - 1 = 0 and use green (ff00) 13 // pixels high six-sided polygon as symbols. c.addScatterLayer(Chart.CTime(dataX), new ArrayMath(dataY).selectEQZ(new ArrayMath(pointType ).sub(1).result(), Chart.NoValue).result(), "Point Type 1", Chart.PolygonShape(6), 13, 0x00ff00); // Similar to above, we select the points with pointType - 2 = 0 and use red (ff0000) 13 // pixels high X shape as symbols. c.addScatterLayer(Chart.CTime(dataX), new ArrayMath(dataY).selectEQZ(new ArrayMath(pointType ).sub(2).result(), Chart.NoValue).result(), "Point Type 2", Chart.Cross2Shape(), 13, 0xff0000); // Finally, add a blue (0000ff) line layer with line width of 2 pixels LineLayer layer = c.addLineLayer(dataY, 0x0000ff); layer.setXData(Chart.CTime(dataX)); layer.setLineWidth(2); // Adjust the plot area size, such that the bounding box (inclusive of axes) is 10 pixels // from the left edge, just below the title, 25 pixels from the right edge, and 8 pixels // above the legend box. c.packPlotArea(10, title.getHeight(), c.getWidth() - 25, c.layoutLegend().getTopY() - 8); // Output the chart viewer.Image = c.makeWebImage(Chart.PNG); // Include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("", "", "title='{x|mmm dd, yyyy}: {value}%'"); }
//Main code for creating chart. //Note: the argument chartIndex is unused because this demo only has 1 chart. public void createChart(WPFChartViewer viewer, int chartIndex) { // In this example, we simply use random data for the 2 data series. RanSeries r = new RanSeries(127); double[] data0 = r.getSeries(180, 70, -5, 5); double[] data1 = r.getSeries(180, 150, -15, 15); DateTime[] timeStamps = r.getDateSeries(180, new DateTime(2014, 3, 1), 86400); // Create a XYChart object of size 640 x 420 pixels XYChart c = new XYChart(640, 420); // Set default text color to dark grey (0x333333) c.setColor(Chart.TextColor, 0x333333); // Add a title box using grey (0x555555) 20pt Arial Bold font c.addTitle(" Plasma Stabilizer Energy Usage", "Arial Bold", 20, 0x555555); // Set the plotarea at (70, 70) and of size 540 x 320 pixels, with transparent // background and border and light grey (0xcccccc) horizontal grid lines c.setPlotArea(70, 70, 540, 320, -1, -1, Chart.Transparent, 0xcccccc); // Add a legend box with horizontal layout above the plot area at (70, 32). Use 12pt // Arial Bold dark grey (0x555555) font, transparent background and border, and line // style legend icon. LegendBox b = c.addLegend(70, 32, false, "Arial Bold", 12); b.setFontColor(0x555555); b.setBackground(Chart.Transparent, Chart.Transparent); b.setLineStyleKey(); // Set axis label font to 12pt Arial c.xAxis().setLabelStyle("Arial", 12); c.yAxis().setLabelStyle("Arial", 12); // Set the x and y axis stems to transparent, and the x-axis tick color to grey // (0xaaaaaa) c.xAxis().setColors(Chart.Transparent, Chart.TextColor, Chart.TextColor, 0xaaaaaa); c.yAxis().setColors(Chart.Transparent); // Set the major/minor tick lengths for the x-axis to 10 and 0. c.xAxis().setTickLength(10, 0); // For the automatic axis labels, set the minimum spacing to 80/40 pixels for the x/y // axis. c.xAxis().setTickDensity(80); c.yAxis().setTickDensity(40); // Use "mm/yyyy" as the x-axis label format for the first plotted month of a year, and // "mm" for other months c.xAxis().setMultiFormat(Chart.StartOfYearFilter(), "{value|mm/yyyy} ", Chart.StartOfMonthFilter(), "{value|mm}"); // Add a title to the y axis using dark grey (0x555555) 12pt Arial Bold font c.yAxis().setTitle("Energy (kWh)", "Arial Bold", 14, 0x555555); // Add a line layer with 2-pixel line width LineLayer layer0 = c.addLineLayer(data0, 0xcc0000, "Power Usage"); layer0.setXData(timeStamps); layer0.setLineWidth(2); // Add an area layer using semi-transparent blue (0x7f0044cc) as the fill color AreaLayer layer1 = c.addAreaLayer(data1, 0x7f0044cc, "Effective Load"); layer1.setXData(timeStamps); layer1.setBorderColor(Chart.SameAsMainColor); // Output the chart viewer.Chart = c; //include tool tip for the chart viewer.ImageMap = c.getHTMLImageMap("clickable", "", "title='[{x|mm dd, yyyy}] {value} kWh'"); }