我有一个巨大的图表,在graphviz中至少有100个节点紧密连接。我正在寻找可以自动化任何给定节点的边缘颜色的方法,使颜色是唯一的。我每个节点都有近30条边。谢谢!!
答案 0 :(得分:2)
您有GraphViz接受的所有颜色列表:http://www.graphviz.org/doc/info/colors.html
如果您从自己的程序生成图形,一种获得独特颜色的简单方法是将所有这些颜色放在列表中,并在有新边时从此列表中选择一个颜色。像这样的伪代码:
List colors = {red, blue, green, ...};
for edge in edges:
write(edge.source +
" -> " +
edge.sink +
" [color=\"" +
color.next() +
"\"];\n"
);
更简洁的方法是从RGB代码中定义颜色。你可以这样做:
digraph G
{
A -> B
[
color="#AABBCC"
]
}
现在您要做的就是为所有边生成#000000和#FFFFFF之间的十六进制数。颜色格式在文档中提供:http://www.graphviz.org/doc/info/attrs.html#k:color
答案 1 :(得分:1)
我遇到了类似的问题,我从1个节点出来了很多节点。
我使用-Goverlap = prism选项使用sfdp(dot无法处理节点数),这样可以很好地分隔出来。
答案 2 :(得分:1)
您是否需要采用点文件并生成新的彩色点文件的内容?或者你有一些生成点文件的程序或脚本? (用什么语言?)
我喜欢为节点(或群集)选择随机中等强度颜色,并使节点背景成为该颜色的较浅版本,并使出现边缘成为该颜色的较暗版本。
例如,在java中我有两个这样的实用方法。
public static Color hashColor(Object value) {
if (value == null) {
return Color.WHITE.darker();
} else {
int r = 0xff - (Math.abs(1 + value.hashCode()) % 0xce);
int g = 0xff - (Math.abs(1 + value.hashCode()) % 0xdd);
int b = 0xff - (Math.abs(1 + value.hashCode()) % 0xec);
return new Color(r, g, b);
}
}
/**
* @return a hex Color string in the format #rrggbb.
*/
public static String encodeColor(Color color) {
return "#" + String.format("%06x", color.getRGB() & 0xffffff);
}