亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
桃花長相依 2022-01-09 10:06:20
所以,這就是問題所在。我有一個圖表,使用以下循環顯示跨多種工作類型的已完成和未完成兩列: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);        }我想要做的是讓它在兩列上方顯示一個標簽,將completionRate 值顯示為每個workType 的百分比。任何幫助或建議將不勝感激。這是圖表的當前外觀:
查看完整描述

1 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

默認情況下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 值為中心是很難甚至是不可能的;那是因為 aLabel屬于單個數據點。這是柱形(和條形)類型圖表的一個獨特問題,因為這里系列的點以群集的形式顯示在公共 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你最好確定錨點,即之前值較大的那個,然后傳遞它而不是我在這里傳遞的兩個點。

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

  • 錨定到 aDataPoint以使其顯示在其 y 值的高度。

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

  • 然后我(順序很重要?。┰O置AnchorX屬性,使其不以一個點為中心,而是以公共 x 值為中心。

  • 我還設置了一些Height,否則文本不會在列頂部移動;不太清楚這里的理由是什么..

結果如下:

http://img1.sycdn.imooc.com//61da434c0001b40906570309.jpg

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


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 );


查看完整回答
反對 回復 2022-01-09
  • 1 回答
  • 0 關注
  • 407 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號