我使用的是prefuse可视化工具包,工具包中的GraphView演示非常棒,它提供了各种控件来可视化数据。
我可以为我的数据集生成GraphML,并使用GraphView将其可视化,我想要的另一件事是用权重或颜色编码标记边,以演示两个节点之间的强度。
任何关于相同内容的输入都是极大的appreciated..Thanks。
发布于 2011-11-04 22:45:35
免责声明:我没有使用过该应用程序接口,只是查看了文档:)该应用程序接口似乎有一个EdgeRenderer接口,您应该实现该接口以实现所需的行为。
参考:http://prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html,http://prefuse.org/doc/manual/introduction/example/
更新:首先,更正一下:事实上,EdgeRenderer不是一个iterface,而是一个类。我已经做了一个简单的演示来演示如何实现自定义的边缘渲染。
功能
向包含结点标注首字母的边添加标注
方法
我做了一个快速而肮脏的解决方案,那就是复制LabelRenderer并进行修改,以便处理边缘。
代码
我将这个类命名为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));https://stackoverflow.com/questions/8010823
复制相似问题