Как создать диаграмму с областями с накоплением с помощью Prefuse?

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

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


person Jay Askren    schedule 02.02.2011    source источник


Ответы (2)


Вы ознакомились с руководством по 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);

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

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

//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");

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

Удачи.

person Tomas Narros    schedule 08.02.2011
comment
Спасибо. Я просматривал руководство несколько лет назад, но не придал ему большого значения, потому что оно было таким скудным. Я предполагаю, что это на самом деле довольно ценно. - person Jay Askren; 10.02.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.

person holygeek    schedule 11.02.2011