a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 121|回复: 1

[其他] JAVA技巧:如何使用JFreeChart创建图象

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
一:jfreechart介绍) H$ B% S' _( E! m; N  i) O
  jfreechart是一个免费建树图片的java工具.可以建树如下图形:$ B. J% T- \! k' K& Y
  饼图版本为0.98
4 D0 W, u0 J7 ^& f  但愿获得具体的信息或下载jfreechart请访谒如下站点:6 w% U; C& L, a  X, O
  http://www.jfree.org/jfreechart /$ O( Y+ ^! ?+ l5 p7 ?1 }( \
  二:出格声名:. v4 ^  _3 L; E' s1 ~, [5 ^2 {
  jfreechart是一个开源项目,可是文档是需要40美金去采办的。: {, Y! v# ^' I# ~& t6 F
  还有一个很主要的问题,jfreechart如不美观使用中文,他使用的默认字体
6 Q. ?! O! `; o9 b  显示出来的中文会很恍惚,你可能需要改削源代码。$ F$ i9 S! h! z9 A5 r* y
  下面我就举几个简单的例子声名一下若何使用jfreechart建树图片
) z4 F% ~3 N3 C$ N- j* j/ ~! }  在开发中有可能会导入以下的类4 C% ~  d7 e7 Q
  import com.jrefinery.chart.ChartFactory;) B) F7 d8 e1 d  i8 Z4 U$ {4 H/ _
  import com.jrefinery.chart.ChartUtilities;8 [1 h) O0 v! M& F
  import com.jrefinery.chart.JFreeChart;9 U" W5 o8 }3 U6 W# y
  import com.jrefinery.chart.TextTitle;
5 I5 I' D$ H8 D, w; M/ ?  import com.jrefinery.chart.axis.NumberAxis;% |  {9 d& R' v+ p% K
  import com.jrefinery.chart.plot.CategoryPlot;
- e* I/ c& L5 k  import com.jrefinery.chart.plot.PiePlot;: h5 f! a6 Q0 b$ Q* [4 k
  import com.jrefinery.data.Day;, L4 f' W: O/ v& H* ?
  import com.jrefinery.data.DefaultCategoryDataset;
' w* X6 n, D" C9 c3 n" o  import com.jrefinery.data.DefaultPieDataset;( J8 u5 ]. ~  V
  import com.jrefinery.data.TimeSeries;) g4 X( }. v# l
  import com.jrefinery.data.TimeSeriesCollection;9 J  Z! s1 p  Q0 K( k3 e
  import com.jrefinery.data.TimeSeriesDataPair;0 R* o% i6 l1 `5 m( Q
  在0.98往后包由com.jrefinery.*改变为:org.jfree1 C/ N0 o: h4 I
  三:建树饼图
, E7 a" |! r3 D! |5 W  //图片问题
$ z3 y# G6 ]+ f5 M9 i  String title = "空调2002年市场据有率";2 H) q  _$ V. g  Z* c) W; R* D
  //设定数据源% ]9 D3 T% o$ D+ K% S
  DefaultPieDataset piedata = http://www.qnr.cn/pc/java/xinde/201007/new DefaultPieDataset();/ O7 W: [6 h. `, q# n) C& |$ {0 s( ~& Y
  //第一个参数为名称,第二个参数是double数
0 a3 M2 i$ }( l' M# M  piedata.setValue("联想", 27.3);
6 h: x- @0 `: R: K* H  piedata.setValue("长城", 12.2);
# F$ e0 v& G% e+ _9 A% Y8 r* i7 ^  piedata.setValue("海尔", 5.5);. L) S" e0 E0 E, U( }% {
  piedata.setValue("美的", 17.1);( p( _4 l) t" B, O! I
  piedata.setValue("松下", 9.0);
1 z2 S! p% Y. w) @% i* [  piedata.setValue("科龙", 19.0);9 x6 l: W! q: H, u/ H, D' }
  //建树JFreeChart,都使用ChartFactory来建树JFreeChart,很尺度的工场设计模式
9 F' v. ?6 T. n8 O' Z3 i  JFreeChart chart =
, x' \% d9 d  R. q# m4 |% W6 n4 e  ChartFactory.createPieChart(title, piedata, true, true, true);  b! U' I8 i3 ?. h4 S
  //设定图片问题3 p) V2 u# o2 G; [
  chart.setTitle(new TextTitle(title, new Font("隶书", Font.ITALIC, 15)));+ y1 j  a3 v" u* u3 K0 Q0 ^1 l
  //chart.addSubtitle(new TextTitle("2002财年剖析", new Font("隶书", Font.ITALIC, 12)));" t1 Z) ], f; F
  //设定布景1 h! y( i: w' i  _2 x! i
  chart.setBackgroundPaint(Color.white);
2 e3 ^, X) K) s  //chart.s6 Y) K2 R) s: J0 G+ @0 t
  //饼取使用一个PiePlot& w) M- g. W- b  F- O, |
  PiePlot pie = (PiePlot)chart.getPlot();$ J) Y9 u2 P# C- [. o
  //pie.setSectionLabelType(PiePlot.NAME_AND_PERCENT_LABELS);
6 g8 g8 g* `/ ]* ?- U$ F  pie.setSectionLabelType(PiePlot.NAME_AND_VALUE_LABELS);+ N0 t1 _8 R! g. A1 d; B
  //设定显示名目(名称加百分比或数值)
% R" B& q/ Q* C$ g' r" k: n9 p9 }  pie.setPercentFormatString("#,###0.0#%");4 w9 H5 f! d7 C
  //设定百分比显示名目$ [5 T8 b- o: Z# ]  U) G3 r
  pie.setBackgroundPaint(Color.white);) Y' a7 L% l1 P9 x( W- ?. C3 m2 t- p2 F
  pie.setSectionLabelFont(new Font("黑体", Font.TRUETYPE_FONT, 12));# z4 h% |' V" _5 X& l( _' h
  //设定布景透明度(0-1.0之间)
