使用JFreeChart的XYLineAndShapeRenderer绘制自定义线

时间:2012-09-04 08:57:20

标签: java jfreechart

我有一些逻辑用于构建一系列集群。到目前为止,为了表示图上每个点所属的聚类,我使用了一系列颜色,其中属于同一聚类的点具有相同的颜色。

除此之外,我还希望显示每个群集的中心,因为这将帮助我了解我的群集构建算法的执行情况。为了做到这一点,我通过使用XPointerAnnotation类在图表上写了一些文本。问题在于我认为在点之上添加文本会导致杂乱的情节(考虑到很可能会有数百个点)。

我想过画线从中心点到其群集的每个成员向外。我面临的问题是,我似乎无法找到正确的方法或方法。

我设法找到sourceXYLineAndShapeRenderer,并尝试将其用作指南,但我仍然没有在绘图上绘制自定义线条。我试图覆盖drawPrimaryLinedrawPrimaryLineAsPathdrawSecondaryPass方法,但无济于事。

我用来渲染线条的代码如下:

int x1 = (int) dataset.getXValue(series, 0);
int y1 = (int) dataset.getYValue(series, 0);

int x2 = (int) dataset.getXValue(series, item);
int y2 = (int) dataset.getYValue(series, item);

g2.drawLine(x1, y1, x2, y2);
System.out.println(String.format("Drawing %d  %d  %d  %d %s", x1, y1, x2, y2, g2.getColor()));

State s = (State) state;
if (item == s.getLastItemIndex()) {
    // draw path
    drawFirstPassShape(g2, pass, series, item, s.seriesPath);
}

print语句打印出正确的坐标和正确的颜色,因此看起来我正在添加的图形没有被渲染。我尝试在执行代码之前和之后调用super,但也没有用。

任何指示都将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:2)

仔细查看发布的代码,从dataset获取的 xy 值代表 data 坐标中的一个点。在可以渲染这样的点之前,必须将其转换为相对于dataArea图形坐标。例如,drawPrimaryLineAsPath()使用相应的轴方法valueToJava2D()将数据值转换为图形坐标。

double transX1 = domainAxis.valueToJava2D(x1, dataArea, xAxisLocation);
double transY1 = rangeAxis.valueToJava2D(y1, dataArea, yAxisLocation);

附录:drawPrimaryLineAsPath()方法仅在drawSeriesLineAsPathtrue时从drawItem()调用,例如setDrawSeriesLineAsPath(true)