Как сделать диаграмму с областями с накоплением с помощью Prefuse? - PullRequest
4 голосов
/ 02 февраля 2011

Я хотел бы сделать диаграмму с накоплением областей с префузом, аналогичную следующей: http://prefuse.org/gallery/namevoyager/

Я не совсем уверен, с чего начать, и для этих диаграмм нет примера кода.Я нашел prefuse.action.layout.StackedAreaChart, но не уверен, что с ним делать.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Вот скомпилированный пример использования макета StackedAreaChart. Я включил это здесь, потому что я не мог найти это где-нибудь еще, с надеждой, что это будет полезно как справка для других. Ключевым моментом здесь является понимание того, что StackedAreaChart предполагает, что ваша таблица соответствует следующей схеме:

  1. Один столбец для идентификатора, скажем "имя",
  2. Один или несколько столбцов для фактических данных, соответствующих идентификатору.
  3. Три столбца для вычисляемого многоугольника с именами «_polygon», «_polygon: start» и «_polygon: end». Именно так был разработан класс StackedAreaChart. «_polygon» на самом деле является константой VisualItem.POLYGON, поэтому вы можете использовать ее вместо нее, как показано в следующем примере.

Вот оно:

import javax.swing.JFrame;
import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.RepaintAction;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.layout.StackedAreaChart;
import prefuse.data.Table;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.PolygonRenderer;
import prefuse.util.ColorLib;
import prefuse.visual.VisualItem;

class Main {
    public static void main(String[] args) {
        ActionList color = new ActionList();
        int[] palette = new int[] {
            ColorLib.rgba(255,200,200,150),
            ColorLib.rgba(200,255,200,150)
        };
        ColorAction fillColor = new DataColorAction("table", "name",
                Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        color.add(fillColor);

        ActionList layout = new ActionList();
        layout.add(new RepaintAction());
        String[] fields = { "1980s", "1990s", "2000s" };
        layout.add(new StackedAreaChart("table", VisualItem.POLYGON, fields));

        Visualization vis = new Visualization();
        Table table = new Table();
        vis.add("table", table);

        table.addColumn("name", String.class);
        table.addColumn("1980s", int.class);
        table.addColumn("1990s", int.class);
        table.addColumn("2000s", int.class);
        table.addColumn(VisualItem.POLYGON, float[].class, null);
        table.addColumn(VisualItem.POLYGON+":start", float[].class, null);
        table.addColumn(VisualItem.POLYGON+":end", float[].class, null);

        int rowNumber = table.addRow();
        table.setString(rowNumber, "name", "Bob");
        table.setInt(rowNumber, "1980s", 1000);
        table.setInt(rowNumber, "1990s", 500);
        table.setInt(rowNumber, "2000s", 300);

        rowNumber = table.addRow();
        table.setString(rowNumber, "name", "Mary");
        table.setInt(rowNumber, "1980s", 800);
        table.setInt(rowNumber, "1990s", 1500);
        table.setInt(rowNumber, "2000s", 3200);

        vis.putAction("layout", layout);
        vis.putAction("color", color);

        DefaultRendererFactory drf = new DefaultRendererFactory();
        drf.add("ingroup('table')", new PolygonRenderer());
        vis.setRendererFactory(drf);

        Display display = new Display(vis);
        display.setSize(720, 500);

        JFrame frame = new JFrame("Prefuse StackedAreaChart Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(display);
        frame.pack();
        frame.setVisible(true);

        vis.run("layout");
        vis.run("color");
    }
}

Чтобы заставить его отображать ось, обратитесь к демонстрационной версии Congress.java, включенной в дистрибутив prefuse.

1 голос
/ 08 февраля 2011

Вы проверили руководство Prefuse ?(не слишком полный, но с этого нужно начать).

В нем вы можете найти пример приложения , в котором показано, как загрузить некоторые данные в элемент Graph и какразверните его в элемент визуализации.

Для генерации StackedAreaChart вам необходимо загрузить данные в prefuse.data.Table объект, который вы можете загрузить, например, из CSV-файла:

CSVTableReader reader=new CSVTableReader();
Table myTable=reader.readTable("/myDataFile.csv");

Затем добавьте таблицу к визуализации в качестве группы данных, то есть «таблица»

Visualization vis = new Visualization();
vis.add("table", myTable);

Затем создайте StackedAreaChart и добавьте его в коллекцию действий визуализации:

//params: name of the data group to layout, name of the data field in which to store computed polygons, and an array containing the names of the various data fields, in sorted order, that should be referenced for each consecutive point of a stack layer
StackedAreaChart chart=new StackedAreaChart ("table", fieldName, csvColumnsToCompute);
//add the layout action with a unique key
 vis.putAction("myChartLayout", chart);

Затем вы можете настроить различные действия макета или другие визуальные аспекты (см. Связанный пример).

Наконец, для отображения диаграммы вам нужно будет создать экранный объект, привяжите визуализацию и запустите на ней действия макета:

//this Display initialization is extracted from the Example app
Display d = new Display(vis);
d.setSize(720, 500); // set display size
// drag individual items around
d.addControlListener(new DragControl());
// pan with left-click drag on background
d.addControlListener(new PanControl()); 
// zoom with right-click drag
d.addControlListener(new ZoomControl());

// create a new window to hold the visualization
JFrame frame = new JFrame("prefuse example");
// ensure application exits when window is closed
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(d);
frame.pack();           // layout components in window
frame.setVisible(true); // show the window

//At the end: RUN THE CHART ACTION:
vis.run("myChartLayout");

Надеюсь, это поможет, по крайней мере, при первом запуске (фрагменты кода не предназначены для копирования-вставки и могут содержать некоторые ошибки компиляции).

Удачи.

...