简体   繁体   English

如何使用荣格根据重量(或其他属性)过滤边缘并显示新网络

[英]how to filter edges based on weight (or other property) with Jung and display the new network

I have an SparseMultigraph< Node, Edge > g where edges have two attributes: 我有一个SparseMultigraph <节点,边> g,其中边具有两个属性:

int weight;
ArrayList<Date> time;

I would like to filter the graph according to weight and time independently. 我想根据体重和时间分别过滤图表。 Say I start filtering out according to weight using a JSlider called weightSlider (I am in Netbeans and Swing): 假设我开始使用称为weightSlider的JSlider根据重量过滤掉(我在Netbeans和Swing中):

 private void weightSliderMouseReleased(java.awt.event.MouseEvent evt) {                                           
    // filter network according to weight:
    Predicate<Edge> edgeAboveWeight = new Predicate<Edge>() {
        @Override
        public boolean evaluate(Edge e) {
            return e.getWeight() >= weightSlider.getValue();
        }
    };
    EdgePredicateFilter<Node, Edge> edgePredicateFilter = new EdgePredicateFilter<>(edgeAboveWeight);
    Graph<Node, Edge> transform = edgePredicateFilter.transform(g);
}         

My question is: how do I push the new graph in the visualization, preserving the node position? 我的问题是:如何在可视化视图中推送新图形,同时保留节点位置?

Since it is the first time I attempt to do something like that, I might have missed a simpler way to achieve my goal, so any suggestion is more than welcome! 由于这是我第一次尝试这样做,所以我可能错过了实现目标的简单方法,因此任何建议都值得欢迎!

EDIT: I succeeded to implement this with: 编辑:我成功实现了:

private void weightSliderMouseReleased(java.awt.event.MouseEvent evt) {                                           
    // filter network according to weight:
    Predicate<Edge> edgeAboveWeight = new Predicate<Edge>() {
        @Override
        public boolean evaluate(Edge e) {
            return e.getWeight() >= weightSlider.getValue();
        }
    };
    EdgePredicateFilter<Node, Edge> edgePredicateFilter = new EdgePredicateFilter<>(edgeAboveWeight);
    Graph<Node, Edge> transform = edgePredicateFilter.transform(g);
    layout.setGraph(transform);
    vv.validate();
    vv.repaint();
}        

Still don't know if it's the most efficient way, but it works... 仍然不知道这是否是最有效的方法,但是它可以工作...

If you want to filter the actual data, then what you're doing is fine. 如果您想过滤实际数据,那么您正在做的就很好。

If what you want to do is just filter the edges whose weight is below a certain value from being rendered, then you can tell the PluggableRendererContext that directly: 如果您只想过滤权重低于某个值的边缘,就可以直接告诉PluggableRendererContext:

http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/visualization/PluggableRenderContext.html#setEdgeIncludePredicate(org.apache.commons.collections15.Predicate) http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/visualization/PluggableRenderContext.html#setEdgeIncludePredicate(org.apache.commons.collections15.Predicate)

This is demonstrated in PluggableRendererDemo. PluggableRendererDemo中对此进行了演示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM