нужно предварительно слить края графа как стрелки - PullRequest
6 голосов
/ 04 января 2011

Я сделал свою домашнюю работу и искал в Google образец и тему, на которую прежде отвечали в stackoverflow. Но ничего не найдено.

Моя проблема - обычные ребра, которые не имеют вида, похожего на стрелки.

Вот что я делаю, чтобы надеяться, что есть стрелки вперед от цели до пункта назначения:

LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        EdgeRenderer edgeRenderer;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


Вот что я вижу в цвете краев, надеясь, что они не должны быть прозрачными:

int[] palette = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};

        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);

        ColorAction text = new ColorAction("socialnet.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));


        ColorAction edges = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction arrow = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

        ActionList colour = new ActionList();
        colour.add(fill);
        colour.add(text);
        colour.add(edges);
        colour.add(arrow);
        vis.putAction("colour", colour);

Итак, мне интересно, где я не прав? Почему мои края не похожи на стрелки?

Спасибо за любую идею.

Для более подробной информации, я хочу вставить весь код:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package prefusedeneme;

import javax.swing.JFrame;

import prefuse.data.*;
import prefuse.data.io.*;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.render.*;
import prefuse.util.*;
import prefuse.action.assignment.*;
import prefuse.Constants;
import prefuse.visual.*;
import prefuse.action.*;
import prefuse.activity.*;
import prefuse.action.layout.graph.*;
import prefuse.controls.*;
import prefuse.data.expression.Predicate;
import prefuse.data.expression.parser.ExpressionParser;

public class SocialNetworkVis {

    public static void main(String argv[]) {

        // 1. Load the data

        Graph graph = null;
        /* graph will contain the core data */
        try {
            graph = new GraphMLReader().readGraph("socialnet.xml");

        /* load the data from an XML file */
        } catch (DataIOException e) {
            e.printStackTrace();
            System.err.println("Error loading graph. Exiting...");
            System.exit(1);
        }

        // 2. prepare the visualization

        Visualization vis = new Visualization();
        /* vis is the main object that will run the visualization */
        vis.add("socialnet", graph);
        /* add our data to the visualization */

        // 3. setup the renderers and the render factory

        // labels for name
        LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        /* nameLabel decribes how to draw the data elements labeled as "name" */

        // create the render factory
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        EdgeRenderer edgeRenderer;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


        // 4. process the actions

        // colour palette for nominal data type
        int[] palette = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};
        /* ColorLib.rgb converts the colour values to integers */


        // map data to colours in the palette
        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        /* fill describes what colour to draw the graph based on a portion of the data */

        // node text
        ColorAction text = new ColorAction("socialnet.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));
        /* text describes what colour to draw the text */

        // edge
        ColorAction edges = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction arrow = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));
        /* edge describes what colour to draw the edges */

        // combine the colour assignments into an action list
        ActionList colour = new ActionList();
        colour.add(fill);
        colour.add(text);
        colour.add(edges);
        colour.add(arrow);
        vis.putAction("colour", colour);
        /* add the colour actions to the visualization */

        // create a separate action list for the layout
        ActionList layout = new ActionList(Activity.INFINITY);
        layout.add(new ForceDirectedLayout("socialnet"));
        /* use a force-directed graph layout with default parameters */

        layout.add(new RepaintAction());
        /* repaint after each movement of the graph nodes */

        vis.putAction("layout", layout);
        /* add the laout actions to the visualization */

        // 5. add interactive controls for visualization

        Display display = new Display(vis);
        display.setSize(700, 700);
        display.pan(350, 350);  // pan to the middle
        display.addControlListener(new DragControl());
        /* allow items to be dragged around */

        display.addControlListener(new PanControl());
        /* allow the display to be panned (moved left/right, up/down) (left-drag)*/

        display.addControlListener(new ZoomControl());
        /* allow the display to be zoomed (right-drag) */

        // 6. launch the visualizer in a JFrame

        JFrame frame = new JFrame("prefuse tutorial: socialnet");
        /* frame is the main window */

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(display);
        /* add the display (which holds the visualization) to the window */

        frame.pack();
        frame.setVisible(true);

        /* start the visualization working */
        vis.run("colour");
        vis.run("layout");

    }
}


Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Я не уверен по вашим комментариям, удовлетворены ли вы ответом, данным на форумах. Поэтому я поиграл с кодом и со следующими изменениями смог получить желаемое поведение.

Я изменил входной xml так, чтобы направленность по умолчанию граничного элемента была направлена.

... <graph edgedefault="directed"> ...

Затем в коде я поиграл с разными типами ребер EdgeRenderer и стрелками, просто чтобы убедиться, что я могу включать и выключать стрелки или заставлять их отображать вперед или назад. Я также попробовал изогнутые линии. Например:

edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_CURVE, prefuse.Constants.EDGE_ARROW_FORWARD);

Опять же, вы, возможно, уже получили ответ на этот вопрос на других форумах.

0 голосов
/ 06 января 2012

Я наткнулся на тот же вопрос. Для будущего пользователя библиотеки prefuse, которая только начинает работу: Если вы хотите добавить стрелки в пример RadialGraphView, вам нужно внести изменения, упомянутые ditkin, и добавить строку:

ColorAction arrowColor = new ColorAction("tree.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

и далее ниже:

// create the filtering and layout:
[...]
filter.add(arrowColor); // add this one

По сути, ответ находится в ветке sourceforge, но я хотел предоставить решение здесь. Код от Merve содержит эти инструкции.

...