Prefuse: добавление весов ребер в демонстрацию GraphView.

Я использую набор инструментов для визуализации prefuse. Демонстрация GraphView в наборе инструментов просто потрясающая, предоставляя различные элементы управления для визуализации данных.

Я могу сгенерировать GraphML для своего набора данных и визуализировать его с помощью GraphView. Еще одна вещь, которую я хотел бы иметь, — это пометить ребра весами или цветовым кодированием, чтобы продемонстрировать силу между двумя узлами.

Мы очень признательны за любой вклад в то же самое..Спасибо..


person learner    schedule 04.11.2011    source источник


Ответы (1)


Отказ от ответственности: я не работал с API, просто проверил документацию :) Кажется, что API имеет интерфейс EdgeRenderer, который вы должны реализовать для достижения желаемого поведения.

Ссылка: http://prefuse.org/doc/manual/introduction/example/ , http://prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html

Обновление: сначала исправление: на самом деле EdgeRenderer — это не интерфейс, а класс. Я сделал простую демонстрацию, чтобы проиллюстрировать, как реализовать пользовательский рендеринг краев.

Характерная черта

Добавьте метку к ребрам, содержащим инициалы меток узлов.

Метод

Я сделал быстрое и грязное решение, которое скопировано 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));
person Gyula    schedule 04.11.2011