我想将X系列线条绘制成不同但“漂亮”的颜色。 “好”,我的意思是光明和不同。
这就是我现在正在做的事情:
var colors = Enum.GetValues(typeof(KnownColor));
int c = -1;
foreach (var ser in AllSeries)
{
c++;
chart.PlotDataSeries( Color.FromKnownColor((KnownColor)colors.GetValue(c % 100 + 1)), );
}
但这给了我很多类似的单调颜色,主要是黑色和灰色,因为KnownColor包含了很多重复的“系统菜单”类型颜色。
答案 0 :(得分:1)
一种方法是“导航色彩空间”。我不是C#程序员,但我在图表中使用的方法虽然是手动的,但是使用Hue-Saturation-Value颜色空间而不是Red-Green-Blue。我手动选择我想要开始的“漂亮”颜色。然后将色调的值空间除以您需要的颜色数,并将此值用作色调值的增量。这应该为您提供均匀分布的颜色,这些颜色看起来很好,因为它们实际上具有相同的饱和度和亮度。
更多细节
我看了一下当前的.NET / C#API,看起来没有一种简单的方法可以从RGB值以外的任何颜色创建随机颜色。这是我在Javascript + HTML中描述的渐变的示例。从HSV或HSL空间到RGB的转换是特定于语言的,但Creating a C# Color from HSL values的答案应该有所帮助。
function setColor(id, hue) {
var elm = document.getElementById(id);
var saturation = document.getElementById("saturation").value;
var lightness = document.getElementById("lightness").value;
elm.style.color = "hsl(" + hue + ", " + saturation + "%, " +
lightness + "%)";
}
function setColors() {
setColor("first", 0 * (360 / 5));
setColor("second", 1 * (360 / 5));
setColor("third", 2 * (360 / 5));
setColor("fourth", 4 * (360 / 5));
}
<p id="first">First Color<p>
<p id="second">Second Color</p>
<p id="third">Third Color</p>
<p id="fourth">Fourth Color</p>
<form>
Saturation: <input id=saturation value=75><br>
Lightness: <input id=lightness value=40><br>
<input type=submit onclick="javascript:setColors()" value=Update>
</form>
答案 1 :(得分:1)
@Tim Schmelter的评论中提出了这些建议。
这不是理想的,因为它重复,但至少颜色是不同的。
public Color GetNiceColor(int n)
{
Color[] NiceColors = new Color[]{Color.Red,Color.Yellow,Color.Blue,Color.Green,Color.Brown,Color.DarkGray,Color.Orange,Color.Magenta,Color.Cyan,Color.Magenta,Color.Lime};
int selection = n % NiceColors.Count();
return NiceColors[selection];
}
答案 2 :(得分:0)
我不认为这是可能的,因为该序列的颜色不遵循任何顺序。 我找到一个很好的颜色的好方法是找到你喜欢的颜色 - 得到它的3个R,G和B值 - 并且......混合十六进制代码对的顺序。 所以...
Colour1=C4 89 FF
Colour2=C4 FF 89
Colour3=FF 89 C4
Colour4=etc.
我对此没有任何提及 - 因为如果我需要快速的颜色序列,这就是我所做的。
您还可以查看颜色渐变以获得一个很好的序列: 例如。 http://www.pixelfor.me/crc/F0000032
或者众多网站中的一个,人们投票选择一起看起来很好的颜色序列,例如。 http://colorhunt.co/
答案 3 :(得分:0)
这是D.Shawley's answer的C#版本,其中有一些tips of Nolonar。
using System.Runtime.InteropServices;
enum E_COLOR_TYPE
{
DEFAULT,
FIRST,
SECOND,
THIRD,
//Add more item here...
TOTAL,
}
static class ColorSetter
{
[DllImport("shlwapi.dll")]
private static extern int ColorHLSToRGB(int H, int L, int S);
private static Color[] s_arrColor;
static ColorSetter()
{
const int COLOR_COUNT = (int)E_COLOR_TYPE.TOTAL;
s_arrColor = new Color[COLOR_COUNT];
const int HUE_BASE = (240 / COLOR_COUNT);
const int LIGHTNESS = 120;
const int SATURATION = 240;
for (int i = 0; i < s_arrColor.Length; ++i)
s_arrColor[i] = ColorTranslator.FromWin32((ColorHLSToRGB(i * HUE_BASE, LIGHTNESS, SATURATION)));
}
public static Color GetColorType(E_COLOR_TYPE type)
{
return s_arrColor[(int)type];
}
}
请注意,如果E_COLOR_TYPE中的项目过多,则颜色将不再“漂亮”。到目前为止,使用此代码,颜色对我来说还不错。