本节内容主要讲述柱状图的一些高级特性。

1、简单定制之修改背景颜色

调用JFreeChart和CategoryPlot类方法可以进行一些简单的直方图表外观的修改。例如,改变图表和区域的背景颜色代码如下:



chart.setBackgroundPaint(Color.white);   
CategoryPlot plot = (CategoryPlot) chart.getPlot();   
//设置图像区域背景色   
plot.setBackgroundPaint(Color.lightGray);   
//水平轴网格线颜色   
plot.setRangeGridlinePaint(Color.white);



运行效果:

android MPAndroidChart 柱状图和标识不对齐_背景颜色

区域Plot的引用(CategoryPlot)是必须的——转换类型也是非常安全的,因为我们知道该图表类型使用CategoryPlot。JFreeChart使用不同的区域类型(比如PiePlot、XYPlot)控制不同类型的图表。我们必须将plot的引用转化成图表响应的类型,因为基本类Plot仅仅定义了一些通用的属性和方法。随着对JFreeChart了解的加深,我们将学习每一种图表使用的不同的plot子类。

在我们的例子中,我们使用plot的引用来改变水平轴的网格线颜色。看一下CategoryPlot类的API文件,就会看到我们能够修改的地方。

2、定制外观

回顾之前章节内容,CategoryPlot管理这一个BarRenderer的实例renderer。如果我们想获得这个renderer的引用,大量的定制选择项会变得有效。

2.1、直方条形图颜色的定制

改变图表中每个系列直方图的颜色,使用如下代码:



BarRenderer renderer = (BarRenderer) plot.getRenderer();   
renderer.setSeriesPaint(0, Color.gray);   
renderer.setSeriesPaint(1, Color.orange);   
renderer.setDrawBarOutline(false);



运行效果:

android MPAndroidChart 柱状图和标识不对齐_背景颜色_02

 

注意setSeriesPaint()方法是在抽象AbstractRenderer基类里面定义的——所以,我们可以在任何类型的renderer里面使用。

 2.2、种类里直方条形图之间的空间

此外,renderer还可以控制每个种类中直方条形图之间的间距。因此我们可以在同一个种类中将空间完全去掉,代码如下:



BarRenderer renderer = (BarRenderer) plot.getRenderer();   
renderer.setItemMargin(0.0);



运行效果:

 

android MPAndroidChart 柱状图和标识不对齐_渐变色_03

 

注意条形图看上去有点变宽——主要是因为JFreeChart分配空间时,分配给种类条形图之间的间距的尺度比较少,所以看上去就显得有点长宽了。

 3 使用GradientPaint实例对象为每一个系列修改renderer(渐变色)

代码如下:



public class BarChartGradientFrame extends ApplicationFrame   
{   
    private static final long serialVersionUID = -4316075518094318809L;   
                
    public BarChartGradientFrame(String title){   
        super(title);   
        JPanel jpanel = createDemoPanel();   
        jpanel.setPreferredSize(new Dimension(500, 270));   
        setContentPane(jpanel);   
    }   
                
    private JPanel createDemoPanel()   
    {   
        JFreeChart jfreechart = createChart(createDataset());   
        return new ChartPanel(jfreechart);   
    }   
                
    private JFreeChart createChart(DefaultCategoryDataset categorydataset)   
    {   
        JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 1",   
                "Category", "Value", categorydataset, PlotOrientation.VERTICAL,   
                true, true, false);   
        jfreechart.setBackgroundPaint(Color.WHITE);   
        CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();   
        categoryplot.setBackgroundPaint(Color.lightGray);   
        categoryplot.setDomainGridlinePaint(Color.white);   
        categoryplot.setDomainGridlinesVisible(true);   
        categoryplot.setRangeGridlinePaint(Color.white);   
                
        //刻度轴刻度设置   
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();   
        //设置数据轴刻度梯进范围   
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   
                
