C# 中的 ZedGraph 具有多个点的堆叠条形图

发布于 2024-10-05 18:50:37 字数 550 浏览 6 评论 0原文

我拥有的是一个如下所示的配置文件:

Item|Size|Directory|Data  
A|12|D_01|11/28/10  
C|13|D_01|11/28/10  
B|12|D_01|11/28/10  
Back|122|D_02|11/28/10  
Body|112|D_02|11/28/10  
A|12|D_01|11/29/10  
C|13|D_01|11/29/10  
B|12|D_01|11/29/10  
Back|122|D_01|11/29/10  
Body|112|D_01|11/29/10  
Arm|20|D_01|11/29/10  

我的 x 轴是日期,我对此没有问题,如果我只有静态数量的实例来组成我的 YI 就可以了,但是我如何创建一个单独的堆叠条形图,可以自动为每个目录的每个项目点点?

因此,堆叠条 1 将是 ABC、身体、背部、手臂,示例显示在 29 上我添加了一个手臂项目。因此,28 号的第 1 条有 5 点,29 号的堆叠条 2 显示 6 点。

我希望这是有道理的.. 除了如何正确显示条形图之外,我不需要任何帮助。

What I have is a configuration file that looks like this:

Item|Size|Directory|Data  
A|12|D_01|11/28/10  
C|13|D_01|11/28/10  
B|12|D_01|11/28/10  
Back|122|D_02|11/28/10  
Body|112|D_02|11/28/10  
A|12|D_01|11/29/10  
C|13|D_01|11/29/10  
B|12|D_01|11/29/10  
Back|122|D_01|11/29/10  
Body|112|D_01|11/29/10  
Arm|20|D_01|11/29/10  

My x-axis is date, which I have no problem with, and if I only have a static number of instances to make up my Y I would be fine, but how do I create a single stacked bar graph that automatically make points for each item for each directory?

So stacked bar 1 would be A.B.C, Body, Back, Arm and the example shows on 29 I added an Arm item. So bar 1 on the 28th has 5 points, the stacked bar 2 on the 29th shows 6 points.

I hope that makes sense..
I don't need help with anything but how to display the bars appropriately.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一百个冬季 2024-10-12 18:50:37

alt text

问题中不清楚目录将如何影响数据的显示,因此假设只有两个栏需要(2 个日期各 1 个),这是一个示例。有两种方法可以格式化日期轴并处理空数据: 1 使用 AxisType.Date= DateAsOrdinal 并为数据为 null 的日期添加零值,或使用 AxisType.Date=Date 添加 [2] 值,并且不为数据为 null 的日期添加值。如果存在空数据,DateAsOrdinal 似乎会将数据应用到错误的日期 - 这似乎是一个错误或至少不直观。该示例使用 AxisType.Date=Date 方法,该方法需要对日期轴进行额外的格式化。

     using ZedGraph;

     ...

     GraphPane myPane = zg1.GraphPane; // zg1 is a ZedGraph control.

     // Set the title and axis label
     myPane.Title.Text = "Stacked Bar, ZedGraph ver 5.1.5.28844";
     myPane.YAxis.Title.Text = "Value";

     // Create two dates.
     XDate date1 = new XDate(2010, 11, 28); // First date.
     XDate date2 = new XDate(2010, 11, 29); // Second date.

     // Create data lists and bars for A, B, C, Back, Body and Arm (6 total).

     ZedGraph.PointPairList listA = new ZedGraph.PointPairList();
     listA.Add( date1, 12 );
     listA.Add( date2, 13);

     BarItem barA = zg1.GraphPane.AddBar("A", listA, Color.Red );
     barA.Bar.Fill = new Fill( Color.Red );

     ZedGraph.PointPairList listB = new ZedGraph.PointPairList();
     listB.Add(date1, 12);
     listB.Add(date2, 12);

     BarItem barB = zg1.GraphPane.AddBar("B", listB, Color.Blue);
     barB.Bar.Fill = new Fill(Color.Blue);

     ZedGraph.PointPairList listC = new ZedGraph.PointPairList();
     listC.Add(date1, 13);
     listC.Add(date2, 12);

     BarItem barC = zg1.GraphPane.AddBar("C", listC, Color.Green);
     barC.Bar.Fill = new Fill(Color.Green);

     ZedGraph.PointPairList listBack = new ZedGraph.PointPairList();
     listBack.Add(date1, 122);
     listBack.Add(date2, 122);
     BarItem barBack = zg1.GraphPane.AddBar("Back", listBack, Color.Red);
     barBack.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);

     ZedGraph.PointPairList listBody = new ZedGraph.PointPairList();
     listBody.Add(date1, 112);
     listBody.Add(date2, 112);
     BarItem barBody = zg1.GraphPane.AddBar("Body", listBody, Color.Blue);
     barBody.Bar.Fill = new Fill(Color.Blue, Color.White, Color.Blue);

     ZedGraph.PointPairList listArm = new ZedGraph.PointPairList();
     // listArm.Add(date1, 0); // Not needed for XAxis.Type = AxisType.Date.
     listArm.Add(date2, 20);
     BarItem barArm = zg1.GraphPane.AddBar("Arm", listArm, Color.Green);
     barArm.Bar.Fill = new Fill(Color.Green, Color.White, Color.Green);

     // Done creating bars.

     myPane.BarSettings.Type = BarType.Stack;  // stacks bar rather than side-by-side.
     myPane.BarSettings.ClusterScaleWidth = 1; // Widen bars somewhat.

     // Format the X axis.
     XAxis x = myPane.XAxis;

     x.Type = AxisType.Date;
     x.Scale.Format = "yyyy-mm-dd";
     x.Scale.BaseTic = date1; // Puts the first major tic at the first date.
     x.Scale.Min = date1 - 0.5; // Manually set the left of the graph window just prior to the first date.
     x.Scale.Max = date2 + 0.5; // Manually set the right of the graph window just after the last date.

     // Setting the step size...
     // Isn't required if AxisType.Date is DateAsOrdinal.
     // Docs says that MinorStep is ignore for AxisType.Date but seems inaccurate.
     // Step value of 24 was derived by trial and error. Seems it should be 1 if Unit = DateUnit.Day.
     // A value of 24 implies that the Units are acting like DateUnit.Hour.
     x.Scale.MajorUnit = DateUnit.Day; 
     x.Scale.MinorUnit = DateUnit.Day;
     x.Scale.MinorStep = 24; 
     x.Scale.MajorStep = 24;

     zg1.AxisChange(); // Update graph.

