Как мне создать гистограмму, используя библиотеку Java prefuse? - PullRequest
1 голос
/ 27 апреля 2009

В настоящее время у меня есть prefuse для построения графика рассеяния, где ось X - это имя компьютера, а ось Y - его температура. Как заставить его рисовать столбцы, отображающие значения вместо дискретных точек?

В настоящее время я использую следующий код для отрисовки точек:

ShapeAction shape = new ShapeAction(group, Constants.SHAPE_RECTANGLE);
ColorAction strokeColor = new DataColorAction(group, dataType, Constants.NUMERICAL, VisualItem.STROKECOLOR, colorPalette);

ActionList draw = new ActionList();
draw.add(shape);
draw.add(strokeColor);
draw.add(new ColorAction(group, VisualItem.FILLCOLOR, 0));
draw.add(new RepaintAction());
m_vis.putAction("draw", draw);

Как мне адаптировать этот код, чтобы вместо маленького квадрата в каждой точке получить толстую полосу, идущую от нижней части графика к точке?

Спасибо.

1 Ответ

1 голос
/ 06 мая 2009

Думаю, мне следует указать, как я это сделал - переполнение стека, в конце концов, тоже должно быть хранилищем. Ранее в коде было следующее:

m_vis.setRendererFactory(new RendererFactory() {
    Renderer yAxisRenderer = new AxisRenderer(Constants.LEFT, Constants.TOP);
    Renderer xAxisRenderer = new AxisRenderer(Constants.CENTER, Constants.FAR_BOTTOM);
    Renderer barRenderer = new ShapeRenderer();

    public Renderer getRenderer(VisualItem item) {
        return item.isInGroup("yAxis") ? yAxisRenderer :
               item.isInGroup("xAxis") ? xAxisRenderer :
               barRenderer;
    }
});

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

m_vis.setRendererFactory(new RendererFactory() {
    Renderer yAxisRenderer = new AxisRenderer(Constants.LEFT, Constants.TOP);
    Renderer xAxisRenderer = new AxisRenderer(Constants.CENTER, Constants.FAR_BOTTOM);
    Renderer barRenderer = new ShapeRenderer() {
        protected Shape getRawShape(VisualItem item) {
            double x = item.getX();
            double y = item.getY();
            if (Double.isNaN(x) || Double.isInfinite(x))
                x = getInsets().left + axisWidth + totalBarWidth / 2;
            if (Double.isNaN(y) || Double.isInfinite(y))
                y = 0;

            double width = totalBarWidth / (barCount + 1) - barGap;
            double height = getHeight() - getInsets().bottom - axisHeight - y;
            x -= width / 2;

            return rectangle(x, y, width, height);
        }
    };

    public Renderer getRenderer(VisualItem item) {
        return item.isInGroup("yAxis") ? yAxisRenderer :
               item.isInGroup("xAxis") ? xAxisRenderer :
               barRenderer;
    }
});
...