我正在尝试使用Microsoft's charting library建立一个股票图表。
我正在使用此代码在我的视图中创建图表:
@{
System.Web.Helpers.Chart cht = new Chart(600, 400);
cht.AddTitle(ViewData["Symbol"].ToString());
cht.AddSeries(name: "Price",
chartType: "Stock",
chartArea: "Top",
xField: "Date",
xValue: Model,
yFields: "Open,High,Low,Close",
yValues: Model);
cht.Write();
}
当调用获取图表的操作时,抛出以下异常:
ArgumentOutOfRangeException: Data points insertion error. Only 1 Y values can be set for this data series. Parameter name: yFields System.Web.UI.DataVisualization.Charting.DataPointCollection.DataBindXY(IEnumerable xValue, String xField, IEnumerable yValue, String yFields) +1076598 System.Web.Helpers.Chart.ApplySeries(Chart chart) +508 System.Web.Helpers.Chart.ExecuteChartAction(Action`1 action) +174 System.Web.Helpers.Chart.GetBytes(String format) +144 System.Web.Helpers.Chart.Write(String format) +96
“Stock”chartType应该允许Y的4个值,并且当使用反射器检查Chart帮助程序的代码时,这似乎得到确认。我错过了什么吗?
答案 0 :(得分:2)
通过自己构建图表,绕过帮助程序,我能够解决这个问题。
using (Chart chart = new Chart())
{
chart.Width = 600;
chart.Height = 400;
chart.RenderType = RenderType.BinaryStreaming;
chart.Palette = ChartColorPalette.Bright;
chart.ChartAreas.Add("Top");
chart.ChartAreas.Add("Bottom");
chart.Series.Add("Price");
chart.Series.Add("Volume");
chart.Series["Price"].ChartArea = "Top";
chart.Series["Volume"].ChartArea = "Bottom";
chart.Series["Price"].ChartType = SeriesChartType.Stock;
chart.Series["Volume"].ChartType = SeriesChartType.Column;
for (int x = 0; x < data.Quotes.Count / 2; x++)
{
Quote quote = data.Quotes[x];
chart.Series["Price"].Points.AddXY(quote.Date, quote.Open, quote.High, quote.Low, quote.Close);
chart.Series["Volume"].Points.AddXY(quote.Date, quote.Volume);
}
using (MemoryStream memStream = new MemoryStream())
{
chart.SaveImage(memStream, ChartImageFormat.Jpeg);
return File(memStream.ToArray(), "image/jpeg");
}
}
此代码位于我的控制器中,并且不存在任何视图,因为它返回了实际的图像资源。
答案 1 :(得分:1)
嗯,实际上最简单的方法就是将其改为:
yFields: "Open,,High,,Low,,Close",
答案 2 :(得分:1)
我通过使用重载的Series构造函数来修复它:Series(string name, int yValues)
。请参阅下面的示例。
Series ohlc = new Series("Ohlc", 4);
...
ohlc.Points.AddXY(xValue, open, high, low, close);
答案 3 :(得分:0)
在处理相同的问题后 - 只能为一个系列添加一个值 - 同时尝试使用Web.Helper.Chart类构建具有多个Y轴值的Stacked Column图表。
我在MSDN或任何其他论坛(包括StackOverflow)上找不到任何一个答案。事实证明 - 它非常简单:您可以使用.AddSeries方法添加多个系列。
换句话说,用简单的英语,为要添加到图表的每个系列调用一次.AddSeries方法。
此示例用于报告每日库存量,以吨为单位,与钢铁厂相同 - 以库存中的吨钢量计算产量。
new Chart(1000, 500, ChartTheme.Blue)
.AddTitle("Inventory")
.AddSeries(name: "A",
chartType: "StackedColumn",
xValue: intDays,
yValues: dblTons_A)
.AddSeries(name: "B",
chartType: "StackedColumn",
xValue: intDays,
yValues: dblTons_B)
.AddSeries(name: "C",
chartType: "StackedColumn",
xValue: intDays,
yValues: dblTons_C)
.AddSeries(name: "D",
chartType: "StackedColumn",
xValue: intDays,
yValues: dblTons_D)
.Write("png");