alt text

It wasn't clear in the question how the directories would affect the display of data so, assuming that only two bars are needed (1 for each of 2 dates), here's an example. There are two ways to format the date axis and handle the null data: 1 using AxisType.Date=DateAsOrdinal and add values of zero for dates where data is null or [2] using AxisType.Date=Date and don't add values for dates where data is null. DateAsOrdinal seems to apply data to the wrong date if there is null data - which seems to be a bug or at least unintuitive. The example uses the AxisType.Date=Date approach which required extra formatting of the date axis.

     using ZedGraph;

     ...

     GraphPane myPane = zg1.GraphPane; // zg1 is a ZedGraph control.

     // Set the title and axis label
     myPane.Title.Text = "Stacked Bar, ZedGraph ver 5.1.5.28844";
     myPane.YAxis.Title.Text = "Value";

     // Create two dates.
     XDate date1 = new XDate(2010, 11, 28); // First date.
     XDate date2 = new XDate(2010, 11, 29); // Second date.

     // Create data lists and bars for A, B, C, Back, Body and Arm (6 total).

     ZedGraph.PointPairList listA = new ZedGraph.PointPairList();
     listA.Add( date1, 12 );
     listA.Add( date2, 13);

     BarItem barA = zg1.GraphPane.AddBar("A", listA, Color.Red );
     barA.Bar.Fill = new Fill( Color.Red );

     ZedGraph.PointPairList listB = new ZedGraph.PointPairList();
     listB.Add(date1, 12);
     listB.Add(date2, 12);

     BarItem barB = zg1.GraphPane.AddBar("B", listB, Color.Blue);
     barB.Bar.Fill = new Fill(Color.Blue);

     ZedGraph.PointPairList listC = new ZedGraph.PointPairList();
     listC.Add(date1, 13);
     listC.Add(date2, 12);

     BarItem barC = zg1.GraphPane.AddBar("C", listC, Color.Green);
     barC.Bar.Fill = new Fill(Color.Green);

     ZedGraph.PointPairList listBack = new ZedGraph.PointPairList();
     listBack.Add(date1, 122);
     listBack.Add(date2, 122);
     BarItem barBack = zg1.GraphPane.AddBar("Back", listBack, Color.Red);
     barBack.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);

     ZedGraph.PointPairList listBody = new ZedGraph.PointPairList();
     listBody.Add(date1, 112);
     listBody.Add(date2, 112);
     BarItem barBody = zg1.GraphPane.AddBar("Body", listBody, Color.Blue);
     barBody.Bar.Fill = new Fill(Color.Blue, Color.White, Color.Blue);

     ZedGraph.PointPairList listArm = new ZedGraph.PointPairList();
     // listArm.Add(date1, 0); // Not needed for XAxis.Type = AxisType.Date.
     listArm.Add(date2, 20);
     BarItem barArm = zg1.GraphPane.AddBar("Arm", listArm, Color.Green);
     barArm.Bar.Fill = new Fill(Color.Green, Color.White, Color.Green);

     // Done creating bars.

     myPane.BarSettings.Type = BarType.Stack;  // stacks bar rather than side-by-side.
     myPane.BarSettings.ClusterScaleWidth = 1; // Widen bars somewhat.

     // Format the X axis.
     XAxis x = myPane.XAxis;

     x.Type = AxisType.Date;
     x.Scale.Format = "yyyy-mm-dd";
     x.Scale.BaseTic = date1; // Puts the first major tic at the first date.
     x.Scale.Min = date1 - 0.5; // Manually set the left of the graph window just prior to the first date.
     x.Scale.Max = date2 + 0.5; // Manually set the right of the graph window just after the last date.

     // Setting the step size...
     // Isn't required if AxisType.Date is DateAsOrdinal.
     // Docs says that MinorStep is ignore for AxisType.Date but seems inaccurate.
     // Step value of 24 was derived by trial and error. Seems it should be 1 if Unit = DateUnit.Day.
     // A value of 24 implies that the Units are acting like DateUnit.Hour.
     x.Scale.MajorUnit = DateUnit.Day; 
     x.Scale.MinorUnit = DateUnit.Day;
     x.Scale.MinorStep = 24; 
     x.Scale.MajorStep = 24;

     zg1.AxisChange(); // Update graph.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文