MS Chart 增加Y轴方法

MS Chart Controls 确实不错,需求是实现柱状图与线分别使用不同的Y轴。因为线的值是累加当月到10号的实笔法产油总量,弄了好久,终于实现此效果,但似乎不是很完美。也很麻烦。下面是实现代码:

 ids = rule.getNSCData(txt_RQ.Text);
        //年生产动态
        Chart1.DataSource = ids.Tables["NCL"];
        Chart1.Series["Series1"].XValueMember = "RQ";
        Chart1.Series["Series1"].YValueMembers = "yjh";
        Chart1.Series["Series2"].XValueMember = "RQ";
        Chart1.Series["Series2"].YValueMembers = "YL";
        Chart1.Series["Series3"].YValueMembers = "otherYL";
        Chart1.DataBind();
        //调整区域位置
        Chart1.ChartAreas["ChartArea1"].Position = new ElementPosition(20, 9, 80, 85);
        Chart1.ChartAreas["ChartArea1"].InnerPlotPosition = new ElementPosition(7, 0, 90, 90);
        //创建第3个series的额外Y轴
        CreateYAxis(Chart1, Chart1.ChartAreas["ChartArea1"], Chart1.Series["Series3"], 16,8);
        //月生产动态

 

/// <summary>
    /// 创建Y轴
    /// </summary>
    /// <param name="chart"></param>
    /// <param name="area"></param>
    /// <param name="series"></param>
    /// <param name="axisOffset"></param>
    /// <param name="labelsSize"></param>
    public void CreateYAxis(Chart chart, ChartArea area, Series series, float axisOffset, float labelsSize)
    {
        // 根跟据原来的区域创建CreateArea
        ChartArea areaSeries = chart.ChartAreas.Add("ChartArea_" + series.Name);
        areaSeries.BackColor = Color.Transparent;
        areaSeries.BorderColor = Color.Transparent;
        areaSeries.Position.FromRectangleF(area.Position.ToRectangleF());
        areaSeries.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF());
        areaSeries.AxisX.MajorGrid.Enabled = false;
        areaSeries.AxisX.MajorTickMark.Enabled = false;
        areaSeries.AxisX.LabelStyle.Enabled = false;
        areaSeries.AxisY.MajorGrid.Enabled = false;
        areaSeries.AxisY.MajorTickMark.Enabled = false;
        areaSeries.AxisY.LabelStyle.Enabled = false;
        areaSeries.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
        series.ChartArea = areaSeries.Name;

        // 在新的区域创建Y轴
        ChartArea areaAxis = chart.ChartAreas.Add("AxisY_" + series.ChartArea);
        areaAxis.BackColor = Color.Transparent;
        areaAxis.BorderColor = Color.Transparent;
        areaAxis.Position.FromRectangleF(chart.ChartAreas[series.ChartArea].Position.ToRectangleF());
        areaAxis.InnerPlotPosition.FromRectangleF(chart.ChartAreas[series.ChartArea].InnerPlotPosition.ToRectangleF());
        areaAxis.AxisY.Title = "单位:万吨";
        // 创建一个指定的Series副本
        Series seriesCopy = chart.Series.Add(series.Name + "_Copy");
        seriesCopy.ChartType = series.ChartType;
        foreach (DataPoint point in series.Points)
        {
            seriesCopy.Points.AddXY(point.XValue, point.YValues[0]/10000);
        }

        // 隐藏副本 series
        seriesCopy.IsVisibleInLegend = false;
        seriesCopy.Color = Color.Transparent;
        seriesCopy.BorderColor = Color.Transparent;
        seriesCopy.ChartArea = areaAxis.Name;

        // 禁用drid线及tickmarks
        areaAxis.AxisX.LineWidth = 0;
        areaAxis.AxisX.MajorGrid.Enabled = false;
        areaAxis.AxisX.MajorTickMark.Enabled = false;
        areaAxis.AxisX.LabelStyle.Enabled = false;
        areaAxis.AxisY.MajorGrid.Enabled = false;
        areaAxis.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
        areaAxis.AxisY.LabelStyle.Font = area.AxisY.LabelStyle.Font;

        // 调整区域位置
        areaAxis.Position.X -= axisOffset;
        areaAxis.InnerPlotPosition.X += labelsSize;

    }

效果是出来了,下面就是重构了,后来终于找到一个即高效又简单的方法,那就是通过数据源来控制。在数据源中将线的值除10。这样另外的Y轴就可以满足需要了。如下图:

注意:上述方法必须在tooltip中将显示的值在乘以10要不结果是错的,还有就是将右侧的Y轴属性设置为True

 

posted @ 2009-11-09 16:48  mysun  阅读(4233)  评论(0编辑  收藏  举报