Java JFreeChart';s条形图条形单元

Java JFreeChart';s条形图条形单元,java,charts,jfreechart,Java,Charts,Jfreechart,我正在尝试用Java创建一个条形图 我希望在日期轴上有1H条形单位(不是勾号单位)。有办法吗? 经过大量的谷歌搜索,我没有发现任何有趣的事情 这就是我得到的: ChartAdapter.java 公共类ChartAdapter扩展JFrame{ /** *构造演示应用程序。 * *@param title框架标题。 */ 公共图表面板generateChart(字符串标题、矢量数据矢量){ JFreeChart chart=ChartFactory.createXYBarChart( 标题 “

我正在尝试用Java创建一个条形图

我希望在
日期轴上有1H条形单位(不是勾号单位)。有办法吗?
经过大量的谷歌搜索,我没有发现任何有趣的事情

这就是我得到的:

ChartAdapter.java

公共类ChartAdapter扩展JFrame{
/**
*构造演示应用程序。
*
*@param title框架标题。
*/
公共图表面板generateChart(字符串标题、矢量数据矢量){
JFreeChart chart=ChartFactory.createXYBarChart(
标题
“X”,
是的,
“Y”,
createDataset(数据向量),
PlotOrientation.VERTICAL,
是的,
假,,
假的
);
final XYItemRenderer renderer=chart.getXYPlot().getRenderer();
最终标准XYToolTipGenerator生成器=新标准XYToolTipGenerator(
“{1}={2}”,新的SimpleDataFormat(“yyyy”),新的DecimalFormat(“0.00”)
);
渲染器.setToolTipGenerator(生成器);
最终XYPlot=chart.getXYPlot();
final DateAxis dAxis=(DateAxis)plot.getDomainAxis();
dAxis.SetVerticalTackLabels(真);
最终NumberAxis nAxis=(NumberAxis)plot.getRangeAxis();
Calendar c=Calendar.getInstance();
c、 设置时间(dAxis.getMinimumDate());
c、 添加(日历小时,12);
最终图表面板图表面板=新图表面板(图表);
setPreferredSize(新java.awt.Dimension(600300));
返回面板;
}
私有IntervalXYDataset createDataset(向量数据向量){
TimeSeries系列=新的TimeSeries(“值”);
for(向量tempVector:dataVector){
Timestamp time=Timestamp.valueOf(tempVector.get(0));
add(新毫秒(时间),Double.parseDouble(tempVector.get(1));
}
TimeSeriesCollection数据集=新的TimeSeriesCollection(系列);
dataset.SetDomainIsPointsTime(false);
返回数据集;
}
}
Test.java

公共类测试扩展JFrame{
私有JPanel内容窗格;
向量数据向量=新向量();
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
测试框架=新测试();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公开考试(){
向量tempString=null;
Calendar c=Calendar.getInstance();
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd hh:MM:ss”);
试一试{
c、 设定时间(sdf.parse(“2017-01-12 12:00:00”);
}捕获(解析异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}

对于(int i=0;i我简化了您的示例,将重点放在组成数据集的时间间隔上。使用一个
Calendar.HOUR
的时间间隔可确保条形图显示为一小时宽。尽管您的问题特别避开了勾号单位,但某些功能可能会在未来有所帮助:

  • 使用所示方法获得特定的刻度间隔

    domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.HOUR, 1));
    
    domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
    
  • 使用
    setTickMarkPosition()
    将记号标记置于所选间隔的中心

    domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.HOUR, 1));
    
    domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
    

导入java.awt.EventQueue;
导入java.text.DecimalFormat;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Random;
导入javax.swing.JFrame;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.DateAxis;
导入org.jfree.chart.axis.DateTickMarkPosition;
导入org.jfree.chart.axis.DateTickUnit;
导入org.jfree.chart.axis.DateTickUnitType;
导入org.jfree.chart.labels.StandardXYToolTipGenerator;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.XYItemRenderer;
导入org.jfree.data.time.Hour;
导入org.jfree.data.time.TimeSeries;
导入org.jfree.data.time.TimeSeriesCollection;
导入org.jfree.data.xy.IntervalXYDataset;
/**@见https://stackoverflow.com/a/42612723/230513 */
公开课考试{
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
测试框架=新测试();
});
}
公开考试(){
JFrame f=新的JFrame(“数据”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新的ChartAdapter().generateChart(“数据”));
f、 包装();
f、 setVisible(真);
}
类图表适配器{
公共图表面板generateChart(字符串标题){
JFreeChart chart=ChartFactory.createXYBarChart(
标题,“时间”,真,“值”,createDataset(),
PlotOrientation.VERTICAL、true、false、false
);
final XYItemRenderer renderer=chart.getXYPlot().getRenderer();
最终标准XYToolTipGenerator生成器=新标准XYToolTipGenerator(
“{1}:{2}”、新的SimpleDateFormat(“HH:mm”)、新的DecimalFormat(“0.00”)
);
renderer.setBaseToolTipGenerator(生成器);
最终XYPlot=chart.getXYPlot();
最终DateAxis domainAxis=(DateAxis)plot.getDomainAxis();
domainAxis.setVerticalTickLabels(true);
domainAxis.setTickUnit(新的DateTickUnit(DateTickUnitType.HOUR,1));
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
setDateFormatOverride(新的SimpleDataFormat(“HH:mm”);
返回新的图表面板(图表);
}
私有IntervalXYDataset createDataset(){
随机r=新随机();
TimeSeries系列=新的TimeSeries(“值”);
Calendar c=Calendar.getInstance();
对于(int i=0;i<10;i++){
系列。添加(新小时(c
import java.awt.EventQueue;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.time.Hour;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.IntervalXYDataset;

/** @see https://stackoverflow.com/a/42612723/230513 */
public class Test {

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {
            Test frame = new Test();
        });
    }

    public Test() {
        JFrame f = new JFrame("Data");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ChartAdapter().generateChart("Data"));
        f.pack();
        f.setVisible(true);
    }

    class ChartAdapter {

        public ChartPanel generateChart(String title) {
            JFreeChart chart = ChartFactory.createXYBarChart(
                title, "Time", true, "Value", createDataset(),
                PlotOrientation.VERTICAL, true, false, false
            );
            final XYItemRenderer renderer = chart.getXYPlot().getRenderer();
            final StandardXYToolTipGenerator generator = new StandardXYToolTipGenerator(
                "{1} : {2}", new SimpleDateFormat("HH:mm"), new DecimalFormat("0.00")
            );
            renderer.setBaseToolTipGenerator(generator);
            final XYPlot plot = chart.getXYPlot();
            final DateAxis domainAxis = (DateAxis) plot.getDomainAxis();
            domainAxis.setVerticalTickLabels(true);
            domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.HOUR, 1));
            domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
            domainAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
            return new ChartPanel(chart);
        }

        private IntervalXYDataset createDataset() {
            Random r = new Random();
            TimeSeries series = new TimeSeries("Value");
            Calendar c = Calendar.getInstance();
            for (int i = 0; i < 10; i++) {
                series.add(new Hour(c.getTime()), r.nextGaussian() + 7);
                c.add(Calendar.HOUR, 1);
            }
            return new TimeSeriesCollection(series);
        }
    }
}