具有未缩放的 y 值的图表
Chart with unscaled y-values
我想知道是否可以在 winforms C# 应用程序中找到任何现有图表。
我有几个整数输入 a、b、c...,在处理结束时,我得到的结果具有很宽的值范围,例如 12、342、445879 等。
在图表上,我只想看到从大到小的层次结构,而不是高线端和低线端之间的等效比例距离。每个输入仅按向下曲线阶梯。
因此,如果已经存在某种此类图表工具,则需要做两件事,即从高到低对序列进行排序,并在线条上附加名称,并以彼此之间的比例显示非比例值。
例如我有输入:
int a = 12989;
int b = 324;
int c = 23;
int d = 12;
int e = 3;
第二个处理结果:
int a = 4;
int b = 25;
int c = 1;
int d = 4;
int e = 14;
我尝试在 VS 列表中使用不同的图表,
private void Size(int a, int b)
{
this.chart1.Series["Series1"].Points.AddXY("a1", a);
this.chart1.Series["Series1"].Points.AddXY("a2", b);
}
但似乎我需要不同的东西。
这是期望的结果:
是的,这是可能的。
对于 x 值,实际上有一个 Series
属性 IsXValueIndexed
来强制显示未缩放。但是,y 值没有这样的东西。
(原因可能是未缩放的 y 值不是很有用,因为它们可能会误导用户关于数据..(..对于 x 值可能是也可能不是;包含邮政编码或其他 ID 的 x 值 应该 未缩放显示!))
要解决此问题,您需要将 x 和 y 值设置为计数值,并且 set
每个 DataPoint
的 Labels
显式 到您拥有的实际值。
示例:
// create an odered list of data:
List<double> data = new List<double>();
for (int i = 0; i < 12; i++) data.Add(rnd.Next(100) * rnd.Next(i * 5));
data = data.OrderByDescending(x => x).ToList();
// now add with dummy x and y-values:
Series s = chart1.Series[0];
for (int i = 0; i < data.Count; i++)
{
int p = s.Points.AddXY(i, data.Count - i); // dummy values
DataPoint dp = s.Points[p];
dp.Label = data[i] +""; // real value, formatted
dp.Tag= data[i]; // real value
}
要删除无法显示任何有意义值的轴,请禁用它们:
chart1.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
chart1.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;
更多样式:
s.SetCustomProperty("PixelPointWidth","15");
s.Color = Color.DarkSlateGray;
请注意,由于 y 值实际上只是虚拟值,如果您需要访问它们,则必须使用 Labels
并将它们从字符串转换为数字类型。另请注意,如果它们是 double
或 floats
,则这些字符串要么非常长,要么被格式化为短字符串。要保留实际值,您可以将这些值另外存储在每个 DataPoint
..
的 Tag
字段中
我想知道是否可以在 winforms C# 应用程序中找到任何现有图表。
我有几个整数输入 a、b、c...,在处理结束时,我得到的结果具有很宽的值范围,例如 12、342、445879 等。
在图表上,我只想看到从大到小的层次结构,而不是高线端和低线端之间的等效比例距离。每个输入仅按向下曲线阶梯。
因此,如果已经存在某种此类图表工具,则需要做两件事,即从高到低对序列进行排序,并在线条上附加名称,并以彼此之间的比例显示非比例值。
例如我有输入:
int a = 12989;
int b = 324;
int c = 23;
int d = 12;
int e = 3;
第二个处理结果:
int a = 4;
int b = 25;
int c = 1;
int d = 4;
int e = 14;
我尝试在 VS 列表中使用不同的图表,
private void Size(int a, int b)
{
this.chart1.Series["Series1"].Points.AddXY("a1", a);
this.chart1.Series["Series1"].Points.AddXY("a2", b);
}
但似乎我需要不同的东西。
这是期望的结果:
是的,这是可能的。
对于 x 值,实际上有一个 Series
属性 IsXValueIndexed
来强制显示未缩放。但是,y 值没有这样的东西。
(原因可能是未缩放的 y 值不是很有用,因为它们可能会误导用户关于数据..(..对于 x 值可能是也可能不是;包含邮政编码或其他 ID 的 x 值 应该 未缩放显示!))
要解决此问题,您需要将 x 和 y 值设置为计数值,并且 set
每个 DataPoint
的 Labels
显式 到您拥有的实际值。
示例:
// create an odered list of data:
List<double> data = new List<double>();
for (int i = 0; i < 12; i++) data.Add(rnd.Next(100) * rnd.Next(i * 5));
data = data.OrderByDescending(x => x).ToList();
// now add with dummy x and y-values:
Series s = chart1.Series[0];
for (int i = 0; i < data.Count; i++)
{
int p = s.Points.AddXY(i, data.Count - i); // dummy values
DataPoint dp = s.Points[p];
dp.Label = data[i] +""; // real value, formatted
dp.Tag= data[i]; // real value
}
要删除无法显示任何有意义值的轴,请禁用它们:
chart1.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
chart1.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;
更多样式:
s.SetCustomProperty("PixelPointWidth","15");
s.Color = Color.DarkSlateGray;
请注意,由于 y 值实际上只是虚拟值,如果您需要访问它们,则必须使用 Labels
并将它们从字符串转换为数字类型。另请注意,如果它们是 double
或 floats
,则这些字符串要么非常长,要么被格式化为短字符串。要保留实际值,您可以将这些值另外存储在每个 DataPoint
..
Tag
字段中