我有一个巨大的图表,其中至少有 100 个节点在 graphviz 中紧密连接。我正在寻找可以自动化来自任何给定节点的边缘颜色的方法,以便颜色是唯一的。每个节点都有近 30 条边。谢谢 !!
问问题
3580 次
3 回答
2
我有一个类似的问题,我有大量的节点来自 1 个节点。
我使用 sfdp(dot 无法处理节点数)和 -Goverlap=prism 选项,它很好地分隔了事物。
于 2013-07-15T15:23:47.917 回答
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
于 2013-07-15T15:54:54.353 回答
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);
}
于 2013-07-17T03:38:50.207 回答