簡體   English   中英

如何在 C# 中向柱形圖的頂部添加百分比

[英]How to add a percentage to top of Column chart in C#

所以,問題來了。

我有一個圖表,它使用以下循環顯示跨多種工作類型的兩列,已完成和未完成:

foreach (var workType in model.WorkTypes)
        {
            decimal completed = 0;
            decimal uncompleted = 0;
            decimal workSubmitted = 0;
            decimal completionRate= 0;
            foreach (var rec in model.JobList.Where(x => x.jobType== workType.Id))
            {
                uncompleted += model.JobList.SingleOrDefault(x => x.recID== rec.recID && x.jobType == workType.Id).Uncompleted;
                completed += model.JobList.SingleOrDefault(x => x.recID == rec.recID && x.jobType == workType.Id).Completed;

            }
            workSubmitted = uncompleted + completed;

            if (uncompleted != 0)
            {
                completionRate= (completed/ workSubmitted) * 100;
            }                
            myChart.Series["Uncompleted"].Points.AddXY(workType.TypeName, uncompleted );
            myChart.Series["Completed"].Points.AddXY(workType.TypeName, completed);
        }

我想要做的是讓它在兩列上方顯示一個標簽,將完成率值顯示為每個工作類型的百分比。

任何幫助或建議將不勝感激。

這是圖表的當前外觀: 在此處輸入圖片說明

默認情況下, Labels顯示y值,但你可以設置任意Label每個DataPoint時加點這樣的如:

int p = myChart.Series["Uncompleted"].Points.AddXY(workType.TypeName, rejections);
myChart.Series["Uncompleted"].Points[p].Label = sometext;

當然,您可以根據需要計算標簽的文本,例如:

string sometext = (workSubmitted / rejections * 100).ToString("0.00") + "%";

請注意,您必須在更改計算中的值后更新Label 不支持自動表達式!

更新

正如我寫的那樣,將Label放在列共享的 x 值的中心是困難的,甚至是不可能的; 那是因為Label屬於單個數據點。 這是柱形(和條形)類型圖表的獨特問題,因為這里系列的點圍繞公共 x 值成簇顯示。 (我們可以通過將標簽添加到中點來解決當且僅當我們有奇數個系列時)

所以我們需要使用Annotations 這是一個函數,它將放置一個TextAnnotation以兩個數據點的 x 值和較大 y 值的高度為中心..:

void setCenterAnnotation(Chart chart, ChartArea ca, 
                         DataPoint dp1, DataPoint dp2, string lbl)
{
        TextAnnotation ta = new TextAnnotation();
        ta.Alignment = ContentAlignment.BottomCenter;
        ta.AnchorAlignment = ContentAlignment.TopCenter;
        DataPoint dp = dp1.YValues[0] > dp2.YValues[0] ? dp1 : dp2;
        ta.Height = 0.36f;
        ta.AxisX = ca.AxisX;
        ta.AxisY = ca.AxisY;
        ta.AnchorDataPoint = dp;
        ta.AnchorX = dp1.XValue;
        ta.Text =  lbl;
        chart.Annotations.Add(ta);
}

如果您有兩個以上的Series您最好確定錨點,即之前具有較大值的那個,並傳遞它而不是我在這里傳遞的兩個點..

放置/錨定注釋並不是很明顯,所以這里有一些注意事項:

  • 一個DataPoint ,使之出現在它的y值的高度。

  • 要使用 (axis-) 值進行錨定,必須為其分配一個或兩個軸。

  • 然后我(順序很重要!)設置AnchorX屬性,使其不以點為中心,而是以公共 x 值為中心。

  • 我還設置了一些Height ,否則文本不會在列的頂部向上移動; 不太確定這里的基本原理是什么..

結果如下:

在此處輸入圖片說明

我在添加點的同時添加了注釋:

int ix = s1.Points.AddXY(i, rnd.Next(i+7));
s2.Points.AddXY(i, rnd.Next(i+4)+3);
double vmax = Math.Max(s1.Points[ix].YValues[0], s2.Points[ix].YValues[0]);
string lbl = (vmax / 123f).ToString("0.0") + "%";
setCenterAnnotation(chart12, ca, s1.Points[ix], s2.Points[ix], lbl );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM