2016-11-25 38 views
1

次の問題があります。 チャートコントロール内に複数の列を表示する必要があります。今、私が "Column"型のチャートを持っているとき、7つのカラムすべてが並べて表示されます。私がしたいのは、それらを重ねることです。これは可能ですか?チャートコントロールで縦棒グラフが重なり合うようにする

次の二つの解決策は、私を助けていない:

Plotting overlapping column or bar chart

Chart control two data set bars overlapping

ありがとうございました。

答えて

5

これを行うための組み込み方法はありません。

  • 他はオーナー描画チャートに..です

    • つの回避策は3-dをオンにすることですが、それは完全に、チャートの外観を変更します。

    カラムのサイズが公開されていないため、これはカラムタイプとバータイプでは正確ではありません。

    また、重複する列は読みにくくなります。あなたはまたLabelsを持っているとき。

    ここでは、オーナー図柱状図の例を示します。

    すべてSeriesは、同じ数の点を持ち、整列しています。すべてのy値は正の値を持ち、他の装飾はありません。

    enter image description here

    :彼らはすべて

    private void chart1_PostPaint(object sender, ChartPaintEventArgs e) 
    { 
        if (!checkBox2.Checked) return; 
    
        int sMax = chart1.Series.Count; 
        ChartArea ca = chart1.ChartAreas[0]; 
        Axis ax = ca.AxisX; 
        Axis ay = ca.AxisY; 
        float py0 = (float)ay.ValueToPixelPosition(ay.Minimum); 
        Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca)); 
        int pMax = chart1.Series[0].Points.Count; 
        float shift = (overlap * sMax)/2f; 
        float deltaX = 1f * ipr.Width/(pMax+1); 
        float colWidth = 1f * deltaX/sMax; 
    
        for (int j = 0; j < chart1.Series.Count; j++) 
         for (int i = 0; i < chart1.Series[j].Points.Count; i++) 
         { 
          DataPoint dp = chart1.Series[j].Points[i]; 
          float px = (float)ax.ValueToPixelPosition(dp.XValue); 
          float py = (float)ay.ValueToPixelPosition(dp.YValues[0]); 
          using (SolidBrush brush = new SolidBrush(chart1.Series[j].Color)) 
           e.ChartGraphics.Graphics.FillRectangle(brush, 
            px + j * colWidth - deltaX/2 - overlap * j + shift, py, 
            colWidth, py0 - py); 
         } 
    } 
    

    それはあなたがここでhere

    を見つけることができる機能InnerPlotPositionClientRectangleを利用した結果である..しかし、おそらくいくつかの余分な努力と、克服することができます

    シリーズカラーにアクセスするには、applyをチャートに追加する必要があります。

    chart1.ApplyPaletteColors(); 
    

    列幅を次のように設定されている:列が消えて "0" で

    private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
        for (int j = 0; j < chart1.Series.Count; j++) 
         chart1.Series[j]["PointWidth"] = numericUpDown1.Value.ToString(); 
    } 
    

  • +0

    ありがとうございますが、チャートは回っているかしていませんか?私はStackedColumn Chartのようなものが必要です – Canox

    +0

    これらはターンではなく、重なり合うようにシフトされています。あなたが__stack__したいときに__overlapping__列を要求する理由は何ですか?そして、StackedColumn Chart'_のように見えるものは何を意味しますか?あなたはStackedColumnチャートを意味しますか?それであなたはそれを持っています!さて、あなたはちょうど[ルールに従います](http://stackoverflow.com/questions/40278299/stackedcolumn-chart-shows-weird-column-width/40279546?s=1|4.8085#40279546)1つを作成してください! – TaW

    +0

    質問は、所有者が列を描きたがっている読者を知るかもしれません。私はあなたが質問をそのままにしておくことをお勧めします1)StackedColumnチャートを使用しようとすると、問題に遭遇したときに、スクリーンショットを含めて、 – TaW

    関連する問題