Java 如何使用jfreechart自上而下绘制折线图?
我正在使用jfreechart绘制折线图,我需要从上到下绘制这条线 .... 意思是:0,0坐标将位于左上角。 当我使用“CategoryPlot”时,只需更改“PlotOrientation”,就可以做到这一点,但左侧的标签变得重叠。无论如何,我更喜欢“xyplot” 更改“SetInversed”或“setDomainAxisLocation”没有帮助 任何帮助都将不胜感激 更新: 为了更清晰,我重新发布了我的代码(图表绘制部分) 在第一个代码中: 我得到了所需的输出 如图所示 只需传递“PlotOrientation.HORIZONTAL” 在这一部分中,我使用“CategoryPlot”Java 如何使用jfreechart自上而下绘制折线图?,java,jfreechart,linechart,Java,Jfreechart,Linechart,我正在使用jfreechart绘制折线图,我需要从上到下绘制这条线 .... 意思是:0,0坐标将位于左上角。 当我使用“CategoryPlot”时,只需更改“PlotOrientation”,就可以做到这一点,但左侧的标签变得重叠。无论如何,我更喜欢“xyplot” 更改“SetInversed”或“setDomainAxisLocation”没有帮助 任何帮助都将不胜感激 更新: 为了更清晰,我重新发布了我的代码(图表绘制部分) 在第一个代码中: 我得到了所需的输出 如图所示 只需传递“P
import java.awt.*;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.*;
public class PCategory extends ApplicationFrame
{
public PCategory(String s)
{
super(s);
JPanel jpanel = createDemoPanel();
jpanel.setPreferredSize(new Dimension(300, 200));
setContentPane(jpanel);
}
private static CategoryDataset createDataset()
{
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(0,"Pixels", Integer.toString(0));
defaultcategorydataset.addValue(2,"Pixels", Integer.toString(1));
defaultcategorydataset.addValue(5,"Pixels", Integer.toString(2));
defaultcategorydataset.addValue(10,"Pixels", Integer.toString(3));
defaultcategorydataset.addValue(7,"Pixels", Integer.toString(4));
defaultcategorydataset.addValue(8,"Pixels", Integer.toString(5));
return defaultcategorydataset;
}
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createLineChart(null, null, null, categorydataset, PlotOrientation.HORIZONTAL, false, true, false);
jfreechart.addSubtitle(new TextTitle("Title"));
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setRangePannable(true);
categoryplot.setRangeGridlinesVisible(false);
ChartUtilities.applyCurrentTheme(jfreechart);
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true);
lineandshaperenderer.setDrawOutlines(true);
lineandshaperenderer.setUseFillPaint(true);
lineandshaperenderer.setBaseFillPaint(Color.white);
lineandshaperenderer.setSeriesStroke(0, new BasicStroke(3F));
lineandshaperenderer.setSeriesOutlineStroke(0, new BasicStroke(2.0F));
lineandshaperenderer.setSeriesShape(0, new java.awt.geom.Ellipse2D.Double(-5D, -5D, 10D, 10D));
return jfreechart;
}
public static JPanel createDemoPanel()
{
JFreeChart jfreechart = createChart(createDataset());
ChartPanel chartpanel = new ChartPanel(jfreechart);
chartpanel.setMouseWheelEnabled(true);
return chartpanel;
}
public static void main(String args[])
{
PCategory PCategory = new PCategory("PCategory.java");
PCategory.pack();
RefineryUtilities.centerFrameOnScreen(PCategory);
PCategory.setVisible(true);
}
}
在第二段代码中:
我没有得到我需要的,即使我使用相同的数据和通行证
'打印方向。水平'
如图所示
我评论了我解决问题的方法
import java.awt.Dimension;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class PXYPlot extends ApplicationFrame {
public PXYPlot(String s) {
super(s);
JPanel jpanel = createPanel();
jpanel.setPreferredSize(new Dimension(300, 200));
setContentPane(jpanel);
}
private static XYDataset createDataset() {
XYSeries xyseries = new XYSeries("Pixels", true);
xyseries.add(0, 0);
xyseries.add(2, 1);
xyseries.add(5, 2);
xyseries.add(10, 3);
xyseries.add(7, 4);
xyseries.add(8, 5);
XYSeriesCollection xyseriescollection = new XYSeriesCollection();
xyseriescollection.addSeries(xyseries);
return xyseriescollection;
}
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart Mychart = ChartFactory.createXYLineChart(null, null, null, xydataset, PlotOrientation.HORIZONTAL, true, true, false);
XYPlot xyplot = (XYPlot) Mychart.getPlot();
xyplot.setDomainPannable(true);
xyplot.setRangePannable(true);
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot.getRenderer();
xylineandshaperenderer.setBaseShapesVisible(true);
xylineandshaperenderer.setBaseShapesFilled(true);
/* ----------- this part is my attempt to solve the problem -----
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setInverted(true);
xyplot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);
//------------I like XYplot because of the part -----------------
NumberAxis xAxis = new NumberAxis();
xAxis.setTickUnit(new NumberTickUnit(1));
XYPlot plot = (XYPlot) Mychart.getPlot();
plot.setDomainAxis(xAxis);
//-----------------------------
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
*/
return Mychart;
}
public static JPanel createPanel() {
JFreeChart jfreechart = createChart(createDataset());
ChartPanel chartpanel = new ChartPanel(jfreechart);
chartpanel.setMouseWheelEnabled(true);
return chartpanel;
}
public static void main(String args[]) {
PXYPlot PXYPlot = new PXYPlot("PXYPlot.java");
PXYPlot.pack();
RefineryUtilities.centerFrameOnScreen(PXYPlot);
PXYPlot.setVisible(true);
}
}
我需要'XYPlot',因为我有大量的数据,我认为'CategoryPlot'不是为它设计的,除了我有重叠的问题。此外,为了满足我的需要,它需要多次重写。首先,按如下方式创建数据集,然后不要更改它……数据是相同的,无论您希望如何显示它:
private XYDataset createDataset() {
XYSeries s1 = new XYSeries("S1");
s1.add(0, 0);
s1.add(1, 2);
s1.add(2, 5);
s1.add(3, 10);
s1.add(4, 7);
s1.add(5, 8);
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(s1);
return dataset;
}
现在,一个合理标准的JFreeChart创建如下所示:
…以下是代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
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.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class StackOverflow25993430 extends JFrame {
public StackOverflow25993430(String title) {
super(title);
JFreeChart chart = createChart(createDataset());
ChartPanel panel = new ChartPanel(chart);
panel.setPreferredSize(new Dimension(500, 300));
setContentPane(panel);
}
private XYDataset createDataset() {
XYSeries s1 = new XYSeries("S1");
s1.add(0, 0);
s1.add(1, 2);
s1.add(2, 5);
s1.add(3, 10);
s1.add(4, 7);
s1.add(5, 8);
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(s1);
return dataset;
}
private JFreeChart createChart(XYDataset dataset) {
JFreeChart chart = ChartFactory.createXYLineChart(
"StackOverflow25993430", "X", "Y", dataset);
chart.removeLegend();
XYPlot plot = (XYPlot) chart.getPlot();
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setSeriesShapesVisible(0, true);
renderer.setSeriesShape(0, new Ellipse2D.Double(-4.0, -4.0, 8.0, 8.0));
renderer.setSeriesFillPaint(0, Color.WHITE);
renderer.setUseFillPaint(true);
NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return chart;
}
public static void main(String[] args) {
JFrame app = new StackOverflow25993430("JFreeChart");
app.pack();
app.setVisible(true);
}
}
几乎不需要改变就能得到你想要的情节。首先,应更改打印方向,第二个x轴应反转,第三个必须提供y轴应位于顶部的提示。结果如下:
。。。以及生成代码(添加的5行由***标记):
您是否尝试过
PlotOrientation.HORIZONTAL
?是的,但没有任何帮助。。假设我添加这些值-忘记随机数-(xyseries.add(0,0);xyseries.add(1,2);xyseries.add(2,5);xyseries.add(3,10);xyseries.add(4,7);xyseries.add(5,8);)默认方向的输出在第#1行我有2,第#2行我有5,依此类推。。我希望绘图从上到下开始我正在寻找这样的输出,正如我所说的,通过使用“CategoryPlot”和PlotOrientation.HORIZONTAL..XYSeries(“像素”,true)
?我不确定我必须在哪里写你的建议,也不明白它。。这是一种方法吗?谢谢你,你让我开心了:)我想知道我犯了什么错。。。我将“PlotOrientation.HORIZONTAL”传递给“createXYLineChart”方法,设置“setInversed(true)”并生成plot.setRangeAxisLocation(AxisLocation.TOP\u或左)。。。顺便说一句,我是jfreechart的忠实粉丝,感谢您提供如此棒/优雅的库
import java.awt.Color;
import java.awt.Dimension;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation; // ***
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation; // ***
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class StackOverflow25993430b extends JFrame {
public StackOverflow25993430b(String title) {
super(title);
JFreeChart chart = createChart(createDataset());
ChartPanel panel = new ChartPanel(chart);
panel.setPreferredSize(new Dimension(500, 300));
setContentPane(panel);
}
private XYDataset createDataset() {
XYSeries s1 = new XYSeries("S1");
s1.add(0, 0);
s1.add(1, 2);
s1.add(2, 5);
s1.add(3, 10);
s1.add(4, 7);
s1.add(5, 8);
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(s1);
return dataset;
}
private JFreeChart createChart(XYDataset dataset) {
JFreeChart chart = ChartFactory.createXYLineChart(
"StackOverflow25993430b", "X", "Y", dataset);
chart.removeLegend();
XYPlot plot = (XYPlot) chart.getPlot();
plot.setOrientation(PlotOrientation.HORIZONTAL); // ***
plot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT); // ***
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setSeriesShapesVisible(0, true);
renderer.setSeriesShape(0, new Ellipse2D.Double(-4.0, -4.0, 8.0, 8.0));
renderer.setSeriesFillPaint(0, Color.WHITE);
renderer.setUseFillPaint(true);
NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
xAxis.setInverted(true); // ***
return chart;
}
public static void main(String[] args) {
JFrame app = new StackOverflow25993430b("JFreeChart");
app.pack();
app.setVisible(true);
}
}