Dundas Charting C# 列上的条件颜色规则
Dundas Charting C# conditional colour rules on column
我在 Visual Studio 中使用 C# 使用 Dundas 图表。
我有一个包含一个系列的图表 - 该图表在列上显示系列。我目前正在使用以下代码添加系列:
public void AddSeries(string name, SeriesChartType type, IEnumerable xValues, IEnumerable yValues, bool showLabels = true)
{
Series s = new Series();
s.Points.DataBindXY(xValues, yValues);
s.LegendText = name;
s.Type = type;
if (type == SeriesChartType.Line) s.Color = Color.FromArgb(139,0,0);
else s.Color = _palette[_chart.Series.Count < _palette.Length ? _chart.Series.Count : 0];
s.ShowLabelAsValue = showLabels;
s.FontAngle = -90;
s.LabelFormat = string.IsNullOrWhiteSpace(_chart.ChartAreas["Default"].AxisY.LabelStyle.Format) ? "P0" : _chart.ChartAreas["Default"].AxisY.LabelStyle.Format;
s.Font = new Font("Arial", 5);
_chart.Series.Add(s);
}
我想根据每列的值更改每列的颜色 - 这将基于 int 目标值。
例如,如果该列小于我们的目标值,则应显示红色,否则应显示绿色。
您如何建议这样做?
我找到了一个 suitable 的答案,这个解决方案的唯一问题是列的宽度会根据 x 轴上的点数而变化。
void GetColourCodedSeries(ChartHelper chartHelper, DataTable table, string groupingColumn, string valueColumn)
{
List<Color> _palette = new List<Color>();
var x = table.AsEnumerable().Select(f => f.Field<string>(groupingColumn)).ToArray();
foreach (DataRow row in table.Rows)
{
if (Convert.ToDecimal(row[valueColumn].ToString()) >= _availabilityTarget) _palette.Add(Color.FromArgb(0, 176, 80));
else _palette.Add(Color.FromArgb(139, 0, 0));
List<decimal?> y = new List<decimal?>();
foreach(var value in x)
{
if (value == row[groupingColumn].ToString()) y.Add(Convert.ToDecimal(row[valueColumn].ToString()));
else y.Add(null);
}
chartHelper.AddSeries(SeriesChartType.Column, x, y, _palette.ToArray());
}
}
此代码根据值为列创建动态调色板。然后我在我的 table 中每行添加一个系列,在添加系列时我包括所有可能的 x 值和每个这些值 1 个 y 值 - 但是,只有一个 y 轴值具有实际值, 所有其他的都标记为空值(我确实尝试使用 0 值,但这使图表看起来很乱)。
我在 Visual Studio 中使用 C# 使用 Dundas 图表。
我有一个包含一个系列的图表 - 该图表在列上显示系列。我目前正在使用以下代码添加系列:
public void AddSeries(string name, SeriesChartType type, IEnumerable xValues, IEnumerable yValues, bool showLabels = true)
{
Series s = new Series();
s.Points.DataBindXY(xValues, yValues);
s.LegendText = name;
s.Type = type;
if (type == SeriesChartType.Line) s.Color = Color.FromArgb(139,0,0);
else s.Color = _palette[_chart.Series.Count < _palette.Length ? _chart.Series.Count : 0];
s.ShowLabelAsValue = showLabels;
s.FontAngle = -90;
s.LabelFormat = string.IsNullOrWhiteSpace(_chart.ChartAreas["Default"].AxisY.LabelStyle.Format) ? "P0" : _chart.ChartAreas["Default"].AxisY.LabelStyle.Format;
s.Font = new Font("Arial", 5);
_chart.Series.Add(s);
}
我想根据每列的值更改每列的颜色 - 这将基于 int 目标值。 例如,如果该列小于我们的目标值,则应显示红色,否则应显示绿色。
您如何建议这样做?
我找到了一个 suitable 的答案,这个解决方案的唯一问题是列的宽度会根据 x 轴上的点数而变化。
void GetColourCodedSeries(ChartHelper chartHelper, DataTable table, string groupingColumn, string valueColumn)
{
List<Color> _palette = new List<Color>();
var x = table.AsEnumerable().Select(f => f.Field<string>(groupingColumn)).ToArray();
foreach (DataRow row in table.Rows)
{
if (Convert.ToDecimal(row[valueColumn].ToString()) >= _availabilityTarget) _palette.Add(Color.FromArgb(0, 176, 80));
else _palette.Add(Color.FromArgb(139, 0, 0));
List<decimal?> y = new List<decimal?>();
foreach(var value in x)
{
if (value == row[groupingColumn].ToString()) y.Add(Convert.ToDecimal(row[valueColumn].ToString()));
else y.Add(null);
}
chartHelper.AddSeries(SeriesChartType.Column, x, y, _palette.ToArray());
}
}
此代码根据值为列创建动态调色板。然后我在我的 table 中每行添加一个系列,在添加系列时我包括所有可能的 x 值和每个这些值 1 个 y 值 - 但是,只有一个 y 轴值具有实际值, 所有其他的都标记为空值(我确实尝试使用 0 值,但这使图表看起来很乱)。