c# - Winform MsChart 辅助轴和带状线

标签 c# winforms mschart

我在 Winform 中绘制 MSChart 时遇到一些问题。

  1. 我无法获取图表右侧显示的 Y2 轴值,这应该是默认值 - 类似于 question

  2. 带状线不会绘制,并且

  3. 是否可以将 Y1 和 Y2 轴的零值对齐?

    感谢您的帮助。

        ChartArea TestChartArea = new ChartArea();
    
        public void CreateChartArea()
        {
            TestChartArea.Name = "TestChartArea";
            TestChartArea.BackColor = Color.LightGreen;
            TestChartArea.Position = new ElementPosition { Height = 100, Width = 80, X = 2, Y = 5 };
            //TestChartArea.Position = new ElementPosition { Auto = true };
            TestChartArea.AxisY = new Axis
            {
                Enabled = AxisEnabled.True,
                IsLabelAutoFit = true,
                IsMarginVisible = true,
                LabelStyle = new LabelStyle { Format = "P2", ForeColor = Color.DarkBlue, Font = new Font("Arial", 10, FontStyle.Regular) },
                LineColor = Color.Black,
                MajorGrid = new Grid { LineColor = Color.White, LineDashStyle = ChartDashStyle.Solid },
                MajorTickMark = new TickMark { LineColor = Color.Black }
            };
    
            TestChartArea.AxisY2 = new Axis
            {
                Enabled = AxisEnabled.True,
                IsLabelAutoFit = true,
                IsMarginVisible = true,
                LabelStyle = new LabelStyle { Format = "P2", ForeColor = Color.DarkBlue, Font = new Font("Arial", 10, FontStyle.Regular) },
                LineColor = Color.Transparent,
                MajorGrid = new Grid { LineColor = Color.Yellow, LineDashStyle = ChartDashStyle.Solid },
                MajorTickMark = new TickMark { LineColor = Color.Blue }
    
            };
    
            TestChartArea.AxisX = new Axis
            {
                Enabled = AxisEnabled.True,
                Crossing = 0,
                LineWidth = 1,
                IsLabelAutoFit = true,
                IsMarginVisible = false,
                LabelStyle = new LabelStyle {  Angle=-45,Format = "N0", ForeColor = Color.Black, Font = new Font("Arial", 8, FontStyle.Regular) },
                LineColor = Color.Black,
                MajorGrid = new Grid { LineColor = Color.White, LineDashStyle = ChartDashStyle.Solid },
                MajorTickMark = new TickMark { LineColor = Color.LightGray, Size = 4.0f },
                Name="Spot"
    
            };
        }
    
        public void PlotChart()
        {
            int[] Xseries = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            double[] AXJO = { 0.0025, 0.0015, -0.001, 0.002, 0.0045, -0.002, -0.003, 0.0001, -0.004, -0.0075 };
            double[] ES = { 0.0020, 0.0010, -0.0005, 0.003, 0.0025, -0.001, -0.0015, 0.0005, -0.0032, -0.006 };
            double[] Diff = new double[10];
    
            // pair return
            for (int i = 0; i < 10; i++)
            {
                Diff[i] = AXJO[i] - ES[i];
            }
    
            TestChart.BackColor = Color.LightGoldenrodYellow;
            TestChart.BackSecondaryColor = Color.LightBlue;
    
            if (TestChart.Series.IsUniqueName("AXJO"))
            {
                TestChart.Series.Add("AXJO");
                TestChart.Series["AXJO"].YAxisType = AxisType.Primary;
                TestChart.Series["AXJO"].Color = Color.Green;
                TestChart.Series["AXJO"].ChartType = SeriesChartType.Line;
                TestChart.Series["AXJO"].Points.DataBindXY(Xseries, AXJO);
                TestChart.Series["AXJO"].ChartArea = "TestChartArea";
            }
    
            if (TestChart.Series.IsUniqueName("ES"))
            {
                TestChart.Series.Add("ES");
                TestChart.Series["ES"].YAxisType = AxisType.Primary;
                TestChart.Series["ES"].Color = Color.Red;
                TestChart.Series["ES"].ChartType = SeriesChartType.Line;
                TestChart.Series["ES"].Points.DataBindXY(Xseries, ES);
                TestChart.Series["ES"].ChartArea = "TestChartArea";
            }
    
            if (TestChart.Series.IsUniqueName("Diff"))
            {
                TestChart.Series.Add("Diff");
                TestChart.Series["Diff"].YAxisType = AxisType.Secondary;
                TestChart.Series["Diff"].Color = Color.Blue;
                TestChart.Series["Diff"].ChartType = SeriesChartType.Line;
                TestChart.Series["Diff"].Points.DataBindXY(Xseries, Diff);
                TestChart.Series["Diff"].ChartArea = "TestChartArea";
            }
        }
    
        public void AddStripLine()
        {
            // add stripline at Diff=zero
            StripLine ZeroDiff = new StripLine();
            ZeroDiff.ForeColor = Color.Black;
            ZeroDiff.BackColor = Color.Black;
            ZeroDiff.StripWidth = 1;
            ZeroDiff.BorderWidth = 2;
            ZeroDiff.Interval = 0;
            ZeroDiff.IntervalOffset = 10;
            TestChart.ChartAreas["TestChartArea"].AxisY2.StripLines.Add(ZeroDiff);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            PlotChart();
            AddStripLine();
        }
    }
    

enter image description here

最佳答案

您询问了 AxisY2 的不需要的放置位置通过设置其 Crossing属性至0

只是不设置它,因此将其保留为默认值 double.NaN自动将其放置在右侧将解决问题......:

Crossing = double.NaN

要显示带状线,它需要在其轴的可见范围内开始。将其偏移 10 对于您的数据来说太过分了。而且将其设置为黑色可能也不是您想要的,除非您只想要一条细线,而不是彩色区域..

StripLines的基本规则是:

  • 何时 Interval = 0 IntervalOffset 处仅显示一条带状线宽度/高度为 StripWidth
  • 何时 Interval > 0显示许多带状线,跨越整个轴;除非你有半透明的颜色,否则你需要确保 StripWidth < Interval否则它们之间就没有空间!
  • 所有度量都在轴值中;类型可以通过 StripWidthType 设置和IntervalType ;特别是在使用 DateTime 之一时很有用单位。

要使两个 y 轴的 0 值对齐,您需要调整 Minimum和/或 Maximum一个或两个轴的值。这可能有点棘手,您可能需要查看数据并完全控制间距和放置轴标签。

enter image description here

关于c# - Winform MsChart 辅助轴和带状线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42049169/

相关文章:

c# - 对自定义 WPF UIElement 的呈现进行单元测试

c#、列表框、stackOverflow 异常

c# - 如何处理 System.Runtime.InteropServices.COMException (0x800706BA) : The RPC server is unavailable.(来自 HRESULT 的异常:0x800706BA)

c# - 单点触摸阅读作为滚动操作

c# - 为什么 RESX 编辑器在 Xamarin Studio 社区中对我不起作用

.net - F# 图表控件更改图例文本

C#:如何在 ASP.Net 条形图中对条形进行交叉影线

c# - 极坐标图 x 轴 0 位置

c# - 格式化包含数字/日期的字符串变量以在 C# 中打印

.net - WinForms - 试图制作一个背景最大化的表格,它留在后台并且不响应