JFreeChart柱狀圖單組柱子的不同顏色顯示


JFreeChart柱狀圖中單組柱子用不同顏色來顯示的實現方法是自定義一個Renderer來繼承BarRenderer類,然后重載getItemPaint(int i,int j)方法。

實現效果如下:

實現代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CustomRenderer  extends org.jfree.chart.renderer.category.BarRenderer { 
   
     /** 
      *  
      */ 
     private static final long serialVersionUID = 784630226449158436L; 
     private Paint[] colors; 
     //初始化柱子顏色 
     private String[] colorValues = {  "#AFD8F8" "#F6BD0F" "#8BBA00" "#FF8E46" "#008E8E" "#D64646" }; 
   
     public CustomRenderer() { 
         colors =  new Paint[colorValues.length]; 
         for ( int i =  0 ; i < colorValues.length; i++) { 
             colors[i] = Color.decode(colorValues[i]); 
        
    
   
     //每根柱子以初始化的顏色不斷輪循 
     public Paint getItemPaint( int i,  int j) { 
         return colors[j % colors.length]; 
    
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
public class CreateJFreeChartBarColor { 
   
     /** 
      * 創建JFreeChart Bar Chart(柱狀圖) 
      */ 
     public static void main(String[] args) { 
         // 步驟1:創建CategoryDataset對象(准備數據) 
         CategoryDataset dataset = createDataset(); 
         // 步驟2:根據Dataset 生成JFreeChart對象,以及做相應的設置 
         JFreeChart freeChart = createChart(dataset); 
         // 步驟3:將JFreeChart對象輸出到文件,Servlet輸出流等 
         saveAsFile(freeChart,  "E:\\bar.png" 500 400 ); 
    
   
     // 保存為文件 
     public static void saveAsFile(JFreeChart chart, String outputPath,  int weight,  int height) { 
         FileOutputStream out =  null
         try
             File outFile =  new File(outputPath); 
             if (!outFile.getParentFile().exists()) { 
                 outFile.getParentFile().mkdirs(); 
            
             out =  new FileOutputStream(outputPath); 
             // 保存為PNG文件 
             ChartUtilities.writeChartAsPNG(out, chart, weight, height); 
             out.flush(); 
         catch (FileNotFoundException e) { 
             e.printStackTrace(); 
         catch (IOException e) { 
             e.printStackTrace(); 
         finally
             if (out !=  null ) { 
                 try
                     out.close(); 
                 catch (IOException e) { 
                     // do nothing 
                
            
        
    
   
     // 根據CategoryDataset生成JFreeChart對象 
     public static JFreeChart createChart(CategoryDataset categoryDataset) { 
         JFreeChart jfreechart = ChartFactory.createBarChart( "學生統計圖" // 標題 
                 "學生姓名" // categoryAxisLabel (category軸,橫軸,X軸的標簽) 
                 "年齡" // valueAxisLabel(value軸,縱軸,Y軸的標簽) 
                 categoryDataset,  // dataset 
                 PlotOrientation.VERTICAL,  false // legend 
                 false // tooltips 
                 false );  // URLs 
   
         Font labelFont =  new Font( "SansSerif" , Font.TRUETYPE_FONT,  12 ); 
   
         jfreechart.setTextAntiAlias( false ); 
         jfreechart.setBackgroundPaint(Color.white); 
   
         CategoryPlot plot = jfreechart.getCategoryPlot(); // 獲得圖表區域對象 
   
         // 設置橫虛線可見 
         plot.setRangeGridlinesVisible( true ); 
         // 虛線色彩 
         plot.setRangeGridlinePaint(Color.gray); 
         // 數據軸精度 
         NumberAxis vn = (NumberAxis) plot.getRangeAxis(); 
         // vn.setAutoRangeIncludesZero(true); 
         DecimalFormat df =  new DecimalFormat( "#0.0" ); 
         vn.setNumberFormatOverride(df);  // 數據軸數據標簽的顯示格式 
   
         // x軸設置 
         CategoryAxis domainAxis = plot.getDomainAxis(); 
         domainAxis.setLabelFont(labelFont); // 軸標題 
         domainAxis.setTickLabelFont(labelFont); // 軸數值 
         // Lable(Math.PI/3.0)度傾斜 
         // domainAxis.setCategoryLabelPositions(CategoryLabelPositions 
         // .createUpRotationLabelPositions(Math.PI / 3.0)); 
         domainAxis.setMaximumCategoryLabelWidthRatio( 6 .00f); // 橫軸上的 Lable 
         // 是否完整顯示 
   
         // 設置距離圖片左端距離 
         domainAxis.setLowerMargin( 0.1 ); 
         // 設置距離圖片右端距離 
         domainAxis.setUpperMargin( 0.1 ); 
         // 設置 columnKey 是否間隔顯示 
         // domainAxis.setSkipCategoryLabelsToFit(true); 
         plot.setDomainAxis(domainAxis); 
         // 設置柱圖背景色(注意,系統取色的時候要使用16位的模式來查看顏色編碼,這樣比較准確) 
         plot.setBackgroundPaint( new Color( 255 255 204 )); 
   
         // y軸設置 
         ValueAxis rangeAxis = plot.getRangeAxis(); 
         rangeAxis.setLabelFont(labelFont); 
         rangeAxis.setTickLabelFont(labelFont); 
         // 設置最高的一個 Item 與圖片頂端的距離 
         rangeAxis.setUpperMargin( 0.15 ); 
         // 設置最低的一個 Item 與圖片底端的距離 
         rangeAxis.setLowerMargin( 0.15 ); 
         plot.setRangeAxis(rangeAxis); 
   
         // 解決中文亂碼問題(關鍵) 
         TextTitle textTitle = jfreechart.getTitle(); 
         textTitle.setFont( new Font( "黑體" , Font.PLAIN,  20 )); 
         domainAxis.setTickLabelFont( new Font( "sans-serif" , Font.PLAIN,  11 )); 
         domainAxis.setLabelFont( new Font( "宋體" , Font.PLAIN,  12 )); 
         vn.setTickLabelFont( new Font( "sans-serif" , Font.PLAIN,  12 )); 
         vn.setLabelFont( new Font( "黑體" , Font.PLAIN,  12 )); 
         // jfreechart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12)); 
   
         // 使用自定義的渲染器 
                 CustomRenderer renderer =  new CustomRenderer(); 
         // 設置柱子寬度 
         renderer.setMaximumBarWidth( 0.2 ); 
         // 設置柱子高度 
         renderer.setMinimumBarLength( 0.2 ); 
         // 設置柱子邊框顏色 
         renderer.setBaseOutlinePaint(Color.BLACK); 
         // 設置柱子邊框可見 
         renderer.setDrawBarOutline( true ); 
         // 設置每個地區所包含的平行柱的之間距離 
         renderer.setItemMargin( 0.5 ); 
         jfreechart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); 
         // 顯示每個柱的數值,並修改該數值的字體屬性 
         renderer.setIncludeBaseInRange( true ); 
         renderer.setBaseItemLabelGenerator( new StandardCategoryItemLabelGenerator()); 
         renderer.setBaseItemLabelsVisible( true ); 
         plot.setRenderer(renderer); 
         // 設置柱的透明度 
         plot.setForegroundAlpha( 1 .0f); 
   
         // 背景色 透明度 
         plot.setBackgroundAlpha( 0 .5f); 
   
         return jfreechart; 
    
   
     // 創建CategoryDataset對象 
     public static CategoryDataset createDataset() { 
         double [][] data =  new double [][] { {  25 24 40 12 33 33 } }; 
         String[] rowKeys = {  "" }; 
         String[] columnKeys = {  "張三" "李四" "王五" "馬六" "陳七" "趙八" }; 
         CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); 
         return dataset; 
    
   
}


免責聲明!

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



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