【JFreeChart】JFreeChart—输出柱形图
如何將數(shù)據(jù)以柱狀圖的形式顯示出來?
實現(xiàn)過程:
1、獲取數(shù)據(jù);
2、根據(jù)工廠模式生成圖形對象,通過獲取該圖形對象,來進(jìn)一步獲得該圖形對象內(nèi)部的小對象,并對它們的字體等進(jìn)行設(shè)置;
3、將圖形放到面板中;
4、構(gòu)建一個方法,將放置了圖形的面板返回出去,當(dāng)需要使用該面板時只需調(diào)用該方法即可(封裝);
5、創(chuàng)建一個窗體,將面板放到該窗體中進(jìn)行顯示;
柱形圖比餅狀圖復(fù)雜,生成的圖標(biāo)數(shù)據(jù)需要有兩個維度。兩個維度從數(shù)據(jù)集的生成角度可以按照類別分為數(shù)據(jù)集(DefaultCategoryDataset )和XY分的數(shù)據(jù)集(XYDataset)兩種。
使用DefaultCategoryDataset數(shù)據(jù)集繪制柱形圖
BarChartServlet.java
import java.awt.Font; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset;/*** @author lmb*報表圖形實現(xiàn)類*/ public class BarChartServlet {//用于獲取數(shù)據(jù)private static CategoryDataset getDataset(){DefaultCategoryDataset dataset=new DefaultCategoryDataset();//創(chuàng)建數(shù)據(jù)集對象//往數(shù)據(jù)集對象中添加數(shù)據(jù)(實際應(yīng)用中是從數(shù)據(jù)庫,Excel文件或者文本文件中獲取數(shù)據(jù),這里為了方便起見將數(shù)據(jù)直接給出)//-------------------------------蘋果的銷售記錄dataset.addValue(100,"北京","蘋果");//數(shù)據(jù)值,X軸,Y軸 dataset.addValue(150,"深圳","蘋果"); dataset.addValue(80,"廣州","蘋果");//-------------------------------橘子的銷售記錄dataset.addValue(120,"北京","梨子"); dataset.addValue(110,"深圳","梨子"); dataset.addValue(170,"廣州","梨子");//-------------------------------葡萄的銷售記錄dataset.addValue(140,"北京","葡萄");dataset.addValue(90,"深圳","葡萄");dataset.addValue(100,"廣州","葡萄");//-------------------------------香蕉的銷售記錄dataset.addValue(380,"北京","香蕉");dataset.addValue(420,"深圳","香蕉"); dataset.addValue(140,"廣州","香蕉");//-------------------------------榴蓮的銷售記錄dataset.addValue(320,"北京","荔枝");dataset.addValue(270,"深圳","荔枝");dataset.addValue(300,"廣州","荔枝");return dataset;}//構(gòu)建容器面板,用于存放已經(jīng)畫好的圖形報表private ChartPanel frame1;//在構(gòu)造方法中將圖形報表初始化public BarChart(){//獲取數(shù)據(jù)CategoryDataset dataset = getDataset();//創(chuàng)建圖形實體對象JFreeChart chart=ChartFactory.createBarChart3D(//工廠模式"水果", //圖形的標(biāo)題"水果種類", //目錄軸的顯示標(biāo)簽(X軸)"數(shù)量", //數(shù)據(jù)軸的顯示標(biāo)簽(Y軸)dataset, //數(shù)據(jù)集PlotOrientation.VERTICAL, //垂直顯示圖形true, //是否生成圖樣false, //是否生成提示工具false);//是否生成URL鏈接CategoryPlot plot=chart.getCategoryPlot();//獲取圖形區(qū)域?qū)ο?/span>//------------------------------------------獲取X軸CategoryAxis domainAxis=plot.getDomainAxis();domainAxis.setLabelFont(new Font("黑體",Font.BOLD,14));//設(shè)置X軸的標(biāo)題的字體domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,12));//設(shè)置X軸坐標(biāo)上的字體//-----------------------------------------獲取Y軸ValueAxis rangeAxis=plot.getRangeAxis();rangeAxis.setLabelFont(new Font("黑體",Font.BOLD,15));//設(shè)置Y軸坐標(biāo)上的標(biāo)題字體//設(shè)置圖樣的文字樣式chart.getLegend().setItemFont(new Font("黑體",Font.BOLD ,15));//設(shè)置圖形的標(biāo)題chart.getTitle().setFont(new Font("宋體",Font.BOLD ,20));frame1 =new ChartPanel(chart,true);//將已經(jīng)畫好的圖形報表存放到面板中}//構(gòu)建一個方法,用于獲取存放了圖形的面板(封裝:隱藏具體實現(xiàn))public ChartPanel getChartPanel(){return frame1;} }DemoFrame.java
/*** @author lmb*窗體類*/ public class DemoFrame extends JFrame{//在構(gòu)造方法中初始化窗體public DemoFrame(){//----------------------設(shè)置窗體大小this.setSize(800,600);//---------------------------將報表面板添加到窗體中this.add(new BarChart().getChartPanel());//----------------------設(shè)置窗體大小不可變this.setResizable(false);//----------------------設(shè)置窗體相對于屏幕居中this.setLocationRelativeTo(null);//------------------------設(shè)置窗體可見this.setVisible(true);}public static void main(String[] args) {new DemoFrame();} }顯示結(jié)果:
為了方便起見該例中的數(shù)據(jù)直接使用的自定義數(shù)據(jù),但在實際應(yīng)用中我們使用的數(shù)據(jù)多來自于數(shù)據(jù)庫、Excel文件或者文本文件。
總結(jié):
1、利用DefaultCategoryDataset數(shù)據(jù)集繪制柱形圖數(shù)據(jù)集對象DefaultCategoryDataset;
2、生成數(shù)據(jù)的方法是addValue(),添加數(shù)據(jù)時需要指定比較的種類和分類;
3、對應(yīng)創(chuàng)建柱形圖的方法是createBarChart3D();
4、可以對圖標(biāo)的X軸對象CategoryAxis對象進(jìn)行設(shè)置。
使用XYDataset數(shù)據(jù)集繪制柱形圖
按照XY軸分類生成的柱形圖可以將數(shù)據(jù)按照兩個維度顯示為柱形圖,此時生成數(shù)據(jù)集時要有XYDataset對象。
BarChartServlet2.java
package com.lmb.jfreechart;import java.awt.Color; import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.XYBarDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection;public class BarChartServlet2 extends HttpServlet {private static final long serialVersionUID = 935480272440185396L;public BarChartServlet2() {super();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 設(shè)置返回類型為圖片response.setContentType("image/png");// 獲取數(shù)據(jù)集對象IntervalXYDataset dataset = createDataset();// 創(chuàng)建圖形對象JFreeChart jfreechart = ChartFactory.createXYBarChart("08年圖書銷售量", null,false, "銷量", dataset, PlotOrientation.VERTICAL, true, false,false);// 設(shè)置背景為白色jfreechart.setBackgroundPaint(Color.white);// 獲得圖表區(qū)域?qū)ο?/span>XYPlot xyplot = (XYPlot) jfreechart.getPlot();// 設(shè)置區(qū)域?qū)ο蟊尘盀榛疑?/span>xyplot.setBackgroundPaint(Color.lightGray);// 設(shè)置區(qū)域?qū)ο缶W(wǎng)格線調(diào)為白色xyplot.setDomainGridlinePaint(Color.white);xyplot.setRangeGridlinePaint(Color.white);// 獲顯示圖形對象XYBarRenderer xybarrenderer = (XYBarRenderer) xyplot.getRenderer();// 設(shè)置不顯示邊框線xybarrenderer.setDrawBarOutline(false);// 將圖表已數(shù)據(jù)流的方式返回給客戶端ChartUtilities.writeChartAsPNG(response.getOutputStream(), jfreechart,500, 270);}/*** 返回數(shù)據(jù)集* * @return*/private static IntervalXYDataset createDataset() {// 創(chuàng)建基本數(shù)據(jù)XYSeries xyseries = new XYSeries("JAVA");XYSeries xyseries1 = new XYSeries("PHP");for (int i = 1; i <= 12; i++) {// 添加數(shù)據(jù)xyseries.add(i,DataUtils.getRandomData());xyseries1.add(i,DataUtils.getRandomData());}XYSeriesCollection xyseriescollection = new XYSeriesCollection();xyseriescollection.addSeries(xyseries);xyseriescollection.addSeries(xyseries1);return new XYBarDataset(xyseriescollection, 0.90000000000000002D);} }web.xml略。。。
總結(jié):
1、利用XYDataset數(shù)據(jù)集繪制柱形圖數(shù)據(jù)集對象IntervalXYDataset;
2、生成數(shù)據(jù)的方法是通過XYSeries對象,并且XYSeriesCollection對象將其轉(zhuǎn)化成XYDataset;
3、對應(yīng)創(chuàng)建柱狀圖的方法createXYBarChart();
4、可以對圖形渲染對象XYBarRenderer設(shè)置圖形的顯示。
總結(jié)
以上是生活随笔為你收集整理的【JFreeChart】JFreeChart—输出柱形图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java线程】线程同步—synchro
- 下一篇: servlet实现用户登录