C# Multi-Series лентова диаграма, показваща неправилна информация за 2/10 записа

Опитвам се динамично да създам стълбовидна диаграма в C# въз основа на следната таблица с данни (която ще се промени, следователно необходимостта от динамично създаване).

Ето таблиците с данни, от които чета в момента: (хора на бъдещето: тези изображения съдържаха работни неща и не искам да бъда уволнен, затова ги премахнах =O )

Горната таблица е мястото, където добавям данните от серията (s24, s26, s27). Втората таблица е мястото, където я намалявам и добавям серията „Общо“.

И така, ето колоните, от които се опитвам да направя диаграма:

Конфигурация - това е мястото, където искам да получа моите индивидуални серии: т.е.: s24, s26, s27 и т.н. HRC_Count - това е действителната стойност, която се опитвам да изобразя в графика HRC_Description и HRC - това са етикети за Y оста Total_HRC_Count - това е за моята серия "Общо" (черна лента на диаграмата)

//get distinct Configs (to be added as Series in chart)
//this creates a dataview to parse for the series in the chart
        DataView view = new DataView(dt);
        DataTable distinctValues = new DataTable();
        distinctValues = view.ToTable(true, "Config");
        DataView dv = new DataView(distinctValues);
        dv.Sort = "Config ASC";

        DataTable dt_temp = new DataTable();
        dt_temp = dv.ToTable();
        distinctValues = dt_temp;


        GraphDataNew(distinctValues);

след това извиквам GraphDataNew и анализирам изгледа на данни за серията:

