本節內容主要講述柱狀圖的一些高級特性。
1、簡單定制之修改背景顏色
調用JFreeChart和CategoryPlot類方法可以進行一些簡單的直方圖表外觀的修改。例如,改變圖表和區域的背景顏色代碼如下:
chart.setBackgroundPaint(Color.white); CategoryPlot plot = (CategoryPlot) chart.getPlot(); //設置圖像區域背景色 plot.setBackgroundPaint(Color.lightGray); //水平軸網格線顏色 plot.setRangeGridlinePaint(Color.white);
運行效果:
區域Plot的引用(CategoryPlot)是必須的——轉換類型也是非常安全的,因為我們知道該圖表類型使用CategoryPlot。JFreeChart使用不同的區域類型(比如PiePlot、XYPlot)控制不同類型的圖表。我們必須將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; }
運行效果: