java - createlinechart - ¿Cómo dibujar la leyenda como una tabla con JFreeCharts?
line chart jfreechart example (1)
Puedo trazar esta tabla así:
Pero quiero trazarlo así, lo que significa en la parte inferior del gráfico y como una tabla (al menos parece uno).
Aquí está mi código:
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);
}
}
A continuación, se indica cómo personalizar el diseño de la leyenda:
// 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
Sin embargo, es mucho más difícil personalizar el diseño de elementos de la leyenda exactamente como lo desea. Tendría que anular un montón de métodos, como createLegendItemBlock()
en LegendTitle
, y LegendTitle
manualmente la API de Arrangement
y Block
de JFreechart.
Alternativamente, podría omitir por completo la API de JFreechart, y generar su propio panel de leyenda, utilizando componentes Swing. Mira este ejemplo .