找回密码
 立即注册

QQ登录

只需一步,快速开始

306828231

注册会员

8

主题

22

帖子

156

积分

注册会员

积分
156

微信认证勋章

306828231
注册会员   /  发表于:2019-1-21 17:59  /   查看:6398  /  回复:11
你好,我的需求是:画柱状图时,根据不同范围的值,柱状图显示不同颜色

柱状图是不叠加

尝试了几种方法,还是有不少问题,最后一次代码如下:
for (int i = 0; i < type.Count; i++)
            {
                StackedBarSeries barSeries = new StackedBarSeries();
                barSeries.YAxisId = 1;
                //柱状图 绿色
                BarSeries barGreen = new BarSeries();
                barGreen.YAxisId = 0;
                barGreen.LabelVisible = true;
                //柱宽度
                barGreen.GapWidth = 1F;
                var fillGreen = new FarPoint.Win.Chart.SolidFill(Color.Green);
                barGreen.BarFill = fillGreen;

                //柱状图 绿色
                BarSeries barYellow = new BarSeries();
                barYellow.YAxisId = 0;
                barYellow.LabelVisible = true;
                //柱宽度
                barYellow.GapWidth = 1F;
                var fillYellow = new FarPoint.Win.Chart.SolidFill(Color.Yellow);
                barYellow.BarFill = fillYellow;

                //柱状图 绿色
                BarSeries barRed = new BarSeries();
                barRed.YAxisId = 0;
                barRed.LabelVisible = true;
                //柱宽度
                barRed.GapWidth = 1F;
                var fillRed = new FarPoint.Win.Chart.SolidFill(Color.Red);
                barRed.BarFill = fillRed;

                //最大工作时间折线图
                LineSeries maxLine = new LineSeries();
                maxLine.PointMarker = new BuiltinMarker(MarkerShape.Diamond, 2.0F);
                maxLine.YAxisId = 0;
                maxLine.LabelVisible = false;
                //折线颜色、宽度
                maxLine.LineBorder = new SolidLine(Color.Red, 1.5F);

                //定时工作时间折线图
                LineSeries stdLine = new LineSeries();
                stdLine.PointMarker = new BuiltinMarker(MarkerShape.Diamond, 2.0f);
                stdLine.YAxisId = 0;
                stdLine.LabelVisible = false;
                stdLine.LineBorder = new SolidLine(Color.Orange, 1.5f);

                for (int x = 2; x < _myTblData.Columns.Count; x++)
                {
                    var dc = _myTblData.Columns[x];
                    var that = data.FirstOrDefault(s => s.WORK_DATE == Convert.ToDateTime(dc.ColumnName) && s.DATA_TYPE == type[i]);
                    if (that != null)
                    {
                        if(that.WORK_TIME_ACT<that.WORK_TIME_STD)
                        {
                            barGreen.Values.Add(Convert.ToDouble(ToHours(that.WORK_TIME_ACT)));
                            barYellow.Values.Add(0);
                            barRed.Values.Add(0);

                        }
                        if (that.WORK_TIME_ACT > that.WORK_TIME_STD && that.WORK_TIME_ACT<that.WORK_TIME_MAX)
                        {
                            barYellow.Values.Add(Convert.ToDouble(ToHours(that.WORK_TIME_ACT)));
                            barGreen.Values.Add(0);
                            barRed.Values.Add(0);
                        }
                        if(that.WORK_TIME_ACT>that.WORK_TIME_MAX)
                        {
                            barRed.Values.Add(Convert.ToDouble(ToHours(that.WORK_TIME_ACT)));
                            barGreen.Values.Add(0);
                            barYellow.Values.Add(0);
                        }
                        stdLine.Values.Add(Convert.ToDouble(ToHours(that.WORK_TIME_STD)));
                        maxLine.Values.Add(Convert.ToDouble(ToHours(that.WORK_TIME_MAX)));

                    }
                    else
                    {
                        barGreen.Values.Add(0);
                        barYellow.Values.Add(0);
                        barRed.Values.Add(0);
                        stdLine.Values.Add(0);
                        maxLine.Values.Add(0);
                    }
                }
                barSeries.Series.Add(barGreen);
                barSeries.Series.Add(barYellow);
                barSeries.Series.Add(barRed);
                //折线图设置
                ValueAxis axisConfig = new ValueAxis();
                axisConfig.AxisId = 1;
                axisConfig.AutoMaximum = true;
                axisConfig.AutoMinimum = true;
                //隐藏折线图Y轴
                axisConfig.LabelVisible = false;
                axisConfig.Location = AxisLocation.Far;

                //Y绘图区
                YPlotArea plotArea = new YPlotArea();
                plotArea.Location = new PointF(0, 0.09F);
                plotArea.Size = new SizeF(1, 0.9F);
                plotArea.Series.Add(barSeries);
                //plotArea.Series.Add(barYellow);
                //plotArea.Series.Add(barRed);

                plotArea.Series.Add(stdLine);
                plotArea.Series.Add(maxLine);
                //隐藏左边Y轴标尺
                plotArea.YAxes[0].RulerLine = new NoLine();
                //隐藏X轴下的数字
                plotArea.XAxis.LabelVisible = false;
                plotArea.XAxis.RulerLine = new NoLine();
                //隐藏柱状图Y轴数字
                plotArea.YAxes[0].LabelVisible = false;
                plotArea.YAxes.Add(axisConfig);
                //隐藏网格线
                plotArea.YAxes[0].MajorGridLine = new NoLine();
                plotArea.YAxes[1].MajorGridLine = new NoLine();

                ChartModel model = new ChartModel();
                model.PlotAreas.Add(plotArea);
                var chart = new FarPoint.Win.Spread.Chart.SpreadChart();
                chart.CanMove = FarPoint.Win.Spread.DrawingSpace.Moving.None;
                chart.CanSize = FarPoint.Win.Spread.DrawingSpace.Sizing.None;
                chart.Size = new Size((_mySheet.ColumnCount - 2) * _dateColWidth, _spanRowHeight * 4);
                int chartY = Convert.ToInt32((_oneAreaMiniRows + type.Count()) * _rowHeihgt) + (_oneAreaMiniRows + type.Count) * 2 + 2;
                if (i > 0)
                {
                    chartY = chartY + Convert.ToInt32(_spanRowHeight * (i * 4));
                }
                //数据类型作业区微调
                if (type.Count == 1)
                    chartY += 2;
                if (type.Count == 4)
                    chartY -= 4;
                if (type.Count == 3)
                    chartY -= 2;
                chart.Location = new Point(_wsCdColWidth + _titleColWidth, chartY);
                chart.Model = model;
                _mySpread.ActiveSheet.Charts.Add(chart);
            }

