5

それぞれが複数のポイントを含む複数のシリーズを持つ縦棒グラフがあります。現在、柱はすべて互いに接触しています。各列の間にギャップを強制したい。どうすればこれを達成できますか?

PointWidth ( Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) を適用すると、x 値グループ間の分離が得られますが、個々のグループ内の各系列ポイント間の分離は得られないことがわかりました (これが必要です)。他の場所で提案されているように空のスペーサー シリーズを使用しても問題は解決しません。

現在のチャート

.Net 4、VS 2010、Web アプリケーションを使用しています。私のチャートコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting;

namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Chart1.ChartAreas.Add("Default");
            Chart1.ChartAreas["Default"].BackColor = Color.White;
            Chart1.ChartAreas["Default"].BackSecondaryColor = Color.AliceBlue;
            Chart1.ChartAreas["Default"].BackGradientStyle = GradientStyle.TopBottom;

            Chart1.BackColor = Color.AliceBlue;
            Chart1.BackSecondaryColor = Color.White;
            Chart1.BackGradientStyle = GradientStyle.TopBottom;
            Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
            var colors = new List<Color>(GetSystemColors().Where(c=>c.Name.StartsWith("Dark")));
            var rng = new Random();
            var start = rng.Next(0, colors.Count - 1);
            for (var c = start; c < start + 6; c++)
            {
                var color = colors[c % colors.Count];
                Chart1.Series.Add(color.Name);
                Chart1.Series[color.Name].BorderColor = color;
                Chart1.Series[color.Name].BorderWidth = 1;
                Chart1.Series[color.Name].Color = Color.FromArgb((int)(255 * .7), color);
                Chart1.Series[color.Name].BackSecondaryColor = Color.White;
                Chart1.Series[color.Name].BackGradientStyle = GradientStyle.TopBottom;
                for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
                    Chart1.Series[color.Name].Points.Add(new DataPoint(year, rng.Next(0, 20)));

                Chart1.Series[color.Name]["PointWidth"] = (0.6).ToString();
                //Chart1.Series.Add("Spacer:" + color.Name);
                //Chart1.Series["Spacer:" + color.Name]["PointWidth"] = (0.6).ToString();
            }
            Chart1.Legends.Add("Default");
        }

        static IEnumerable<Color> GetSystemColors()
        {
            Type type = typeof(Color);
            return type.GetProperties().Where(info => info.PropertyType == type).Select(info => (Color)info.GetValue(null, null));
        }
    }
}
4

2 に答える 2

7

私はあなたの状況を再現する悪魔自身の仕事をしました。そうすることで何かを学ぶことができると思ったので、私は助けたかったのですが、あなたのマークアップ、またはもっと良いことに、ソリューション全体が必要でした! グラフを含む単純なページを試したときに、「ChartImg.axd の子リクエストの実行中にエラーが発生しました」というエラーが発生しました。構成にハンドラーを追加する必要があることを発見しました。次に、アセンブリ System.Web.DataVisualization の読み込みに失敗しました。これは、コピーしたハンドラー要素が 3.5 DataVisualization アセンブリを参照していたため、それを 4.0 に変更し、最終的にグラフを表示したためです。それはなんて仕事だったのでしょう!

スペーサー シリーズがギャップを作成していない理由は、そのシリーズに値がないためです。以下のコードの最後の 2 行に注目してください。これは、スペーサー シリーズにゼロの値を追加します。これにより、他のシリーズ間に目的のギャップが生じますが、控えめに言っても見苦しい場合は、凡例にスペーサー シリーズがリストされていることもわかります。

  for (var c = start; c < start + 6; c++)
  {
   var color = colors[c % colors.Count];
   var seriesName = "Series "+ c;//color.Name);
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName].BorderColor = color;
   Chart1.Series[seriesName].BorderWidth = 1;
   Chart1.Series[seriesName].Color = Color.FromArgb((int)(255 * .7), color);
   Chart1.Series[seriesName].BackSecondaryColor = Color.FromArgb((int)(255 * .2), color);
   Chart1.Series[seriesName].BackGradientStyle = GradientStyle.TopBottom;
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, rng.Next(0, 20)));

   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();

   seriesName = "Spacer:" + seriesName;
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, 0));
  }

次のように、凡例テキストをスペースに設定できます (注意: 空の文字列は無視され、凡例テキストは設定されません) が、凡例にはこれらのスペーサー シリーズが引き続き表示されます。

    Chart1.Series[seriesName].LegendText = " ";

運が良ければ、凡例を表示する必要はありません。または、スペーサー シリーズの色を凡例の背景と同じ色に設定し、凡例のテキストをスペースに設定できます。これにより、レジェンドでダブル スペースの外観が発生しますが、許容される可能性があります。

于 2010-01-28T10:16:36.817 に答える
0

「IsVisibleInLegend」値を false に設定することで、シリーズが凡例に表示されるかどうかを制御できます

于 2011-10-15T18:34:45.863 に答える