Java 使用xml文件的简单jfreechart条形图
我需要根据XML文件中“state”字段的值生成一个条形图(如下所示)。Y轴上的条形图是XML文件中的“键”字段。(A计划、B计划等) 这些条的颜色取决于相应标记中的“状态”字段。(成功-绿色,失败-红色,正在进行-蓝色) 我试着用谷歌搜索如何通过读取XML文件来生成条形图。但我想不出来 请帮助我从xml文件中解析“state”字段&这个用例的正确jfreechart xml文件内容:Java 使用xml文件的简单jfreechart条形图,java,xml,jfreechart,Java,Xml,Jfreechart,我需要根据XML文件中“state”字段的值生成一个条形图(如下所示)。Y轴上的条形图是XML文件中的“键”字段。(A计划、B计划等) 这些条的颜色取决于相应标记中的“状态”字段。(成功-绿色,失败-红色,正在进行-蓝色) 我试着用谷歌搜索如何通过读取XML文件来生成条形图。但我想不出来 请帮助我从xml文件中解析“state”字段&这个用例的正确jfreechart xml文件内容: <results> <result id="1" number="10" lifeCycle
<results>
<result id="1" number="10" lifeCycleState="Finished" state="Failed" key="PLAN-A">
</result>
<result id="2" number="20" lifeCycleState="Finished" state="Success" key="PLAN-B">
</result>
<result id="3" number="30" lifeCycleState="Finished" state="Success" key="PLAN-C">
</result>
<result id="4" number="40" lifeCycleState="InProgress" state="InProgress" key="PLAN-D">
</result>
</results>
图表为:
以下是您正在寻找的示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class BarChartDemo extends ApplicationFrame {
public BarChartDemo(final String title) throws Exception {
super(title);
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(500, 270));
setContentPane(chartPanel);
}
/**
* Returns a sample dataset.
*
* @return The dataset.
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
private CategoryDataset createDataset() throws Exception {
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("src/input.xml"));
NodeList nodeList = document.getElementsByTagName("result");
for(int x=nodeList.getLength()-1;x>=0;x--){
dataset.addValue(10.0, nodeList.item(x).getAttributes().getNamedItem("state").getNodeValue(),nodeList.item(x).getAttributes().getNamedItem("key").getNodeValue());
}
return dataset;
}
/**
* Creates a sample chart.
*
* @param dataset the dataset.
*
* @return The chart.
*/
private JFreeChart createChart(final CategoryDataset dataset) {
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
"Bar Chart Demo", // chart title
"key", // domain axis label
"number", // range axis label
dataset, // data
PlotOrientation.HORIZONTAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
// set the background color for the chart...
chart.setBackgroundPaint(Color.white);
// get a reference to the plot for further customisation...
final CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
// set the range axis to display integers only...
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// disable bar outlines...
final BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setDrawBarOutline(false);
// set up gradient paints for series...
final GradientPaint gp0 = new GradientPaint(
0.0f, 0.0f, Color.blue,
0.0f, 0.0f, Color.lightGray
);
final GradientPaint gp1 = new GradientPaint(
0.0f, 0.0f, Color.green,
0.0f, 0.0f, Color.lightGray
);
final GradientPaint gp2 = new GradientPaint(
0.0f, 0.0f, Color.red,
0.0f, 0.0f, Color.lightGray
);
renderer.setSeriesPaint(0, gp0);
renderer.setSeriesPaint(1, gp1);
renderer.setSeriesPaint(2, gp2);
final CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
);
return chart;
}
public static void main(final String[] args) throws Exception {
final BarChartDemo demo = new BarChartDemo("Barchart");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
编辑:要根据状态值固定颜色,请执行以下操作:
/* renderer.setSeriesPaint(0, gp0);
renderer.setSeriesPaint(1, gp1);
renderer.setSeriesPaint(2, gp2);*/
在程序中注释上述代码,并添加以下代码:
int pos=0;
List<Comparable> statusList = dataset.getRowKeys();
for(Comparable status : statusList){
if(status.equals("InProgress")){
renderer.setSeriesPaint(pos,gp0);
}
else if (status.equals("Success")){
renderer.setSeriesPaint(pos,gp1);
}
else if (status.equals("Failed")){
renderer.setSeriesPaint(pos,gp2);
}
pos++;
}
当您运行该程序时,它将为您提供以下信息:
一个小点,图表显示所有值为10.0。 更改: dataset.addValue(10.0。。。 致:
dataset.addValue(Double.valueOf(nodeList.item(x).getAttributes().getNamedItem(“number”).getNodeValue()),…但是,如果xml文件顺序发生变化,这些颜色表示在图形中会发生变化。假设如果xml文件中PLAN-A的“状态”为“成功”,则图形中的颜色将变为“蓝色”成功。如何使图表中的颜色为静态?(失败-红色,成功-绿色,InProgress-蓝色)查看我的编辑以根据状态使用颜色,但仍然没有进行编辑,如果将PLAN-A的状态更改为“成功”,图表将显示“绿色”仅条形图。这就像填鸭式馈送:P非常感谢。我试图使用以下代码将图形另存为图像。但我无法。您能看一下吗。我在注释
demo.setVisible(true);
后添加了这些代码。然后我添加了:文件BarChart=new文件(“chart.png”);ChartUtilities.saveChartAsPNG(条形图,演示,宽度,高度);
将这段代码移动到createChart方法,在返回之前保存为图像,应该是:ChartUtilities.saveChartAsPNG(条形图,图表,宽度,高度);您能看一下吗
int width=640;
int height=480;
File BarChart=new File("src/chart.png");
ChartUtilities.saveChartAsPNG(BarChart, chart, width, height);
return chart;