दिलचस्प पोस्ट
iFrameExtractor के लिए ffmpeg संकलित करने की समस्या क्या आईडी का संग्रह ADO.NET SQL पैरामीटर के रूप में भेजना संभव है? सिंगलटन इंस्टेंस को गेटइंस्टेंस विधि के स्थिर वैरिएबल के रूप में घोषित किया गया सी में शून्य स्टेटमेंट का उपयोग बिल्टिन प्रकारों के विनाशक (इंट, चार आदि ..) Mercurial और Git के बीच अंतर क्या है? एनपी, एनपी-पूर्ण और एनपी-हार्ड के बीच अंतर क्या हैं? मोंगोडीबी: अप-डॉक्यूमेंट अपस्टेशन रजिस्ट्री Watcher सी # एक वेबफ़ॉर्म के अंदर एक आंशिक दृश्य कैसे शामिल करें एसक्यूएल में, आप श्रेणियों में "समूह" कैसे कर सकते हैं? Entity Framework 6 का उपयोग कर रिकॉर्ड कैसे अपडेट करें? स्प्रिंग फ्रेमवर्क 4.1 का उपयोग करते हुए YAML फाइलों को लोड करने के लिए YamlPropertiesFactoryBean का उपयोग कैसे करें? HTTP अनुरोध विधि का क्लाइंट साइड डिटेक्शन हल्के वजन विकल्प सीतनिद्रा में होना करने के लिए?

जावा में एक सरल रेखा का ग्राफ आकर्षित करना

मेरे कार्यक्रम में मैं एक साधारण स्कोर लाइन ग्राफ आकर्षित करना चाहता हूं। मेरे पास एक पाठ फ़ाइल है और प्रत्येक पंक्ति पर एक पूर्णांक स्कोर है, जिसे मैं पढ़ता हूं और मेरे ग्राफ़ क्लास के तर्क के रूप में पार करना चाहता हूं। मुझे ग्राफ़ क्लास को लागू करने में कुछ परेशानी हो रही है और मैंने जो भी उदाहरण देखा है, उनके तरीकों को उसी श्रेणी में उनके मुख्य रूप से है, जो मुझे नहीं होगा।

मैं ऑब्जेक्ट को मेरी सरणी को पास करने और एक ग्राफ तैयार करने में सक्षम होना चाहता हूं, लेकिन जब मेरी पेंट पद्धति को बुलाते हैं तो यह मुझे ग्राफिक्स के लिए पूछ रहा है … यह मेरे पास इतनी दूर है:

public class Graph extends JPanel { public void paintGraph (Graphics g){ ArrayList<Integer> scores = new ArrayList<Integer>(10); Random r = new Random(); for (int i : scores){ i = r.nextInt(20); System.out.println(r); } int y1; int y2; for (int i = 0; i < scores.size(); i++){ y1 = scores.get(i); y2 = scores.get(i+1); g.drawLine(i, y1, i+1, y2); } } } 

अब के लिए मैंने अपनी सरणी को भरने के लिए एक सरल यादृच्छिक संख्या जनरेटर डाला है।

मेरे पास एक मौजूदा फ्रेम है और मूल रूप से ग्राफ़ वर्ग को इन्स्तांत करना और पैनल को मेरे फ्रेम पर माउंट करना चाहते हैं मुझे सच में खेद है कि यह प्रश्न इस तरह से गड़बड़ हो रहा है, लेकिन मुझे थोड़ा सो रहा था …

मेरे मुख्य बयान में कोड है:

 testFrame = new JFrame(); testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Graph graph = new Graph(); testFrame.add(graph); 

