我能够像这样绘制这个图表:
但我想这样绘制它,这意味着在图表的底部和作为一个表(至少看起来像一个)。
这是我的代码:
package charts;
import java.awt.*;
import java.io.*;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleEdge;
public class PieChart {
public static void main( String[ ] args ) throws Exception
{
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("A", new Double( 36.95 ));
dataset.setValue("B", new Double( 31.51 ));
dataset.setValue("C", new Double( 12.44 ));
dataset.setValue("D", new Double( 6.41 ));
dataset.setValue("E", new Double( 2.76 ));
dataset.setValue("F", new Double( 2.29 ));
dataset.setValue("G", new Double( 1.71 ));
dataset.setValue("H", new Double(1.21));
dataset.setValue("I", new Double(4.71));
JFreeChart chart = ChartFactory.createPieChart(
"", // chart title
dataset, // dataset
true, // legends
true, // tooltips
false); // urls
// remove legend border
chart.getLegend().setFrame(BlockBorder.NONE);
PiePlot plot = (PiePlot) chart.getPlot();
plot.setSimpleLabels(true);
PieSectionLabelGenerator generator = new StandardPieSectionLabelGenerator("{2}");
plot.setLabelGenerator(generator);
// background
plot.setBackgroundPaint(Color.WHITE); //
plot.setOutlineVisible(false); // remove image border
// label
plot.setLabelFont(new Font("Courier New", Font.BOLD, 16));
plot.setLabelPaint(Color.WHITE);
Color transparent = new Color(0.0f, 0.0f, 0.0f, 0.0f);
plot.setLabelBackgroundPaint(transparent); //background
plot.setLabelOutlinePaint(transparent); //border
plot.setLabelShadowPaint(transparent); //shadow
// legend
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}: {1}"));
// sections
// use gradients and white borders for the section colours
plot.setSectionPaint("A", new Color(126, 208, 150));
plot.setSectionPaint("B", new Color(41, 157, 135));
plot.setSectionPaint("C", new Color(25, 144, 212));
plot.setSectionPaint("D", new Color(95, 85, 25));
plot.setSectionPaint("E", new Color(22, 90, 63));
plot.setSectionPaint("F", new Color(134, 125, 25));
plot.setSectionPaint("G", new Color(226, 200, 14));
plot.setSectionPaint("H", new Color(241, 172, 18));
plot.setSectionPaint("I", new Color(245, 200, 51));
plot.setBaseSectionOutlinePaint(Color.WHITE);
plot.setSectionOutlinesVisible(true);
// chart title at the bottom
TextTitle legendText = new TextTitle("THIS IS JUST A TEST");
legendText.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(legendText);
LegendTitle legend = chart.getLegend();
legend.setPosition(RectangleEdge.RIGHT);
int width = 640; /* Width of the image */
int height = 480; /* Height of the image */
File pieChart = new File( "PieChart.png" );
ChartUtilities.saveChartAsPNG(pieChart, chart, width, height);
}
}
答案 0 :(得分:1)
以下是如何自定义图例布局:
// remove default legend
chart.removeLegend();
// create and add legend
LegendTitle legend = new LegendTitle(plot, new GridArrangement(dataset.getItemCount(), 1), new GridArrangement(1, 1));
legend.setPosition(RectangleEdge.BOTTOM);
chart.addLegend(legend);
// add text title after the legend
但是,完全按照自己的意愿自定义图例项布局要困难得多。您需要覆盖一堆方法,例如LegendTitle
中的createLegendItemBlock()
,并手动摆弄JFreechart的Block
和Arrangement
API。
或者,您可以完全绕过JFreechart API,并使用Swing组件生成您自己的图例面板。退房this example。