private void DrawLegend(Graphics g, float xCenter, float yCenter, float hWidth, float hHeight, DataCollection dc, ChartStyle cs) { float spacing = 8.0f; float textHeight = 8.0f; float htextHeight = textHeight / 2.0f; float lineLength = 30.0f; float hlineLength = lineLength / 2.0f; Rectangle legendRectangle; Pen aPen = new Pen(LegendBorderColor, 1f); SolidBrush aBrush = new SolidBrush(LegendBackColor); if (isLegendVisible) { legendRectangle = new Rectangle((int)xCenter - (int)hWidth, (int)yCenter - (int)hHeight, (int)(2.0f * hWidth), (int)(2.0f * hHeight)); g.FillRectangle(aBrush, legendRectangle); if (IsBorderVisible) { g.DrawRectangle(aPen, legendRectangle); } int n = 1; foreach (DataSeries ds in dc.DataSeriesList) { // Draw lines and symbols: float xSymbol = legendRectangle.X + spacing + hlineLength; float xText = legendRectangle.X + 2 * spacing + lineLength; float yText = legendRectangle.Y + n * spacing + (2 * n - 1) * htextHeight; aPen = new Pen(ds.LineStyle.LineColor, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; PointF ptStart = new PointF(legendRectangle.X + spacing, yText); PointF ptEnd = new PointF(legendRectangle.X + spacing + lineLength, yText); g.DrawLine(aPen, ptStart, ptEnd); ds.SymbolStyle.DrawSymbol(g, new PointF(xSymbol, yText)); // Draw text: StringFormat sFormat = new StringFormat(); sFormat.Alignment = StringAlignment.Near; g.DrawString(ds.SeriesName, LegendFont, new SolidBrush(textColor), new PointF(xText, yText - 8), sFormat); n++; } } aPen.Dispose(); aBrush.Dispose(); }
public void AddLines(Graphics g, ChartStyle cs) { // Plot lines: foreach (DataSeries ds in DataSeriesList) { if (ds.LineStyle.IsVisible == true) { Pen aPen = new Pen(ds.LineStyle.LineColor, ds.LineStyle.Thickness); aPen.DashStyle = ds.LineStyle.Pattern; if (ds.LineStyle.PlotMethod == LineStyle.PlotLinesMethodEnum.Lines) { for (int i = 1; i < ds.PointList.Count; i++) { if (!ds.IsY2Data) { g.DrawLine(aPen, cs.Point2D((PointF)ds.PointList[i - 1]), cs.Point2D((PointF)ds.PointList[i])); } else { g.DrawLine(aPen, cs.Point2DY2((PointF)ds.PointList[i - 1]), cs.Point2DY2((PointF)ds.PointList[i])); } } } else if (ds.LineStyle.PlotMethod == LineStyle.PlotLinesMethodEnum.Splines) { ArrayList al = new ArrayList(); for (int i = 0; i < ds.PointList.Count; i++) { PointF pt = (PointF)ds.PointList[i]; if (!ds.IsY2Data) { if (pt.X >= cs.XLimMin && pt.X <= cs.XLimMax && pt.Y >= cs.YLimMin && pt.Y <= cs.YLimMax) { al.Add(pt); } } else { if (pt.X >= cs.XLimMin && pt.X <= cs.XLimMax && pt.Y >= cs.Y2LimMin && pt.Y <= cs.Y2LimMax) { al.Add(pt); } } } PointF[] pts = new PointF[al.Count]; for (int i = 0; i < pts.Length; i++) { if (!ds.IsY2Data) { pts[i] = cs.Point2D((PointF)(al[i])); } else { pts[i] = cs.Point2DY2((PointF)(al[i])); } } g.DrawCurve(aPen, pts); } aPen.Dispose(); } } // Plot Symbols: foreach (DataSeries ds in DataSeriesList) { for (int i = 0; i < ds.PointList.Count; i++) { PointF pt = (PointF)ds.PointList[i]; if (!ds.IsY2Data) { if (pt.X >= cs.XLimMin && pt.X <= cs.XLimMax && pt.Y >= cs.YLimMin && pt.Y <= cs.YLimMax) { ds.SymbolStyle.DrawSymbol(g, cs.Point2D((PointF)ds.PointList[i])); } } else { if (pt.X >= cs.XLimMin && pt.X <= cs.XLimMax && pt.Y >= cs.Y2LimMin && pt.Y <= cs.Y2LimMax) { ds.SymbolStyle.DrawSymbol(g, cs.Point2DY2((PointF)ds.PointList[i])); } } } } }
// Shared initialization code void Initialize() { this.AutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable; BackColor = Color.Wheat; // Set Form1 size: // this.Width = 350; // this.Height = 300; // Sub Chart parameters: sc = new SubChart(this); sc.TotalChartBackColor = Color.White; sc.Margin = 20; sc.Rows = 2; sc.Cols = 2; // Sub-chart 1 (0, 0): dc1 = new DataCollection(); cs1 = new ChartStyle(this); cs1.TickFont = new Font("Arial", 7, FontStyle.Regular); cs1.TitleFont = new Font("Arial", 10, FontStyle.Regular); cs1.XLimMin = 0f; cs1.XLimMax = 7f; cs1.YLimMin = -1.5f; cs1.YLimMax = 1.5f; cs1.XTick = 1.0f; cs1.YTick = 0.5f; cs1.Title = "Sin(x)"; // Sub-chart 2 (0, 1): dc2 = new DataCollection(); cs2 = new ChartStyle(this); cs2.TickFont = new Font("Arial", 7, FontStyle.Regular); cs2.TitleFont = new Font("Arial", 10, FontStyle.Regular); cs2.XLimMin = 0f; cs2.XLimMax = 7f; cs2.YLimMin = -1.5f; cs2.YLimMax = 1.5f; cs2.XTick = 1.0f; cs2.YTick = 0.5f; cs2.Title = "Cos(x)"; // Sub-chart 3 (1, 0): dc3 = new DataCollection(); cs3 = new ChartStyle(this); cs3.TickFont = new Font("Arial", 7, FontStyle.Regular); cs3.TitleFont = new Font("Arial", 10, FontStyle.Regular); cs3.XLimMin = 0f; cs3.XLimMax = 7f; cs3.YLimMin = -0.5f; cs3.YLimMax = 1.5f; cs3.XTick = 1.0f; cs3.YTick = 0.5f; cs3.Title = "Sin(x)^2"; // Sub-chart 4 (1, 1): dc4 = new DataCollection(); cs4 = new ChartStyle(this); cs4.IsY2Axis = true; cs4.IsXGrid = false; cs4.IsYGrid = false; cs4.TickFont = new Font("Arial", 7, FontStyle.Regular); cs4.TitleFont = new Font("Arial", 10, FontStyle.Regular); cs4.XLimMin = 0f; cs4.XLimMax = 30f; cs4.YLimMin = -20f; cs4.YLimMax = 20f; cs4.XTick = 5.0f; cs4.YTick = 5f; cs4.Y2LimMin = 100f; cs4.Y2LimMax = 700f; cs4.Y2Tick = 100f; cs4.XLabel = "X Axis"; cs4.YLabel = "Y Axis"; cs4.Y2Label = "Y2 Axis"; cs4.Title = "With Y2 Axis"; lg = new Legend(); lg.IsLegendVisible = true; lg.LegendPosition = Legend.LegendPositionEnum.SouthEast; }
public void AddLegend(Graphics g, DataCollection dc, ChartStyle cs) { if (dc.DataSeriesList.Count < 1) { return; } if (!IsLegendVisible) { return; } int numberOfDataSeries = dc.DataSeriesList.Count; string[] legendLabels = new string[dc.DataSeriesList.Count]; int n = 0; foreach (DataSeries ds in dc.DataSeriesList) { legendLabels[n] = ds.SeriesName; n++; } float offSet = 10; float xc = 0f; float yc = 0f; SizeF size = g.MeasureString(legendLabels[0], LegendFont); float legendWidth = size.Width; for (int i = 0; i < legendLabels.Length; i++) { size = g.MeasureString(legendLabels[i], LegendFont); float tempWidth = size.Width; if (legendWidth < tempWidth) { legendWidth = tempWidth; } } legendWidth = legendWidth + 50.0f; float hWidth = legendWidth / 2; float legendHeight = 18.0f * numberOfDataSeries; float hHeight = legendHeight / 2; switch (LegendPosition) { case LegendPositionEnum.East: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height / 2; break; case LegendPositionEnum.North: xc = cs.PlotArea.X + cs.PlotArea.Width / 2; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.NorthEast: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.NorthWest: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.South: xc = cs.PlotArea.X + cs.PlotArea.Width / 2; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.SouthEast: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.SouthWest: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.West: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height / 2; break; } DrawLegend(g, xc, yc, hWidth, hHeight, dc, cs); }
public void AddLegend(Graphics g, DataCollection dc, ChartStyle cs) { if (dc.DataSeriesList.Count < 1) { return; } if (!IsLegendVisible) { return; } int numberOfDataSeries = dc.DataSeriesList.Count; string[] legendLabels = new string[dc.DataSeriesList.Count]; int n = 0; foreach (DataSeries ds in dc.DataSeriesList) { legendLabels[n] = ds.SeriesName; n++; } float offSet = 10; float xc = 0f; float yc = 0f; SizeF size = g.MeasureString(legendLabels[0], LegendFont); float legendWidth = size.Width; for (int i = 0; i < legendLabels.Length; i++) { size = g.MeasureString(legendLabels[i], LegendFont); float tempWidth = size.Width; if (legendWidth < tempWidth) legendWidth = tempWidth; } legendWidth = legendWidth + 50.0f; float hWidth = legendWidth / 2; float legendHeight = 18.0f * numberOfDataSeries; float hHeight = legendHeight / 2; switch (LegendPosition) { case LegendPositionEnum.East: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height / 2; break; case LegendPositionEnum.North: xc = cs.PlotArea.X + cs.PlotArea.Width / 2; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.NorthEast: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.NorthWest: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + offSet + hHeight; break; case LegendPositionEnum.South: xc = cs.PlotArea.X + cs.PlotArea.Width / 2; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.SouthEast: xc = cs.PlotArea.X + cs.PlotArea.Width - offSet - hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.SouthWest: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height - offSet - hHeight; break; case LegendPositionEnum.West: xc = cs.PlotArea.X + offSet + hWidth; yc = cs.PlotArea.Y + cs.PlotArea.Height / 2; break; } DrawLegend(g, xc, yc, hWidth, hHeight, dc, cs); }