JFreeChart 使用 一 直方圖之柱狀圖-高級特性


本節內容主要講述柱狀圖的一些高級特性。

1、簡單定制之修改背景顏色

調用JFreeChartCategoryPlot類方法可以進行一些簡單的直方圖表外觀的修改。例如,改變圖表和區域的背景顏色代碼如下:

chart.setBackgroundPaint(Color.white);   
CategoryPlot plot = (CategoryPlot) chart.getPlot();   
//設置圖像區域背景色   
plot.setBackgroundPaint(Color.lightGray);   
//水平軸網格線顏色   
plot.setRangeGridlinePaint(Color.white);

運行效果:

區域Plot的引用(CategoryPlot)是必須的——轉換類型也是非常安全的,因為我們知道該圖表類型使用CategoryPlotJFreeChart使用不同的區域類型(比如PiePlotXYPlot)控制不同類型的圖表。我們必須將plot的引用轉化成圖表響應的類型,因為基本類Plot僅僅定義了一些通用的屬性和方法。隨着對JFreeChart了解的加深,我們將學習每一種圖表使用的不同的plot子類。

在我們的例子中,我們使用plot的引用來改變水平軸的網格線顏色。看一下CategoryPlot類的API文件,就會看到我們能夠修改的地方。

2、定制外觀

回顧之前章節內容,CategoryPlot管理這一個BarRenderer的實例renderer。如果我們想獲得這個renderer的引用,大量的定制選擇項會變得有效。

2.1、直方條形圖顏色的定制

改變圖表中每個系列直方圖的顏色,使用如下代碼:

BarRenderer renderer = (BarRenderer) plot.getRenderer();   
renderer.setSeriesPaint(0, Color.gray);   
renderer.setSeriesPaint(1, Color.orange);   
renderer.setDrawBarOutline(false);

運行效果:

 

注意setSeriesPaint()方法是在抽象AbstractRenderer基類里面定義的——所以,我們可以在任何類型的renderer里面使用。

 2.2、種類里直方條形圖之間的空間

此外,renderer還可以控制每個種類中直方條形圖之間的間距。因此我們可以在同一個種類中將空間完全去掉,代碼如下:

 BarRenderer renderer = (BarRenderer) plot.getRenderer();   
renderer.setItemMargin(0.0);

 運行效果:

 

 

注意條形圖看上去有點變寬——主要是因為JFreeChart分配空間時,分配給種類條形圖之間的間距的尺度比較少,所以看上去就顯得有點長寬了。

 3 使用GradientPaint實例對象為每一個系列修改renderer(漸變色)

代碼如下:

 public class BarChartGradientFrame extends ApplicationFrame   
{   
    private static final long serialVersionUID = -4316075518094318809L;   
                
    public BarChartGradientFrame(String title){   
        super(title);   
        JPanel jpanel = createDemoPanel();   
        jpanel.setPreferredSize(new Dimension(500, 270));   
        setContentPane(jpanel);   
    }   
                
    private JPanel createDemoPanel()   
    {   
        JFreeChart jfreechart = createChart(createDataset());   
        return new ChartPanel(jfreechart);   
    }   
                
    private JFreeChart createChart(DefaultCategoryDataset categorydataset)   
    {   
        JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 1",   
                "Category", "Value", categorydataset, PlotOrientation.VERTICAL,   
                true, true, false);   
        jfreechart.setBackgroundPaint(Color.WHITE);   
        CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();   
        categoryplot.setBackgroundPaint(Color.lightGray);   
        categoryplot.setDomainGridlinePaint(Color.white);   
        categoryplot.setDomainGridlinesVisible(true);   
        categoryplot.setRangeGridlinePaint(Color.white);   
                
        //刻度軸刻度設置   
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();   
        //設置數據軸刻度梯進范圍   
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   
                
