我正在繪製一種使用XYZ數據集和XY塊渲染器的熱圖。塊的顏色是Z值的函數,顏色使用灰度分配。即具有0Z值的塊被分配白色,並且具有最大值的塊被分配黑色。 我的灰度從0到100(或更多可以說)。如果比例很大,計數爲0和10的塊在顏色值上的差異很小。爲了理解,可以說整個網格是分塊的。一個塊的Z值爲100,其中一個爲2,其餘爲0.然後,這個Z值爲2的塊由於陰影很淺而不太明顯。XY塊渲染器中的塊概述jfreechart
我想概述一些顏色的區塊,以便區分它們。我嘗試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);
}
}
我已經通過在其騎做出getPaint()
類CustomGrayPaintScale得到白三色爲0 Z值。如果上面的課程正在運行,我們會注意到這些模塊沒有太多區別。最上面一行的單元格的值爲3,該行中的所有其他單元都爲0.由於我的範圍較大,所以其顏色值與其相鄰值沒有太大區別。所以,我想要一些可以爲這些塊繪製輪廓的東西。另外,我想給一些塊項目指定藍色,其他人應該只有基於Z值的油漆比例(如果設計了油漆比例,它可以爲所有項目分配不同強度的任何顏色,例如綠色,而不是光譜油漆比例尺給出了所有不同顏色的塊)。 我該如何做到這一點?
可以給人一種背景顏色像淡藍色的工作?我認爲這些項目將是可區分的,但XYBlockRenderer是否允許設置背景?似乎沒有像我試過的那樣。 – user3552407
沒錯。默認情況下,'XYBlockRenderer'使用相同的顏色來填充塊和draw()大綱。您必須決定是否重寫'drawItem()'或使用不同的'PaintScale'。 – trashgod
有沒有辦法讓塊變色或點擊時突出顯示? – user3552407