gpt4 book ai didi

java - 预置 : Adding edge weights to the GraphView Demo

转载 作者:行者123 更新时间:2023-12-04 06:08:56 25 4
gpt4 key购买 nike

我正在使用 prefuse 可视化工具包,工具包中的 GraphView Demo 非常棒,它提供了各种控件来可视化数据。

我能够为我的数据集生成 GraphML 并使用 GraphView 对其进行可视化,我希望拥有的另一件事是用权重或颜色编码标记边缘,以展示两个节点之间的强度。

非常感谢任何有关相同的输入..谢谢..

最佳答案

免责声明:我没有使用 API,只是检查了文档:) 似乎 API 有一个 EdgeRenderer 接口(interface),您应该实现该接口(interface)以实现所需的行为。

引用:http://prefuse.org/doc/manual/introduction/example/ , http://prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html

更新:首先更正:实际上 EdgeRenderer 不是一个 iterface 而是一个类。我做了一个简单的演示来说明如何实现自定义边缘渲染。

特征

将标签添加到包含节点标签首字母的边

方法

我做了一个快速而肮脏的解决方案,即复制 LabelRenderer 并进行修改以处理边缘。

代码

我将类(class)命名为 MyEdgeRenderer :

public class MyEdgeRenderer extends AbstractShapeRenderer {

使用原文 EdgeRenderer绘制边缘线(请参阅下面的 render() 以了解正在运行的渲染器):
protected EdgeRenderer m_edgeRenderer = new EdgeRenderer();

修改 getText()从节点获取首字母:
protected String getText(VisualItem item) {
EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();

String t1 = null, t2 = null;
if ( item1.canGetString(m_labelName) ) {
t1 = item1.getString(m_labelName).substring(0,1);
};
if ( item2.canGetString(m_labelName) ) {
t2 = item2.getString(m_labelName).substring(0,1);
};
if (t1 != null && t2 != null)
return t1 + "-" + t2;
else
return null;
}

修改 getAlignedPoint()将标签放在边缘的一半:
protected void getAlignedPoint(Point2D p, VisualItem item, 
double w, double h, int xAlign, int yAlign)
{
double x=0, y=0;

EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();

// label is positioned to the center of the edge
x = (item1.getX()+item2.getX())/2;
y = (item1.getY()+item2.getY())/2;
...

修改 render() (I)首先画线和(II)使用黑色:
public void render(Graphics2D g, VisualItem item) {         
m_edgeRenderer.render(g, item);
...

// render text
int textColor = ColorLib.color(Color.BLACK); // item.getTextColor()
if ( text != null && ColorLib.alpha(textColor) > 0 ) {
...

为了进行测试,我修改了 Prefuse 网站 (http://prefuse.org/doc/manual/introduction/example/Example.java) 上的示例:
    // -- 3. the renderers and renderer factory ---------------------------

// draw the "name" label for NodeItems
LabelRenderer ir = new LabelRenderer("name");
ir.setRoundedCorner(8, 8); // round the corners

// draw the "name" initials for EdgeItems
MyEdgeRenderer er = new MyEdgeRenderer("name");
er.setRoundedCorner(8, 8); // round the corners

// create a new default renderer factory
// return our name label renderer as the default for all non-EdgeItems
// includes straight line edges for EdgeItems by default
vis.setRendererFactory(new DefaultRendererFactory(ir, er));

这只是一个演示自定义渲染的演示。实际上,您可能会从图形模型中检索标签文本和颜色,即: EdgeItem.getString(), getTextColor() .我猜这两个属性都可能来自 GraphML 数据。示例代码还显示了如何为节点设置颜色,它也可能适用于边缘(尽管我没有尝试过):
    // -- 4. the processing actions ---------------------------------------
...
// use black for node text
ColorAction text = new ColorAction("graph.nodes",
VisualItem.TEXTCOLOR, ColorLib.gray(0));

关于java - 预置 : Adding edge weights to the GraphView Demo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8010823/

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