none
Synchronisation der Achsenskalierung zwischen ChartAreas RRS feed

  • Frage

  • Moin,

    ich möchte Daten in zwei ChartAreas vergleichen. Dazu lege ich eine Slave-ChartArea hinter eine Master-ChartArea und mache den Master transparent.

    Mit der AlignWithChartArea-Eigenschaft klappt das gut.

    Mein Problem: ich möchte gerne den Slave im Hintergrund genauso skalieren wie den Master. Sind diskrete Achsenwerte eingestellt, klappt das. Wenn ich die Autoskalierung benutze, steht in den Minimum- und Maximum-Werten NaN und ich kann keinen sinvollen Wert an den Slave übergeben.

    Wie kann ich die aktuelle Skalierung (wie z.B. AxisY.Maximum) auch bei Autoscale auslesen?

    Danke, Messie

     


    bin neu hier...
    Dienstag, 22. Februar 2011 09:15

Antworten

  • Hallo Messie,

    Nach erfolgter Datenbindung, kannst Du in diesem Fall die Methode RecalculateAxesScale() aufrufen:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          const int MAXPOINTS = 12;
          Random random = new Random(DateTime.Now.Millisecond);
    
          chart1.Series.Clear();
          chart1.ChartAreas.Clear();
          chart1.Legends.Clear();
    
          chart1.BackColor = Color.Transparent;
    
          Series[] series = new Series[2];
    
          for (int seriesIndex = 0; seriesIndex < 2; seriesIndex++)
          {
            series[seriesIndex] = new Series() { ChartType = SeriesChartType.Line, BorderWidth = 2 };
    
            for (int pointIndex = 0; pointIndex < MAXPOINTS; pointIndex++)
            {
              DateTime dateX = DateTime.Now.Date.AddDays(pointIndex);
              series[seriesIndex].Points.AddXY(dateX, random.Next(1, (seriesIndex + 1) * 1000));
            }
    
            chart1.Series.Add(series[seriesIndex]);
    
            ChartArea area = new ChartArea();
            area.BackColor = Color.Transparent;
    
            if (seriesIndex == 1)
            {
              series[seriesIndex].YAxisType = AxisType.Secondary;
              series[seriesIndex].XAxisType = AxisType.Secondary;
            }
    
            chart1.ChartAreas.Add(area);
            series[seriesIndex].ChartArea = area.Name;
          }
    
          chart1.ChartAreas[1].AlignmentOrientation = AreaAlignmentOrientations.All;
          chart1.ChartAreas[1].AlignmentStyle = AreaAlignmentStyles.All;
          chart1.ChartAreas[1].AlignWithChartArea = chart1.ChartAreas[0].Name;
    
          chart1.ChartAreas[0].RecalculateAxesScale(); 
          chart1.ChartAreas[1].RecalculateAxesScale(); 
    
          double maxY = Math.Max(chart1.ChartAreas[0].AxisY.Maximum, chart1.ChartAreas[1].AxisY2.Maximum);
    
          chart1.ChartAreas[0].AxisY.Maximum = maxY;
          chart1.ChartAreas[1].AxisY2.Maximum = maxY;
        }
      }
    }
    

     

    (P.S. Ich habe hier zur besseren visuellen Differenziierung primäre und sekundäre X und Y-Achsen verwendet.)

    ChartArea.RecalculateAxesScale-Methode:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.datavisualization.charting.chartarea.recalculateaxesscale.aspx

    Gruss
    Marcel

    Dienstag, 22. Februar 2011 11:36
    Moderator