- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想用BGL布局一个RNA fold 的图,它有一个保证的平面结构,所有的边应该有相同的长度(有两种边:正常序列和红色的键),像这样:
rna secondary structure http://www.ncrna.org/frnadb/sec_structure/png/FR096703.png
namespace boost {
enum vertex_position_t { vertex_position };
BOOST_INSTALL_PROPERTY(vertex, position);
};
template<class PairIterator>
void layout(std::string seq, PairIterator begin, PairIterator end) {
using namespace boost; using namespace std;
// backbone edges + bonding edges
vector<pair<size_t,size_t>> edge_list(begin, end);
for(size_t i = 0 ; i < seq.size() - 1 ; i++)
edge_list.push_back(make_pair(i, i + 1));
typedef rectangle_topology<> topology;
typedef topology::point_type point;
boost::minstd_rand random;
topology space(random, -1000, -1000, 2000, 2000);
adjacency_list<vecS, vecS, undirectedS,
property<vertex_position_t, point>
> g(edge_list.begin(), edge_list.end(), seq.size());
random_graph_layout(g, get(vertex_position, g), space);
fruchterman_reingold_force_directed_layout(g, get(vertex_position, g), space,
cooling(linear_cooling<double>(100)));
// draw
}
但是,这给了我一个非常随机的布局(冷却时间为 100、200、400)。更长的冷却时间只需将顶点压入角落(图像显示完整布局)。边缘似乎总是太长......
我想为边缘指定一个目标长度,并且在达到一定范围内之前不停止模拟。
我的代码是从 boost 示例中拼凑而成的,但我不需要坚持使用属性映射等,我只需要一个布局而不必求助于 GraphViz。
最佳答案
看起来布局开始在您最右侧的图像中起作用,但空间太小,无法展开成正确的形状:也许尝试使用更紧凑的随机布局开始?
或者更强的吸引力也可能有所帮助。注意根据the documentation默认的吸引力函数,square_distance_attractive_force
除以边缘描述符的吸引力 --- 因此较小的边缘描述符意味着更近的顶点。
考虑到对于布局良好的平面图,每个顶点仅靠近它通过边链接到的顶点,您可以计算出边的“目标长度”(某种程度上)。这与我们有两个顶点由一条边连接的简单情况非常相似(如果你有一个规则的顶点网格,它不会超过 4 倍):
(vertex descriptor value, V)^2/distance
。distance^2/(edge descriptor value, E)
。在以下情况下,它们处于平衡状态:
V2/距离 = 距离2/E
所以:
距离 = V(2/3) E(1/3)
关于c++ - Fruchterman Reingold 布局不收敛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466843/
我想用BGL布局一个RNA fold 的图,它有一个保证的平面结构,所有的边应该有相同的长度(有两种边:正常序列和红色的键),像这样: rna secondary structure http://w
我计划在此处实现用于绘制图形的 Fruchterman 和 Reingold 算法:http://cs.brown.edu/people/rtamassi/gdhandbook/chapters/fo
来自演示文稿:Graphs and Trees在第 3 页上,直观地展示了 Reigngold-Tilford 过程中发生的事情;它还预先对该算法给出了一个模糊的总结:“...从树的自下而上传递开始;
我一直在寻找一种方法来从我的径向 Tilford 树中删除根节点,但到目前为止没有成功。我发现了一个类似的问题here ,但提供的答案不够具体,无法完全理解我需要在何处使用 d.depth > 0。我
我试图用 Java 实现 Fruchterman 和 Reingold 算法,但由于某些原因,输出顶点的坐标有时会占用相同的坐标,这不是该算法想要的。我哪里出错了? 坐标对象( vector ) pu
有时,当使用布局算法(例如layout.fruchterman.reingold)时,您可能会得到一些离群值的节点,因为它们从结构的其余部分不成比例地延伸出来。有谁知道如何对边缘施加最大长度(例如=1
尝试在 R 中绘制网络图。如何使用 IGraph 延长网络图中的边? 我实际上想使用 fruchterman-reingold 布局。有什么方法可以使基于力的算法“更有弹性”,以便我的顶点相距更远?
我正在实现一个径向 Reingold–Tilford 树 ( http://bl.ocks.org/mbostock/4063550 ),但还有带有平移和缩放、拖动以及可折叠可点击节点的基本示例。我已
我正在学习 Boost Graph Library 中的 Fruchterman-Reingold 算法。通过阅读文档,我知道该算法是根据图形布局计算所有节点的位置,但我的问题是我无法理解Boost
我想(有点)结合 Hierarchical Edge Bundling和 Radial Reingold–Tilford Tree 它看起来有点像这样(请原谅我糟糕的 paint.net 技能)*:
给定一个时间图(每条边都有一个时间属性),我有一个脚本来使用 Fruchterman-Reingold 布局绘制图的演变。我的脚本基于这个例子:Temporal Networks with igrap
我是一名优秀的程序员,十分优秀!