, M. i. Q  h) E2 s0 M# [- D& Q4 _  pie.setBackgroundAlpha(0.6f);
; P! _2 p  g, g' O, Y  //设定前景透明度(0-1.0之间)4 ]0 O8 L+ g6 x% {! m+ G- P& f
  pie.setForegroundAlpha(0.90f);: I/ v. R) N( X% f' f
  //输出文件到指定目录: O" X- Y$ B! _: g8 B
  String rfname = MathUtil.getRoundCode(12) + ".jpeg";) [! y6 C' a; t* f- \$ e* O8 b
  String fileName = "d:/test/" + rfname;3 Y. j8 l% k) Z' X! I" l
  try {
6 D" _/ N8 S% r- ]  //可以保留文件为jpg或png名目。  H2 R3 Q+ m. F: V( e9 Q* y
  ChartUtilities.saveChartAsJPEG(new File(fileName), 100, chart, 600, 600);
& \/ R! ^/ K, U, ?  //第一个参数为文件名
6 ^+ C5 x) G# I8 w0 \: v  //第二个参数质量
" v* ^0 u  B9 F  //第三个参数为哪个chart建树图片
# y* @9 J7 z. S9 g% }, d  //第四个宽度
4 H- G4 B# ^; P2 \: C- L, G  //第五个高度
, x+ Q. T. m( L3 x1 j7 s  } catch (IOException exz) {4 Z# l7 o" S. c8 O! L+ o4 o0 N
  System.out.print("....Cant’t Create image File");
* l& a! P! A: Y/ `  S# w7 f+ x  }. M, h) Y% F' H3 B8 s/ z
  其实使用JFreeChart建树图片很简单,分歧的的图片类型区别在于设置数据集
8 E  B2 U+ ?% C$ T, X- Y2 F  四:建树曲线图1 I8 D, d2 x; G" O1 |% H; F
  // create a default chart based on some sample data...
6 `5 V0 x: |  V2 v- S  //曲线搁问题$ d5 r7 Y: O( w7 t3 r
  String title = "趋向剖析";6 i5 w9 |2 j% ^' N$ D  |# j
  //曲线图X轴提醒
! S& Y" t0 k, O8 g  g3 c& Y  String domain = "月份走势";( ]7 V6 l: R. a/ j* h
  //曲线图Y轴提醒
$ ?; E( J: G4 W4 I- w2 U  String range = "应收余额";+ ]  r* p, E6 i  F
  //曲线图自问题
! X" o" r7 q' y! [& O% ?. W( s  String subtitleStr = "2003财年剖析";( }# X  e# C1 y+ R( q& \3 f
  //建树时刻数据源' v! U6 ?) z, ~+ R2 s6 |
  //每一个TimeSeries在图上是一条曲线5 t* e8 |( u  B: Z0 B, ]7 f! i
  TimeSeries ca = new TimeSeries("用友");/ R8 V2 [7 y/ V" c9 n
  for (int i = 1999; i < 2005; i++) {$ t# R* T4 ^. D# x& k9 q
  for (int mon = 0; mon < 12; mon++) {3 C$ K! z' _& _3 T4 N2 D; R
  //ca.add(new Month(mon + 1, i), new Double(500 + Math.random() * 100));
7 S0 {" P& n: M, Q9 B  //TimeSeriesDataPair是一个时刻点的数值浮现
6 p# w7 m3 g# b* @' t! E  ca.add(
/ r, ~8 F/ t; ~- D  new TimeSeriesDataPair(4 A: y+ B% Q* `5 t* y' k
  new Day(1, mon + 1, i),
& \; e6 m4 u# u4 x  new Double(500 + Math.random() * 100)));5 n. ?5 o7 [3 u! [9 k- h; s5 Y
  }
8 y. i2 @( k3 h; }# ?  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:如何使用JFreeChart创建图象

  TimeSeries ibm = new TimeSeries("金碟");
5 e2 F$ e$ C6 F$ ^  for (int i = 1999; i < 2005; i++) {
! f  ~0 Y5 _# t% F  for (int mon = 0; mon < 12; mon++) {: X: e3 u( l) S$ x' T3 E! [! s
  //ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));
- n" e7 Q5 f4 U2 R; h" y  ibm.add(
8 C; f9 y( {% |, k2 Z# R5 E* U+ x  new TimeSeriesDataPair(
- J/ X8 A5 A# U3 P" Y! V5 _  new Day(1, mon + 1, i),8 P. s& J2 v1 P0 \6 _  n
  new Double(400 - Math.random() * 100)));
2 y' ]; h. J& o# j+ p* k4 L: b  }
  N5 e+ a- h- C9 ?5 p# q  }
  r) t) M( J& u8 c: F  o: V1 a7 P  TimeSeries king = new TimeSeries("东软");
+ X3 }& l6 C# C6 o  for (int i = 1999; i < 2005; i++) {$ V8 m1 Z) Z7 B# Q
  for (int mon = 0; mon < 12; mon++) {$ W# x  ]8 x# y/ }! w
  //ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));3 A8 l" r6 S0 Y; N/ T. T& o' g3 ^2 L
  king.add(
& i8 L7 I1 ?, E9 Y  new TimeSeriesDataPair(
* J2 k1 U7 f: e, f. u  new Day(1, mon + 1, i),
. d( W- j) R/ k! ]7 N# {  new Double(300 - Math.random() * 100)));6 a4 }: A  X$ D" q1 A$ m
  }. P! c! H/ d- t& {0 V/ k8 A
  }
* b" D" D0 y2 m( U/ X  //时刻曲线数据集结$ k( K# N# m8 H/ n
  TimeSeriesCollection dataset = new TimeSeriesCollection();/ ]' E" l2 h! y2 e! `
  dataset.addSeries(ca);' F5 e* t. t3 @
  dataset.addSeries(ibm);
: k% D# ?+ {! }5 _8 }0 Y  dataset.addSeries(king);2 [; ^" R+ u# O
  //dataset.addSeries(jpy);
4 ^& K$ X% a. A: _4 a1 @  //dataset.addSeries(mav);* s  X/ O: z: l4 q9 q
  //时刻曲线元素6 g- I( Z; i# F; ]5 {
  JFreeChart chart =
! d8 \* u# C' j  ChartFactory.createTimeSeriesChart(
, S# F7 ?* _, ?- b( Y/ Y+ q  title,
" V* a' ~/ ^( y! y: c6 K; v5 V  domain,
7 @# T1 Z8 l( v% I2 Y  ^" J( n1 \  range,
) T* }! ^6 b5 D( V  dataset,
! X# X5 o/ G+ m7 y3 z5 ]  true,
8 m  i1 J+ U+ y/ J! R' A  true,
, Z1 f1 {4 ]0 n  false);
  d, _1 M- }$ z% _  // then customise it a little...2 A$ E% s' q/ l% K4 h- x# l! I4 O
  TextTitle subtitle =  P/ k" Z. r, G/ i/ t0 f+ y
  new TextTitle(subtitleStr, new Font("黑体", Font.BOLD, 12));$ a( w* l/ C3 u3 r) ?/ C
  chart.addSubtitle(subtitle);
4 T! X) S  U1 t; ^6 m# g4 j  chart.setTitle(new TextTitle(title, new Font("隶书", Font.ITALIC, 15)));( h1 j  P5 }. P; l  |
  //pie.setSeriesLabelFont(new Font("黑体", Font.BOLD, 15)); chart.setBackgroundPaint(3 b% G9 m: S/ T9 M
  new GradientPaint(0, 0, Color.white, 0, 1000, Color.blue));
9 N2 j, L& m' h* m7 o" W  //sysout! C2 k. u; k. y1 C0 Y4 O
  //输出文件到指定目录9 V9 M5 Y- E* W; R
  String rfname = MathUtil.getRoundCode(22) + ".jpeg";
: e& X' K5 |; r5 r/ A" ~! _  String fileName = "d:/test/" + rfname;
4 |0 c. n9 Q% H2 l4 F1 a  try {% C8 I6 v/ e, E
  //for( \3 q: ?, u, f( o7 g! X9 ~
  //System.out.println();, `7 c/ P  Y; \8 f0 K; c: |1 P
  ChartUtilities.saveChartAsJPEG(new File(fileName), 100, chart, 600, 600);7 E# V5 F, {+ q4 M4 V
  // log.info("....Create image File:" + fileName);% o/ E. Z4 Q& Q  d/ @1 J" d4 M: p3 j: m! ?
  } catch (IOException exz) {: U3 E& h" a/ t7 l! e
  System.out.print("....Cant’t Create image File");
& A. Y) s' v# C$ o+ }  }
1 `% q' r& a3 w* z& q2 E: P  五:建树柱状图; b$ a0 {0 G* q& r3 c. j
  String title = "柱状图测试";8 ^- F5 W) s# P" @' o
  String domain = "单元斗劲";4 {8 r/ s- Q3 `7 D: l
  String range = "数值";
& ]" A% h( u- r7 Y1 }& F  //CategoryDataset data = DemoDatasetFactory.createCategoryDataset();
9 k! b" x4 K, i! U6 Z  DefaultCategoryDataset data = new DefaultCategoryDataset();
# _) h9 K% g! e; F; H# _  for (int r = 0; r < 5; r++) {
' m9 Q& @& }$ d% O0 G. F% ^  String rowKey = "单元 [" + (r + 1)+"]" ;
* \2 z+ O$ `$ \, p6 L& E0 ^  //第一层轮回:剖析对象
$ D  J3 b: O& y. [3 S* m5 {9 y2 M$ F  for (int c = 0; c < 6; c++) {
: U$ m2 K; Q8 l" ]  //第二层轮回:剖析对象在时刻点上的数据
9 ?8 ?6 \: Y% g* P% _  String columnKey = "2001年" + (c + 1) + "月";
: g( U) L2 u8 [9 W4 J, O$ f! [  data.addValue(new Double(r * c + 5), rowKey, columnKey);
( K/ ~' J" k8 p7 R: z3 J& o- Y  }- w- q. x( Y" W" X/ n
  }+ S) z; M% }9 S  n% Q
  JFreeChart chart =
* ]) F* ~/ c/ h3 C  ChartFactory.createVerticalBarChart(
" g! U+ ?# y: ]. g  title,
! }- p. g7 o* e/ N( Y9 y  domain,6 a: v: Y  b- U0 q! X
  range,3 x( H5 x' t! T! s
  data,
, X9 i% i3 ^  {  y, p& d4 P  true,
# p8 o; d( p; _  true,0 t* ~: r- O9 Y9 a0 Y/ w5 {: G: V7 n
  false);
- B4 @; t! b. o  // then customise it a little...
; }* A/ j8 ~; h; u5 E; e  chart.setBackgroundPaint(
/ j! L/ |1 ]5 t. A  new GradientPaint(0, 0, Color.white, 1000, 0, Color.red));& A5 p( k2 q( C7 E
  chart.setTitle(new TextTitle(title, new Font("隶书", Font.ITALIC, 15)));
7 u5 a1 W/ Z3 G  n7 h, ^' t+ R5 N  CategoryPlot plot = (CategoryPlot)chart.getPlot();
) }9 D1 k" g# y1 l& ^7 l3 D  plot.setForegroundAlpha(0.9f);$ x& O* ~8 F% v* l) P6 C
  plot.setValueLabelFont(new Font("黑体", Font.TRUETYPE_FONT, 12));7 \3 z3 r8 @+ ?: G6 L+ x
  //plot.setSectionLabelFont(new Font("黑体", Font.TRUETYPE_FONT, 12));
8 c8 q; D6 t: O* {$ h' ?: d  //注重以下代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 11:05 , Processed in 0.607758 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表