मुझे यकीन नहीं है कि वास्तव में एसएससीई क्या है, लेकिन यह मेरा एक प्रयास है:

 public class Test { JFrame testFrame; public Test() { testFrame = new JFrame(); testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Graph graph = new Graph(); testFrame.add(graph); testFrame.setBounds(100, 100, 764, 470); testFrame.setVisible(true); } 

Graph.java

 public class Graph extends JPanel { public Graph() { setSize(500, 500); } @Override public void paintComponent(Graphics g) { Graphics2D gr = (Graphics2D) g; // This is if you want to use Graphics2D // Now do the drawing here ArrayList<Integer> scores = new ArrayList<Integer>(10); Random r = new Random(); for (int i : scores) { i = r.nextInt(20); System.out.println(r); } int y1; int y2; for (int i = 0; i < scores.size() - 1; i++) { y1 = (scores.get(i)) * 10; y2 = (scores.get(i + 1)) * 10; gr.drawLine(i * 10, y1, (i + 1) * 10, y2); } } } 

Solutions Collecting From Web of "जावा में एक सरल रेखा का ग्राफ आकर्षित करना"

अपने कोड और सुझावों के साथ समस्याएं:

  • फिर आपको घटक के पसंदीदा सिज़ाइन को बदलना होगा (यहां ग्राफ़ जेननेल), आकार नहीं
  • JFrame की सीमा निर्धारित न करें।
  • अपने जेफ्रैम पर घटकों को जोड़ने और सेट अप करने योग्य (सत्य) कॉल करने से पहले कॉल pack() )
  • आपका अग्रेक लूप आपके ऐरेलिस्ट के आकार के 0 से काम नहीं करेगा (यह जांचने के लिए जांचें कि यह सही है)। इसके बजाय 0 से 10 तक जा रहे लूप का उपयोग करें
  • आपको अपने पेंट paintComponent(...) अंदर प्रोग्राम लॉजिक नहीं होना चाहिए, लेकिन केवल पेंटिंग कोड इसलिए मैं ArrayList को एक वर्ग वैरिएबल बनाऊंगा और उसे कक्षा के निर्माता के अंदर भर दूंगा।

उदाहरण के लिए:

 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.*; @SuppressWarnings("serial") public class DrawGraph extends JPanel { private static final int MAX_SCORE = 20; private static final int PREF_W = 800; private static final int PREF_H = 650; private static final int BORDER_GAP = 30; private static final Color GRAPH_COLOR = Color.green; private static final Color GRAPH_POINT_COLOR = new Color(150, 50, 50, 180); private static final Stroke GRAPH_STROKE = new BasicStroke(3f); private static final int GRAPH_POINT_WIDTH = 12; private static final int Y_HATCH_CNT = 10; private List<Integer> scores; public DrawGraph(List<Integer> scores) { this.scores = scores; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); double xScale = ((double) getWidth() - 2 * BORDER_GAP) / (scores.size() - 1); double yScale = ((double) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE - 1); List<Point> graphPoints = new ArrayList<Point>(); for (int i = 0; i < scores.size(); i++) { int x1 = (int) (i * xScale + BORDER_GAP); int y1 = (int) ((MAX_SCORE - scores.get(i)) * yScale + BORDER_GAP); graphPoints.add(new Point(x1, y1)); } // create x and y axes g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, BORDER_GAP, BORDER_GAP); g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, getWidth() - BORDER_GAP, getHeight() - BORDER_GAP); // create hatch marks for y axis. for (int i = 0; i < Y_HATCH_CNT; i++) { int x0 = BORDER_GAP; int x1 = GRAPH_POINT_WIDTH + BORDER_GAP; int y0 = getHeight() - (((i + 1) * (getHeight() - BORDER_GAP * 2)) / Y_HATCH_CNT + BORDER_GAP); int y1 = y0; g2.drawLine(x0, y0, x1, y1); } // and for x axis for (int i = 0; i < scores.size() - 1; i++) { int x0 = (i + 1) * (getWidth() - BORDER_GAP * 2) / (scores.size() - 1) + BORDER_GAP; int x1 = x0; int y0 = getHeight() - BORDER_GAP; int y1 = y0 - GRAPH_POINT_WIDTH; g2.drawLine(x0, y0, x1, y1); } Stroke oldStroke = g2.getStroke(); g2.setColor(GRAPH_COLOR); g2.setStroke(GRAPH_STROKE); for (int i = 0; i < graphPoints.size() - 1; i++) { int x1 = graphPoints.get(i).x; int y1 = graphPoints.get(i).y; int x2 = graphPoints.get(i + 1).x; int y2 = graphPoints.get(i + 1).y; g2.drawLine(x1, y1, x2, y2); } g2.setStroke(oldStroke); g2.setColor(GRAPH_POINT_COLOR); for (int i = 0; i < graphPoints.size(); i++) { int x = graphPoints.get(i).x - GRAPH_POINT_WIDTH / 2; int y = graphPoints.get(i).y - GRAPH_POINT_WIDTH / 2;; int ovalW = GRAPH_POINT_WIDTH; int ovalH = GRAPH_POINT_WIDTH; g2.fillOval(x, y, ovalW, ovalH); } } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } private static void createAndShowGui() { List<Integer> scores = new ArrayList<Integer>(); Random random = new Random(); int maxDataPoints = 16; int maxScore = 20; for (int i = 0; i < maxDataPoints ; i++) { scores.add(random.nextInt(maxScore)); } DrawGraph mainPanel = new DrawGraph(scores); JFrame frame = new JFrame("DrawGraph"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

जो ऐसा ग्राफ दिखाएगा जो ऐसा दिखता है: यहां छवि विवरण दर्ज करें

बस एल्स के समाधान से होवरक्राफ्ट का पूरक:

मैंने अपने कोड को फिर से शुरू किया, यह थोड़ा सा छू लिया, एक ग्रिड, अक्ष लेबल जोड़ने और अब वाई-अक्ष न्यूनतम मूल्य से अधिकतम मूल्य तक बढ़ जाता है। मैंने कुछ गेटर्स / सेटर्स जोड़ने पर योजना बनाई थी लेकिन मुझे उनकी ज़रूरत नहीं थी, अगर आप चाहें तो उन्हें जोड़ सकते हैं

यहां गिट लिंक है, मैं नीचे दिए गए कोड को भी पेस्ट कर दूंगा : GraphPanel on Gist

 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class GraphPanel extends JPanel { private int width = 800; private int heigth = 400; private int padding = 25; private int labelPadding = 25; private Color lineColor = new Color(44, 102, 230, 180); private Color pointColor = new Color(100, 100, 100, 180); private Color gridColor = new Color(200, 200, 200, 200); private static final Stroke GRAPH_STROKE = new BasicStroke(2f); private int pointWidth = 4; private int numberYDivisions = 10; private List<Double> scores; public GraphPanel(List<Double> scores) { this.scores = scores; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); double xScale = ((double) getWidth() - (2 * padding) - labelPadding) / (scores.size() - 1); double yScale = ((double) getHeight() - 2 * padding - labelPadding) / (getMaxScore() - getMinScore()); List<Point> graphPoints = new ArrayList<>(); for (int i = 0; i < scores.size(); i++) { int x1 = (int) (i * xScale + padding + labelPadding); int y1 = (int) ((getMaxScore() - scores.get(i)) * yScale + padding); graphPoints.add(new Point(x1, y1)); } // draw white background g2.setColor(Color.WHITE); g2.fillRect(padding + labelPadding, padding, getWidth() - (2 * padding) - labelPadding, getHeight() - 2 * padding - labelPadding); g2.setColor(Color.BLACK); // create hatch marks and grid lines for y axis. for (int i = 0; i < numberYDivisions + 1; i++) { int x0 = padding + labelPadding; int x1 = pointWidth + padding + labelPadding; int y0 = getHeight() - ((i * (getHeight() - padding * 2 - labelPadding)) / numberYDivisions + padding + labelPadding); int y1 = y0; if (scores.size() > 0) { g2.setColor(gridColor); g2.drawLine(padding + labelPadding + 1 + pointWidth, y0, getWidth() - padding, y1); g2.setColor(Color.BLACK); String yLabel = ((int) ((getMinScore() + (getMaxScore() - getMinScore()) * ((i * 1.0) / numberYDivisions)) * 100)) / 100.0 + ""; FontMetrics metrics = g2.getFontMetrics(); int labelWidth = metrics.stringWidth(yLabel); g2.drawString(yLabel, x0 - labelWidth - 5, y0 + (metrics.getHeight() / 2) - 3); } g2.drawLine(x0, y0, x1, y1); } // and for x axis for (int i = 0; i < scores.size(); i++) { if (scores.size() > 1) { int x0 = i * (getWidth() - padding * 2 - labelPadding) / (scores.size() - 1) + padding + labelPadding; int x1 = x0; int y0 = getHeight() - padding - labelPadding; int y1 = y0 - pointWidth; if ((i % ((int) ((scores.size() / 20.0)) + 1)) == 0) { g2.setColor(gridColor); g2.drawLine(x0, getHeight() - padding - labelPadding - 1 - pointWidth, x1, padding); g2.setColor(Color.BLACK); String xLabel = i + ""; FontMetrics metrics = g2.getFontMetrics(); int labelWidth = metrics.stringWidth(xLabel); g2.drawString(xLabel, x0 - labelWidth / 2, y0 + metrics.getHeight() + 3); } g2.drawLine(x0, y0, x1, y1); } } // create x and y axes g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, padding + labelPadding, padding); g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, getWidth() - padding, getHeight() - padding - labelPadding); Stroke oldStroke = g2.getStroke(); g2.setColor(lineColor); g2.setStroke(GRAPH_STROKE); for (int i = 0; i < graphPoints.size() - 1; i++) { int x1 = graphPoints.get(i).x; int y1 = graphPoints.get(i).y; int x2 = graphPoints.get(i + 1).x; int y2 = graphPoints.get(i + 1).y; g2.drawLine(x1, y1, x2, y2); } g2.setStroke(oldStroke); g2.setColor(pointColor); for (int i = 0; i < graphPoints.size(); i++) { int x = graphPoints.get(i).x - pointWidth / 2; int y = graphPoints.get(i).y - pointWidth / 2; int ovalW = pointWidth; int ovalH = pointWidth; g2.fillOval(x, y, ovalW, ovalH); } } // @Override // public Dimension getPreferredSize() { // return new Dimension(width, heigth); // } private double getMinScore() { double minScore = Double.MAX_VALUE; for (Double score : scores) { minScore = Math.min(minScore, score); } return minScore; } private double getMaxScore() { double maxScore = Double.MIN_VALUE; for (Double score : scores) { maxScore = Math.max(maxScore, score); } return maxScore; } public void setScores(List<Double> scores) { this.scores = scores; invalidate(); this.repaint(); } public List<Double> getScores() { return scores; } private static void createAndShowGui() { List<Double> scores = new ArrayList<>(); Random random = new Random(); int maxDataPoints = 40; int maxScore = 10; for (int i = 0; i < maxDataPoints; i++) { scores.add((double) random.nextDouble() * maxScore); // scores.add((double) i); } GraphPanel mainPanel = new GraphPanel(scores); mainPanel.setPreferredSize(new Dimension(800, 600)); JFrame frame = new JFrame("DrawGraph"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

यह इस तरह दिख रहा है: उदाहरण तस्वीर

या बस जेफ्रीचर्ट लाइब्रेरी का उपयोग करें – http://www.jfree.org/jfreechart/

कई ओपन सोर्स प्रोजेक्ट मौजूद हैं जो आपके लिए लाइन चार्ट्स की सभी रेखाओं को कोड की कुछ लाइनों से संभालते हैं। यहां बताया गया है कि आप XChart लाइब्रेरी के साथ द्वि पाठ ( CSV ) फ़ाइल में डेटा से रेखा चार्ट कैसे आकर्षित कर सकते हैं। अस्वीकरण: मैं परियोजना का प्रमुख विकासक हूं।

इस उदाहरण में, दो पाठ फ़ाइलें मौजूद हैं ./CSV/CSVChartRows/ ध्यान दें कि फाइल में प्रत्येक पंक्ति एक डेटा बिंदु को साजिश रची जाती है और प्रत्येक फ़ाइल एक अलग श्रृंखला का प्रतिनिधित्व करती है। series1 में x , y , और error bar डेटा शामिल है, जबकि series2 में केवल x और y डेटा शामिल होता है।

series1.csv

 1,12,1.4 2,34,1.12 3,56,1.21 4,47,1.5 

series2.csv

 1,56 2,34 3,12 4,26 

सोर्स कोड

 public class CSVChartRows { public static void main(String[] args) throws Exception { // import chart from a folder containing CSV files XYChart chart = CSVImporter.getChartFromCSVDir("./CSV/CSVChartRows/", DataOrientation.Rows, 600, 400); // Show it new SwingWrapper(chart).displayChart(); } } 

परिणामस्वरूप प्लॉट

यहां छवि विवरण दर्ज करें

अपने पैनल की पेंट कॉमोनेंट विधि को ओवरराइड करें ताकि आप कस्टम ड्रॉ कर सकें। इस कदर:

 @Override public void paintComponent(Graphics g) { Graphics2D gr = (Graphics2D) g; //this is if you want to use Graphics2D //now do the drawing here ... } 

ईल्स के उत्तर से भरा होवरक्राफ्ट बहुत अच्छा है, लेकिन मुझे इसे अपने कार्यक्रम पर काम करने के लिए थोड़ा बदलना पड़ा:

 int y1 = (int) ((this.height - 2 * BORDER_GAP) - (values.get(i) * yScale - BORDER_GAP)); 

के बजाय

 int y1 = (int) (scores.get(i) * yScale + BORDER_GAP); 

क्योंकि अगर मैं अपने रास्ते का इस्तेमाल किया तो ग्राफिक उल्टा होगा

(आप इसे देखेंगे यदि आप यादृच्छिक मूल्यों के बजाय हार्डकोड मूल्यों (जैसे 1,3,5,7,9) का उपयोग करते हैं)