代码之家  ›  专栏  ›  技术社区  ›  dan2k3k4

具有多个“散点线”的散点图

  •  1
  • dan2k3k4  · 技术社区  · 15 年前

    好的,我知道JFreechart和其他一些,但我正在编写我自己的简单散点图。我已经有了一个方框图(没有Y轴标签,但当我在报告中解释它时,这不应该是一个大问题)。

    我有一个基本的散点图类,但是我试图改变它,以便添加不同的散点图值。

    它可以工作,但它只接受第一个散点阵列,而不绘制其余的阵列。虽然它确实用最后一个散射数组的颜色绘制了第一个散射数组…所以它是半工作的。

    这是我的全部散射面板类:

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Line2D;
    import javax.swing.JPanel;
    
    public class ScatterPanel extends JPanel {
        private TwoArray[] values;
        private String title;
        private String[] color_list;
    
        // Constructor for ScatterPanel
        public ScatterPanel(TwoArray[] v, String t, String[] c) {
            values = v;
            title = t;
            color_list = c;
        }
    
        /* This will paint the scatter chart
         * using the values from the above variables:
         * "values", "title" and "color_list"
         */
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
    
            // Initialize the titleFont
            Font titleFont = new Font("Verdana", Font.BOLD, 16);
            FontMetrics titleFontMetrics = g.getFontMetrics(titleFont);
    
            // Get the width of the JPanel
            Dimension d = getSize();
            int clientWidth = d.width;
            //int clientHeight = d.height;
    
            // Setup the title position and size
            int titleWidth = titleFontMetrics.stringWidth(title);
            int title_y = titleFontMetrics.getAscent();
            int title_x = (clientWidth - titleWidth) / 2;
    
            // Set the font for the title
            g.setFont(titleFont);
    
            // Draw the title
            g.drawString(title, title_x, title_y);
    
            // Initialise min and max display scale
            double min = -0.5;
            double max = 5;
    
            // Iterate through each different algorithm we are comparing
            for(int point = 0; point < values.length; point++) {
                // Iterate through each algorithm's size array and timing array
                for (int i = 0; i < values[point].array_time.length; i++) {
                    // Find the overall max and min for x and y
                    double x = (double) values[point].array_size[i];
                    double y = (double) values[point].array_time[i];
                    // Adjust max and min to include x and y.
                    if (x < min)
                        min = x - 0.5;
                    if (x > max)
                        max = x + 0.5;
                    if (y < min)
                        min = y - 0.5;
                    if (y > max)
                        max = y + 0.5;
                }
            }
    
            g2.translate(getWidth()/2,getHeight()/2);
            g2.scale(getWidth()/(max-min), -getHeight()/(max-min));
            g2.translate(-(max+min)/2, -(max+min)/2);
    
            // Horizontal size of a pixel in new coords.
            double pixelWidth = (max-min)/getWidth();
    
            // Vertical size of a pixel in new coord.
            double pixelHeight = (max-min)/getHeight();
    
            g2.setStroke(new BasicStroke(0));
    
            // Draw the x and y axis
            g2.setColor(Color.BLUE);
            g2.draw( new Line2D.Double(min,0,max,0));
            g2.draw( new Line2D.Double(0,min,0,max));
    
            for(int point = 0; point < values.length; point++) {
                if(point % 3 == 0)
                    g2.setColor(Color.decode(color_list[0]));
                else if(point % 3 == 1)
                    g2.setColor(Color.decode(color_list[4]));
                else if(point % 3 == 2)
                    g2.setColor(Color.decode(color_list[8]));
    
                for (int i = 0; i < values[point].array_time.length; i++) {
                    long x = values[point].array_size[i];
                    long y = values[point].array_time[i];
    
                    // Plot the x-y co-ords
                    g2.draw(new Line2D.Double(x-3*pixelWidth,y,x+3*pixelWidth,y));
                    g2.draw(new Line2D.Double(x,y-3*pixelHeight,x,y+3*pixelHeight));
                }
            }
        }
    }
    

    Twoarray只是用来存储两个长阵列。

    在我的主界面类中,我画了一个这样的散点图:

    for(int i = 0; i < scat_size.length; i++)
        scat_size[i] = i;
    
    for(int i = 0; i < scat_times.length; i++)
        scat_times[i] = i;
    
    // This should be 1,1 2,2 3,3 etc. in Red
    scatter_values[0] = new TwoArray(scat_size, scat_times);
    
    // Trying to test a large co-ord so this should be green
    scat_size[2] = 70;
    scat_times[2] = 20;
    scatter_values[1] = new TwoArray(scat_size, scat_times);
    
    // Trying to test another different co-ord so this should be blue
    scat_size[2] = 3;
    scat_times[2] = 7;
    scatter_values[2] = new TwoArray(scat_size, scat_times);
    
    myScatter = new ScatterPanel(scatter_values, scat_title, color_list);
    

    一个jpanel设置为myscatter。它可以很好地绘制散点图,但是它没有用不同的色点绘制,而是用蓝色绘制“红色散点图”。

    干杯。

    另外,我知道我还没有任何代码可以在散点图上画出一条曲线,我会在完成这一部分后再处理它。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Paul    15 年前

    scatter_values[]将包含指向数组scat_大小和scat_时间的指针。您正在更改这些数组中的值,因此更改将应用于散射值数组中的所有项。因此,它将在彼此的顶部绘制三次第三个图形。

    需要向数组中添加维度:

    for(int j = 0; j < 3; j++) {
        for(int i = 0; i < scat_size.length; i++)
            scat_size[j][i] = i;
    
        for(int i = 0; i < scat_times.length; i++)
            scat_times[j][i] = i;
    }
    
    // This should be 1,1 2,2 3,3 etc. in Red
    scatter_values[0] = new TwoArray(scat_size[0], scat_times[0]);
    
    // Trying to test a large co-ord so this should be green
    scat_size[1][2] = 70;
    scat_times[1][2] = 20;
    scatter_values[1] = new TwoArray(scat_size[1], scat_times[1]);
    
    // Trying to test another different co-ord so this should be blue
    scat_size[2][2] = 3;
    scat_times[2][2] = 7;
    scatter_values[2] = new TwoArray(scat_size[2], scat_times[2]);
    
    myScatter = new ScatterPanel(scatter_values, scat_title, color_list);