当前位置: 首页 > 知识库问答 >
问题:

时间序列图,X轴刻度标签变为

闽承望
2023-03-14

我正在使用JFreeChart制作一个条形图与时间。由于某些原因,在这些图表上,x轴上的刻度标签变为“…”偶尔地似乎有足够的空间来扩展标签,但它只是切断了整个事情。我怎样才能解决这个问题。

我试着用图片按钮上传一张图片,但它似乎不起作用。

下面是与我的项目设置相似的代码。奇怪的是,它的行为不同于我的建筑。在我的上面,不是说“侯......”,而是说“......”。请忽略评论和所有其他未编辑的东西。

package dataDisplay;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

public class mockTest extends JPanel{

    ChartPanel chartPanel;
    JFreeChart chart;
    CategoryAxis domainAxis;
    NumberAxis rangeAxis;

    public mockTest()
    {
        //Mock data
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        int[] times = new int[]{1,2,3,4,5,6,7,8,9,10,11,12};

        for ( int i = 0; i < times.length; i++ ){
            dataset.addValue(times[i], "Time", "Houreee" + String.valueOf(i+1));;

        }
        CategoryPlot plot = new CategoryPlot();

        //create the plot

        //add the first dataset, and render as bar values
        CategoryItemRenderer renderer = new BarRenderer();
        plot.setDataset(0,dataset);
        plot.setRenderer(0,renderer);  

        //set axis 
         domainAxis = new CategoryAxis("Time");  
        rangeAxis = new NumberAxis("Value"); 

        plot.setDomainAxis(0,domainAxis);
        plot.setRangeAxis(rangeAxis);
        chart = new JFreeChart(plot);
        chartPanel = new ChartPanel( chart ); 

           this.addComponentListener(new ComponentAdapter() {
                @Override
                /**
                 *  Makes it so it does not stretch out text. Resizes the fonts to scale with the screen width..
                 */
                public void componentResized(ComponentEvent e) {
                    chartPanel.setMaximumDrawHeight(e.getComponent().getHeight());
                    chartPanel.setMaximumDrawWidth(e.getComponent().getWidth());
                    chartPanel.setMinimumDrawWidth(e.getComponent().getWidth());
                    chartPanel.setMinimumDrawHeight(e.getComponent().getHeight());

                    // Makes the font size scale according to the width of the chart panel.
                    rangeAxis.setLabelFont(new Font("SansSerif", Font.PLAIN,e.getComponent().getWidth()/60));
                    domainAxis.setTickLabelFont(new Font("SansSerif", Font.PLAIN,e.getComponent().getWidth()/80));
                    rangeAxis.setTickLabelFont(new Font("SansSerif", Font.PLAIN,e.getComponent().getWidth()/75));
                }
            });


        this.add(chartPanel, "Center");
    }   
    public static void main (String[] args) 
    {

        // Get the default toolkit
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        // Get the current screen size 
        Dimension scrnsize = toolkit.getScreenSize();
        int scrnWidth= (int)scrnsize.getWidth();
        int scrnHeight = (int) scrnsize.getHeight();

        JFrame J= new JFrame();
        JPanel jP = new JPanel();
        J.setContentPane(jP);
        J.setSize(scrnWidth, scrnHeight);
        jP.setBackground(Color.white);
        jP.setBounds(0,0,scrnWidth,scrnHeight);
        int xPercent= 50;
        int yPercent = 50;
        int widthPercent=50;
        int heightPercent=43;
        jP.setLayout(null);
        jP.setSize(scrnWidth, scrnHeight);
        mockTest b= new mockTest();


        jP.add(b);
        b.setBounds(new Rectangle((int)(scrnWidth*((double)xPercent/100)),(int)(scrnHeight*((double)yPercent/100)),(int)(scrnWidth*((double)widthPercent/100)),(int)(scrnHeight*((double)heightPercent/100))));
        J.setUndecorated(true);
        J.setVisible(true);




    }

共有1个答案

蒙勇
2023-03-14

不要使用null布局;让布局管理器完成这项工作。JPanel的默认布局是FlowLayout,它会忽略后续更改。在下面的例子中,

>

避免不必要的嵌套面板。

使用setExtendedState()最大化帧。

如有必要,使用此处建议的方法之一更改图表的初始大小。

如果您选择更改Font,请使用eriveFont()来避免用户所选设置中的突然差异。

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

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


    public void display() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < 12; i++) {
            dataset.addValue(i, "Time", "Hours" + String.valueOf(i + 1));
        }
        CategoryPlot plot = new CategoryPlot();
        CategoryItemRenderer renderer = new BarRenderer();
        plot.setDataset(0, dataset);
        plot.setRenderer(0, renderer);
        CategoryAxis domainAxis = new CategoryAxis("Time");
        NumberAxis rangeAxis = new NumberAxis("Value");
        plot.setDomainAxis(0, domainAxis);
        plot.setRangeAxis(rangeAxis);
        JFreeChart chart = new JFreeChart(plot);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setLayout(new GridLayout());

        JFrame f = new JFrame();
        f.add(chartPanel);
        f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        f.setUndecorated(true);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}
 类似资料:
  • 问题内容: 我有一个始终从x = 0开始的JFree XY折线图。然后,根据属性文件中用户定义的设置,应用程序将根据该数字(以分钟为单位)递增。 例如,x = 0开始时,用户定义的设置为5,因此刻度变为0、5、10、15、20…,或者用户设置为3,因此变为0、3、6、9、12…非常简单。 我遇到的问题是图表开始的方式。如果我从0开始,则0在图形的中间,而不是在左下角的-0.0000005,-0.0

  • 我需要移动轴中所有刻度线的标签(),使文本位于其自己的刻度线和下一个刻度线的中间。 我正在使用Roland的甘特图控件(经过一些修改)和Christian Schudt的DateAxis作为我的X轴。我的目标是根据Date值绘制甘特图(忽略时间;所有时间值都被截断)。 我的甘特图对每个任务都有一个“开始日期”和“结束日期”(即在图表上,它由一个条形图表示)。 考虑一下: 我有一个从2月1日开始的任

  • 使用jfreechart fx渲染带有垂直刻度标签的时间序列图表时,标签意外地与域轴重叠,有时在调整大小时会发生更改。我无法用Swing或纯Java2D重现这一点,如图所示。我欢迎任何指导。

  • 我希望能够为从Pandas时间序列对象绘制的时间序列图设置主要和次要XTICK及其标签。 熊猫0.9“最新信息”页面显示: “您可以使用来_pydatetime或注册时间戳类型的转换器” 但是我不知道如何使用matplotlib

  • 我正在利用SDSS(斯隆数字天空测量)的数据来绘制和分析恒星的光谱。为此,我从他们的网站下载了一个.csv文件,从中提取每一行及其数据,然后绘制这些数据。数据的格式是波长、通量、最佳拟合、天空通量,但我只对波长和最佳拟合感兴趣。我只是想提一下,这样我的代码就更有意义了。我试着每10个和100个数据点运行一次,但我无法解决我的问题。任何帮助都将不胜感激。SDSS网站上有一张想要的结果图,我将其粘贴在

  • 我正在尝试修复python如何绘制数据。 说 和 然后我会做: x轴的刻度以5为间隔绘制。有没有办法让它显示1的间隔?