我正在使用MVC中的C#通过MS-Chart构建“Stacked Column”图表。我的图表有3个系列。我试图让每个系列的数据值标签显示在X轴下方而不是每列上。
我一直在搜索网络,希望找到一些指向这种类似布局的指针,但是已经找不到2天了。
有人可以给我一些关于如何完成数据值标签安排的相同位置的指针吗?
答案 0 :(得分:1)
这是最简单的解决方案。它没有很好的风格,但只需要几行:
var months = new[] { "Jan", "Feb", "Mar", "Apr", "May",
"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
for (int i = 0; i < pointCount; i++)
{
double sum = 0;
string label = "";
for (int j = seriesCount - 1; j >= 0; j--)
{
sum += chart.Series[j].Points[i].YValues[0];
label += "\n" + +chart.Series[j].Points[i].YValues[0] ;
}
chart.Series[0].Points[i].AxisLabel = months[i] + "\n" + sum + label;
}
这会为第一个DataPoint
的每个Series
添加一个标签字符串。请注意,每个点只能显示一个这样的标签;稍后Series
的标签将被忽略。
使用合适的计数器和任何你想要的标签月份部分。
对于更好看的外观,如大胆的彩色或彩色背景,你需要做更多的工作。
请注意,标签和系列中的数字是反向堆叠的,因此内部循环会向后移动。
这适用于任意数量的系列。
答案 1 :(得分:1)
以下是使用PostPaint
事件的变体:
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
if (chart1.Series[0].Points.Count <= 0) return;
Graphics g = e.ChartGraphics.Graphics;
ChartArea ca = chart1.ChartAreas[0];
Rectangle rip = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
StringFormat fmt = new StringFormat()
{ Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
int cols = chart1.Series[0].Points.Count;
int sCount = chart1.Series.Count;
int w = rip.Width / (cols + 1); // there is ca. 1/2 column gap to the sides
for (int i = 0; i < cols; i++)
{
List<string> s = (List<string>)(chart1.Series[0].Points[i].Tag);
for (int j = 0; j < s.Count; j++)
{
// change magic numbers with your font!
Rectangle r = new Rectangle(rip.Left + i * w + w / 2,
rip.Bottom + 5 + 25 * j, w, 25);
// 1st row: header, 2nd row sum, rest moved up by and reversed
using (SolidBrush brush = new SolidBrush(j == 0 ? Color.Transparent
: j == 1 ? Color.Gray : chart1.Series[sCount + 1 - j].Color))
g.FillRectangle(brush, r);
g.DrawRectangle(Pens.White, r);
g.DrawString(s[j], ca.AxisX.LabelStyle.Font, Brushes.White, r, fmt);
}
}
}
它使用相同的例程来收集标签字符串,但不是设置AxisLabels
,而是将它们添加到Tags
的{{1}}:
DataPoints
图表样式几乎占据了代码的最大部分:
string l = months[i] + "\n" + sum + label;
chart.Series[0].Points[i].Tag = l.Split('\n').ToList();
使用chart.BackColor = Color.DarkSlateGray;
ChartArea ca = chart.ChartAreas[0];
chart.Legends[0].Alignment = StringAlignment.Center;
chart.Legends[0].Docking = Docking.Top;
chart.Legends[0].BackColor = chart.BackColor;
chart.Legends[0].ForeColor = Color.White;
Legend L = chart.Legends[0];
L.CustomItems.Add(Color.Silver, "Sum");
ca.BackColor = Color.LightSteelBlue;
ca.Position = new ElementPosition(2, 8, 93, 70); // make room
ca.Area3DStyle.Enable3D = true;
ca.Area3DStyle.PointDepth = 25;
ca.Area3DStyle.WallWidth = 0;
ca.AxisX.MajorGrid.Enabled = false;
ca.AxisY.MajorGrid.LineColor = Color.White;
ca.AxisY.LineColor = Color.White;
ca.AxisY.LabelStyle.ForeColor = Color.White;
ca.AxisY.MajorTickMark.LineColor = Color.White;
ca.AxisX.LabelStyle.Enabled = false;
ca.AxisX.LineColor = Color.White;
ca.AxisX.MajorTickMark.Enabled = false;
创建Series
后,您需要应用它们,因此可以通过代码访问它们:
Colors
chart1.ApplyPaletteColors();
的精美圆角列由Series
CustomProperty
更多细节:
s.SetCustomProperty("DrawingStyle", "Cylinder");
更新:您需要在我的其他一些帖子中加入chart.Series[1].Color = Color.Crimson;
chart.Series[0].LegendText = "Hobbits";
..
和InnerPlotPositionClientRectangle
两个函数,例如here或here!
要制作此work in ASP,请在ChartAreaClientRectangle
:
PageLoad