none
Chartで複数のシリーズを表示する際に、赤×印が表示される。 RRS feed

  • 質問

  • Chartで複数のシリーズを表示する際に、赤×印が表示されます。

    原因は、複数のシリーズに追加したデータの要素数が異なるためだと思います。

    (※要素数を同じにすれば正常に複数表示されたため。)

    不足している要素数を0などの値で補おうと考えましたが、不恰好になるので避けたいです。

    要素数が異なっていても、複数のシリーズを表示される方法はありませんでしょうか。

    何卒、ご教授の程、宜しくお願い致します。

    2016年6月18日 14:24

回答

  • ChartTypeとデータの与え方が提示されていないので適当に回答。

    以下の方法が考えられます。

    1. 要素数が2種までであれば、SeriesのXAxisType/YAxisTypeをPrimaryとSecondaryに振り分ける。
    2. ChartAreaを複数用意して振り分ける。
    3. データ数が異なっていてもエラーにならないChartTypeに変更する
    4. 空のポイントを追加する。(以下サンプル)
    using System;
    using System.Linq;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private System.Windows.Forms.DataVisualization.Charting.Chart chart;
            private CheckBox chkFix;
            private ListBox list;
            private Label label;
            public Form1()
            {
                this.Width = 600;
                this.Height = 600;
    
                Panel panel = new Panel();
                panel.Width = 150;
                panel.Dock = DockStyle.Left;
                this.Controls.Add(panel);
    
                list = new ListBox();
                list.Dock = DockStyle.Fill;
                list.IntegralHeight = false;
                list.SelectedIndexChanged += Changed;
    
                list.Items.AddRange(Enum.GetValues(typeof(SeriesChartType)).Cast<object>().ToArray());
    
                chkFix = new CheckBox();
                chkFix.Text = "データ数を補正";
                chkFix.CheckedChanged += Changed;
                chkFix.Dock = DockStyle.Bottom;
    
                label = new Label();
                label.Dock = DockStyle.Bottom;
                label.Font = new System.Drawing.Font(this.Font.FontFamily, 20);
                label.ForeColor = Color.Red;
    
                panel.Controls.Add(list);
                panel.Controls.Add(chkFix);
                panel.Controls.Add(label);
    
                list.SelectedItem = SeriesChartType.StackedBar100;
            }
    
            void Changed(object sender, EventArgs e)
            {
                SeriesChartType chartType = (SeriesChartType)list.SelectedItem;
                if (chart != null)
                {
                    this.Controls.Remove(chart);
                }
                ChartArea area = new ChartArea();
                chart = new Chart();
    
                chart.Dock = DockStyle.Fill;
                chart.ChartAreas.Add(area);
                Random rnd = new Random();
                int[] counts;
                counts = new int[] { 10, 10 };
                for (int i = 0; i < counts.Length; i++)
                {
                    var seri = new System.Windows.Forms.DataVisualization.Charting.Series();
                    seri.ChartType = chartType;
                    chart.Series.Add(seri);
                    for (int x = 0; x < counts[i]; x++)
                    {
                        seri.Points.AddXY(x, rnd.Next(100));
                    }
                }
                //2個目のSeriesのデータ数を不一致にする
                chart.Series[1].Points.RemoveAt(3);
                chart.Series[1].Points.RemoveAt(5);
    
    
                if (chkFix.Checked)
                {
                    //空のデータを挿入してデータ数を揃えさせる
                    var names = string.Join(",", chart.Series.Select(_ => _.Name));
                    chart.DataManipulator.InsertEmptyPoints(1, IntervalType.Number, names);
                }
    
                chart.Dock = DockStyle.Fill;
                this.Controls.Add(chart);
                this.Controls.SetChildIndex(chart, 0);
    
                label.Text = "エラー?";
                chart.Paint += (s2, e2) => { label.Text = ""; };
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 星 睦美 2016年6月30日 8:19
    2016年6月18日 15:55