        //renderer設置   
        BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();   
        barrenderer.setDrawBarOutline(false);//設置外廓線不可見   
        //漸變色   
        GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,   
                0.0F, 0.0F, new Color(0, 0, 64));   
        GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F,   
                Color.green, 0.0F, 0.0F, new Color(0, 64, 0));   
        GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F,   
                Color.red, 0.0F, 0.0F, new Color(64, 0, 0));   
        //設置系列柱體顏色   
        barrenderer.setSeriesPaint(0, gradientpaint);   
        barrenderer.setSeriesPaint(1, gradientpaint1);   
        barrenderer.setSeriesPaint(2, gradientpaint2);   
                
        //設置種類標簽旋轉的角度,逆時針旋轉   
        CategoryAxis categoryaxis = categoryplot.getDomainAxis();   
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions   
                .createUpRotationLabelPositions(Math.PI / 6));   
        return jfreechart;   
    }   
                
    private DefaultCategoryDataset createDataset()   
    {   
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
        dataset.addValue(100, "First", "Category1");   
        dataset.addValue(100, "Second", "Category1");   
        dataset.addValue(100, "Three", "Category1");   
        dataset.addValue(200, "First", "Category2");   
        dataset.addValue(200, "Second", "Category2");   
        dataset.addValue(200, "Three", "Category2");   
        dataset.addValue(300, "First", "Category3");   
        dataset.addValue(300, "Second", "Category3");   
        dataset.addValue(300, "Three", "Category3");   
        dataset.addValue(400, "First", "Category4");   
        dataset.addValue(400, "Second", "Category4");   
        dataset.addValue(400, "Three", "Category4");   
        return dataset;   
    }   
                
    public static void main(String[] args)   
    {   
        BarChartGradientFrame barchartdemo = new BarChartGradientFrame("Bar Chart Demo");   
        barchartdemo.pack();   
        RefineryUtilities.centerFrameOnScreen(barchartdemo);   
        barchartdemo.setVisible(true);   
                
    }   
}

顯示效果如下:

程序代碼說明:

lMain()方法執行直方條形圖。編寫方法與餅圖一樣。

lBarChartDemo1構造函數中創了一個JPanel,並設置大小。

lcreateDemoPanel()方法創建了一個JPanel,並且在該panel上創建了直方條形圖。

lcreateDataset()方法創建了數據集。類型為CategoryDataset。注意數據集為三維數據。與餅圖不同。

l使用ChartFactory.createBarChart()方法創建直方條形圖

ljfreechart.setBackgroundPaint(Color.WHITE):設置圖表的背景顏色。

lcategoryplot.setBackgroundPaint(Color.lightGray):設置直方條形圖的背景顏色。

lsetDomainGridlinePaint(Color.whites):設置垂直格線的顏色。默認不可見。

lsetRangeGridlinePaint(Color.white):設置水平格線的顏色。默認可見。

lsetStandardTickUnits(NumberAxis.createIntegerTickUnits()):設置數據軸的刻度遞進范圍。

lGradientPaint類用來設置漸變色。

lcategoryaxis.setCategoryLabelPositions():設置標簽文字旋轉的角度。

 

4 使用二維數組生成CategoryDataset 同時顯示水平直方圖

代碼如下:

 private static CategoryDataset createDataset() {   
    double[][] ds = { { 1.0, 43.0, 35.0, 58.0, 54.0, 77.0, 71.0, 89.0 },   
            { 54.0, 75.0, 63.0, 83.0, 43.0, 46.0, 27.0, 13.0 },   
            { 41.0, 33.0, 22.0, 34.0, 62.0, 32.0, 42.0, 34.0 } };   
    return DatasetUtilities.createCategoryDataset("Series ", "Factor ", ds);   
}   
         
private static JFreeChart createChart(CategoryDataset categorydataset) {   
    JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 2",   
            "Category", "Score (%)", categorydataset,   
            PlotOrientation.VERTICAL, true, true, false);   
    jfreechart.setBackgroundPaint(Color.white);   
    CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();   
    categoryplot.setBackgroundPaint(Color.lightGray);   
    categoryplot.setRangeGridlinePaint(Color.white);   
    categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);   
    NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();   
    //設置值域范圍   
    numberaxis.setRange(0.0, 100.0);   
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   
    BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();   
    barrenderer.setDrawBarOutline(false);   
    barrenderer.setLegendItemToolTipGenerator(new StandardCategorySeriesLabelGenerator("Tooltip: {0}"));   
    return jfreechart;   
}

 

運行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM