找回密码
 立即注册

QQ登录

只需一步,快速开始

evenwan

论坛元老

4

主题

15

帖子

4650

积分

论坛元老

积分
4650

活字格认证

evenwan
论坛元老   /  发表于:2012-10-30 15:22  /   查看:11957  /  回复:13
各位大大。我现在想要实现以下的两种图     麻烦贴下实例代码   谢谢了


1.jpeg (9.93 KB, 下载次数: 1514)

13 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-10-30 20:11:00
沙发
evenwan 你好

Spread for WinForms中图表有两种显示方法,一种是直接插入到Spread中显示(类似于Excle);另外一种是通过FpChart直接在Form上面显示图表

不知你使用的是哪种方式,谢谢!
回复 使用道具 举报
evenwan
论坛元老   /  发表于:2012-10-31 09:06:00
板凳
回复 2楼dof的帖子

版主你好。我是通过FpChart直接在Form上面显示图表。应该是这样的。

因为我在设计的时候 spread上 是没有放控件的。
回复 使用道具 举报
evenwan
论坛元老   /  发表于:2012-10-31 15:07:00
地板
回复 2楼dof的帖子

版主你好。
    我要做的是在form上放置了一个FpSpread表格控件。
然后在cs文件中利用代码绑定数据源。 最后在页面上实现上边想要的效果。

public void PieChart()
                {
                       

                        fpSpread2.Reset();

                        fpSpread2.ActiveSheet.ColumnHeader.Visible = false;
                        fpSpread2.ActiveSheet.RowHeader.Visible = false;
                       


                        DataTable dta = new DataTable();
                        dta.Columns.Add("aaa", System.Type.GetType("System.String"));
                        dta.Columns.Add("bbb", System.Type.GetType("System.String"));
                        dta.Columns.Add("ccc", System.Type.GetType("System.String"));

                        DataRow dra = dta.NewRow();
                        dra[0] = "a";
                        dra[1] = "10";
                        dra[2] = "15";
                        dta.Rows.Add(dra);
                        DataRow dra1 = dta.NewRow();
                        dra1[0] = "b";
                        dra1[1] = "20";
                        dra1[2] = "250";
                        dta.Rows.Add(dra1);
                        DataRow dra2 = dta.NewRow();
                        dra2[0] = "c";
                        dra2[1] = "30";
                        dra2[2] = "265";
                        dta.Rows.Add(dra2);
                        fpSpread2.ActiveSheet.DataSource = dta;

                        FarPoint.Win.Chart.PieSeries series2 = new FarPoint.Win.Chart.PieSeries();

                        series2.SeriesName = "Series 2";
                        series2.CategoryNames.DataSource = new FarPoint.Win.Spread.Chart.SeriesDataField(fpSpread2, "DataFieldCategoryName", "Sheet1!$A$1A$" + Convert.ToString(dta.Rows.Count), FarPoint.Win.Spread.Chart.SegmentDataType.Text);
                        if (this.rbtnAmountShell.Checked == true)
                        {
                                series2.Values.DataSource = new FarPoint.Win.Spread.Chart.SeriesDataField(fpSpread2, "DataFieldValue", "Sheet1!$B$1B$" + Convert.ToString(dta.Rows.Count));
                        }
                        else
                        {
                                series2.Values.DataSource = new FarPoint.Win.Spread.Chart.SeriesDataField(fpSpread2, "DataFieldValue", "Sheet1!$C$1C$" + Convert.ToString(dta.Rows.Count));
                        }
                        series2.LabelVisible = true;
                       
       
                        FarPoint.Win.Chart.PiePlotArea plotArea = new FarPoint.Win.Chart.PiePlotArea();
                        plotArea.Location = new System.Drawing.PointF(0.2f, 0.2f);
                        plotArea.Size = new System.Drawing.SizeF(0.6f, 0.6f);
                        plotArea.Series.AddRange(new FarPoint.Win.Chart.Series[] { series2 });

               
                        FarPoint.Win.Chart.LegendArea legend = new FarPoint.Win.Chart.LegendArea();
                        legend.Location = new PointF(0.0f, 0.0f);
                        legend.AlignmentX = 0f;
                        legend.AlignmentY = 0.0f;

               
                        FarPoint.Win.Chart.ChartModel model = new FarPoint.Win.Chart.ChartModel();
                        model.LegendAreas.Add(legend);
                        model.PlotAreas.Add(plotArea);

               
                        FarPoint.Win.Spread.Chart.SpreadChart chart = new FarPoint.Win.Spread.Chart.SpreadChart();
                        chart.Size = new Size(600, 350);
                        chart.Location = new Point(0, 0);
                        chart.Model = model;
                        chart.Locked = true;
                        chart.CanMove = FarPoint.Win.Spread.DrawingSpace.Moving.None;
                        chart.CanSize = FarPoint.Win.Spread.DrawingSpace.Sizing.None;

                        fpSpread2.ActiveSheet.Charts.Add(chart);
                       
                }


3.jpeg (16.45 KB, 下载次数: 1427)
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-10-31 17:29:00
5#
Spread中的饼图如果要要显示百分比的Label,需要对数据源进行换算之后才能显示百分比,比如下面的代码有一个values的数据源,然后需要对其进行换算,然后设置给series1.Values,才能显示成百分比的形式:
  1.     FarPoint.Win.Chart.PieSeries series2 = new FarPoint.Win.Chart.PieSeries();

  2.     double[] values = new double[] { 10,20,30};
  3.     double sum = 0;
  4.     foreach (var item in values)
  5.     {
  6.         sum += item;
  7.     }
  8.     for (int i = 0; i < values.Length; i++)
  9.     {
  10.         values[i] = values[i] / sum;
  11.     }
  12.     series2.SeriesName = "Series 2";
  13.     series2.CategoryNames.AddRange(new String[]{"AA","BB","CC"});
  14.     series2.Values.AddRange(values);
  15.     series2.LabelVisible = true;
  16.     series2.LabelFormatter = new FarPoint.Win.Spread.Model.GeneralFormatter("0.00%", false);
复制代码
回复 使用道具 举报
evenwan
论坛元老   /  发表于:2012-10-31 18:03:00
6#
回复 5楼dof的帖子

谢谢斑竹。
我先研究一下饼图。  

那个柱形图跟折线图怎么做呢?  两个图在一起出现的。而且右边的数据是怎么做出来的?
希望能给出demo 以供参考~谢谢
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-1 12:11:00
7#
第二种图表通常叫着组合图表,可以使用以下代码实现:
  1.         private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             BarSeries series0 = new BarSeries();
  4.             series0.Values.Add(8.0);
  5.             series0.Values.Add(4.0);
  6.             series0.Values.Add(2.0);
  7.             series0.Values.Add(1.0);
  8.             series0.YAxisId = 0;
  9.             series0.LabelVisible = true;

  10.             LineSeries series1 = new LineSeries();
  11.             series1.PointMarker = new BuiltinMarker(MarkerShape.Circle, 7.0f);
  12.             series1.Values.Add(8.0);
  13.             series1.Values.Add(12.0);
  14.             series1.Values.Add(14.0);
  15.             series1.Values.Add(15.0);
  16.             series1.YAxisId = 1;
  17.             series1.LabelVisible = true;

  18.             ValueAxis y2 = new ValueAxis();
  19.             y2.AxisId = 1;
  20.             y2.AutoMaximum = true;
  21.             y2.AutoMinimum = true;
  22.             y2.LabelVisible = true;
  23.             y2.Location = AxisLocation.Far;

  24.             YPlotArea plotArea = new YPlotArea();
  25.             plotArea.Location = new PointF(0.2f, 0.2f);
  26.             plotArea.Size = new SizeF(0.6f, 0.6f);
  27.             plotArea.Series.Add(series0);
  28.             plotArea.Series.Add(series1);

  29.             plotArea.YAxes.Add(y2);

  30.             LabelArea label = new LabelArea();
  31.             label.Location = new PointF(0.5f, 0.02f);
  32.             label.AlignmentX = 0.5f;
  33.             label.AlignmentY = 0.0f;
  34.             label.Text = "组合图表";

  35.             ChartModel model = new ChartModel();
  36.             model.LabelAreas.Add(label);
  37.             model.PlotAreas.Add(plotArea);

  38.             fpSpread1.ActiveSheet.Charts[0].Model = model;

  39.         }
复制代码



44.png
回复 使用道具 举报
evenwan
论坛元老   /  发表于:2012-11-1 15:35:00
8#
回复 7楼dof的帖子

感谢dof 大神 细心的解答~非常感谢。

