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 轴的主要内容,如果未能解决你的问题,请参考以下文章