gpt4 book ai didi

java - XY block 渲染器 jfreechart 中 block 的轮廓

转载 作者:行者123 更新时间:2023-11-30 06:45:02 26 4
gpt4 key购买 nike

我正在使用 XYZ 数据集和 XY block 渲染器绘制一种热图。 block 的颜色是 Z 值的函数,并且颜色是使用灰度指定的。即 Z 值为 0 的 block 被指定为白色,而 Z 值最大的 block 被指定为黑色。我的灰度从 0 到 100(或者更多)。如果比例这么大,计数为 0 和 10 的 block 的颜色值差异很小。为了理解,可以说整个网格被分成 block 。其中一个 block 的 Z 值为 100,一个 block 的 Z 值为 2,其他 block 均为 0。那么,这个 Z 值为 2 的 block 由于颜色很浅,所以不太明显。

我想为某些颜色的 block 提供轮廓,以便它们可以区分。我尝试使用 setBaseItemOutline() 等函数,但没有一个这样做。

对此有什么帮助吗?

编辑:下面

我的一门课是这样的:

public class BlockRenderer extends ApplicationFrame {

/**
* Constructs the demo application.
*
* @param title the frame title.
*/
public BlockRenderer(String title) {
super(title);
JPanel chartPanel = createDemoPanel();
//chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
}

/**
* Creates a chart for the specified dataset.
*
* @param dataset the dataset.
*
* @return A chart instance.
*/
private static JFreeChart createChart(XYZDataset dataset) {
NumberAxis xAxis = new NumberAxis("X");
xAxis.setLowerMargin(0.0);
xAxis.setUpperMargin(0.0);
NumberAxis yAxis = new NumberAxis("Y");
yAxis.setAutoRangeIncludesZero(false);
yAxis.setInverted(true);
yAxis.setLowerMargin(0.0);
yAxis.setUpperMargin(0.0);
yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
XYBlockRenderer renderer = new XYBlockRenderer();
CustomGrayPaintScale paintScale = new CustomGrayPaintScale(0,1000);
renderer.setPaintScale(paintScale);
XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
plot.setBackgroundPaint(Color.lightGray);
plot.setAxisOffset(new RectangleInsets(5, 5, 5, 5));
JFreeChart chart = new JFreeChart("XYBlockChartDemo3", plot);
chart.removeLegend();
chart.setBackgroundPaint(Color.white);
SymbolAxis scaleAxis = new SymbolAxis(null, new String[] {"", "OK",
"Uncertain", "Bad"});
scaleAxis.setRange(0.5, 3.5);
scaleAxis.setPlot(new PiePlot());
scaleAxis.setGridBandsVisible(false);
PaintScaleLegend psl = new PaintScaleLegend(paintScale, scaleAxis);
psl.setAxisOffset(5.0);
psl.setPosition(RectangleEdge.BOTTOM);
psl.setMargin(new RectangleInsets(5, 5, 5, 5));
chart.addSubtitle(psl);

renderer.setBaseToolTipGenerator(new XYToolTipGenerator() {

@Override
public String generateToolTip(XYDataset dataset, int arg1, int arg2) {
// TODO Auto-generated method stub
XYZDataset xyzDataset = (XYZDataset)dataset;
return String.valueOf(xyzDataset.getZValue(arg1, arg2));
}

});

return chart;
}

/**
* Utility method called by createDataset().
*
* @param data the data array.
* @param c the column.
* @param r the row.
* @param value the value.
*/
private static void setValue(double[][] data,
int c, int r, double value) {

data[0][(r) * 10 + c] = c;
data[1][(r) * 10 + c] = r;
data[2][(r) * 10 + c] = value;

}

/**
* Creates a sample dataset.
*/
private static XYZDataset createDataset() {

double[] xvalues = new double[10*10];
double[] yvalues = new double[10*10];
double[] zvalues = new double[10*10];
double[][] data = new double[][] {xvalues, yvalues, zvalues};

// set the default z-value to zero throughout the data array.
int count [][] = new int[10][10];
for ( int i=0; i<10; i++ ) {
for ( int j=0; j<10; j++ ) {
count[i][j] = i*j;
if ( i==0 && j== 5 )
count[i][j] = 3;
}
}

for ( int i=0; i<10; i++ ) {
for ( int j=0; j<10; j++ ) {
setValue(data,j,i,count[i][j]);
}
}

DefaultXYZDataset dataset = new DefaultXYZDataset();
dataset.addSeries("Series 1", data);
System.out.println(dataset.getZValue(0, 1));
return dataset;
}

/**
* Creates a panel for the demo.
*
* @return A panel.
*/
public static JPanel createDemoPanel() {
return new ChartPanel(createChart(createDataset()));
}

/**
* Starting point for the demonstration application.
*
* @param args ignored.
*/
public static void main(String[] args) {
BlockRenderer demo = new BlockRenderer("Block Chart Demo 3");
//demo.pack();
demo.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}

}

我已经创建了 CustomGrayPaintScale 类,通过重写其 getPaint() 来获取 0 Z 值的白色。如果运行上面的类,我们会注意到这些 block 没有太大区别。最上面一行有一个单元格的值为 3,该行中的所有其他单元格的值为 0。由于我的范围很大,它的颜色值与其相邻的颜色值相差不大。所以,我想要一些可以绘制这些 block 轮廓的东西。另外,我想为某些 block 项目分配蓝色,而其他 block 项目应该仅根据 Z 值具有绘画比例(如果设计绘画比例将任何颜色(例如绿色)的不同强度级别分配给所有项目,则更好,而不是为 block 提供所有不同颜色的光谱绘制比例)。我怎样才能实现这个目标?

最佳答案

XYBlockRenderer忽略从父级 AbstractRenderer 继承的轮廓属性。 drawItem()方法只是设置从 PaintScale 返回的绘制,两者 fill() draw()使用相同的颜色。一些可能的方法包括:

  • 覆盖 drawItem() 并在 fill() 之后但在 draw() 之前设置不同的绘制,可能使用 brighter()darker() 颜色。

  • 使用 GrayPaintScale 以外的 PaintScale,例如 LookupPaintScale 或您自己的实现。您可以在问题结束时指定更独特的颜色,也许使用 Color.getHSBColor() 来改变色调、饱和度和/或亮度。

    • 这个example实现 PaintScale 接口(interface)。

    image

    • 这个example改变 XYLineAndShapeRenderer 中的色调。

    image

    • 这个example改变 GanttRenderer 中的饱和度。

    image

关于java - XY block 渲染器 jfreechart 中 block 的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com