c# - MS 图表控件 : Drawing and Labeling Line Series Across the Chart Area

标签 c# asp.net charts data-visualization dundas

我对 MS ASP.NET 图表控件有疑问。

  1. 如何将线系列设置在条形系列之上,使其延伸到图表的 y 轴?
  2. 是否可以将线系列的名称(即“Goal”)放在图表的右侧,以替代将此系列包含在图例中?

正如您在下面的屏幕截图中看到的,我有一个线系列显示在一个未延伸到图表 y 轴的条形系列之上。

enter image description here

代码如下:

var data1 = new Dictionary<string, float>
{
    { "W1", 80},
    { "W2", 60},
    { "W3", 40},
    { "W4", 20},
    { "W5", 10}
};
var data2 = new Dictionary<string, float>
{
    { "W1", 10},
    { "W2", 10},
    { "W3", 0},
    { "W4", 10},
    { "W5", 10}
};
var data3 = new Dictionary<string, float>
{
    { "W1", 10},
    { "W2", 30},
    { "W3", 50},
    { "W4", 70},
    { "W5", 80}
};
var data4 = new Dictionary<string, float>
{
    { "W1", 50},
    { "W2", 50},
    { "W3", 50},
    { "W4", 50},
    { "W5", 50}
};

var chart = new Chart();
chart.Height = Unit.Pixel(300);
chart.Width = Unit.Pixel(450);
chart.Legends.Add("Legend").Alignment = StringAlignment.Center;
chart.Palette = ChartColorPalette.None;
chart.PaletteCustomColors = new Color[] { Color.FromArgb(191, 214, 151), Color.FromArgb(249, 255, 149), Color.FromArgb(191, 79, 75), Color.Green };

var area = new ChartArea();
area.AxisX.MajorGrid.LineColor = Color.Transparent;
chart.ChartAreas.Add(area);

var series1 = new Series("Done");
foreach (var item in data1)
{
    series1.Points.AddXY(item.Key, item.Value);
}
series1.MarkerBorderWidth = 1;

var series2 = new Series("In Progress");
foreach (var item in data2)
{
    series2.Points.AddXY(item.Key, item.Value);
}

var series3 = new Series("Needs Review");
foreach (var item in data3)
{
    series3.Points.AddXY(item.Key, item.Value);
}

var series4 = new Series("Goal");
foreach (var item in data4)
{
    series4.Points.AddXY(item.Key, item.Value);
}
series4.ChartType = SeriesChartType.Line;
series4.BorderWidth = 2;

series1.ChartType = series2.ChartType = series3.ChartType = SeriesChartType.StackedColumn;
series1.Font = series2.Font = series3.Font = series4.Font = new Font("Verdana", 8.25f, FontStyle.Regular);

chart.Series.Add(series1);
chart.Series.Add(series2);
chart.Series.Add(series3);
chart.Series.Add(series4);

感谢您的帮助。


更新:
在我继续寻找合适的解决方案时,我为“目标”线系列实现了一个额外的图表,目的是:

  • 将此新图表的某些属性的颜色设置为透明
  • 将此图表置于现有图表之上

此方法通过在条形系列上显示“目标”线系列并允许“目标”线系列延伸到 y 轴来提供正确的呈现。但它禁用了现有图表上条形图系列的工具提示和点击操作。由于这种不完善的用户体验,这种方法不是合适的解决方案。

继续寻找解决方案......

最佳答案

对于问题 1:

另一种方法是使用 PostPaint 事件,您可以在图表上的任何位置绘制任何您想要的东西……但是您仍然会失去工具提示和该行的此类交互功能。

对于你的问题2:

您可以从图例项集合中排除不需要的图例条目;您可以像完成此示例一样自定义图例:

yourChart.CustomizeLegend += new EventHandler<CustomizeLegendEventArgs> (CustomizeLegendEventHandler);
//...
static void CustomizeLegendEventHandler(object sender, CustomizeLegendEventArgs e)
{
  int anotherIndex = 3;
  if (sender != null && sender is Chart)
  {
    if (e != null && e.LegendItems != null && e.LegendItems.Count > 0)
    {
      Chart ch = ((Chart)sender);
      if (...) //your logic here
      {
        //example: you can move a legend item from one index to another here:
        LegendItem item = e.LegendItems[0];
        e.LegendItems.RemoveAt(0);
        e.LegendItems.Insert(anotherIndex, item);
      }
    }
  }
}

并且,您可以使用仅包含一个标签、一个点等的辅助 Y 轴,或者:您可以使用 PostPaint 事件处理程序来绘制任何您想要的东西。

您可以从 MS 下载一个很棒的可安装示例包:here .它们显示了许多您可以学习的代码示例。我从这些样本和使用这个新的免费反射器中发现了这些东西:ILSpy .

希望这对您有所帮助。

关于c# - MS 图表控件 : Drawing and Labeling Line Series Across the Chart Area,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6714321/

相关文章:

c# - 如何使用 .NET (Windows/Mac/Linux) 将 PCM S16LE 音频转换为 MU-LAW/8000

c# - 如何在 ShowDialog() 阻塞调用之前注册消息处理程序?

c# - 如何将 ASP.NET Core 配置为对两个已部署的应用程序具有不同的配置

asp.net - Request() 与 Request.QueryString()

javascript - 使用 d3 的轴标签的多级/分组

javascript - Highcharts 列的日期时间标签

c# - PlaceHolder + @Html.TextBox 问题

c# - Http隧道不适用于某些网站

asp.net - IIS 配置 - ASP.NET MVC 返回所有请求的默认文档

javascript - Chart.js 垂直对称图表