如何以编程方式从java生成饼图?我有一些由程序处理的数据,然后我想创建一个有饼图的图像文件(PNG,GIF等)。是否有一个库可以做到这一点,或者至少我可以用来做这个?
或者,使用一个能在JFrame中绘制饼图然后以某种方式自动截取这些饼图的库会更好吗?
答案 0 :(得分:6)
JFreeChart可生成饼图,可将结果图表保存为JPEG格式。这是example如何做到这一点。这是一个3D example。
developers guide中提供了更多示例和文档。
生成饼形图的其他图表库:
答案 1 :(得分:4)
您可以使用XChart库,这是一个非常轻量级的Java直接图表库。以下代码将创建一个饼图。您还可以右键单击图表并另存为不同的位图类型,包括PNG,JPG,BMP,SVG,EPS和PDF。免责声明,我是XChart库的主要开发人员。
public class PieChartDemo {
public static void main(String[] args) throws IOException {
// Create Chart
PieChart chart = new PieChartBuilder().width(800).height(600).title("My Pie Chart").theme(ChartTheme.GGPlot2).build();
// Customize Chart
chart.getStyler().setLegendVisible(false);
chart.getStyler().setAnnotationType(AnnotationType.LabelAndPercentage);
chart.getStyler().setAnnotationDistance(1.15);
chart.getStyler().setPlotContentSize(.7);
chart.getStyler().setStartAngleInDegrees(90);
// Series
chart.addSeries("Prague", 2);
chart.addSeries("Dresden", 4);
chart.addSeries("Munich", 34);
chart.addSeries("Hamburg", 22);
chart.addSeries("Berlin", 29);
// Show it
new SwingWrapper(chart).displayChart();
// Save it
BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.PNG);
// or save it in high-res
BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.PNG, 300);
}
}
答案 2 :(得分:2)
这是一个很好,不需要使用任何第三方库
=============================
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
import javax.swing.JFrame;
class Slice {
double value;
Color color;
public Slice(double value, Color color) {
this.value = value;
this.color = color;
}
}
class PieChart3 extends JComponent {
Slice[] slices = { new Slice(5, Color.black),
new Slice(33, Color.green),
new Slice(20, Color.yellow), new Slice(15, Color.red) };
PieChart3() {}
public void paint(Graphics g) {
drawPie((Graphics2D) g, getBounds(), slices);
}
void drawPie(Graphics2D g, Rectangle area, Slice[] slices) {
double total = 0.0D;
for (int i = 0; i < slices.length; i++) {
total += slices[i].value;
}
double curValue = 0.0D;
int startAngle = 0;
for (int i = 0; i < slices.length; i++) {
startAngle = (int) (curValue * 360 / total);
int arcAngle = (int) (slices[i].value * 360 / total);
g.setColor(slices[i].color);
g.fillArc(area.x, area.y, area.width, area.height,
startAngle, arcAngle);
curValue += slices[i].value;
}
}