c#中的条形图

时间:2016-01-17 04:42:35

标签: c# graph

我正在尝试在C#中实现条形图。我有两个文本框,我可以在其中获取数据,我想为它们绘制比较条形图。例如,我有一个原始的CPU(ocpu)和更改的cpu(ccpu)数据来了,我想为他们绘制一个比较图。 我能够这样做,如图中的图形。蓝色是原始值,橙色是更改值。但是,我在X轴上得到0,1,2,我不需要。我也不需要这两个酒吧之间的界线。我也附上了我正在使用的代码片段。我在图中有两个名为“原始”和“修改”的系列。

chartcpu.Series["Original"].Points.AddY(ocpu.Text.ToString());
chartcpu.Series["Modified"].Points.AddY(ccpu.Text.ToString());
chartcpu.ChartAreas[0].AxisX.Title = "CPU";

data graph

请告诉我这是什么解决方案?

- Samir Singh

1 个答案:

答案 0 :(得分:5)

我并不完全确定我是否正确地理解了你,但使用此代码:

        var original = chart1.Series.Add("Original");
        var modified = chart1.Series.Add("Modified");
        chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisY.MinorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisX.MinorGrid.Enabled = false;

        original.Points.AddXY("CPU", 7.6);
        modified.Points.AddXY("CPU", 1.6);

你得到这个结果:

enter image description here

您可以发布"它应该如何"草图(用油漆或其他)如果你想要实现不同的东西。

来自德国的问候

<强>更新

  
      
  1. 我的数据来自文本框,是不是可以将其转换为字符串进行显示。这是上面提到的评论。我需要将它转换为什么形式?
  2.   

string只是文本,图表需要浮点数,如System.Windows.Forms.DataVisualization.Charting.DataPoint的YValues属性所示:

public double[] YValues { get; set; }

Points.AddXY已为您进行转换,因为它还会处理DateTimeDBNull等。 如果您愿意,可以使用Double.TryParse自行处理转换。

  
      
  1. &#34; AxisY.MajorGrid.Enabled = false;&#34;的含义是什么?我认为我的代码中缺少这个。
  2.   

是的,主要和次要网格属性控制指定轴的线条外观。通过禁用它们,您只需关闭它们。

  
      
  1. 如何更改条形图的颜色和宽度
  2.   

Series和DataPoint都有Color-Property,所​​以你可以说:

chartcpu.Series["Original"].Color = Color.Magenta;
chartcpu.Series["Modified"].Color = Color.Lime;

或者您喜欢的任何颜色:)

大小改变如下:

chartcpu.Series["Original"].SetCustomProperty("PointWidth", "2");
chartcpu.Series["Modified"].SetCustomProperty("PointWidth", "2");
  

如果我的数据为空,我想不显示任何条形图。现在显示为0。

当我没有指定任何数据时,我的图表是空的。但是,如果您有有效数据,则可以尝试仅添加一个点:

// e.g. when ocpu text change
chartcpu.Series["Original"].Points.Clear();
double yValue = 0;
if (!String.IsNullOrEmpty(ocpu.Text) && Double.TryParse(ocpu.Text, out yValue))
{
    chartcpu.Series["Original"].Points.AddXY("CPU", yValue);
}

<强>更新

  

如何更改K格式的左网格上显示的值,   例如 - 如果它是12000000,我希望它显示为12000K / 12M。   另外,如何格式化具有分隔符的条上方显示的值   例如,如果值为112887296为112,887,296或   112,887K / 113M(近似值)

简单方法: 将其添加到初始化逻辑中:

//string format = "#,0.#0"; // default
//string format = "#,0,.#0K"; // thousand
string format = "#,0,,.#0M"; // million, etc.
cpuchart.ChartAreas[0].AxisY.LabelStyle.Format = format;
cpuchart.Series.ToList().ForEach(series => series.LabelFormat = format);

msdn上的自定义数字格式: https://msdn.microsoft.com/en-US/library/0c899ak8(v=vs.110).aspx

动态方法: 为后缀添加一个字典作为静态变量:

private static readonly ReadOnlyDictionary<int, string> _numberSuffix = new ReadOnlyDictionary<int, string>(new Dictionary<int, string> {
        { 0, String.Empty }, // default
        { 1, "K" }, // thousand
        { 2, "M" }, // million
        { 3, "B" }, // billion
        { 4, "T" }, // trillion
    });

以及格式化图表的方法:

private void FormatChart(Chart chart)
{
    // calculates the format based on the maximum on the y axis
    chart.ChartAreas[0].RecalculateAxesScale(); // ensure that the maximum of the y-axis is calculated
    int digitGroupCount = (int)Math.Log10(Math.Abs(chart.ChartAreas[0].AxisY.Maximum)) / 3;
    string suffix = _numberSuffix.ContainsKey(digitGroupCount) ? _numberSuffix[digitGroupCount] : "nA";
    string format = String.Format("#,0{0}.#0{1}", new string(',', digitGroupCount), suffix);
    chart.ChartAreas[0].AxisY.LabelStyle.Format = format;
    chart.Series.ToList().ForEach(series => series.LabelFormat = format);
}

现在,只要您想格式化图表,就可以调用此方法(例如,当值更改时)