2017-05-06 65 views
1

我正在繪製一種使用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值的油漆比例(如果設計了油漆比例,它可以爲所有項目分配不同強度的任何顏色,例如綠色,而不是光譜油漆比例尺給出了所有不同顏色的塊)。 我該如何做到這一點?

回答

1

XYBlockRenderer忽略從父項AbstractRenderer繼承的大綱屬性。 drawItem()方法簡單地設置從PaintScale退色的塗料,使用相同顏色的fill()draw()。一些可能的方案將包括這些:

  • 覆蓋drawItem()fill()之後,但draw()之前設置一個不同的油漆,或者用brighter()darker()顏色。

  • 使用除GrayPaintScale之外的PaintScale,例如LookupPaintScale或您自己的實現。您可以在問題結束時指定更多與衆不同的顏色,可能會使用Color.getHSBColor()來改變色調,飽和度和/或亮度。

    • 這個example實現PaintScale接口。

    image

    • example變化在XYLineAndShapeRenderer色調。

    image

    • example變化在GanttRenderer飽和。

    image

+0

可以給人一種背景顏色像淡藍色的工作?我認爲這些項目將是可區分的,但XYBlockRenderer是否允許設置背景?似乎沒有像我試過的那樣。 – user3552407

+1

沒錯。默認情況下,'XYBlockRenderer'使用相同的顏色來填充塊和draw()大綱。您必須決定是否重寫'drawItem()'或使用不同的'PaintScale'。 – trashgod

+0

有沒有辦法讓塊變色或點擊時突出顯示? – user3552407