为了简化问题,我有一个图表,其中包含2D平面上的节点和边.
我想要做的是单击一个按钮,它会自动布局图形看起来干净.我的意思是边缘的最小交叉,节点之间的漂亮空间,甚至可能代表图形比例(加权边缘).
我知道这是一个看起来很干净的图表是完全主观的,但有没有人知道一个算法开始,而不是重新发明轮子?
谢谢.
我有一个三角形(JSFiddle)使用这个CSS:
.triangle {
width: 0;
height: 0;
border-top: 0;
border-bottom: 30px solid #666699;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
}
Run Code Online (Sandbox Code Playgroud)
这个HTML:
<div class="triangle"></div>
Run Code Online (Sandbox Code Playgroud)
这会形成一个三角形,但对角线呈锯齿状和像素化.我怎样才能让它们变得光滑?(我可以通过点缀它们来在Safari和Chrome中平滑它们,但这打破了Firefox和IE中的三角形.)
我想创建一个深度优先搜索,我有点成功.
这是我到目前为止的代码(除了我的构造函数,请注意Vertex和Edge类只包含属性,这里没有重要的内容):
private Stack<Vertex> workerStack = new Stack<Vertex>();
private List<Vertex> vertices = new List<Vertex>();
private List<Edge> edges = new List<Edge>();
private int numberOfVertices;
private int numberOfClosedVertices;
private int visitNumber = 1;
private void StartSearch()
{
// Make sure to visit all vertices
while (numberOfClosedVertices < numberOfVertices && workerStack.Count > 0)
{
// Get top element in stack and mark it as visited
Vertex workingVertex = workerStack.Pop();
workingVertex.State = State.Visited;
workingVertex.VisitNumber = visitNumber;
visitNumber++;
numberOfClosedVertices++;
// Get all edges connected to …
Run Code Online (Sandbox Code Playgroud) 我想强制点只显示节点之间的垂直或水平边缘.
我发现了一个类似的请求,使用Dot/GraphViz发布了Family树布局,但我没有处理树,所以我希望有一个解决方案,而不插入额外的节点...
如果我构建以下图表:
digraph G { splines=ortho A [ shape=box ] B [ shape=box ] C [ shape=box ] D [ shape=box ] A -> B A -> C B -> D C -> D }
我得到的是这个:
但我想要一个像这样的图表:
我怎样才能得到这样的渲染?
编辑:"splines"属性似乎没有按预期工作......有没有我做错了?
我一直在关注此示例中的 Mike Bostock的代码,以了解如何在d3中绘制有向图,并想知道如何构造代码以便我可以在图中的两个节点之间添加多个边.例如,如果上例中的数据集定义为
var links = [{source: "Microsoft", target: "Amazon", type: "licensing"},
{source: "Microsoft", target: "Amazon", type: "suit"},
{source: "Samsung", target: "Apple", type: "suit"},
{source: "Microsoft", target: "Amazon", type: "resolved"}];
Run Code Online (Sandbox Code Playgroud)
然后运行代码,我看到的只有一行.所有路径都在html代码中正确绘制,但它们都具有相同的坐标和方向,使视觉看起来像1行.在这个例子中需要进行什么样的代码重组才能让3个边缘不能相互叠加?
digraph G {
a -> b [ label = "foo" ];
a -> b [ label = "bar" ];
}
Run Code Online (Sandbox Code Playgroud)
这将在'a'和'b'节点之间创建两条边.有没有办法只有一条边(将它们分组)?
我有一个JSON提要数据,其中包含许多用户关系,例如:
"subject_id = 1, object_id = 2, object = added
subject_id = 1, object_id = 2, object = liked
subject_id = 1, object_id = 3, object = added
subject_id = 2, object_id = 1, object = added"
Run Code Online (Sandbox Code Playgroud)
现在我使用以下代码将JSON转换为networkx Graph:
def load(fname):
G = nx.DiGraph()
d = simplejson.load(open(fname))
for item in d:
for attribute, value in item.iteritems():
G.add_edge(value['subject_id'],value['object_id'])
return G
Run Code Online (Sandbox Code Playgroud)
结果如下:
[('12820', '80842'), ('12820', '81312'), ('12820', '81311'), ('13317', '29'), ('12144', '81169'), ('13140', '16687'), ('13140', '79092'), ('13140', '78384'), ('13140', '48715'), ('13140', '54151'), …
Run Code Online (Sandbox Code Playgroud) 是否有任何方法可以强制graphviz始终在边缘上绘制节点,即使边缘被绘制(或最好是在节点下)?
到目前为止,我已经尝试过订购它们和不同的图层选项,但没有找到一种有效的方法.
我正在使用igraph for R.我的图表基于一个包含平行边缘的边缘列表(多个边缘具有相同的源和目标).我想将这些平行边缘转换为边缘属性权重.有没有一种方法可以做到这一点?
如果没有简单的方法.如何识别这些平行边缘?
duplicated(E(net))
Run Code Online (Sandbox Code Playgroud)
不会返回单个副本.我想它正在寻找重复的边缘ID.