【问题标题】:C# Scaling Axes of chartC# 缩放图表轴
【发布时间】:2015-10-23 19:41:11
【问题描述】:

我的应用程序中的图表有问题。我想用图表来显示图片的直方图。我想在图表下添加一个渐变矩形,颜色从黑色到 R/G/B/白色,所以我将它绘制为每个图表的背景图像。当 AxisY 上的值大于 1k 时,一切都很好,但是当这些值小于 4 位时,就会出现问题screen。任何人都知道如何防止 AxisX 的扩展?

初始化图表:

    for(int i = 0; i < 3; i++)
        {
            ca = new ChartArea();
            ca.AxisX.Interval = 1D;
            ca.AxisX.IntervalOffsetType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Number;
            ca.AxisX.LabelAutoFitStyle = System.Windows.Forms.DataVisualization.Charting.LabelAutoFitStyles.WordWrap;
            ca.AxisX.MajorGrid.Enabled = false;
            ca.AxisY.MajorGrid.LineColor = System.Drawing.Color.DarkGray;
            ca.BackColor = System.Drawing.Color.Transparent;
            ca.BackSecondaryColor = System.Drawing.Color.Transparent;
            ca.BorderWidth = 0;
            ca.Name = "ChartArea" + i.ToString();
            ca.AxisY.LabelAutoFitStyle = LabelAutoFitStyles.DecreaseFont;
            ca.AxisX.Minimum = 0;
            ca.AxisX.Interval = 256;
            ca.AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;

            s = new Series();
            s.BorderWidth = 0;
            s.ChartArea = "ChartArea" + i.ToString();
            s.IsVisibleInLegend = false;
            s.Name = "Series" + i.ToString(); ;
            s.Color = Colors[i];
            s["PointWidth"] = "1";

            HistCharts[i] = new Chart();
            HistCharts[i].Anchor = AnchorStyles.Top | AnchorStyles.Right;
            HistCharts[i].BackColor = Color.Transparent;
            HistCharts[i].BackgroundImageLayout = ImageLayout.None;
            HistCharts[i].BorderlineWidth = 0;
            HistCharts[i].ChartAreas.Add(ca);
            HistCharts[i].Location = new System.Drawing.Point(405, (i + 3) * Form.Height / 6 - 28);
            HistCharts[i].Name = "Chart" + i.ToString();
            HistCharts[i].Series.Add(s);
            HistCharts[i].Size = new System.Drawing.Size(297, Form.Height / 6 - 27);
            HistCharts[i].TabIndex = 6;
            HistCharts[i].Text = "chart" + i.ToString();
            HistCharts[i].Visible = false;
            HistCharts[i].SendToBack();
        }

        SetChartImage();
        for(int i = 0; i < 3; i++)
            HistCharts[i].BackgroundImage = HistImages[i];

设置新系列和绘画:

        if(Hists == null)
            {
                HistCharts[0].Visible = false;
                HistCharts[1].Visible = false;
                HistCharts[2].Visible = false;
                UpdateStatTimer(Time);
                return;
            }

            HistCharts[0].BackgroundImage = HistImages[Hists.Length > 1 ? 1 : 0];

            if(Hists[0].SequenceEqual(Hists[1]) && Hists[0].SequenceEqual(Hists[2]))
            {
                HistCharts[0].Series[0].Color = Color.Black;
                HistCharts[0].BackgroundImage = HistImages[0];
                HistCharts[0].Visible = true;
                HistCharts[1].Visible = false;
                HistCharts[2].Visible = false;
            }
            else
            {
                HistCharts[0].Series[0].Color = Color.Red;
                HistCharts[0].BackgroundImage = HistImages[1];
                HistCharts[0].Visible = true;
                HistCharts[1].Visible = true;
                HistCharts[2].Visible = true;
            }

            int Max = 0;
            for(int i = 0; i < 3; i++)
            {
                HistCharts[i].Series[0].Points.Clear();
                HistCharts[i].ChartAreas[0].AxisY.Maximum = Double.NaN;
                for(int j = 0; j < Hists[i].Length; j++)
                    HistCharts[i].Series[0].Points.AddXY(j + 0.5, Hists[i][j]);
                HistCharts[i].Update();
                if(HistCharts[i].ChartAreas[0].AxisY.Maximum > Max)
                    Max = (int) HistCharts[i].ChartAreas[0].AxisY.Maximum;
            }
            if(StatisticsItemCheck.Checked == false)
            {
                for(int i = 0; i < 3; i++)
                    HistCharts[i].ChartAreas[0].AxisY.Maximum = Max;
            }

如果所有 Hist 都相等,则绿色和蓝色直方图不可见,红色直方图变为灰度直方图

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果您需要更快的帮助,您应该在问题中包含相关代码。我们是这里的编码员,没有任何代码我们无法为您做很多事情。就目前而言,我可以推荐一些可以修复您包含的图片的Photoshop。
  • 我必须同意 leigero 的观点:我们至少需要查看绘制代码。我假设所有图像和所有图表区域都具有相同的大小?

标签: c# charts axis


【解决方案1】:

这不是真的缩放..:

您的图像并不总是与 Y 轴对齐的原因是 Y 轴图例在各种情况下占用的空间或多或少。这会使inner plot area 向右移动,并且您仔细对齐的图像不再适合。

当 Y 轴向右移动时,整个绘图区域会缩小,至少如果 Auto 的默认值对各种元素仍然有效..

最简单的解决方法是将位置从Auto 设置为适合所有数据的固定值:

chart1.ChartAreas[0].InnerPlotPosition.X = someValue;

请注意,所有element position 值都以整个图表的百分比表示!所以也许你会想在调整图表大小时修改它..?正如您所注意到的,您还必须调整图像大小..

要找到一个好的值,您可以使用调试器查看两种情况下哪些是当前值,然后选择较大的值,然后选择一些额外的值以确保安全。

同样,您可能希望更好地控制格式,即 y 轴标签值上的位数,可能像这样......:

chart1.ChartAreas[0].AxisY.LabelStyle.Format = "0.00"; // some formatstring

更新:

要使用系统的AutoScaling during(调整大小后,您可以使用此解决方法:

首先设置Auto 并复制生成的Elementposition。然后使用这些值创建一个受控制的新值:

int LeftEdge = yourValue;
chart1.ChartAreas[0].InnerPlotPosition.Auto = true;
ElementPosition EP = chart1.ChartAreas[0].InnerPlotPosition;
chart1.ChartAreas[0].InnerPlotPosition =  
                     new ElementPosition(LeftEdge, EP.Y, EP.Height, 100 - LeftEdge);

【讨论】:

  • 调整图表大小时,我也会调整此背景 Bitmp 的大小。图表只能垂直调整大小。您的回答解决了一些问题,但是如何使用固定 X 位置进行高度自动缩放?
  • 你能再解释一下吗?
  • 我想让这个图的 X 位置和宽度保持不变。但是当我调整表格大小时,我希望情节更高。所以当我用 someValue 设置 InnerPlotPosition.X 时,它的 Y 位置和高度停止自动。
  • 啊!请参阅我的更新以了解与调整大小一起使用的解决方法!
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多