तो, यहाँ समस्या है।

मेरे पास एक चार्ट है जो निम्न लूप का उपयोग करके कई प्रकार के कार्य प्रकारों में दो कॉलम, पूर्ण और अपूर्ण प्रदर्शित करता है:

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

मैं जो करने की कोशिश कर रहा हूं वह यह है कि यह दो कॉलम के ऊपर एक लेबल प्रदर्शित करता है जो प्रत्येक कार्य प्रकार के प्रतिशत के रूप में पूर्णता मान प्रदर्शित करता है।

किसी तरह की सहायता या सुझाव की हम सराहना करते हैं।

यह चार्ट का वर्तमान स्वरूप है: यहां छवि विवरण दर्ज करें

2
Christopher Szynkowski 7 सितंबर 2018, 19:44

1 उत्तर

सबसे बढ़िया उत्तर

डिफ़ॉल्ट रूप से Labels y-मान दिखाते हैं लेकिन आप प्रत्येक DataPoint के लिए एक मनमाना Label सेट कर सकते हैं। जब आप इस तरह से बिंदु जोड़ते हैं:

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-मान की ऊंचाई पर दिखाने के लिए एंकर करता हूं।

  • एंकरिंग के लिए (अक्ष-) मानों का उपयोग करने के लिए इसे एक या दोनों अक्षों को असाइन करना होगा।

  • मैं फिर (आदेश मायने रखता है!) AnchorX गुण सेट करता हूं ताकि यह एक बिंदु पर केंद्रित न हो बल्कि सामान्य x-मान पर केंद्रित हो।

  • मैंने कुछ Height भी सेट किए हैं वरना टेक्स्ट कॉलम के ऊपर नहीं जाएगा; निश्चित नहीं है कि यहाँ क्या तर्क है..

यहाँ परिणाम है:

enter image description here

मैंने अंक जोड़ते समय एनोटेशन जोड़े थे:

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 );
2
TaW 10 सितंबर 2018, 16:56