我正在尝试在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";
请告诉我这是什么解决方案?
- Samir Singh
答案 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);
你得到这个结果:
您可以发布"它应该如何"草图(用油漆或其他)如果你想要实现不同的东西。
来自德国的问候
<强>更新强>
- 我的数据来自文本框,是不是可以将其转换为字符串进行显示。这是上面提到的评论。我需要将它转换为什么形式?
醇>
string只是文本,图表需要浮点数,如System.Windows.Forms.DataVisualization.Charting.DataPoint
的YValues属性所示:
public double[] YValues { get; set; }
Points.AddXY
已为您进行转换,因为它还会处理DateTime
或DBNull
等。
如果您愿意,可以使用Double.TryParse
自行处理转换。
- &#34; AxisY.MajorGrid.Enabled = false;&#34;的含义是什么?我认为我的代码中缺少这个。
醇>
是的,主要和次要网格属性控制指定轴的线条外观。通过禁用它们,您只需关闭它们。
- 如何更改条形图的颜色和宽度
醇>
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);
}
现在,只要您想格式化图表,就可以调用此方法(例如,当值更改时)