我在我的应用程序中使用jfree图表。我需要一个图表,其中笔点值出现在x轴标签上方。
预期
我需要删除值之间的刻度线(54%和2008)。 我已经尝试了以下代码来获取注释,
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();
}
从上面的代码我得到以下图表
实际
请帮助我在jfree折线图中获得预期的图像。
答案 0 :(得分:2)
使用方法setBasePositiveItemLabelPosition
,您可以设置基本正项目标签位置。试试这个:
renderer.setBasePositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.OUTSIDE8, TextAnchor.CENTER));
使用OUTSIDE
,INSIDE
或CENTER
,您可以指定标签的放置位置。
答案 1 :(得分:1)
我找到了解决方案。对于预期的图表,您必须创建虚拟系列值。并使用此代码。
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;
}
}
你会得到合适的图表......