1

パーセンテージ、通貨値、または単純な数値の統計をグラフ化しています。

グラフ コントロールの軸の最大値を、データ セットの最大値よりも少しだけ上に丸めた数値に設定する必要があります。(グラフ コントロールの既定値は、私が望むものではありません)。

2 つの注意事項:

  1. 軸の最大値に設定した値は、データセットの最大値よりも 5% 以上大きくする必要があります (これよりも小さいほど良い)。

  2. 0 Y 軸の上に 4 本の水平線があります。したがって、理想的には、Y 軸の最大値は 4 で割る必要があります。

サンプル データは次のようになります。

200%, 100%, 100%, 100%, 75%, 50%, 9%

この場合、最大値として 220% が許容されます。

$3500161, $1825223, $1671232, $110112

この場合、$3680000 で十分かもしれません。または$ 3700000だと思います。

誰かがこれを行うための良い式を提案できますか? 5% の余白を 10% に変更したり、4 本の水平線を 5 本に変更したりするなど、設定を調整する必要があるかもしれません。

4

3 に答える 3

1

グラフの軸を作成するために使用するコードを次に示します。

/// <summary>
/// Axis scales a min/max value appropriately for the purpose of graphs
/// <remarks>Code taken and modified from http://peltiertech.com/WordPress/calculate-nice-axis-scales-in-excel-vba/</remarks>
/// </summary>
public struct Axis 
{
    public readonly float min_value;
    public readonly float max_value;
    public readonly float major_step;
    public readonly float minor_step;
    public readonly int major_count;
    public readonly int minor_count;

    /// <summary>
    /// Initialize Axis from range of values. 
    /// </summary>
    /// <param name="x_min">Low end of range to be included</param>
    /// <param name="x_max">High end of range to be included</param>
    public Axis(float x_min, float x_max)
    {
        //Check if the max and min are the same
        if(x_min==x_max)
        {
            x_max*=1.01f;
            x_min/=1.01f;
        }
        //Check if dMax is bigger than dMin - swap them if not
        if(x_max<x_min)
        {
            float temp = x_min;
            x_min = x_max;
            x_max = temp;
        }

        //Make dMax a little bigger and dMin a little smaller (by 1% of their difference)
        float delta=(x_max-x_min)/2;
        float  x_mid=(x_max+x_min)/2;

        x_max=x_mid+1.01f*delta;
        x_min=x_mid-1.01f*delta;

        //What if they are both 0?
        if(x_max==0&&x_min==0)
        {
            x_max=1;
        }

        //This bit rounds the maximum and minimum values to reasonable values
        //to chart.  If not done, the axis numbers will look very silly
        //Find the range of values covered
        double pwr=Math.Log(x_max-x_min)/Math.Log(10);
        double scl=Math.Pow(10, pwr-Math.Floor(pwr));
        //Find the scaling factor
        if(scl>0&&scl<=2.5)
        {
            major_step=0.2f;
            minor_step=0.05f;
        }
        else if(scl>2.5&&scl<5)
        {
            major_step=0.5f;
            minor_step=0.1f;
        }
        else if(scl>5&&scl<7.5)
        {
            major_step=1f;
            minor_step=0.2f;
        }
        else
        {
            major_step=2f;
            minor_step=0.5f;
        }
        this.major_step=(float)(Math.Pow(10, Math.Floor(pwr))*major_step);
        this.minor_step=(float)(Math.Pow(10, Math.Floor(pwr))*minor_step);
        this.major_count=(int)Math.Ceiling((x_max-x_min)/major_step);
        this.minor_count=(int)Math.Ceiling((x_max-x_min)/minor_step);
        int i_1=(int)Math.Floor(x_min/major_step);
        int i_2=(int)Math.Ceiling(x_max/major_step);
        this.min_value=i_1*major_step;
        this.max_value=i_2*major_step;
    }
    public float[] MajorRange
    {
        get
        {
            float[] res=new float[major_count+1];
            for(int i=0; i<res.Length; i++)
            {
                res[i]=min_value+major_step*i;
            }
            return res;
        }
    }
    public float[] MinorRange
    {
        get
        {
            float[] res=new float[minor_count+1];
            for(int i=0; i<res.Length; i++)
            {
                res[i]=min_value+minor_step*i;
            }
            return res;
        }
    }
}

数学的な最小値を指定するmax_valuemin_value、初期化されたものから計算されたように計算されます。Axis最大 x_minとの値x_max

例:

  1. new Axis(0,3500161)計算するmax_value = 4000000.0
  2. new Axis(0,1825223)計算するmax_value = 2000000.0
  3. new Axis(0,1671232)計算するmax_value = 1800000.0
  4. new Axis(0, 110112)計算するmax_value = 120000.0
于 2012-07-09T18:49:58.977 に答える
0

あなたの最初のクエリの使用のために:

DataView data = new DataView(dt);
string strTarget = dt.Compute("MAX(target)", string.Empty).ToString();// target is your column name.
int tTarget = int.Parse(strTarget.Equals("") ? "0" : strTarget); // Just in case if your string is empty.
myChart.ChartAreas[0].AxisY.Maximum = myChart.ChartAreas[0].AxisY2.Maximum = Math.Ceiling(tTarget * 1.1); // This will give a 10% plus to max value.

2 番目の点については、副軸/主軸のインターレースとオフセットのプロパティを使用して、これを理解できると思います。

于 2012-07-09T15:03:59.290 に答える
0

まず、(グラフの上部)/(最大データ ポイント) の範囲を決定する必要があります。これは下限で 1.05 に制限されています。妥当な上限は 1.1 または 1.15 です。範囲が広いほど、グラフの上部に空白が多く表示される場合がありますが、数値が「より適切」になる場合があります。または、最初に「ナイスネス」基準を選択してから、上記の比率が少なくとも 1.05 である、十分にナイスな最小の数値を選択することもできます。

また、その下限を緩めて、たとえば 1.02 または 1.0 に下げることで、間隔の「快適さ」を改善することもできます。

編集:コメントに応じて。

適切な最大サイズを見つけるために必要なことは、最大値にマージンを加えたものを間隔の数で割り、最も近い「適切な」値に丸め、間隔の数を掛けることです。「ナイス」の合理的な定義は「の倍数」かもしれません。10^(floor(log_10(max value)) - 2)ナイスネスの定義が緩いほど、(平均して) 上部の余分なマージンが少なくなります。

于 2012-07-09T15:06:54.837 に答える