将c#极坐标图设置为特定的环和段

时间:2016-08-14 09:12:29

标签: c# charts diagram

我想在C#(无库)中创建一个具有固定环和节段的极坐标图。是否也可以改变侧面的数字,以便0在右边?如果在C#中不可能有一个图书馆吗? image of the chart diagram in c#

here is what it should look like

2 个答案:

答案 0 :(得分:3)

这在winforms中使用GDI非常容易实现。创建一个新的UserControl,将OnPaint功能覆盖为:

  1. 画你的圈子(e.Graphics.DrawArc)
  2. 绘制标签(e.Graphics.DrawString)
  3. 绘制数据点和线(e.Graphics.DrawLine)
  4. ----------------编辑------------------ 创建一个新的UserControl:右键单击项目 - >添加 - >用户控制

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
            private void UserControl1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawEllipse(Pens.Blue, 0, 0, this.Width, this.Height);
                e.Graphics.DrawString("90", this.Font, Brushes.Black, new PointF(0, 0));
                e.Graphics.DrawLine(Pens.Red, 0,0, this.Width, this.Height );
            }
        }
    }
    

答案 1 :(得分:3)

使用MSChart控件并不难。

您可以使用其Polar ChartType并设置两个Axes的各种属性,以达到您想要的效果:

enter image description here

这是一个例子;在表单中添加Chart chart1并将其设置为:

Series s = chart1.Series[0];           // a reference to the default series
ChartArea ca = chart1.ChartAreas[0];   // a reference to the default chart area..
Axis ax = ca.AxisX;                    // and the ewo.. 
Axis ay = ca.AxisY;                    // ..axes  

s.ChartType = SeriesChartType.Polar;   // set the charttype of the series
s.MarkerStyle = MarkerStyle.Circle;    // display data as..
s.SetCustomProperty("PolarDrawingStyle", "Marker");  //.. points, not lines

让辐条以15°的步幅从0°到360° 旋转90°设置这些轴值:

ax.Minimum = 0;    
ax.Maximum = 360;
ax.Interval = 15;
ax.Crossing = 90;

控制响铃比较棘手,因为它最终必须考虑您的数据值!     假设y值从0到100,我们可以使用这些设置得到10个响铃:

ay.Minimum = 0;    
ay.Maximum = 100;  
ay.Interval = (ay.Maximum - ay.Minimum) / 10;

如果您的数据值有不同的范围,您应该调整这些值!

因此(Maximum - Minimum) / Interval的辐条数量为X-Axis。并且对于Y-Axis,环的数量是相同的。要控制两者,最好设置所有,而不是依赖默认的自动设置!

如果你想要一个空的中心,你应该

  • 包括y-mimimum值的缓冲区或-1或-2区间
  • 再制作1或2个戒指
  • 在中心画一个白色圆圈,这有点棘手......

作为替代方案,您可以向中心添加一个虚拟Datapoint并为其设置样式:

int cc = s.Points.AddXY(0, ay.Minimum);
DataPoint dpc = s.Points[cc];
dpc.MarkerColor = Color.White;
dpc.MarkerSize = centerwidth;  // tricky!

要找到centerwidth的正确尺寸,您必须进行测试,或者,如果您希望缩放工作,请在xxxPaint事件中进行测量;这超出了这个答案的范围..