MS 图表数据值标签

Posted

技术标签:

【中文标题】MS 图表数据值标签【英文标题】:MS Chart Data Value Labels 【发布时间】:2016-11-04 14:12:11 【问题描述】:

我正在 MVC 中使用 C# 通过 MS-Chart 构建“堆积柱形”图表。我的图表有 3 个系列。我试图让每个系列的数据值标签显示在 X 轴下方而不是每列上。

我一直在网上搜索,希望能找到一些指向这种类似布局的指针,但两天没找到。

有人可以给我一些关于如何完成数据值标签排列的相同位置的指导吗?

【问题讨论】:

这有点棘手。请参阅here 以获取一个看起来不错但与列不对齐的示例。或者在标签中插入换行符,这很简单,但看起来不太好。或者你可以试试ownerdrawing,这两者都可以,但可能是最难的解决方案.. 【参考方案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;

这会为第一个Series 的每个DataPoint 添加一个标签字符串。请注意,每个点只能显示一个这样的标签;稍后Series 的标签将被忽略。

为标签的月份部分使用合适的计数器和任何你想要的东西。

要获得更好的外观,例如粗体或彩色背景,您需要做更多的工作。

请注意,标签和系列中的数字是反向堆叠的,因此内部循环向后。

这适用于任意数量的系列。

【讨论】:

非常感谢 TaW。这是我从某个地方开始的一个很好的指针。我对所有其他方法感到筋疲力尽。上帝保佑你先生。 研究第一个答案后,您可能想查看第二个答案。如您所见,我在模仿您发布的图片时玩得很开心:-)【参考方案2】:

这是使用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,而是将它们添加到DataPointsTags

    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;

使用Colors 创建Series 后,您需要应用它们,以便可以在代码中访问它们:

chart1.ApplyPaletteColors();

Series 的漂亮圆角列是由 CustomProperty 创建的

s.SetCustomProperty("DrawingStyle", "Cylinder");

更多细节:

chart.Series[1].Color = Color.Crimson;
chart.Series[0].LegendText = "Hobbits";
..

更新:您需要在我的其他一些帖子中包含两个函数InnerPlotPositionClientRectangleChartAreaClientRectangle,例如here 或here!

要制作这个work in ASP,您需要在PageLoad 中连接事件:

chart1.PostPaint += new EventHandler<ChartPaintEventArgs>(chart1_PostPaint);

【讨论】:

这个更好,颜色也很好看。 Taw,我正在使用 Asp.net MVC;我将无法使用“private void chart1_PostPaint(object sender, ChartPaintEventArgs e)”,因为它适用于 Windows 版本。是否有解决方法来调用此过程?谢谢! 好吧,在 (MSDN](msdn.microsoft.com/en-us/library/…) 中查找它之后,我想它在 ASP 中的工作方式应该差不多。我没有 ASP,所以我不能发布实际的代码,但参数看起来一样,所以它应该可以工作。 Here is an example 谢谢你!我在上面使用了您的链接:***.com/questions/35791944/…,效果很好。我需要添加颜色并使盒子更宽。我也尝试使用您在上面第一条评论中指定的书面代码,但结果不好,所以我跳过了这种方法。 我忘了提到用于 asp.net 的 MVC 没有创建 page_load 事件的选项。我会看看是否有另一种获得颜色的方法。谢谢 TaW。

以上是关于MS 图表数据值标签的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy添加数据

s-s-rS 100% 图表没有数据标签

如何使用 c# 将数据表值添加到 ms 访问表

剑道图表显示0值

07版EXCEL中的图表如何增加图例

从 MS Access 中提取数据并输出图表 [关闭]