JFreeChart 笔记(柱状图)
?
以下是源代码:
/*
?* jfreechart
?*
?* */
package cn.com.terje.jfreechart;
?
import java.awt.Font;
import java.io.File;
import java.io.IOException;
?
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;
?
/**
?* jfreechart 复习笔记
?*
?* 通过虚拟家乡甜点供应,做个图标展示一下
?*
?* @author terje liu
?*/
public class DomeOne
{
??? public static void main(String[] args) throws IOException
??? {
?????? JFreeChart chart = ChartFactory.createBarChart("桂林甜点供应(个)", "城区",
????????????? "供应量", getDateSet(), PlotOrientation.HORIZONTAL, true, true,
????????????? false);
?
?????? // ---------显示中文------------\\
?????? chart.getTitle().setFont(new Font("宋体", Font.PLAIN, 20));
?????? CategoryPlot plot = chart.getCategoryPlot();
?
?????? // 设置分类 中文,就是图片里面的那个"城区"和"xx区"
?????? CategoryAxis cgAxis = plot.getDomainAxis();
?????? cgAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11));
?????? cgAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));
?
?????? // 设置数值 中文
?????? ValueAxis vAxis = plot.getRangeAxis();
?????? vAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11));
?????? vAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));
?
?????? // 显示说明 中文
?????? chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 16));
?
?????? // -------微调整-------\\
?????? // 设置边距,右边的(防止最大值,跑到图片外面去,所以要设置一下)
?????? vAxis.setUpperMargin(0.08);
?
?????? // 设置最小值(有个最小值好一些,容易突出重点嘛)
?????? vAxis.setLowerBound(200);
?
?????? // ------将每个柱子显示的数值 显示出来---------\\
?????? BarRenderer barRender = new BarRenderer();
?????? barRender
????????????? .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
?????? barRender.setBaseItemLabelFont(new Font("宋体", Font.PLAIN, 11));
?????? barRender.setBaseItemLabelsVisible(true);
?????? // 避免因为数值过小,显示不明显,或则看不到
?????? barRender.setMinimumBarLength(10);
?????? plot.setRenderer(barRender);
?
?????? // 调节柱子显示的数值的位置
?????? // 通过设置ItemLabelPosition里面的2个静态参数(奇怪了,ItemLabelAnchor的含义文档好像没有怎么说)
?????? barRender.setBasePositiveItemLabelPosition(new ItemLabelPosition(
????????????? ItemLabelAnchor.OUTSIDE2, TextAnchor.TOP_LEFT));
?
?????? // ------将结果以图片形式输出------\\
?????? File f = new File("c:\\domeone.jpg");
?????? ChartUtilities.saveChartAsJPEG(f, chart, 800, 640);
?
??? }
?
??? /**
??? ?* 数据集
??? ?*
??? ?*/
??? public static CategoryDataset getDateSet()
??? {
?????? DefaultCategoryDataset dcd = new DefaultCategoryDataset();
?
?????? dcd.addValue(552, "布丁", "七星高新区");
?????? dcd.addValue(1131, "蛋挞", "七星高新区");
?????? dcd.addValue(912, "海苔饼", "七星高新区");
?????? dcd.addValue(513, "脆皮奶", "七星高新区");
?????? dcd.addValue(313, "巧克力蛋糕", "七星高新区");
?
?????? dcd.addValue(946, "布丁", "秀峰区");
?????? dcd.addValue(563, "蛋挞", "秀峰区");
?????? dcd.addValue(712, "海苔饼", "秀峰区");
?????? dcd.addValue(399, "脆皮奶", "秀峰区");
?????? dcd.addValue(299, "巧克力蛋糕", "秀峰区");
?
?????? dcd.addValue(564, "布丁", "象山区");
?????? dcd.addValue(765, "蛋挞", "象山区");
?????? dcd.addValue(592, "海苔饼", "象山区");
?????? dcd.addValue(799, "脆皮奶", "象山区");
?????? dcd.addValue(499, "巧克力蛋糕", "象山区");
?
?????? dcd.addValue(464, "布丁", "叠彩区");
?????? dcd.addValue(263, "蛋挞", "叠彩区");
?????? dcd.addValue(992, "海苔饼", "叠彩区");
?????? dcd.addValue(691, "脆皮奶", "叠彩区");
?????? dcd.addValue(291, "巧克力蛋糕", "叠彩区");
?
?????? dcd.addValue(261, "布丁", "雁山区");
?????? dcd.addValue(333, "蛋挞", "雁山区");
?????? dcd.addValue(594, "海苔饼", "雁山区");
?????? dcd.addValue(599, "脆皮奶", "雁山区");
?????? dcd.addValue(201, "巧克力蛋糕", "雁山区");
?
?????? return dcd;
??? }
?
}
现在预测一个需求,用户不需要在柱子弹上方显示数字,而是显示百分比。
那么需要将标识的生成器换一个构造函数。
?
?
new StandardCategoryItemLabelGenerator("{0} {1} {2} {3}", NumberFormat.getNumberInstance(),
???????????????????? new DecimalFormat("0.00%"));
?
{0}表示甜点的种类,例如:“布丁”
?
{1}表示地区,例如:七星区
{2}表示数量,例如七星区的布丁数量是552
{3}表示百分比,这样一来就在柱状图里面显示百分比
?
以下是来自网络的一些信息,对学习jfreechart很有用,虽然里面有些方法被抛弃了。
学JFreeChart不得不看的中文API
??? ValueAxis(Axis)类:
?
void setAutoRange(boolean auto)自动设置数据轴数据范围??? NumberAxis(ValueAxis)类:
?
void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0??? DateAxis(ValueAxis)类:
?
void setMaximumDate(Date maximumDate)日期轴上的最小日期??? CategoryAxis(Axis)类:
?
void setCategoryMargin(double margin)分类轴边距??? AbstractRenderer类:
?
void setItemLabelAnchorOffset(double offset)数据标签的与数据点的偏移?
??? AbstractCategoryItemRenderer(AbstractRenderer)类:
?
void setLabelGenerator(CategoryLabelGenerator generator)数据标签的格式??? BarRenderer(AbstractCategoryItemRenderer)类:
?
void setDrawBarOutline(boolean draw)是否画图形边框??? BarRenderer3D(BarRenderer)类:
?
void setWallPaint(Paint paint)3D坐标轴的墙体颜色??? StackedBarRenderer(BarRenderer)类:
?
没有特殊的设置??? StackedBarRenderer3D(BarRenderer3D)类:
?
没有特殊的设置??? GroupedStackedBarRenderer(StackedBarRenderer)类:
?
void setSeriesToGroupMap(KeyToGroupMap map)将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))??? LayeredBarRenderer(BarRenderer)类:
?
void setSeriesBarWidth(int series,double width)设定每个分类的宽度(注意设置不要使某分类被覆盖)??? WaterfallBarRenderer(BarRenderer)类:
?
void setFirstBarPaint(Paint paint)第一个柱图的颜色??? IntervalBarRenderer(BarRenderer)类:
?
需要传IntervalCategoryDataset作为数据源??? GanttBarRenderer(IntervalBarRenderer)类:
?
void setCompletePaint(Paint paint)完成进度颜色??? StatisticBarRenderer(BarRenderer)类:
?
需要传StatisticCategoryDataset作为数据源??? LineAndShapeRenderer(AbstractCategoryItemRenderer)类:
?
void setDrawLines(boolean draw)是否折线的数据点之间用线连?
??? LevelRenderer(AbstractCategoryItemRenderer)类:
?
void setItemMargin(double percent)每个分类之间的间隔??? CategoryStepRenderer(AbstractCategoryItemRenderer)类:
?
void setStagger(boolean shouldStagger)不同分类的图是否交错??? MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:
?
void setDrawLines(boolean drawLines)是否在每个分类线间画连接线??? AreaRender(AbstractCategoryItemRenderer)类:
?
没有特殊的设置??? StackedAreaRender(AreaRender)类:
?
没有特殊的设置??? 关键就是用好Renderer这个类了,再贴个例子:
?
??? String sFont = "宋体";??? //设置Plot,不显示所有网格
??? ((CategoryPlot)chart.getPlot()).setOutlinePaint(null);
??? ((CategoryPlot)chart.getPlot()).setDomainGridlinesVisible(false);
??? ((CategoryPlot)chart.getPlot()).setRangeGridlinesVisible(false);
??? //设置横轴字体,设定横轴轴线不可见,隐藏纵轴
??? ((CategoryPlot)chart.getPlot()).getDomainAxis().setTickLabelFont(new Font(sFont,Font.PLAIN,12));
??? ((CategoryPlot)chart.getPlot()).getDomainAxis().setAxisLineVisible(false);
??? ((CategoryPlot)chart.getPlot()).getRangeAxis().setVisible(false);
??? //采用BarRenderer作为表示器
??? BarRenderer renderer = new BarRenderer();
??? renderer.setPaint(new GradientPaint(0.0f,0.0f,Color.orange,0.0f,0.0f,Color.yellow));
??? renderer.setOutlinePaint(Color.orange);
??? renderer.setDrawBarOutline(true);
??? //在条中央显示投票数值
??? renderer.setItemLabelAnchorOffset(-20.0f);
??? renderer.setLabelGenerator(new StandardCategoryLabelGenerator("{2}",new DecimalFormat()));
??? renderer.setPositiveItemLabelPosition(new ItemLabelPosition());
??? renderer.setItemLabelsVisible(true);
??? JFreeChart类:
?
void setAntiAlias(boolean flag)字体模糊边界??? TextTitle类:
?
void setFont(Font font)标题字体??? StandardLegend(Legend)类:
void setBackgroundPaint(Paint paint)图示背景色??? Axis类:
?
void setVisible(boolean flag)坐标轴是否可见