gpt4 book ai didi

visualization - 图形工具中带有边缘捆绑和标签的圆形布局

转载 作者:行者123 更新时间:2023-12-05 06:51:51 27 4
gpt4 key购买 nike

我对图形可视化和图形工具 (gt) 等软件非常陌生。我的主要领域是数学,但我对 Python 和一般编程有些熟悉。但是,我不是程序员,所以我的代码可能不够优雅;任何改进建议将不胜感激。

描述:

我非常喜欢带有边缘捆绑的圆形布局,用于可视化非常大的图形。例如,我正在尝试使用出色的 Python 模块 graph-tool 绘制 C.Elegans 连接组。蒂亚戈·佩肖托 (Tiago Peixoto)。为此,我使用以下内容:

import graph_tool.all as gt
g_celegans = gt.load_graph("c.elegans_neural.male_1.graphml")
v_prop = g_celegans.vertex_properties
celegans_state = gt.minimize_nested_blockmodel_dl(g_celegans)
celegans_state.draw(vertex_text = v_prop['name'], bg_color = 'w')

产生:

C.Elegans Connectome

问题:

  1. 我如何(在 gt 中)将顶点标签放在从中心绘制的线上? Like this
  2. 我能否绘制类似的布局,即圆形和边缘捆绑​​,但使用我自己的聚类(顶点分区)而不是随机 block 模型?从某种意义上说,我想我只是希望能够自己使用圆形 + 边缘捆绑功能。还是我有点漏掉了重点?
  3. (有人会推荐一个很好的图形可视化介绍方法,包括这种类型(连线图)吗?)

尝试问题 1:所以,我至少设法做到了这一点:

def getAngle(vec):
norm_vec = vec / np.linalg.norm(vec)
one_vec = np.array([1,0])
dot_product = np.dot(norm_vec, one_vec)
return np.arccos(dot_product)

text_rot = [0]*len(list(text_pos))
for i, p in enumerate(text_pos):
if p[0]>=0 and p[1]>=0:
text_rot[i] = getAngle(p)
elif p[0]>=0 and p[1]<0:
text_rot[i] = -getAngle(p)
elif p[0]<0 and p[1]>=0:
text_rot[i] = getAngle(p)-np.pi
elif p[0]<0 and p[1]<0:
text_rot[i] = -getAngle(p)+np.pi

text_rot = np.asarray(text_rot)
t_rot = g_celegans.new_property('v','float', vals = text_rot)

options = {'pos': pos,
'vertex_text': v_prop['name'],
'vertex_text_rotation':t_rot,
'bg_color': 'w',
'vertex_shape': 'none',
'vertex_font_size': 5,
'edge_end_marker': 'none'
}

celegans_state.draw(**options)

产生: enter image description here

所以,旋转很好,但我想将标签偏移得更远一些。现在它们位于一个不可见顶点的中心。有两个名为“text_position”和“text_offset”的顶点属性,您可以阅读 here .

现在,“vertex_text_position”的任何值,例如 -1 或“centered”,或者如果我像上面的“vertex_text_rotation”一样传递 VertexPropertyMap 对象,都会生成一个 IndexError:

    ---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-197-d529fcf5647e> in <module>