private void GraphDataNew(DataTable dt_distinct)
    {
        chart_new.Series.Clear();
        foreach (DataRow row in dt_distinct.Rows)
        {
            string s = row["Config"].ToString();
            chart_new.Series.Add(s);
            chart_new.Series[s].ChartType = SeriesChartType.Bar;
            chart_new.Series[s].IsValueShownAsLabel = true;
            chart_new.Series[s].Sort(PointSortOrder.Ascending, "X");
            chart_new.Series[s].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.String;
            chart_new.Series[s].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
        }

И така, сега имам настроена серия (конфигурации), сега добавям действителни данни:

        DataView dv = new DataView(dt);
        dv.Sort = "HRC_Description ASC, Config ASC"; // sort by description first, then config second

        string HRC_Description = "";
        string Config = "";
        double HRC_Count = 0;
        DataTable dt_temp = new DataTable();
        dt_temp = dv.ToTable();

        // add actual data
        //loop through dt_temp and add datapoints and custom labels to chart
        for (int x = 0; x < dt_temp.Rows.Count; x++)
        {

            HRC_Description = (dt_temp.Rows[x]["HRC_Description"].ToString().Trim());
            Config = dt_temp.Rows[x]["Config"].ToString().Trim();
            HRC_Count = Double.Parse(dt_temp.Rows[x]["HRC_Count"].ToString().Trim());


           chart_new.Series[Config].Points.AddXY(HRC_Description, HRC_Count);
           int y = chart_new.Series[Config].Points.Count;
           chart_new.Series[Config].Points[y - 1].AxisLabel = HRC_Description;
        }

След това добавям лентата на серията „Общо“:

if (1==1) // fake condition for this question
        {
            chart_new.Series.Add("Total");
            chart_new.Series["Total"].ChartType = SeriesChartType.Bar;
            chart_new.Series["Total"].Color = Color.Black;
            chart_new.Series["Total"].IsValueShownAsLabel = true;
            chart_new.Series["Total"].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.String;
            chart_new.Series["Total"].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;

            DataView view1 = new DataView(dt_temp);
            DataTable distinctValues1 = view1.ToTable(true, "HRC_Description", "Total_HRC_Count");

            dt_temp = distinctValues1;
            double Total_HRC_Count = 0;
            for (int x = 0; x < dt_temp.Rows.Count; x++)
            {
                HRC_Description = (dt_temp.Rows[x]["HRC_Description"].ToString().Trim());
                Total_HRC_Count = Double.Parse(dt_temp.Rows[x]["Total_HRC_Count"].ToString().Trim());
                chart_new.Series["Total"].Points.AddXY(HRC_Description, Total_HRC_Count);


            }

        }

Ето как изглежда диаграмата: [![Примерна диаграма][2]][2]

Въпреки това, както можете да видите в приложената диаграма, всички мои данни са изключени. Има 10 от HRC_Description, но само 9 се показват, а едно се повтаря. Освен това изглежда, че когато имам повече от 2 серии, данните се смесват. Някой има ли съвети какво мога да направя, за да поправя това? Побърква ме! Благодаря!!


person Rob K    schedule 23.02.2016    source източник
comment
Не много хора обичат да се ровят в големи, непълни, зле форматирани кодови фрагменти. Затова ви препоръчвам да създадете минимално пълен пример за проверка. Не трябва да използва данни от база данни - само някои твърдо кодирани проби, които му позволяват да възпроизведе проблема и не трябва да съдържа ненужен код (като бърникане на потребителския интерфейс, регистриране и т.н.). MCVE значително ще подобри шансовете за получаване на някои полезни отговори. Може би, докато създавате такъв MCVE, можете дори да разберете отговора сами.   -  person Eugene Podskal    schedule 23.02.2016
comment
Добавих пример, който показва най-вероятния източник на вашия проблем   -  person TaW    schedule 24.02.2016


Отговори (1)


Не мога да анализирам напълно вашите данни, но мога да ви дам намек, който би трябвало да помогне при решаването на проблема ви:

Виждам, че добавяте точките от данни с низове като x-стойности.

Това е добре (донякъде; добре, не, не наистина), но x-стойностите на точките от данни, които всъщност са добавени, наистина са не низове, а двойни и всички те съдържат 0.

Низовете влизат само в етикетите, а не в x-стойностите! (Така че стойностите са изгубени)

Но за да бъдат групирани заедно, точките във вашите различни серии се нуждаят от някакъв критерий и тъй като x-стойностите няма да работят (въпреки че изглеждат така, сякаш са), вместо това се използва позицията на точките. Което зависи от позициите, т.е. от реда и броя точки, които добавяте.

Така че само тези ленти ще бъдат групирани заедно, които са добавени към една и съща позиция и тъй като няма реални позиции, редът, в който са добавени, е всичко, което се брои.

Така че трябва да се уверите, че винаги използвате един и същ ред и никога не оставяйте място празно, когато добавяте вашите точки. Ако стойности липсват в серия, вие трябва да добавите празни фиктивни точки (задайте нейните DataPoint.IsEmpty=true)

Лесно се греши..!

Можете да проверите дали това е причината, като проверите броя на точките от данни във всяка серия. Ако не са еднакви това е проблема..

Ето един пример: Забележете как във втората, жълта и в 3-та, червена серия липсват стойности, но как само жълтата е изключена; обърнете специално внимание на последната точка!

въведете описание на изображението тук

private void button17_Click(object sender, EventArgs e)
{
    chart3.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
    chart3.Series.Clear();
    Series s1 = chart3.Series.Add("S1");
    Series s2 = chart3.Series.Add("S2");
    Series s3 = chart3.Series.Add("S3");
    Random R = new Random(42);

    s1.ChartType = SeriesChartType.Bar;
    s2.ChartType = SeriesChartType.Bar;
    s3.ChartType = SeriesChartType.Bar;

    for (int i = 0; i < 10; i++)
    {
        // this series is complete..:
        s1.Points.AddXY(i + "", R.Next(100));
        int r = R.Next(5);
        // this series misses some points..:
        if (r==0) s2.Points.AddXY(i + "", R.Next(100));
        // this series inserts empty points and so misses no points.:
        if (r == 0) s3.Points.AddXY(i + "", R.Next(100));
        else { int p = s3.Points.AddXY(i + "", R.Next(100)); s3.Points[p].IsEmpty = true; }
    }
    // now add a value at "10" for all series..;
    s1.Points.AddXY("10", 100);
    s2.Points.AddXY("10", 100);
    s3.Points.AddXY("10", 100);
}
person TaW    schedule 23.02.2016
comment
Много благодаря!! Това беше точно това. Добавих точкова система всеки път, когато HRC_Description се промени, така че X стойностите се увеличават от 0 до „максимален брой етикети, които ще имам“ и сега работи! Имам допълнителен въпрос относно форматирането - вижте как на моята прикачена снимка серията не се докосва (вътре в червеното поле)? Има ли начин да ги накараш да се докоснат, когато междинните серии са празни? i.imgur.com/JGqvNVy.jpg - person Rob K; 24.02.2016
comment
Не, не мисля, че можете да направите това; мястото за точките от серията винаги ще бъде запазено. освен ако не можете да разбъркате двете серии, за да го предотвратите, ще трябва да живеете с това, вярвам. - person TaW; 24.02.2016