我是新来的JFreeChart
,不知道如何解决这个问题;我也不知道是否有可能做我假装的事。问题是,我试图在JavaSwing应用程序中显示一个图形,我传递要显示的日期和值。日期由用户选择,可能不在一行中;,我的意思是,如果用户选择从星期四到星期一,那么星期六和星期天将被避免,并传递到图表星期四、星期五和星期一。问题是,图表从星期四到星期一(包括星期六和星期日)在X轴上显示它们,而实际情况并非如此。基于此示例,我的类如下所示:
ArrayList<StringBuffer> dates={20-02-2015,23-02-2015,24-02-2015,25-02-2015,26-02-2015};
args="tittle";
frame=(the frame where I do the call,although it's not needed in myChartPanelDemo2,just added for setting errorDialogs purpose);
ArrayList<StringBuffer> amount = {"serie1","serie2"};
myChartPanelDemo2.init(amount,args,dates,frame);
public class myChartPanelDemo2 {
static int datasetIndex;
private static ChartPanel chartPanel;
public static JPanel init(ArrayList<StringBuffer> amount, String args,
ArrayList<StringBuffer> dates, JFrame frame) {
//*****just getting the values***********//
datasetIndex = 0;
int cantity = amount.size();
int cantity2 = fechas.size();
float[][] resultArray = new float[cantity][cantity];
float[] result = new float[cantity2];
for (int x = 0; x < cantity; x++) {
for (int y = 0; y < cantity2; y++) {
result[y] = callingDataBase.main(amount.get(x), args, dates.get(y));
}
for (int v = 0; v < result.length; v++) {
resultArray[x][v] = result[v];
}
//resultArray will be the array from where chartPanel will take the values
}
XYDataset roiData = createDataset(args, dates, resultArray, amount);
JFreeChart chart = ChartFactory.createTimeSeriesChart(args, "Days",
"Values", roiData, true, true, false);
XYPlot plot = chart.getXYPlot();
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
chartPanel = new ChartPanel(chart);
JPanel f = new JPanel(new BorderLayout());
f.add(chartPanel, BorderLayout.CENTER);
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
JPanel panel = new JPanel(new BorderLayout());
panel.add(createTrace(), BorderLayout.SOUTH);
f.add(panel, BorderLayout.SOUTH);
f.setVisible(true);
chartPanel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));
chartPanel.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight()));
chartPanel.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight()));
return f;
}
/** @see https://stackoverflow.com/a/5522583/230513 */
private static JComboBox<String> createTrace() {
final JComboBox<String> trace = new JComboBox<String>();
final String[] traceCmds = {"Enable Trace", "Disable Trace"};
trace.setModel(new DefaultComboBoxModel<String>(traceCmds));
trace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (traceCmds[0].equals(trace.getSelectedItem())) {
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
chartPanel.repaint();
} else {
chartPanel.setHorizontalAxisTrace(false);
chartPanel.setVerticalAxisTrace(false);
chartPanel.repaint();
}
}
});
return trace;
}
private static XYDataset createDataset(String name,
ArrayList<StringBuffer> dates, float[][] resultArray,
ArrayList<StringBuffer> amount) {
TimeSeriesCollection tsc = new TimeSeriesCollection();
for (int x = 0; x < GraficoEmpresas.size(); x++) {
tsc.addSeries(createSeries(GraficoEmpresas.get(x).toString(), fechas,
resultArray, x));
}
return tsc;
private static TimeSeries createSeries(String name,
ArrayList<StringBuffer> dates, float[][] resultArray, int x) {
final TimeSeries series = new TimeSeries(name);
int cantity2 = dates.size();
RegularTimePeriod t = new Day();
for (int y = 0; y < cantity2; y++) {
Date fecha;
SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
day = new Date();
try {
day = formatoDelTexto.parse(fechas.get(y).toString());
} catch (ParseException e) {
e.printStackTrace();
}
RegularTimePeriod p = new Day(day);
series.addOrUpdate(p, resultArray[x][y]);
}
return series;
}
}
我不能上传图片,没有足够的声誉,但结果是一个x轴值的图表:{20-02-2015 -- 21-02-2015 -- 22-02-2015 --23-02-2015 -- 24-02-2015 -- 25-02-2015 -- 26-02-2015}除了21和22之外,每个点都有数据集值,但21和22被添加在轴标签中。
我同时使用JFreechart和JCommon 1.0.16。我想这是一个自动完成的问题,但这只是一个猜测,我还不能检查它是否正确。有没有人知道如何避免这种情况,或者这是不可能的?非常感谢。
非常感谢你!!!仅仅添加这两行就解决了问题:源代码是:这个示例ValueAxis domainAxis=plot。getDomainAxis();((日期轴)域轴)。setTimeline(SegmentedTimeline.newMondaythrifridayTimeline())
整个班级将是:
public class myChartPanelDemo2 {
static int datasetIndex;
private static ChartPanel chartPanel;
public static JPanel init(ArrayList<StringBuffer> amount, String args,
ArrayList<StringBuffer> dates, JFrame frame) {
//*****只是***********//
datasetIndex = 0;
int cantity = amount.size();
int cantity2 = fechas.size();
float[][] resultArray = new float[cantity][cantity];
float[] result = new float[cantity2];
for (int x = 0; x < cantity; x++) {
for (int y = 0; y < cantity2; y++) {
result[y] = callingDataBase.main(amount.get(x), args, dates.get(y));
}
for (int v = 0; v < result.length; v++) {
resultArray[x][v] = result[v];
}
//结果数组将是chartPanel获取值的数组
}
XYDataset roiData = createDataset(args, dates, resultArray, amount);
JFreeChart chart = ChartFactory.createTimeSeriesChart(args, "Days",
"Values", roiData, true, true, false);
XYPlot plot = chart.getXYPlot();
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
ValueAxis domainAxis = plot.getDomainAxis();
((DateAxis) domainAxis).setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );
chartPanel = new ChartPanel(chart);
JPanel f = new JPanel(new BorderLayout());
f.add(chartPanel, BorderLayout.CENTER);
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
JPanel panel = new JPanel(new BorderLayout());
panel.add(createTrace(), BorderLayout.SOUTH);
f.add(panel, BorderLayout.SOUTH);
f.setVisible(true);
chartPanel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));
chartPanel.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight()));
chartPanel.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight()));
return f;
}
/** @see https://stackoverflow.com/a/5522583/230513 */
private static JComboBox<String> createTrace() {
final JComboBox<String> trace = new JComboBox<String>();
final String[] traceCmds = {"Enable Trace", "Disable Trace"};
trace.setModel(new DefaultComboBoxModel<String>(traceCmds));
trace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (traceCmds[0].equals(trace.getSelectedItem())) {
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
chartPanel.repaint();
} else {
chartPanel.setHorizontalAxisTrace(false);
chartPanel.setVerticalAxisTrace(false);
chartPanel.repaint();
}
}
});
return trace;
}
private static XYDataset createDataset(String name,
ArrayList<StringBuffer> dates, float[][] resultArray,
ArrayList<StringBuffer> amount) {
TimeSeriesCollection tsc = new TimeSeriesCollection();
for (int x = 0; x < GraficoEmpresas.size(); x++) {
tsc.addSeries(createSeries(GraficoEmpresas.get(x).toString(), fechas,
resultArray, x));
}
return tsc;
private static TimeSeries createSeries(String name,
ArrayList<StringBuffer> dates, float[][] resultArray, int x) {
final TimeSeries series = new TimeSeries(name);
int cantity2 = dates.size();
RegularTimePeriod t = new Day();
for (int y = 0; y < cantity2; y++) {
Date fecha;
SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
day = new Date();
try {
day = formatoDelTexto.parse(fechas.get(y).toString());
} catch (ParseException e) {
e.printStackTrace();
}
RegularTimePeriod p = new Day(day);
series.addOrUpdate(p, resultArray[x][y]);
}
return series;
}
}
如果没有完整的示例,很难确定,但是您可以将SegmentedTimeline
应用于由您选择的ChartFactory
创建的DataAxis
。使用静态的工厂方法newMondayousFridayTimeline()
来创建周一到周五的SegmentedTimeline
,如下所示。您可以从图表的绘图中获得对DataAxis
的引用;或者,跳过ChartFactory
,重新创建图表,如下所示。
问题内容: 我有一个始终从x = 0开始的JFree XY折线图。然后,根据属性文件中用户定义的设置,应用程序将根据该数字(以分钟为单位)递增。 例如,x = 0开始时,用户定义的设置为5,因此刻度变为0、5、10、15、20…,或者用户设置为3,因此变为0、3、6、9、12…非常简单。 我遇到的问题是图表开始的方式。如果我从0开始,则0在图形的中间,而不是在左下角的-0.0000005,-0.0
在JFreechart中,我有一个带有日期(和时间)的X轴。 我怎样才能让JFreechart优化它们并充分利用它们? 现在它包含的标签比空间多,所有标签都转换为“…”。 如果不是所有的刻度都有标签,这是完全可以的,但是我想要尽可能多的(如果它们合适并且可以完全显示)。 我怎样才能做到这一点? 这里是完整的最小源来重现截断的标签。(默认情况下,JFreechart不处理优化: 我更喜欢像@tras
在放大MPandroid图表时,是否可以更改X轴上的标签?我希望在开始时将年作为标签,而不是在缩放时变为月,然后是周(缩放时标签将变得更准确)。
问题内容: 我正在使用JFreeChart显示一个月的每一天的值。现在,我想让我的x轴显示一个月中的星期而不是天。目前,我的图表的值在y轴上是double,在x轴上是int。 我正在 将日期范围设置为一个月,并且 将x轴的刻度显示在正确的位置。我不想显示天(0、7、14、21、28),而是希望它们是几周(0、1、2、3、4)。 那有可能吗,我将如何做到呢? 问题答案: 您应该像时间一样使用a 作为
问题内容: 我正在根据创建一个图: 问题是x和y轴中有不想要的标签,这些标签来自层次结构索引。因此,我想尝试删除这些标签,例如: 但这没有效果。如何删除x和y轴上的标签? 问题答案: 没有这个问题,就很难知道标签来自何处(我不知道数据帧的外观如何,这样才能产生标签,因为默认情况下不应有任何标签。)但是,标签可以使用已知方法和群集网格的热图轴进行设置- 因此也设置为空字符串。 所以如果是一个实例,
我正在从csv文件中读取日期/时间和数据,并将其存储在折线图中。我的日期/时间字符串是或,这实际上是第一个条目,我有几个小时的数据。 首先,我将chartArea X轴lablestyle设置为正确的格式:。 然后,我使用与上面相同的格式将实际的日期字符串解析为DateTime格式:。并将数据添加到图表中。