我再问一下。如果我现在想要一个柱上表现两条或多条数据应该怎么写?

BarSeries series0 = new BarSeries();
                        series0.Values.Add(8.0);
                        series0.Values.Add(4.0);
                        series0.Values.Add(2.0);
                        series0.Values.Add(1.0);
                        BarSeries series2 = new BarSeries();
                        series2.Values.Add(18.0);
                        series2.Values.Add(14.0);
                        series2.Values.Add(12.0);
                        series2.Values.Add(11.0);
                        //foreach (var item in Values)
                        //{
                        //    series0.Values.Add(item);
                        //}
                        series0.YAxisId = 0;
                        series0.LabelVisible = true;
                        series2.YAxisId = 0;
                        series2.LabelVisible = true;

                        LineSeries series1 = new LineSeries();
                        series1.PointMarker = new BuiltinMarker(MarkerShape.Circle, 7.0f);
                        series1.Values.Add(8.0);
                        series1.Values.Add(12.0);
                        series1.Values.Add(14.0);
                        series1.Values.Add(15.0);

                        LineSeries series3 = new LineSeries();
                        series1.PointMarker = new BuiltinMarker(MarkerShape.Circle, 7.0f);
                        series1.Values.Add(18.0);
                        series1.Values.Add(22.0);
                        series1.Values.Add(34.0);
                        series1.Values.Add(45.0);
                        //foreach (var item in Count)
                        //{
                        //    series1.Values.Add(item);
                        //}
                        series1.YAxisId = 1;
                        series1.LabelVisible = true;
                        series3.YAxisId = 1;
                        series3.LabelVisible = true;

                        ValueAxis y2 = new ValueAxis();
                        y2.AxisId = 1;
                        y2.AutoMaximum = true;
                        y2.AutoMinimum = true;
                        y2.LabelVisible = true;
                        y2.Location = AxisLocation.Far;

                        YPlotArea plotArea = new YPlotArea();
                        plotArea.Location = new PointF(0.2f, 0.2f);
                        plotArea.Size = new SizeF(0.6f, 0.6f);
                        plotArea.Series.Add(series0);
                        plotArea.Series.Add(series1);
                        plotArea.Series.Add(series2);
                        plotArea.Series.Add(series3);

                        plotArea.YAxes.Add(y2);

                        LabelArea label = new LabelArea();
                        label.Location = new PointF(0.5f, 0.02f);
                        label.AlignmentX = 0.5f;
                        label.AlignmentY = 0.0f;
                        label.Text = "组合图表";

                        ChartModel model = new ChartModel();
                        model.LabelAreas.Add(label);
                        model.PlotAreas.Add(plotArea);

我在你给的代码上又添了一组数据。

但是这样写了之后 , 柱形图的数据。两条都是从最下边开始   变的重合了。
                             折线图的数据、不是并列的关系,变成了延伸的关系了。

我想要的效果: 柱形图两条数据。第二条数据的基础点从第一条数据的最高点开始。数据是上下叠着的。
                      折线图两条数据。两条折线应该是上线并列显示的,而不是一条线延伸出去的。


刚学这个问题可能比较幼稚   还望版主大大见谅~~~

如果有做过的大大们  也帮我瞅瞅吧~~拜谢了~~
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-1 20:14:00
9#
你的程序在最后好像少一句代码:fpSpread1.ActiveSheet.Charts[0].Model = model;
回复 使用道具 举报
evenwan
论坛元老   /  发表于:2012-11-2 09:17:00
10#
回复 9楼dof的帖子


这部分是我的后半部分代码

                        FarPoint.Win.Spread.Chart.SpreadChart chart = new FarPoint.Win.Spread.Chart.SpreadChart();
                        chart.Size = new Size(600, 350);
                        chart.Location = new Point(0, 0);
                        chart.Model = model;
                        chart.Locked = true;
                        chart.CanMove = FarPoint.Win.Spread.DrawingSpace.Moving.None;
                        chart.CanSize = FarPoint.Win.Spread.DrawingSpace.Sizing.None;

                        fpSpread1.ActiveSheet.Charts.Add(chart);

这句代码我加上会报越界的错误。(Index was out of range. Must be non-negative and less than the size of the collection.
     Parameter name: index)所以我用的 (chart.Model = model;)替换了(fpSpread1.ActiveSheet.Charts[0].Model = model;)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部