- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组机器,对于管理应用程序,我需要制作图表来显示每台机器的状态。在数据库中有一个存储实际状态的列状态。此状态会根据其他参数发生变化,并且通过更改还会存储事件的时间,这意味着事件的时间戳是状态的开始时间。
machine-id | event_time (long) | status (int)
正如您在图像中看到的,一条水平线(机器)上有许多状态,颜色将根据数据库中的值设置。
时间轴在过去和 future (预测)两个方向上都有预定义的步长(此处为 1/4 小时),因此用户应该能够以某种方式滚动它。
作为一个库,我可以使用 JFreeChart,但我以前从未使用过它,而且我也不是一个经验丰富的 Java 开发人员。
我的问题:
- 我需要做什么? (jfreechart有哪些类)
- 如何设置以 1/4 小时为单位分隔的第一个时间轴
- 如何使用日期设置第二个时间轴(格式为 dd:mm:yyyy)(很高兴)
- 如何使时间轴可滚动(过去和 future )
- 如何为每个状态设置颜色
我真正需要的是操作方法或教程。
我在网上找到的资源和示例几乎都是 eachether 的副本,其中包含 jfreechart 库的非常基本的用法。所以我真的不知道如何或从哪里开始......
非常感谢您的帮助。
最佳答案
你将不得不结合一些例子:
为您的数据使用 CategoryDataset
,例如 DefaultCategoryDataset
。使用 ChartFactory.createStackedBarChart()
和 PlotOrientation.HORIZONTAL
创建图表。
确保 addValue()
的第一个参数是 15 分钟的倍数,以毫秒为单位。
为域使用DateAxis
;调用 setDateFormatOverride()
获取您想要的格式。
DateAxis dateAxis = new DateAxis("Time");
dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
categoryplot.setRangeAxis(dateAxis);
对于滚动,使用SlidingCategoryDataset
,就像他们建议的那样here ,或使用上下文菜单中的缩放命令。
对于颜色,使用自定义 getItemPaint()
,就像它们显示的那样 here .
I did set the
DateFormat
to show years, and it has 1970 as a year! Why?
您的示例是使用秒 创建新的日期值,但是Date
预计 毫秒。我将 000L
添加到时间值,将范围计算移动到 createDataset()
,并让轴自动调整范围。
import java.awt.Color;
import java.awt.Dimension;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.Range;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class StackedTimeBarChart extends ApplicationFrame {
private static final String STANDBY_SERIES = "STANDBY";
private static final String HEATING_SERIES = "HEATING";
private static final String HOLDING_SERIES = "HOLDING";
private static final String COOLING_SERIES = "COOLING";
private static final String LOWERING_SERIES = "LOWERING";
private static final int STANDBY_SERIES_INDEX = 0;
private static final int HEATING_SERIES_INDEX = 1;
private static final int HOLDING_SERIES_INDEX = 2;
private static final int COOLING_SERIES_INDEX = 3;
private static final int LOWERING_SERIES_INDEX = 4;
private static final Color STANDBY_COLOR = Color.DARK_GRAY;
private static final Color HEATING_COLOR = Color.ORANGE;
private static final Color HOLDING_COLOR = Color.YELLOW;
private static final Color COOLING_COLOR = Color.CYAN;
private static final Color LOWERING_COLOR = Color.GREEN;
ArrayList<EventStatus> testData = null;
CategoryPlot plot;
public StackedTimeBarChart(String title) {
super(title);
// set up some test data
initData();
// set the start and end date of the chart
plot = new CategoryPlot();
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
plot.setOrientation(PlotOrientation.HORIZONTAL);
// create dataset
CategoryDataset dataset = createDataset();
// create the axis
CategoryAxis catAxis = new CategoryAxis();
DateAxis dateAxis = new DateAxis();
dateAxis.setVerticalTickLabels(true);
//dateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.HOUR, 1));
dateAxis.setDateFormatOverride(new SimpleDateFormat("dd.MM.yyyy HH:mm"));
// set up the renderer
StackedBarRenderer rend = new StackedBarRenderer();
//rend.setBase(chartRange.getLowerBound());
rend.setSeriesPaint(STANDBY_SERIES_INDEX, STANDBY_COLOR);
rend.setSeriesPaint(HEATING_SERIES_INDEX, HEATING_COLOR);
rend.setSeriesPaint(HOLDING_SERIES_INDEX, HOLDING_COLOR);
rend.setSeriesPaint(COOLING_SERIES_INDEX, COOLING_COLOR);
rend.setSeriesPaint(LOWERING_SERIES_INDEX, LOWERING_COLOR);
// set up the plot
plot.setDataset(dataset);
plot.setDomainAxis(catAxis);
plot.setRangeAxis(dateAxis);
plot.setRenderer(rend);
// create the chart and add it
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(600, 450));
setContentPane(chartPanel);
}
private CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
Date chartStartDate = new Date(testData.get(0).getTime());
Date chartEndDate = new Date(testData.get(testData.size() - 1).getTime());
Range chartRange = new Range(chartStartDate.getTime(), chartEndDate.getTime());
if (testData != null) {
for (int i = 0; i < testData.size(); i++) {
// is there data?
if (testData.size() > 0) {
for (int j = 0; j < testData.size(); j++) {
EventStatus es = testData.get(j);
long eventTime = es.getTime();
int status = es.getStatus();
String name = es.getName();
// if data event time is in the range of the chart then show it
// THIS DOES NOT WORK PROPERLY!!!!
if (eventTime >= chartStartDate.getTime() && eventTime < chartEndDate.getTime()) {
// create series and categories
if (es.getStatus() == STANDBY_SERIES_INDEX) {
dataset.addValue(new Double(es.getTime()), STANDBY_SERIES, es.getName());
} else if (es.getStatus() == HEATING_SERIES_INDEX) {
dataset.addValue(new Double(es.getTime()), HEATING_SERIES, es.getName());
} else if (es.getStatus() == HOLDING_SERIES_INDEX) {
dataset.addValue(new Double(es.getTime()), HOLDING_SERIES, es.getName());
} else if (es.getStatus() == COOLING_SERIES_INDEX) {
dataset.addValue(new Double(es.getTime()), COOLING_SERIES, es.getName());
} else if (es.getStatus() == LOWERING_SERIES_INDEX) {
dataset.addValue(new Double(es.getTime()), LOWERING_SERIES, es.getName());
} else {
dataset.addValue(chartRange.getUpperBound() - chartRange.getLowerBound(), STANDBY_SERIES, es.getName());
}
} else {
continue;
}
}
}
}
} else {
plot.setNoDataMessage("NO DATA AVAILABLE");
}
return dataset;
}
public static void main(String[] args) {
StackedTimeBarChart demo = new StackedTimeBarChart("demo");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
private void initData() {
testData = new ArrayList<EventStatus>();
testData.add(new EventStatus("Mach-1", 1476950160000L, 1));
testData.add(new EventStatus("Mach-1", 1476952200000L, 2));
testData.add(new EventStatus("Mach-1", 1476964800000L, 4));
testData.add(new EventStatus("Mach-1", 1476966600000L, 3));
testData.add(new EventStatus("Mach-2", 1476943200000L, 1));
testData.add(new EventStatus("Mach-2", 1476946800000L, 4));
testData.add(new EventStatus("Mach-2", 1476954000000L, 2));
testData.add(new EventStatus("Mach-2", 1476955800000L, 1));
testData.add(new EventStatus("Mach-2", 1476973800000L, 3));
testData.add(new EventStatus("Mach-3", 1476959400000L, 2));
testData.add(new EventStatus("Mach-3", 1476966600000L, 1));
testData.add(new EventStatus("Mach-3", 1476970200000L, 4));
testData.add(new EventStatus("Mach-3", 1476972000000L, 1));
testData.add(new EventStatus("Mach-3", 1476986400000L, 2));
}
// Chart object class that hold category, event time and status
private class EventStatus {
private String name;
private long time;
private int status;
public EventStatus(String name, long time, int status) {
this.name = name;
this.time = time;
this.status = status;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
}
关于java - JFreeChart - 带日期轴的水平堆积条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105094/
我使用 Dojo fadeIn 和 fadeOut 以及一个计时器旋转了三个堆叠图像。只有最后一个的 href 可用。是否也可以旋转 href? 这是它的 CSS: #main-slides
给定一个 numpy 数组,我想总结统一的元素 block 以形成一个新的、更小的数组。它与分箱类似,但不是按频率分箱。除了通过示例(如下)之外,我不确定如何描述它。 问题:是否有用于此的函数或更清晰
我正在尝试实现某种按钮控制的幻灯片放映,其中包括用于页面顶部全 Angular 图片的 div,用于页面顶部的 div页面底部的另一张全 Angular 图片和中央内容的最终 div(包括控制“幻
嘿,我正在使用 D3JS 作为图表库,我真的很想利用气泡图中的超酷功能。上主D3JS chart站点下面的Bubble Chart用来比较两组数据: Bubble Chart . 我想知道是否有人真的
我是一名优秀的程序员,十分优秀!