我正在使用JFreeChart创建折线图,这些折线图可以作为图像导出并嵌入到自动生成的文档中。例如,一个简单的折线图如下所示:
我用来显示值的代码是:
LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false);
chart.getCategoryPlot().setRenderer(renderer);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance()));
renderer.setBaseItemLabelsVisible(true);
我还想添加误差线以显示每个点的标准偏差,这可以通过使用StatisticsLineAndShapeRenderer(当然还要将误差值添加到数据集)来完成,因此上面的杂项现在变为:
StatisticalLineAndShapeRenderer renderer = new StatisticalLineAndShapeRenderer(true, false);
chart.getCategoryPlot().setRenderer(renderer);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance()));
renderer.setBaseItemLabelsVisible(true);
使用此代码,将生成带有错误条的图表,但标签消失了。从这张图片可以看出:
我试图找到一个同时包含错误栏和标签的在线示例,但我没有这样做。为什么使用Statistical Renderer时标签消失了,这有什么办法吗?
编辑:添加了最小和自包含的示例。
DefaultStatisticalCategoryDataset dataset = new DefaultStatisticalCategoryDataset();
dataset.add(1, 0.1, "serie", "A");
dataset.add(2, 0.4, "serie", "B");
dataset.add(2, 0.2, "serie", "C");
JFreeChart chart = ChartFactory.createLineChart("Chart", null, null, dataset, PlotOrientation.VERTICAL, false, true, true);
LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false);
chart.getCategoryPlot().setRenderer(renderer);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance()));
renderer.setBaseItemLabelsVisible(true);
JFreeChart chartErrorBars = ChartFactory.createLineChart("ErrorBars", null, null, dataset, PlotOrientation.VERTICAL, false, true, true);
StatisticalLineAndShapeRenderer statisticalRenderer = new StatisticalLineAndShapeRenderer(true, false);
chartErrorBars.getCategoryPlot().setRenderer(statisticalRenderer);
statisticalRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", NumberFormat.getNumberInstance()));
statisticalRenderer.setBaseItemLabelsVisible(true);
int width = 1500;
int height = 400;
try {
FileOutputStream fos = new FileOutputStream(new File("chart.png"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChartUtilities.writeChartAsPNG(baos, chart, width, height);
baos.writeTo(fos);
baos.close();
fos.close();
fos = new FileOutputStream(new File("chartErrorBars.png"));
baos = new ByteArrayOutputStream();
ChartUtilities.writeChartAsPNG(baos, chartErrorBars, width, height);
baos.writeTo(fos);
baos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
以及由该代码生成的两个图像。
StatisticalLineAndShapeRenderer
当父LineAndShapeRenderer
方法getItemShapeVisible()
返回时显示标签true
。在下面的示例中,我避开了图表工厂,并使用了StatisticalLineAndShapeRenderer
同时启用形状和线条的显式构造函数。
StatisticalLineAndShapeRenderer renderer
= new StatisticalLineAndShapeRenderer(true, true);
有什么具体的原因可以避免
ChartFactory
吗?
尽管重新使用ChartFactory
它是方便的,但让人想起在烤面包上点鸡,握住鸡,再烤面包。更重要的是,被丢弃 LineAndShapeRenderer
的内容带有请求的工具提示和URL生成器,这可能使将来的维护者感到困惑。
有什么方法可以使形状保持禁用状态吗?
如您所建议,空Shape
是有效的,例如
renderer.setSeriesShape(0, new Rectangle2D.Double(0, 0, 0, 0));
import java.awt.Dimension;
import java.awt.EventQueue;
import java.text.NumberFormat;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.StatisticalLineAndShapeRenderer;
import org.jfree.data.statistics.DefaultStatisticalCategoryDataset;
/**
* @see https://stackoverflow.com/a/38080778/230513
*/
public class Test {
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultStatisticalCategoryDataset dataset
= new DefaultStatisticalCategoryDataset();
dataset.add(1, 0.1, "series", "A");
dataset.add(2, 0.4, "series", "B");
dataset.add(2, 0.2, "series", "C");
CategoryAxis domain = new CategoryAxis();
ValueAxis range = new NumberAxis();
StatisticalLineAndShapeRenderer renderer
= new StatisticalLineAndShapeRenderer(true, true);
CategoryPlot plot = new CategoryPlot(dataset, domain, range, renderer);
JFreeChart chart = new JFreeChart(
"ErrorBars", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
renderer.setBaseItemLabelGenerator(
new StandardCategoryItemLabelGenerator("{2}",
NumberFormat.getNumberInstance()));
renderer.setBaseItemLabelsVisible(true);
renderer.setSeriesShape(0, new Rectangle2D.Double(0, 0, 0, 0));
new StandardChartTheme("JFree").apply(chart);
f.add(new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 300);
}
});
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句