MS 甘特图 2 轴

Posted

技术标签:

【中文标题】MS 甘特图 2 轴【英文标题】:MS Gantt Chart 2 Axis 【发布时间】:2021-03-14 00:29:32 【问题描述】:

我有这样的甘特图。我想显示 AxisX2 的值是我为它准备的公式的百分比。我在展示 AxisX2 并为其设置系列时遇到了挑战。

这是我捕获的甘特图click here。 我希望再增加一个轴,例如this。 请帮忙,谢谢。

这里有一些基本的功能来呈现该图表

 public void setUpGantt(Chart chart)
    
       chart.Series.Clear();
        Series s = chart.Series.Add("sszs");

        s.ChartType = SeriesChartType.RangeBar;
        s.YValueType = ChartValueType.DateTime;
        s.ResetIsVisibleInLegend () ;
        s.IsVisibleInLegend = true;

        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ax.MajorGrid.Enabled = false;
  
     
        ay.IntervalType = DateTimeIntervalType.Minutes;
        ay.Interval = 60;
        ay.LabelStyle.Format = "HH:mm";

      ay.Minimum = 0;
      ay.Maximum = 0.2;
        limitGantt(chart, "0:00", "24:00");
        s.ToolTip = "#VALY1HH:mm~#VALY2HH:mm";
    
 public void limitGantt(Chart chart, string start, string end)
    
        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ay.Minimum = fromTimeString(start).ToOADate();  
        ay.Maximum = fromTimeString(end).ToOADate();  
    
DateTime fromTimeString(string time)
        
            var p = time.Split(':');
            int sec = p.Length == 3 ? Convert.ToInt16(p[2]) : 0;
            TimeSpan t = new TimeSpan(Convert.ToInt16(p[0]), Convert.ToInt16(p[1]), sec);
            return DateTime.Today.Add(t);
        
public void addGanttTask(Series s, string start, string end, Color c, int slot, string [] array)
        
            DateTime start_ = fromTimeString(start);
            DateTime end_ = fromTimeString(end);
            int pt = s.Points.AddXY(slot, start_, end_);
            s.Points[pt].Color = c;
            s.IsVisibleInLegend = true;

            if (array != null)
            
                for (int i = 0; i < array.Length; i++)
                
                    if (slot == i + 1)
                     s.Points[pt].AxisLabel = array[i];
                        
                    
                
            

        

Taw 的评论

 public void setUpGantt(Chart chart)
    
       chart.Series.Clear();
        Series s = chart.Series.Add("sszs");

        s.ChartType = SeriesChartType.RangeBar;
        s.YValueType = ChartValueType.DateTime;
        s.ResetIsVisibleInLegend () ;
        s.IsVisibleInLegend = true;

        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ax.MajorGrid.Enabled = false;
  
 Axis ax2 = chart.ChartAreas[0].AxisX2; 
                ax2.Enabled = AxisEnabled.True;
                ax2.Maximum = 100; 
                ax2.MajorGrid.Enabled = false;

        ay.IntervalType = DateTimeIntervalType.Minutes;
        ay.Interval = 60;
        ay.LabelStyle.Format = "HH:mm";

      ay.Minimum = 0;
      ay.Maximum = 0.2;
        limitGantt(chart, "0:00", "24:00");
        s.ToolTip = "#VALY1HH:mm~#VALY2HH:mm";
    

我想要百分比 = 绿色时间/总时间(从 00 开始: 00 到当前时间)示例

【问题讨论】:

这张图表很棒。 @Mehdi LAMRANI 可以帮助你 只需启用辅助轴,禁用majorgridlins并设置最小值和最大值!示例:Axis ax2 = chart.ChartAreas[0].AxisX2; axy2.Enabled = AxisEnabled.True; axy2.Maximum = 100; axy2.MajorGrid.Enabled = false; - 但是请注意,在您的示例中,网格的距离相等,但您的百分比不是!要真正显示随机间隔的标签,您需要自定义标签 @TaW 你的意思是 axy2 是 ax2 不是吗?正如您所说,显示百分比并不容易。你有什么详细的建议吗?谢谢 哎呀,是的,一个错字,它们都应该命名为 ax2。 - 不确定你想要什么作为标签内容。我的示例创建了从 0 到 100 的自动标签。有两种方法可以创建自定义值。你展示的那些是你需要的吗?他们的意思是什么?不是 x 而是 y 值的百分比?为此,您确实需要 CustomLabels。 好的,虽然我在您显示的图像中看不到axis2 Lables,但我想我知道您无论如何都需要CustomLabels,因为您想显示与轴值无关的LabelTexts。 CustomLabels 有点棘手,但并不难。您将在 x 值上编写一个循环,并为每个值创建一个 CL。您可以将它们添加到辅助轴。棘手的部分是设置位置。为此,将 From- 和 ToPosition 设置为比实际位置小和大的“小”。您可以设置任何文本和其他东西.. 【参考方案1】:

感谢 TaW 的建议。它对我有用。 我在这里发帖分享谁想知道

 public void setUpGantt(Chart chart)

   chart.Series.Clear();
    Series s = chart.Series.Add("sszs");

    s.ChartType = SeriesChartType.RangeBar;
    s.YValueType = ChartValueType.DateTime;
    s.ResetIsVisibleInLegend () ;
    s.IsVisibleInLegend = true;

    Axis ax = chart.ChartAreas[0].AxisX;
    Axis ay = chart.ChartAreas[0].AxisY;
    ax.MajorGrid.Enabled = false;
  
      Axis ax2 = chart.ChartAreas[0].AxisX2; 
       ax2.Enabled = AxisEnabled.True;
       ax2.MajorGrid.Enabled = true;
       ax2.CustomLabels.Clear();// clear previous value when switch another data
        for (int i = 0; i < 12; i++)
        
            CustomLabel cl = new CustomLabel();
            cl.FromPosition = i+0.5;   
            cl.ToPosition = i+1.5;  
            cl.Text = i+" %";   // example value to show on CustomLabel
            ax2.CustomLabels.Add(cl);
        

    ay.IntervalType = DateTimeIntervalType.Minutes;
    ay.Interval = 60;
    ay.LabelStyle.Format = "HH:mm";

  ay.Minimum = 0;
  ay.Maximum = 0.2;
    limitGantt(chart, "0:00", "24:00");
    s.ToolTip = "#VALY1HH:mm~#VALY2HH:mm";

使用 CustomLabel 再显示一个轴的主脚本

Axis ax2 = chart.ChartAreas[0].AxisX2; 
           ax2.Enabled = AxisEnabled.True;
           ax2.MajorGrid.Enabled = true;
           ax2.CustomLabels.Clear();// clear previous value when switch another data
            for (int i = 0; i < 12; i++)
            
                CustomLabel cl = new CustomLabel();
                cl.FromPosition = i+0.5;   
                cl.ToPosition = i+1.5;  
                cl.Text = i+" %";   // example value to show on CustomLabel
                ax2.CustomLabels.Add(cl);
            

【讨论】:

以上是关于MS 甘特图 2 轴的主要内容,如果未能解决你的问题,请参考以下文章

将 y 轴网格线添加到 D3 甘特图

Excel制作甘特图

前端甘特图组件开发

带有整数 xaxis 的甘特图的 Plotly Express 时间线?

什么叫甘特图

手绘甘特图怎么画