JfreeChart CationalPlot перезаписывает категории
-
30-09-2019 - |
Вопрос
Я новый, чтобы использовать JfreeChart, и я уверен, что есть простое решение для моей проблемы. Отказ
ПРОБЛЕМА:
У меня есть диаграмма, которая показывает несколько «типов событий» вдоль даты оси X. Ось Y показывает «категорию событий». Моя проблема заключается в том, что только последняя дата типа событий отображается для каждой категории.
В примере ниже диаграмма показывает точки данных для события типа 1 в 20 июня (категория 1) и 10 июня (категория 2). Я также добавил точку данных на 10 июня, категории 1, но 20 июня стирается его.
Я думаю, что я неправильно понимаю, как работает CoateLoT. Я использую неправильный тип диаграммы? Я думал, что график разброса будет билет, но он принимает только численные значения. Мне нужно иметь дискретные категории строк на моей оси Y.
Если кто-то может указать мне в правильном направлении, вы действительно сделаете мой день. Спасибо за прочтение!
-Кристин
(Код ниже работает как есть. Это так просто, как я мог сделать его)
import java.awt.Dimension;
import javax.swing.JPanel;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class EventFrequencyDemo1 extends ApplicationFrame
{
public EventFrequencyDemo1(String s)
{
super(s);
CategoryDataset categorydataset = createDataset();
JFreeChart jfreechart = createChart(categorydataset);
ChartPanel chartpanel = new ChartPanel(jfreechart);
chartpanel.setPreferredSize(new Dimension(500, 270));
setContentPane(chartpanel);
}
private static JFreeChart createChart(CategoryDataset categorydataset)
{
CategoryPlot categoryplot = new CategoryPlot(categorydataset, new CategoryAxis("Category"), new DateAxis("Date"), new LineAndShapeRenderer(false, true));
categoryplot.setOrientation(PlotOrientation.HORIZONTAL);
categoryplot.setDomainGridlinesVisible(true);
return new JFreeChart(categoryplot);
}
private static CategoryDataset createDataset()
{
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
Day june10 = new Day(10, 6, 2002);
Day june20 = new Day(20, 6, 2002);
// This event is overwritten by June20th
defaultcategorydataset.setValue(new Long(june10.getMiddleMillisecond()), "Event Type 1", "Category 1");
defaultcategorydataset.setValue(new Long(june10.getMiddleMillisecond()), "Event Type 1", "Category 2");
// Overwrites the previous June10th event
defaultcategorydataset.setValue(new Long(june20.getMiddleMillisecond()), "Event Type 1", "Category 1");
defaultcategorydataset.setValue(new Long(june20.getMiddleMillisecond()), "Event Type 2", "Category 2");
return defaultcategorydataset;
}
public static JPanel createDemoPanel()
{
JFreeChart jfreechart = createChart(createDataset());
return new ChartPanel(jfreechart);
}
public static void main(String args[])
{
EventFrequencyDemo1 eventfrequencydemo1 = new EventFrequencyDemo1("Event Frequency Demo");
eventfrequencydemo1.pack();
RefineryUtilities.centerFrameOnScreen(eventfrequencydemo1);
eventfrequencydemo1.setVisible(true);
}
}
Решение
В дополнение к предложениям @jeff Storey вы можете получить вдохновение от Образцы JfreeChart, и не упускай из виду Демонстрация Применение, доступное через Java Web Start. Я не уверен, что следую за вашими требованиями, но DefaultMultiValueCategoryDataset
описывается как «набор данных категории, который определяет несколько значений для каждого элемента».
Приложение: Если вы хотите придерживаться LineAndShapeRenderer
, обе LineAndShapeRenderer(false, true)
а также setBaseLinesVisible()
может исключить рисунок линии.
Другие советы
Я думаю, что вы используете неправильный тип набора данных и диаграммы здесь. Похоже, вы пытаетесь создать график разброса, поэтому вы должны использовать график разброса вместо графика категории. В графике категории, потому что каждая пара ряд / колонна получает только одно значение. Итак, в первом звонке вы говорите, что PARE EVELT1 / CABITE1 имеет значение июня 10 июня. GTGEMIDDLEMILLIILLISECOND, вы изменяете его значение до июня. GTGEMIDDLEMILLISECOND. Вы также можете захотеть посмотреть на участки временных рядов.