9 }
10
---> 11 celegans_state.draw(**options)

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/inference/nested_blockmodel.py in draw(self, **kwargs)
986 draws the hierarchical state."""
987 import graph_tool.draw
--> 988 return graph_tool.draw.draw_hierarchy(self, **kwargs)
989
990

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/draw/cairo_draw.py in draw_hierarchy(state, pos, layout, beta, node_weight, vprops, eprops, hvprops, heprops, subsample_edges, rel_order, deg_size, vsize_scale, hsize_scale, hshortcuts, hide, bip_aspect, empty_branches, **kwargs)
2121 kwargs[k] = u.own_property(v.copy())
2122
-> 2123 pos = graph_draw(u, pos, vprops=t_vprops, eprops=t_eprops, vorder=tvorder,
2124 **kwargs)
2125

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/draw/cairo_draw.py in graph_draw(g, pos, vprops, eprops, vorder, eorder, nodesfirst, output_size, fit_view, fit_view_ink, adjust_aspect, ink_scale, inline, inline_scale, mplfig, output, fmt, bg_color, **kwargs)
1074 vprops.get("fill_color", _vdefaults["fill_color"]),
1075 vcmap)
-> 1076 vprops["text_color"] = auto_colors(g, bg,
1077 vprops.get("text_position",
1078 _vdefaults["text_position"]),

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/draw/cairo_draw.py in auto_colors(g, bg, pos, back)
724 return color_contrast(back)
725 c = g.new_vertex_property("vector<double>")
--> 726 map_property_values(bgc_pos, c, conv)
727 return c
728

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/__init__.py in map_property_values(src_prop, tgt_prop, map_func)
1189 u = GraphView(g, directed=True, reversed=g.is_reversed(),
1190 skip_properties=True)
-> 1191 libcore.property_map_values(u._Graph__graph,
1192 _prop(k, g, src_prop),
1193 _prop(k, g, tgt_prop),

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/draw/cairo_draw.py in conv(x)
722 return color_contrast(bgc)
723 else:
--> 724 return color_contrast(back)
725 c = g.new_vertex_property("vector<double>")
726 map_property_values(bgc_pos, c, conv)

~/anaconda3/envs/gt/lib/python3.9/site-packages/graph_tool/draw/cairo_draw.py in color_contrast(color)
694 def color_contrast(color):
695 c = np.asarray(color)
--> 696 y = c[0] * .299 + c[1] * .587 + c[2] * .114
697 if y < .5:
698 c[:3] = 1

IndexError: too many indices for array: array is 0-dimensional, but 1 were indexed
  • 如果我执行“vertex_text_offset = pos”,这意味着我将每个顶点偏移其自己的坐标,然后我可以按比例缩放 0.1 以使它们适本地远离,这实际上在没有旋转的情况下工作得很好。然后我旋转了文本,它产生了这个(没有缩放): enter image description here

问题似乎是旋转的中心是顶点的中心,如果文本从顶点移出,这是不理想的。所以,即使上面的“vertex_text_position”可行,我猜旋转也会把它搞砸。

  • 奇怪的是,如果我使用“vertex_rotation”来旋转顶点,标签也会随之旋转(太棒了!),但是当我用顶点位置偏移文本时(应该“向外”“推”),我得到了与上面相同的错误图。

  • 接下来我尝试了“vertex_shape = circle”,并使用“vertex_fill_color = 'w'”用白色填充顶点。因此,我会通过增加顶点的大小将文本从边缘推出一点。出于某种原因,这使得图形的所有边缘也变白了;所以情节中根本没有颜色。我猜边缘是根据顶点颜色着色的。

我最终做的是使用顶点属性“text_out_color”和“text_out_width”,宽度为 0.003。这为文本提供了漂亮的粗体样式,使其在彩色背景下更具可读性。

但是,现在我几乎没有想法了。

有人知道我的问题的解决方案吗?即像我一样放置标签,但将它们移得更远(从中心向外的方向)或将它们用白色框起来,以便它们更具可读性,但情节仍然看起来不错;以及上面的问题 2。

最佳答案

这晚了几个月,所以希望你能弄明白,但我会把它留在这里以供将来引用:

在这种情况下,为了让这些标签看起来像您希望的那样,当您调用绘制函数时,您需要像这样指定顶点文本的位置:

celegans_state.draw(vertex_text = v_prop['name'], bg_c​​olor = 'w', vertex_text_position='centered')

(如文档中的属性列表所示,“居中”给出了这个确切的效果:https://graph-tool.skewed.de/static/doc/draw.html#graph_tool.draw.graph_draw)

要获得圆形图,我认为您想使用径向树布局 ( https://graph-tool.skewed.de/static/doc/draw.html?highlight=radial_tree_layout#graph_tool.draw.radial_tree_layout )

希望这对您有所帮助!

关于visualization - 图形工具中带有边缘捆绑和标签的圆形布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66062025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com