jfreechart画折线图的方法

时间:2022-10-24 12:22:55

jfreechart 是开放源代码站点sourceforge.net 上的一个 java 项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图 ( 普通柱状图以及堆栈柱状图 )、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。

应用jfreechart来画图需要两个jar包:jfreechart.jar和jcommon.jar,下载地址

下面是一个画折线图的例子:

?
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package yuth.jfree.demo;
/**
 * 使用 categorydataset 数据集创建折线图
 * 当数据多时,在jpanel中无法完全看到横坐标的值,显示为省略号。
 * 解决方法:
 *  方法1、将报表保存为图片时,设置图片的宽度足够大(2000或3000),图片可以显示横坐标值。
 *    这种方法治标不治本,所以有了第2种方法
 *  方法2、设置x轴上的lable让其45度倾斜。
 */
import java.awt.basicstroke;
import java.awt.color;
import java.awt.dimension;
import java.awt.font;
import java.awt.geom.ellipse2d;
import java.io.file;
import java.io.ioexception;
import java.net.url;
import java.text.decimalformat;
import java.util.random;
 
import javax.swing.imageicon;
import javax.swing.jpanel;
import org.jfree.chart.chartfactory;
import org.jfree.chart.chartpanel;
import org.jfree.chart.chartutilities;
import org.jfree.chart.jfreechart;
import org.jfree.chart.axis.categoryaxis;
import org.jfree.chart.axis.categorylabelpositions;
import org.jfree.chart.axis.numberaxis;
import org.jfree.chart.labels.standardcategoryitemlabelgenerator;
import org.jfree.chart.plot.categoryplot;
import org.jfree.chart.plot.plotorientation;
import org.jfree.chart.renderer.category.lineandshaperenderer;
import org.jfree.chart.title.texttitle;
import org.jfree.data.category.categorydataset;
import org.jfree.data.category.defaultcategorydataset;
import org.jfree.ui.applicationframe;
import org.jfree.ui.horizontalalignment;
import org.jfree.ui.rectangleedge;
import org.jfree.ui.rectangleinsets;
import org.jfree.ui.refineryutilities;
 
public class linechartdemo1 extends applicationframe {
 
 private static final long serialversionuid = -6354350604313079793l;
 /* synthetic */static class class$demo$linechartdemo1;
 
 public linechartdemo1(string string) {
   super(string);
  jpanel jpanel = createdemopanel();
  jpanel.setpreferredsize(new dimension(500, 270));
   setcontentpane(jpanel);
 }
 
  
  
 /**
  * 如何区分不同的图例:根据defaultcategorydataset.addvalue()的第二个参数是否相同来区分。
  * 同一个图例的数据的添加顺序影响最终的显示;不同图例的数据的添加顺序不影响最终的显示。
  * @return
  */
 private static categorydataset createdataset() {
  defaultcategorydataset defaultcategorydataset = new defaultcategorydataset();
  //defaultcategorydataset.addvalue()的参数解析:(数值,图例名,横坐标值)
/* 
  //添加数据方法1
  //图例1
  defaultcategorydataset.addvalue(212.0, "first", "1001.0");
   defaultcategorydataset.addvalue(504.0, "first", "1001.1");
  defaultcategorydataset.addvalue(1520.0, "first", "1001.2");
 
  //图例2
  defaultcategorydataset.addvalue(712.0, "second", "1001.0");
   defaultcategorydataset.addvalue(1204.0, "second", "1001.1");
  defaultcategorydataset.addvalue(1820.0, "second", "1001.2");  
/*/
//*
  //添加数据方法2
  //实验随机数来生成测试结果
  random random = new random(12345);
 
  //图例1,40个数据
  for(int i=0;i<40;i++){
   defaultcategorydataset.addvalue(random.nextint(100000),
     "first",string.valueof(1000+i) );
  }
  //图例2,40个数据
  for (int i = 0; i < 40; i++) {
   defaultcategorydataset.addvalue(random.nextint(100000),
     "second", string.valueof(1000 + i));
  }
//*/  
   
  return defaultcategorydataset;
 }
 