        //renderer设置   
        BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();   
        barrenderer.setDrawBarOutline(false);//设置外廓线不可见   
        //渐变色   
        GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,   
                0.0F, 0.0F, new Color(0, 0, 64));   
        GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F,   
                Color.green, 0.0F, 0.0F, new Color(0, 64, 0));   
        GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F,   
                Color.red, 0.0F, 0.0F, new Color(64, 0, 0));   
        //设置系列柱体颜色   
        barrenderer.setSeriesPaint(0, gradientpaint);   
        barrenderer.setSeriesPaint(1, gradientpaint1);   
        barrenderer.setSeriesPaint(2, gradientpaint2);   
                
        //设置种类标签旋转的角度,逆时针旋转   
        CategoryAxis categoryaxis = categoryplot.getDomainAxis();   
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions   
                .createUpRotationLabelPositions(Math.PI / 6));   
        return jfreechart;   
    }   
                
    private DefaultCategoryDataset createDataset()   
    {   
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
        dataset.addValue(100, "First", "Category1");   
        dataset.addValue(100, "Second", "Category1");   
        dataset.addValue(100, "Three", "Category1");   
        dataset.addValue(200, "First", "Category2");   
        dataset.addValue(200, "Second", "Category2");   
        dataset.addValue(200, "Three", "Category2");   
        dataset.addValue(300, "First", "Category3");   
        dataset.addValue(300, "Second", "Category3");   
        dataset.addValue(300, "Three", "Category3");   
        dataset.addValue(400, "First", "Category4");   
        dataset.addValue(400, "Second", "Category4");   
        dataset.addValue(400, "Three", "Category4");   
        return dataset;   
    }   
                
    public static void main(String[] args)   
    {   
        BarChartGradientFrame barchartdemo = new BarChartGradientFrame("Bar Chart Demo");   
        barchartdemo.pack();   
        RefineryUtilities.centerFrameOnScreen(barchartdemo);   
        barchartdemo.setVisible(true);   
                
    }   
}



显示效果如下:

android MPAndroidChart 柱状图和标识不对齐_直方图_04

程序代码说明:

lMain()方法执行直方条形图。编写方法与饼图一样。

lBarChartDemo1构造函数中创了一个JPanel,并设置大小。

lcreateDemoPanel()方法创建了一个JPanel,并且在该panel上创建了直方条形图。

lcreateDataset()方法创建了数据集。类型为CategoryDataset。注意数据集为三维数据。与饼图不同。

l使用ChartFactory.createBarChart()方法创建直方条形图

ljfreechart.setBackgroundPaint(Color.WHITE):设置图表的背景颜色。

lcategoryplot.setBackgroundPaint(Color.lightGray):设置直方条形图的背景颜色。

lsetDomainGridlinePaint(Color.whites):设置垂直格线的颜色。默认不可见。

lsetRangeGridlinePaint(Color.white):设置水平格线的颜色。默认可见。

lsetStandardTickUnits(NumberAxis.createIntegerTickUnits()):设置数据轴的刻度递进范围。

lGradientPaint类用来设置渐变色。

lcategoryaxis.setCategoryLabelPositions():设置标签文字旋转的角度。

 

4 使用二维数组生成CategoryDataset 同时显示水平直方图

代码如下:



private static CategoryDataset createDataset() {   
    double[][] ds = { { 1.0, 43.0, 35.0, 58.0, 54.0, 77.0, 71.0, 89.0 },   
            { 54.0, 75.0, 63.0, 83.0, 43.0, 46.0, 27.0, 13.0 },   
            { 41.0, 33.0, 22.0, 34.0, 62.0, 32.0, 42.0, 34.0 } };   
    return DatasetUtilities.createCategoryDataset("Series ", "Factor ", ds);   
}   
         
private static JFreeChart createChart(CategoryDataset categorydataset) {   
    JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 2",   
            "Category", "Score (%)", categorydataset,   
            PlotOrientation.VERTICAL, true, true, false);   
    jfreechart.setBackgroundPaint(Color.white);   
    CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();   
    categoryplot.setBackgroundPaint(Color.lightGray);   
    categoryplot.setRangeGridlinePaint(Color.white);   
    categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);   
    NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();   
    //设置值域范围   
    numberaxis.setRange(0.0, 100.0);   
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   
    BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();   
    barrenderer.setDrawBarOutline(false);   
    barrenderer.setLegendItemToolTipGenerator(new StandardCategorySeriesLabelGenerator("Tooltip: {0}"));   
    return jfreechart;   
}



 

运行效果:

android MPAndroidChart 柱状图和标识不对齐_直方图_05