سؤال

حسنا, أنا أعرف عن JFreeChart وغيرها, ولكن أنا الترميز بلدي بسيطة الرسم البياني المبعثر.لقد حصلت على مربع الرسم البياني أسفل (دون y-axis التسميات ولكن هذا لا ينبغي أن يكون مشكلة كبيرة عندما كنت أشرح ذلك في التقرير).

لدي الأساسية الرسم البياني المبعثر الدرجة ، ومع ذلك حاولت تغيير بحيث يمكنني أن أضيف في مختلف مبعثر القيم.

يعمل ولكنه لا يقبل إلا أول مبعثر مجموعة و لا رسم بقية.على الرغم من أنه لا يوجه أول مبعثر مجموعة في الماضي مبعثر مجموعة اللون...حتى انها شبه العامل.

هنا هو بلدي كامل ScatterPanel الدرجة:

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.يعمل وتوجه مبعثر على ما يرام, ولكن لم يلفت ذلك مع مختلف النقاط الملونة و توجه الأحمر "مبعثر" في اللون الأزرق.

هتافات الرجال.

P. S.أنا أعرف أنني لم يكن لديك أي رمز أن يرسم خط منحن من خلال مبعثر بعد, سأعمل على ذلك بعد أن أنهي هذا الجزء =)

هل كانت مفيدة؟

المحلول

scatter_values[] سوف تحتوي على مؤشر إلى صفائف scat_size و scat_times.أنت تغير القيم في هذه المصفوفات ، وبالتالي فإن التغيير سوف تنطبق على جميع البنود في scatter_values مجموعة.وبالتالي فإنه سوف يوجه 3 الرسم البياني ثلاث مرات على رأس كل منهما الآخر.

تحتاج إلى إضافة بعدا المصفوفات:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top