 private static jfreechart createchart(categorydataset categorydataset) {
  jfreechart jfreechart = chartfactory.createlinechart(
    "jfreechart test",// 图表标题
    "x", // 主轴标签(x轴)
    "y",// 范围轴标签(y轴)
    categorydataset, // 数据集
    plotorientation.vertical,// 方向
    false, // 是否包含图例
    true, // 提示信息是否显示
    false);// 是否使用urls
   
  // 改变图表的背景颜色
  jfreechart.setbackgroundpaint(color.white);
   
  categoryplot categoryplot = (categoryplot) jfreechart.getplot();
  categoryplot.setbackgroundpaint(color.lightgray);
  categoryplot.setrangegridlinepaint(color.white);
  categoryplot.setrangegridlinesvisible(false);
 
  //修改范围轴。 我们将默认刻度值 (允许显示小数) 改成只显示整数的刻度值。
  numberaxis numberaxis = (numberaxis) categoryplot.getrangeaxis();
  numberaxis.setstandardtickunits(numberaxis.createintegertickunits());
   
  // 设置x轴上的lable让其45度倾斜
  categoryaxis domainaxis = categoryplot.getdomainaxis();
  domainaxis.setcategorylabelpositions(categorylabelpositions.up_45); // 设置x轴上的lable让其45度倾斜 
   domainaxis.setlowermargin(0.0); // 设置距离图片左端距离
   domainaxis.setuppermargin(0.0); // 设置距离图片右端距离
   
   
   
  lineandshaperenderer lineandshaperenderer = (lineandshaperenderer) categoryplot
    .getrenderer();
  lineandshaperenderer.setshapesvisible(true);
  lineandshaperenderer.setdrawoutlines(true);
  lineandshaperenderer.setusefillpaint(true);
  lineandshaperenderer.setbasefillpaint(color.white);
  lineandshaperenderer.setseriesstroke(0, new basicstroke(3.0f));
  lineandshaperenderer.setseriesoutlinestroke(0, new basicstroke(2.0f));
  lineandshaperenderer.setseriesshape(0, new ellipse2d.double(-5.0, -5.0,
    10.0, 10.0));
  lineandshaperenderer.setitemmargin(0.4); //设置x轴每个值的间距(不起作用??)
   
  // 显示数据值
  decimalformat decimalformat1 = new decimalformat("##.##");// 数据点显示数据值的格式
  lineandshaperenderer.setbaseitemlabelgenerator(new standardcategoryitemlabelgenerator(
    "{2}", decimalformat1));// 设置数据项标签的生成器
  lineandshaperenderer.setbaseitemlabelsvisible(true);// 基本项标签显示
  lineandshaperenderer.setbaseshapesfilled(true);// 在数据点显示实心的小图标
     
   
  return jfreechart;
 }
 
 public static jpanel createdemopanel() {
  jfreechart jfreechart = createchart(createdataset());
 
  try {
   chartutilities.savechartasjpeg(
     new file("d:/linechartdemo1.png"), //文件保存物理路径包括路径和文件名
     // 1.0f, //图片质量 ,0.0f~1.0f
      jfreechart, //图表对象
     1024, //图像宽度 ,这个将决定图表的横坐标值是否能完全显示还是显示省略号
     768);
  } catch (ioexception e) {
   // todo auto-generated catch block
   e.printstacktrace();
  } //图像高度
     
  return new chartpanel(jfreechart);
 }
 
 public static void main(string[] strings) {
  linechartdemo1 linechartdemo1 = new linechartdemo1(
    "jfreechart - line chart demo 1");
  linechartdemo1.pack();
  refineryutilities.centerframeonscreen(linechartdemo1);
  linechartdemo1.setvisible(true);
 }
 
 /* synthetic */
 static class class$(string string) {
  class var_class;
  try {
   var_class = class.forname(string);
  } catch (classnotfoundexception classnotfoundexception) {
   throw new noclassdeffounderror(classnotfoundexception.getmessage());
  }
  return var_class;
 }
}

运行结果:

jfreechart画折线图的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/yuhentian/article/details/20213191