0

I have like total of 500 array list in my program as HashMap and want to generate graph for each list (500 graphs in total). I used the below code to draw a single graph..

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 javax.swing.*;

@SuppressWarnings("serial")
public class DrawGraph extends JPanel {
   private static final int PREF_W = 1000;
   private static final int PREF_H = 800;
   private static final int BORDER_GAP = 25;
   private static final int PADDING = 25;
   private static final Color GRAPH_COLOR = Color.green;
   private static final Color GRAPH_POINT_COLOR = new Color(100, 100, 100, 180);
   private static final Color GRID_COLOR = new Color(200, 200, 200, 200);
   private static final Stroke GRAPH_STROKE = new BasicStroke(3f);
   private static final int GRAPH_POINT_WIDTH = 4;
   private static final int Y_HATCH_CNT = 10;
   private List<Double> scores;

   public DrawGraph(List<Double> scores2) {
      this.scores = scores2;
   }

   @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)-PADDING) / (scores.size() - 1);
      double yScale = ((double) getHeight() - (2 * BORDER_GAP)-PADDING) / (getMaxScore() - getMinScore());

      List<Point> graphPoints = new ArrayList<Point>();
      for (int i = 0; i < scores.size(); i++) {
         int x1 = (int) (i * xScale + BORDER_GAP + PADDING);
         int y1 = (int) ((getMaxScore() - scores.get(i)) * yScale + BORDER_GAP);
         graphPoints.add(new Point(x1, y1));
      }

      g2.setColor(Color.WHITE);
      g2.fillRect(BORDER_GAP + PADDING, BORDER_GAP, getWidth() - (2 * BORDER_GAP) - PADDING, getHeight() - 2 * BORDER_GAP - PADDING);
      g2.setColor(Color.BLACK);

      g2.drawLine(BORDER_GAP + PADDING, getHeight() - BORDER_GAP - PADDING, BORDER_GAP + PADDING, BORDER_GAP);
      g2.drawLine(BORDER_GAP + PADDING, getHeight() - BORDER_GAP - PADDING, getWidth() - BORDER_GAP, getHeight() - BORDER_GAP - PADDING);

      for (int i = 0; i < Y_HATCH_CNT + 1; i++) {
          int x0 = BORDER_GAP + PADDING;
          int x1 = GRAPH_POINT_WIDTH + BORDER_GAP + PADDING;
          int y0 = getHeight() - ((i * (getHeight() - BORDER_GAP * 2 - PADDING)) / Y_HATCH_CNT + BORDER_GAP + PADDING);
          int y1 = y0;
          if (scores.size() > 0) {
              g2.setColor(GRID_COLOR);
              g2.drawLine(BORDER_GAP + PADDING + 1 + GRAPH_POINT_WIDTH, y0, getWidth() - BORDER_GAP, y1);
              g2.setColor(Color.BLACK);
              String yLabel = ((int) ((getMinScore() + (getMaxScore() - getMinScore()) * ((i * 1.0) / Y_HATCH_CNT)) * 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);
      }

      for (int i = 0; i < scores.size(); i++) {
          if (scores.size() > 1) {
              int x0 = i * (getWidth() - BORDER_GAP * 2 - PADDING) / (scores.size() - 1) + BORDER_GAP + PADDING;
              int x1 = x0;
              int y0 = getHeight() - BORDER_GAP - PADDING;
              int y1 = y0 - GRAPH_POINT_WIDTH;
              if ((i % ((int) ((scores.size() / 20.0)) + 1)) == 0) {
                  g2.setColor(GRID_COLOR);
                  g2.drawLine(x0, getHeight() - BORDER_GAP - PADDING - 1 - GRAPH_POINT_WIDTH, x1, BORDER_GAP);
                  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);
          }
      }

      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 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 static void createAndShowGui(ArrayList<Double> scores, String s) {
      DrawGraph mainPanel = new DrawGraph(scores);

      JFrame frame = new JFrame(s);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String args[]) {
       final ArrayList<Double> inputValues = new ArrayList<Double>();
       // Read input values from text document and store in ArrayList
       SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                DrawGraph.createAndShowGui(inputValues, "MyGraphTitle");
             }
          });
   }
}

When i provided 20 sample array list as input it plot and displays 20 graphs correctly..But i want to save the graph as an image in my system without displaying it as a separate window since when plotting 500 graphs i dont want to open 500 windows. Is there any option to save the graph as image after plotting it.? I checked few methods online but im not sure how to integrate the saving as image code with this particular graph generation code that uses 2D Graphics.

Mano Prathibhan C
  • 488
  • 1
  • 11
  • 38
  • If you can display it on the screen (ie any `Component` or a `SpecialPrint` ... you probably don't need to worry about the latter), you can print it with this: https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/print/StandardPrint.java NOTE: You do not actually have to display the Component on the screen - it can still work if you create your Component but never display it – ControlAltDel Sep 14 '16 at 13:17
  • The posted [code](http://stackoverflow.com/a/39490801/230513) seems to be going around. Are you in the same class? – trashgod Sep 14 '16 at 14:23
  • @trashgod the posted code is working good for me. actually i call the runnable method from another java class and not within the main method of this class..i just want to save the graph as image instead of displaying it in new popup window frame – Mano Prathibhan C Sep 14 '16 at 14:30
  • Check out this tutorial: http://www.java2s.com/Tutorials/Java/Graphics_How_to/Image/Save_a_Generated_Graphic_to_a_PNG_or_JPEG_File.htm – Amber Sep 14 '16 at 14:44
  • @Amber yes i checked this but im not sure where or how to add the line createGraphics().. i tried adding that in my code and it only generate empty image files..im still trying – Mano Prathibhan C Sep 14 '16 at 14:55
  • When I ran your code I actually got an empty graph. But once your get your graph to draw, you can call BufferedImage.createGraphics() (as shown in the tutorial) and pass the returned Graphics2D object into your paintComponent method. – Amber Sep 14 '16 at 15:13
  • @ManoUncharted: The non-attributed [copy](http://stackoverflow.com/a/39490801/230513) includes such code. – trashgod Sep 15 '16 at 02:24

0 Answers0