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;
}
}
|
