本文包括3个部分:
1. Jfreechart分解;
2. Jfreechart中文API
3.JfreeChart开发中遇到的问题及解决方式
要想绘制出漂亮的图表,就必须了解图表的构成部分,将图表进行分解成N个部分。

1JfreeChart 中文API 2-------------------------------- 3 要想绘制出漂亮的图表,就必须了解图表的构成部分,将图表进行分解成N个部分。 4然后再对每一个部分进行渲染,设置样式:包括背景色、轮廓线条样式和颜色、填充颜色、字体大小、样式、颜色。 5同时,需要确保在整个项目中,图表的样式风格整体统一。 6 统一,和谐才能打造漂亮、干净、专业的外观. 7 8-------------------------------- 91-图表组成部门 10整个图表-JFreeChart 11图表绘制区域(图表轮廓内部称之为绘制区域)-Plot 12 13标题-Title 14副标题-Subtitle 15 16X坐标轴-DomainAxis 17Y坐标轴-RangeAxis(ValueAxis) 18X坐标轴标题-DomainAxis.AxisLabel 19Y坐标轴标题-RangeAxis(ValueAxis).AxisLabel 20X坐标轴水平线DomainAxis.AxisLine 21Y坐标轴水平线RangeAxis(ValueAxis)AxisLine 22X坐标轴标尺值DomainAxis.TickLabel 23Y坐标轴标尺值RangeAxis(ValueAxis).TickLabel 24X坐标轴标尺竖线DomainAxis.TickMark 25Y坐标轴标尺水平线RangeAxis(ValueAxis).TickMark 26 27垂直数据轴网格线:DomainGridlines 28水平数据轴网格线:RangeGridlines 29 30标注-Legend 31 32 33绘制图形的步骤: 34 351-创建数据集合,然后根据数据创建JfreeChart 362-chart.setTextAntiAlias(false);//必须设置文本抗锯齿为false,防止乱码 373-对图表进行渲染 384-修改X-Y轴;标注,图表样式 395-创建ChartPanel;chartPanel = new ChartPanel(chart); 40 41-------------------------------- 422-主题样式 43JfreeChart主题样式有StandardChartTheme进行统一管理,包括字体,绘制颜色,线条类型,坐标轴样式等! 44 45 private static Font FONT = new Font("宋体", Font.PLAIN, 12); 46 // 设置中文主题样式 解决乱码 47 StandardChartTheme chartTheme = new StandardChartTheme("CN"); 48 // 设置标题字体 49 chartTheme.setExtraLargeFont(FONT); 50 // 设置图例的字体 51 chartTheme.setRegularFont(FONT); 52 // 设置轴向的字体 53 chartTheme.setLargeFont(FONT); 54 chartTheme.setSmallFont(FONT); 55 chartTheme.setTitlePaint(new Color(51, 51, 51));//Paint 可以理解为绘制颜色;标题字体颜色 56 chartTheme.setSubtitlePaint(new Color(85, 85, 85));//副标题字体颜色 57 58 chartTheme.setLegendBackgroundPaint(Color.WHITE);// 设置标注背景色 59 chartTheme.setLegendItemPaint(Color.BLACK);//设置字体颜色 60 chartTheme.setChartBackgroundPaint(Color.WHITE);//图表背景色 61 // 绘制颜色绘制颜色.轮廓供应商 62 // paintSequence,outlinePaintSequence,strokeSequence,outlineStrokeSequence,shapeSequence 63 64 Paint[] OUTLINE_PAINT_SEQUENCE = new Paint[] { Color.WHITE };//外边框线条颜色 65 //绘制器颜色源-所有线条 饼图 默认颜色都是来自DefaultDrawingSupplier 66 DefaultDrawingSupplier drawingSupplier = new DefaultDrawingSupplier(CHART_COLORS, CHART_COLORS, OUTLINE_PAINT_SEQUENCE, 67 DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE, DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE, 68 DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE); 69 chartTheme.setDrawingSupplier(drawingSupplier);//设置绘制颜色、线条、外边框供应商 70 71 chartTheme.setPlotBackgroundPaint(Color.WHITE);// 绘制区域背景色 72 chartTheme.setPlotOutlinePaint(Color.WHITE);// 绘制区域外边框 73 chartTheme.setLabelLinkPaint(new Color(8, 55, 114));// 链接标签颜色 74 chartTheme.setLabelLinkStyle(PieLabelLinkStyle.CUBIC_CURVE); 75 76 chartTheme.setAxisOffset(new RectangleInsets(5, 12, 5, 12));//设置X-Y坐标轴偏移量 77 chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));// X坐标轴垂直网格颜色 78 chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));// Y坐标轴水平网格颜色 79 80 chartTheme.setBaselinePaint(Color.WHITE); 81 chartTheme.setCrosshairPaint(Color.BLUE);// 不确定含义 82 chartTheme.setAxisLabelPaint(new Color(51, 51, 51));// 坐标轴标题文字颜色 83 chartTheme.setTickLabelPaint(new Color(67, 67, 72));// 刻度数字颜色 84 chartTheme.setBarPainter(new StandardBarPainter());// 设置柱状图渲染问哦基本渲染,不采用渐变 85 chartTheme.setXYBarPainter(new StandardXYBarPainter());// XYBar 渲染,值使用颜色渲染,不采用渐变 86 87 chartTheme.setItemLabelPaint(Color.black); 88 chartTheme.setThermometerPaint(Color.white);// 温度计 89 90 ChartFactory.setChartTheme(chartTheme);//设置主题样式 91 92-------------------------------- 933-API描述;对每一个部分进行样式控制,只涉及重要API! 94 95JFreeChart类:图标对象,任何类型的图标的最终表现形式都是在该对象上进行一些属性的定制。 96JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象。 97 98void setAntiAlias(boolean flag) 设置字体抗锯齿,必须关闭字体抗锯齿,否则文字显示非常模糊:用法chart.setTextAntiAlias(false); 99void setBorderPaint(Paint paint) 边界线条颜色 100void setBorderStroke(Stroke stroke) 边界线条笔触 101void setBorderVisible(boolean visible) 边界线条是否可见 102-------------------------------- 103标题 104TextTitle类: 105void setFont(Font font) 标题字体 106void setPaint(Paint paint) 标题字体颜色 107void setText(String text) 标题内容 108 109-------------------------------- 110 111StandardLegend(Legend)类: 112void setBackgroundPaint(Paint paint) 图示背景色 113void setTitle(String title) 图示标题内容 114void setTitleFont(Font font) 图示标题字体 115void setOutlinePaint(Paint paint) 图示边界线条颜色 116void setOutlineStroke(Stroke stroke) 图示边界线条笔触 117void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效) 118void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效) 119void setItemFont(Font font) 图示项字体 120void setItemPaint(Paint paint) 图示项字体颜色 121void setAnchor(int anchor) 图示在图表中的显示位置(参数常量在Legend类中定义) 122 123-------------------------------- 124 125X轴 126 127Axis类:用于处理图表的两个轴,即纵轴和横轴。 128void setVisible(boolean flag) 坐标轴是否可见 129void setAxisLinePaint(Paint paint) 坐标轴线条颜色(3D轴无效) 130void setAxisLineStroke(Stroke stroke) 坐标轴线条笔触(3D轴无效) 131void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效) 132void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置) 133void setLabel(String label) 坐标轴标题 134void setLabelFont(Font font) 坐标轴标题字体 135void setLabelPaint(Paint paint) 坐标轴标题颜色 136void setLabelAngle(double angle)` 坐标轴标题旋转角度(纵坐标可以旋转) 137void setTickLabelFont(Font font) 坐标轴标尺值字体 138void setTickLabelPaint(Paint paint) 坐标轴标尺值颜色 139void setTickLabelsVisible(boolean flag) 坐标轴标尺值是否显示 140void setTickMarkPaint(Paint paint) 坐标轴标尺颜色 141void setTickMarkStroke(Stroke stroke) 坐标轴标尺笔触 142void setTickMarksVisible(boolean flag) 坐标轴标尺是否显示 143 144-------------------------------- 145Y轴 146ValueAxis(Axis)类: 147void setAutoRange(boolean auto) 自动设置数据轴数据范围 148void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度 149void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true) 150void setFixedAutoRange(double length) 数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围) 151void setInverted(boolean flag) 数据轴是否反向(默认为false) 152void setLowerMargin(double margin) 数据轴下(左)边距 153void setUpperMargin(double margin) 数据轴上(右)边距 154void setLowerBound(double min) 数据轴上的显示最小值 155void setUpperBound(double max) 数据轴上的显示最大值 156void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效) 157void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效) 158void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直 159void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false) 160 161-------------------------------- 162 163NumberAxis(ValueAxis)类: 164void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0 165void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中 166void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式 167void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection设false) 168 169-------------------------------- 170X 日期轴 171DateAxis(ValueAxis)类: 172void setMaximumDate(Date maximumDate) 日期轴上的最小日期 173void setMinimumDate(Date minimumDate) 日期轴上的最大日期 174void setRange(Date lower,Date upper) 日期轴范围 175void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式 176void setTickUnit(DateTickUnit unit) 日期轴的日期标签(需要将AutoTickUnitSelection设false) 177void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义) 178-------------------------------- 179 180CategoryAxis(Axis)类: 181void setCategoryMargin(double margin) 分类轴边距 182void setLowerMargin(double margin) 分类轴下(左)边距 183void setUpperMargin(double margin) 分类轴上(右)边距 184void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直 185void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度 186 187-------------------------------- 188绘制区域: 189 190Plot类:图标区域对象,基本上这个对象决定着图表的样式,创建该对象时需要Axis,Renderer及数据集对象的支持。 191void setBackgroundImage(Image image) 数据区的背景图片 192void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义) 193void setBackgroundPaint(Paint paint) 数据区的背景图片背景色 194void setBackgroundAlpha(float alpha) 数据区的背景透明度(0.0~1.0) 195void setForegroundAlpha(float alpha) 数据区的前景透明度(0.0~1.0) 196void setDataAreaRatio(double ratio) 数据区占整个图表区的百分比 197void setOutLinePaint(Paint paint) 数据区的边界线条颜色 198void setOutLineStroke(Stroke stroke) 数据区的边界线条笔触 199void setNoDataMessage(String message) 没有数据时显示的消息 200void setNoDataMessageFont(Font font) 没有数据时显示的消息字体 201void setNoDataMessagePaint(Paint paint) 没有数据时显示的消息颜色 202 203-------------------------------- 204CategoryPlot(Plot)类: 205void setDataset(CategoryDataset dataset) 数据区的2维数据表 206void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式 207void setAxisOffset(Spacer offset) 坐标轴到数据区的间距 208void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL) 209void setDomainAxis(CategoryAxis axis) 数据区的分类轴 210void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义) 211void setDomainGridlinesVisible(boolean visible) 垂直方向:分类轴网格是否可见 212void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色 213void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触 214void setRangeAxis(ValueAxis axis) 数据区的数据轴 215void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义) 216void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见 217void setRangeGridlinePaint(Paint paint) 数据轴网格线条颜色 218void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触 219void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组) 220void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释 221void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域 222 223-------------------------------- 224 225PiePlot(Plot)类: 226void setDataset(PieDataset dataset) 数据区的1维数据表 227void setIgnoreNullValues(boolean flag) 忽略无值的分类 228void setCircular(boolean flag) 饼图是否一定是正圆 229void setStartAngle(double angle) 饼图的初始角度 230void setDirection(Rotation direction) 饼图的旋转方向 231void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效 232void setLabelBackgroundPaint(Paint paint) 分类标签的底色 233void setLabelFont(Font font) 分类标签的字体 234void setLabelPaint(Paint paint) 分类标签的字体颜色 235void setLabelLinkMargin(double margin) 分类标签与图的连接线边距 236void setLabelLinkPaint(Paint paint) 分类标签与图的连接线颜色 237void setLabelLinkStroke(Stroke stroke) 分类标签与图的连接线笔触 238void setLabelOutlinePaint(Paint paint) 分类标签边框颜色 239void setLabelOutlineStroke(Paint paint) 分类标签边框笔触 240void setLabelShadowPaint(Paint paint) 分类标签阴影颜色 241void setMaximumLabelWidth(double width) 分类标签的最大长度(0.0~1.0) 242void setPieIndex(int index) 饼图的索引(复合饼图中用到) 243void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色 244void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触 245void setSectionPaint(int section,Paint paint) 指定分类饼的颜色 246void setShadowPaint(Paint paint) 饼图的阴影颜色 247void setShadowXOffset(double offset) 饼图的阴影相对图的水平偏移 248void setShadowYOffset(double offset) 饼图的阴影相对图的垂直偏移 249void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null则整个标签包括连接线都不显示 250void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式 251void setURLGenerator(PieURLGenerator generator) MAP中钻取链接格式 252 253-------------------------------- 254 255PiePlot3D(PiePlot)类: 256void setDepthFactor(double factor) 3D饼图的Z轴高度(0.0~1.0) 257 258MultiplePiePlot(Plot)类: 259void setLimit(double limit) 每个饼图之间的数据关联(详细比较复杂) 260void setPieChart(JFreeChart pieChart) 每个饼图的显示方式(见JFreeChart类个PiePlot类) 261 262-------------------------------- 263渲染 Render 264 265AbstractRenderer类:负责如何显示一个图表对象 266void setItemLabelAnchorOffset(double offset) 数据标签的与数据点的偏移 267void setItemLabelsVisible(boolean visible) 数据标签是否可见 268void setItemLabelFont(Font font) 数据标签的字体 269void setItemLabelPaint(Paint paint) 数据标签的字体颜色 270void setItemLabelPosition(ItemLabelPosition position) 数据标签位置 271void setPositiveItemLabelPosition(ItemLabelPosition position) 正数标签位置 272void setNegativeItemLabelPosition(ItemLabelPosition position) 负数标签位置 273void setOutLinePaint(Paint paint) 图形边框的线条颜色 274void setOutLineStroke(Stroke stroke) 图形边框的线条笔触 275void setPaint(Paint paint) 所有分类图形的颜色 276void setShape(Shape shape) 所有分类图形的形状(如折线图的点) 277void setStroke(Stroke stroke) 所有分类图形的笔触(如折线图的线) 278void setSeriesItemLabelsVisible(int series,boolean visible) 指定分类的数据标签是否可见 279void setSeriesItemLabelFont(int series,Font font) 指定分类的数据标签的字体 280void setSeriesItemLabelPaint(int series,Paint paint) 指定分类的数据标签的字体颜色 281void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置 282void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置 283void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置 284void setSeriesOutLinePaint(int series,Paint paint) 指定分类的图形边框的线条颜色 285void setSeriesOutLineStroke(int series,Stroke stroke) 指定分类的图形边框的线条笔触 286void setSeriesPaint(int series,Paint paint) 指定分类图形的颜色 287void setSeriesShape(int series,Shape shape) 指定分类图形的形状(如折线图的点) 288void setSeriesStroke(int series,Stroke stroke) 指定分类图形的笔触(如折线图的线) 289-------------------------------- 290 291AbstractCategoryItemRenderer(AbstractRenderer)类: 292void setLabelGenerator(CategoryLabelGenerator generator) 数据标签的格式 293void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠标移上的显示格式 294void setItemURLGenerator(CategoryURLGenerator generator) MAP中钻取链接格式 295void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式 296void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式 297void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式 298 299-------------------------------- 300柱状图渲染 301BarRenderer(AbstractCategoryItemRenderer)类: 302void setDrawBarOutline(boolean draw) 是否画图形边框 303void setItemMargin(double percent) 每个BAR之间的间隔(0-1) 304void setMaxBarWidth(double percent) 每个BAR的最大宽度(0-1) 305void setMinimumBarLength(double min) 最短的BAR长度,避免数值太小而显示不出 306void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置 307void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置 308 309BarRenderer3D(BarRenderer)类: 310void setWallPaint(Paint paint) 3D坐标轴的墙体颜色 311 312 -------------------------------- 313 314//堆积柱状图渲染 315StackedBarRenderer(BarRenderer)类: 316没有特殊的设置 317StackedBarRenderer3D(BarRenderer3D)类: 318没有特殊的设置 319 320 -------------------------------- 321 322GroupedStackedBarRenderer(StackedBarRenderer)类: 323void setSeriesToGroupMap(KeyToGroupMap map) 将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group)) 324 325LayeredBarRenderer(BarRenderer)类: 326void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖) 327 328 -------------------------------- 329 330//瀑布流图渲染图 331WaterfallBarRenderer(BarRenderer)类: 332void setFirstBarPaint(Paint paint) 第一个柱图的颜色 333void setLastBarPaint(Paint paint) 最后一个柱图的颜色 334void setPositiveBarPaint(Paint paint) 正值柱图的颜色 335void setNegativeBarPaint(Paint paint) 负值柱图的颜色 336 337IntervalBarRenderer(BarRenderer)类: 338需要传IntervalCategoryDataset作为数据源 339 340-------------------------------- 341甘特图 342GanttBarRenderer(IntervalBarRenderer)类: 343void setCompletePaint(Paint paint) 完成进度颜色 344void setIncompletePaint(Paint paint) 未完成进度颜色 345void setStartPercent(double percent) 设置进度条在整条中的起始位置(0.0~1.0) 346void setEndPercent(double percent) 设置进度条在整条中的结束位置(0.0~1.0) 347 348StatisticBarRenderer(BarRenderer)类: 349需要传StatisticCategoryDataset作为数据源 350 351------------------------------- 352折线图渲染 353LineAndShapeRenderer(AbstractCategoryItemRenderer)类: 354void setDrawLines(boolean draw) 是否折线的数据点之间用线连 355void setDrawShapes(boolean draw) 是否折线的数据点根据分类使用不同的形状 356void setShapesFilled(boolean filled) 所有分类是否填充数据点图形 357void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形 358void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框 359 360 -------------------------------- 361 362LevelRenderer(AbstractCategoryItemRenderer)类: 363void setItemMargin(double percent) 每个分类之间的间隔 364void setMaxItemWidth(double percent) 每个分类的最大宽度 365 366CategoryStepRenderer(AbstractCategoryItemRenderer)类: 367void setStagger(boolean shouldStagger) 不同分类的图是否交错 368 369MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类: 370void setDrawLines(boolean drawLines) 是否在每个分类线间画连接线 371void setGroupPaint(Paint groupPaint) 一组图形连接线的颜色 372void setGroupStroke(Stroke groupStroke) 一组图形连接线的笔触 373void setMaxIcon(Icon maxIcon) 最大值的ICON 374void setMinIcon(Icon minIcon) 最小值的ICON 375void setObjectIcon(Icon objectIcon) 所有值的ICON 376 377AreaRender(AbstractCategoryItemRenderer)类: 378没有特殊的设置 379 380StackedAreaRender(AreaRender)类 381 382 383-------------------------------- 3843-获得核心对象 385 386//得到JFreeChart 387JFreeChart chart = ChartFactory.createTimeSeriesChart(title, "", "新增中长期贷款(亿元)", lendingDataset); 388 389//得到Plot 390XYPlot xyplot = (XYPlot) chart.getPlot(); 391 392//得到渲染器 393LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); 394 395 396//得到X坐标轴 397plot.getDomainAxis(); 398 399//得到Y坐标轴 400ValueAxis axis = plot.getRangeAxis(); 401plot.getRangeAxis().setUpperMargin(0.1);// 设置顶部Y坐标轴间距,防止数据无法显示 402plot.getRangeAxis().setLowerMargin(0.1);// 设置底部Y坐标轴间距 403 404// 得到标注 405chart.getLegend(); 406chart.getLegend().setFrame(new BlockBorder(Color.WHITE));//设置标注表框 407 408 409-------------------------------- 4103-JfreeChart注意问题事项 411-------------------------------- 412(1)中文乱码问题 413解决:主题样式只需要加载一次,放在静态代码块即可! 414 415 public class ChartUtils { 416 private static String NO_DATA_MSG = "数据加载失败"; 417 private static Font FONT = new Font("宋体", Font.PLAIN, 12); 418 public static Color[] CHART_COLORS = { new Color(31, 129, 188), new Color(241, 92, 128), new Color(124, 181, 236), new Color(102, 172, 204), 419 new Color(102, 102, 0), new Color(204, 153, 102), new Color(0, 153, 255), new Color(204, 255, 255), new Color(51, 153, 153), 420 new Color(255, 204, 102), new Color(102, 102, 0), new Color(204, 204, 204), new Color(204, 255, 255), new Color(255, 204, 204), 421 new Color(255, 255, 204), new Color(255, 153, 204), new Color(51, 0, 0), new Color(0, 51, 102), new Color(0, 153, 102), new Color(153, 102, 153), 422 new Color(102, 153, 204), new Color(153, 204, 153), new Color(204, 204, 153), new Color(255, 255, 153), new Color(255, 204, 153), 423 new Color(255, 153, 204), new Color(204, 153, 153), new Color(204, 204, 255), new Color(204, 255, 204), new Color(153, 204, 153), 424 new Color(255, 204, 102) };//颜色 425 426 static { 427 setChartTheme(); 428 } 429 430 public ChartUtils() { 431 } 432 433 /** 434 * 中文主题样式 解决乱码 435 */ 436 public static void setChartTheme() { 437 // 设置中文主题样式 解决乱码 438 StandardChartTheme chartTheme = new StandardChartTheme("CN"); 439 // 设置标题字体 440 chartTheme.setExtraLargeFont(FONT); 441 // 设置图例的字体 442 chartTheme.setRegularFont(FONT); 443 // 设置轴向的字体 444 chartTheme.setLargeFont(FONT); 445 chartTheme.setSmallFont(FONT); 446 chartTheme.setTitlePaint(new Color(51, 51, 51)); 447 chartTheme.setSubtitlePaint(new Color(85, 85, 85)); 448 449 chartTheme.setLegendBackgroundPaint(Color.WHITE);// 设置标注 450 chartTheme.setLegendItemPaint(Color.BLACK);// 451 chartTheme.setChartBackgroundPaint(Color.WHITE); 452 // 绘制颜色绘制颜色.轮廓供应商 453 // paintSequence,outlinePaintSequence,strokeSequence,outlineStrokeSequence,shapeSequence 454 455 Paint[] OUTLINE_PAINT_SEQUENCE = new Paint[] { Color.WHITE }; 456 //绘制器颜色源 457 DefaultDrawingSupplier drawingSupplier = new DefaultDrawingSupplier(CHART_COLORS, CHART_COLORS, OUTLINE_PAINT_SEQUENCE, 458 DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE, DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE, 459 DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE); 460 chartTheme.setDrawingSupplier(drawingSupplier); 461 462 chartTheme.setPlotBackgroundPaint(Color.WHITE);// 绘制区域 463 chartTheme.setPlotOutlinePaint(Color.WHITE);// 绘制区域外边框 464 chartTheme.setLabelLinkPaint(new Color(8, 55, 114));// 链接标签颜色 465 chartTheme.setLabelLinkStyle(PieLabelLinkStyle.CUBIC_CURVE); 466 467 chartTheme.setAxisOffset(new RectangleInsets(5, 12, 5, 12)); 468 chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));// X坐标轴垂直网格颜色 469 chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));// Y坐标轴水平网格颜色 470 471 chartTheme.setBaselinePaint(Color.WHITE); 472 chartTheme.setCrosshairPaint(Color.BLUE);// 不确定含义 473 chartTheme.setAxisLabelPaint(new Color(51, 51, 51));// 坐标轴标题文字颜色 474 chartTheme.setTickLabelPaint(new Color(67, 67, 72));// 刻度数字 475 chartTheme.setBarPainter(new StandardBarPainter());// 设置柱状图渲染 476 chartTheme.setXYBarPainter(new StandardXYBarPainter());// XYBar 渲染 477 478 chartTheme.setItemLabelPaint(Color.black); 479 chartTheme.setThermometerPaint(Color.white);// 温度计 480 481 ChartFactory.setChartTheme(chartTheme); 482 } 483} 484 485-------------------------------- 486(2)中文字体模糊 487解决:必须取消文本抗锯齿,创建JFreeChart完毕后,调用setAntiAlias取消文本抗锯齿 488 489 public static void setAntiAlias(JFreeChart chart) { 490 chart.setTextAntiAlias(false); 491 492 } 493 494 调用: 495 JFreeChart chart = ChartFactory.createTimeSeriesChart(title, "", "", dataset); 496 ChartUtils.setAntiAlias(chart); 497 498 499-------------------------------- 500(3)创建折线图时,显示数据,数据被遮盖 501解决: 502 plot.getRangeAxis().setUpperMargin(0.1);// 设置顶部Y坐标轴间距百分比,防止数据无法显示 503 plot.getRangeAxis().setLowerMargin(0.1);// 设置底部Y坐标轴间距百分比 504 505-------------------------------- 506(4)创建时间序列柱状图图时,柱子显示过细 507解决:暂时无法解决 508原因:柱子宽度由 Timeseries.add(new Day(date), dValue); add里面的RegularTimePeriod决定。 509 510意思就是:如果RegularTimePeriod为 511 Day,那个这个柱子的宽度占比为 1/(最大日期-最小日期 之间的天数) 512 Month,那个这个柱子的宽度占比为 1/(最大日期-最小日期 之间的月数) 513 YEAR,那个这个柱子的宽度占比为 1/(最大日期-最小日期 之间的年数) 514 515 所以,时间间隔越小,柱子宽度就越粗。 516 如果时间间隔过大的话,建议使用时间序列折线图或者柱状图代替。
(5)设置 X 坐标刻度间隔单位(X坐标轴数据太密集处理)
1NumberAxis domainAxis = (NumberAxis)plot.getDomainAxis();//x轴设置 2domainAxis.setTickUnit(new NumberTickUnit(100));/每100个刻度显示一个刻度值