11 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-22 09:27:19
沙发
您后,现在柱状图颜色没有办法根据某些设置动态变化。可以在自动生成后重新设置系列的颜色,也可以按照您这样完全自定义图表。
您现在遇到的具体问题是什么

评分

参与人数 1满意度 +10 收起 理由
306828231 + 10 赞一个!

查看全部评分

回复 使用道具 举报
306828231
注册会员   /  发表于:2019-1-22 10:19:31
板凳
dexteryao 发表于 2019-1-22 09:27
您后,现在柱状图颜色没有办法根据某些设置动态变化。可以在自动生成后重新设置系列的颜色,也可以按照您这 ...

你好,用这种方法自定义图表后,每个住状下都有一个0,还有就是数据值比较小时,文字重叠 image.png978216857.png

您提到的【在自动生成后重新设置系列的颜色】可以给出代码吗

回复 使用道具 举报
306828231
注册会员   /  发表于:2019-1-22 10:23:06
地板
dexteryao 发表于 2019-1-22 09:27
您后,现在柱状图颜色没有办法根据某些设置动态变化。可以在自动生成后重新设置系列的颜色,也可以按照您这 ...

应该是根据 Point来设置,不过目前还没找到方法设置Point
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-22 17:32:30
5#
您哪个0看不出来是什么,是最下方还有条线吗?
Demo我准备下给您
回复 使用道具 举报
306828231
注册会员   /  发表于:2019-1-22 17:44:32
6#
dexteryao 发表于 2019-1-22 17:32
您哪个0看不出来是什么,是最下方还有条线吗?
Demo我准备下给您

那个0出现的原因是:图表里添加了3种柱状图来实现不同范围值显示不同颜色柱子,其实也就是说,如果某一天没有数据的话,其实是有3个0,只是叠在一起看不出来,我用的这种方式肯定是不采用的

需要用您提到的:生成后重新设置系列的颜色
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-23 08:54:07
7#
通过设计器设计好图表之后,通过代码修改颜色


  1.             var chart = fpSpread1.Sheets[0].AddChart(range, typeof(FarPoint.Win.Chart.LineSeries), 400, 300, 0, 0, FarPoint.Win.Chart.ChartViewType.View2D, false);

  2.             var series = chart.Model.PlotAreas[0].Series;
  3.             var serie1 = series[0] as FarPoint.Win.Chart.LineSeries;
  4.             serie1.LineBorder = new FarPoint.Win.Chart.SolidLine(Color.Black, 2);
复制代码
回复 使用道具 举报
306828231
注册会员   /  发表于:2019-1-23 09:24:39
8#
dexteryao 发表于 2019-1-23 08:54
通过设计器设计好图表之后,通过代码修改颜色

你好,我在代码里是没有使用LineSeries这种类型的,所以不能将BarSeries转成LineSeries
我希望的是:比如我想让柱状图中第二个柱子变成红色,这个代码好像并不能实现吧。

根据网站这边提供的【图表对象模型】在Series下有一个Point集合,在生成柱状图后,鼠标移到柱子上也会显示Point0、Point1这样的信息

请问我要获取并使用Point集合,应该怎么做呢
图表对象模型.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-1-23 11:15:22
9#
BarSeries也有对应接口


  1.             var series = chart.Model.PlotAreas[0].Series;
  2.             var serie1 = series[2] as FarPoint.Win.Chart.BarSeries;
  3.             serie1.BarFill = new FarPoint.Win.Chart.SolidFill(Color.Black);

  4.             serie1.LabelVisible = true;
  5.             serie1.LabelTextDirection = FarPoint.Win.Chart.TextDirection.Rotate270Degree;
复制代码


你需要Point的具体什么,值的话就是Vlaues对象,标签样式有对应的babel属性
回复 使用道具 举报
306828231
注册会员   /  发表于:2019-1-23 11:44:53
10#
dexteryao 发表于 2019-1-23 11:15
BarSeries也有对应接口

你好,你发的这个代码和我在1楼发的代码本质上也没有区别啊,还是实现不了修改【某个特定】柱子的颜色,因为这个代码修改的是整个BarSeries柱子的颜色
如果说我想改第一1个柱子的颜色,要怎么实现呢

我理解的Point对象:
BarSeries第一个柱就是Point 0 对吧,我要取到这个Point 0 对象怎么取呢

Values[0]只是取到具体的数值吧,即使取到Values[0]也不能设置什么

在BarSeries下也没有找到Point关键词相关的方法和属性
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部