Im using jfree charts for my application. I need a chart with stroke point values appear above the x axis label.
Expected
And i need to remove the tick mark in between the values(54% and 2008). I have tried the below code to get the annotation,
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(23, "Line", "2008");
dataset.addValue(145, "Line", "2009");
dataset.addValue(245, "Line", "2010");
dataset.addValue(322, "Line", "2011");
final JFreeChart chart = ChartFactory.createLineChart(
"", // chart title
"", // domain axis label
"", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
false, // tooltips
false // urls
);
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderVisible(true);
chart.setBorderPaint(Color.decode("#EEEEEE"));
chart.setPadding(new RectangleInsets(10, 10, 5, 5));
final CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeZeroBaselinePaint(Color.RED);
plot.setOutlineVisible(false);
plot.setRangeGridlinePaint(Color.white);
plot.setDomainGridlinePaint(Color.BLUE);
final CategoryAxis categoryAxis = (CategoryAxis) plot.getDomainAxis();
categoryAxis.setAxisLineVisible(false);
categoryAxis.setTickMarksVisible(false);
categoryAxis.setTickLabelFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 8));
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setVisible(false);
rangeAxis.setLabelPaint(Color.BLUE);
rangeAxis.setRangeWithMargins(21, 600);
DecimalFormat format = new DecimalFormat("###,###");
StandardCategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator("{2}", format);
final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
renderer.setBaseShapesFilled(true);
renderer.setSeriesStroke(0, new BasicStroke(1.5f));
renderer.setSeriesItemLabelsVisible(0, true);
renderer.setBaseItemLabelGenerator(labelGenerator);
renderer.setBaseItemLabelFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 9));
Shape circle = new Ellipse2D.Double(-2, -2, 4, 4);
renderer.setSeriesShape(0, circle);
plot.getRenderer().setSeriesPaint(0, Color.decode("#0066CC"));
// CategoryAnnotation categoryAnnotation=new CategoryLineAnnotation(Male1, 248, Male2, 216, null, null);
// XYLineAnnotation annotation=new XYLineAnnotation(8, 0, 8, 24, new BasicStroke(2.0f), Color.blue);
// plot.addAnnotation( (CategoryAnnotation) annotation);
try {
ChartUtilities.saveChartAsPNG(new File("E:\\jfreeLinechart.png"), chart, 290, 95);
System.out.println("=====chart=====");
} catch (Exception e) {
e.printStackTrace();
}
from the above code im getting the following chart
Actual
Please help me to get the expected image in jfree line chart.
Using the method setBasePositiveItemLabelPosition
you can set the base positive item label position. Try this:
renderer.setBasePositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.OUTSIDE8, TextAnchor.CENTER));
Using OUTSIDE
, INSIDE
, or CENTER
you can specify where the label will be placed respecting the item.
I have found the solution. For the expected Chart you have to create the dummy series values. And use this code.
public String createLineChart() throws IOException {
System.out.println("Line chart");
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(14, "Line", "2008");
dataset.addValue(18, "Line", "2009");
dataset.addValue(22, "Line", "2010");
dataset.addValue(13, "Line2", "2008");
dataset.addValue(13, "Line2", "2009");
dataset.addValue(13, "Line2", "2010");
final JFreeChart chart = ChartFactory.createLineChart(
"", // chart title
"", // domain axis label
"", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
false, // tooltips
false // urls
);
chart.setBackgroundPaint(Color.WHITE);
final CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeZeroBaselinePaint(Color.RED);
plot.setOutlineVisible(false);
plot.setRangeGridlinePaint(Color.white);
plot.setDomainGridlinePaint(Color.BLUE);
final CategoryAxis categoryAxis = (CategoryAxis) plot.getDomainAxis();
categoryAxis.setAxisLineVisible(false);
categoryAxis.setTickMarksVisible(false);
categoryAxis.setMaximumCategoryLabelLines(2);
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setVisible(false);
rangeAxis.setLabelPaint(Color.BLUE);
rangeAxis.setRange(13, 23);
rangeAxis.setTickUnit(new NumberTickUnit(20));
final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
renderer.setBaseShapesFilled(true);
renderer.setSeriesStroke(0, new BasicStroke(2.0f));
renderer.setSeriesItemLabelsVisible(1, Boolean.TRUE);
Shape circle = new Ellipse2D.Double(-3, -3, 6, 6);
renderer.setSeriesShape(0, circle);
renderer.setSeriesShape(1, null);
renderer.setBaseItemLabelGenerator(new CustomLabelGenerator());
// MyGenerator generator=new MyGenerator();
// renderer.setSeriesItemLabelGenerator(1, generator);
renderer.setBaseItemLabelsVisible(true);
plot.getRenderer().setSeriesPaint(0, Color.decode("#0066CC"));
plot.getRenderer().setSeriesPaint(1, Color.WHITE);
// ValueAxis range = plot.getRangeAxis();
// range.setUpperMargin(0.20);
try {
ChartUtilities.saveChartAsPNG(new File("/media/root/668ea9a3-d26c-4896-a2f0-756dfb532756/jfreeLinechart.png"), chart, 400, 200);
System.out.println("=====chart=====");
} catch (IOException e) {
System.out.println("Line chart :" + e);
}
xyLineChart();
return "success";
}
static class CustomLabelGenerator extends AbstractCategoryItemLabelGenerator implements CategoryItemLabelGenerator {
public CustomLabelGenerator() {
super("", NumberFormat.getCurrencyInstance());
}
public String generateLabel(CategoryDataset dataset, int series, int category) {
String result = null;
if (series == 1) {
series = 0;
Number value = dataset.getValue(series, category);
result = value.toString();
System.out.println("===========result===============" + series + "====category======" + category);
}
return result;
}
public String generateRowLabel(CategoryDataset arg0, int arg1) {
return null;
}
public String generateColumnLabel(CategoryDataset arg0, int arg1) {
return null;
}
}
You will get the appropriate chart...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.