自動で最適なグラフをつくる

DrawRectGを改良

ウインドウの大きさが400x300ですから、データが300以上になる場合はグラフのスケールを調整しなければなりません。これを自動で行うようにします。また、データの数が増えたときも対応できるようにします。

ウインドウの大きさが400x300でない場合も最小限の変更でよいようにします。

棒グラフの課題

ファイル名 DrawRectG2.java

import java.awt.*;
import javax.swing.*;

public class DrawRectG2 extends JFrame{
    public DrawRectG2() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("グラフ");
        setLayout(new BorderLayout());
        MyPanel mypnl = new MyPanel();
        add(mypnl, BorderLayout.CENTER);
        mypnl.setBackground(Color.white);
        mypnl.setPreferredSize(new Dimension(400,300));
        pack();
        setVisible(true);
    }
    public static void main(String[] args){
        DrawRectG2 myframe = new DrawRectG2();
    }


    public class MyPanel extends JPanel{
      double[] data={100, 40.5, 520, 360.4, 480.8, 250, 40, 82};
      double max = 600;
      Color c  = new Color(0,0,0);
      Color cf = new Color(128,128,128);
      public void paintComponent(Graphics myg){
         super.paintComponent(myg);
         
         int pw = 400;   //パネルの幅
         int ph = 300;   //パネルの高さ
         int yzero= ph-50; //これだけマージンでなく位置
         int left  = 50;    //leftマージン
         int top   = 20;    //topマージン
         int right = 20;    //rightマージン
         int dx = (pw-left-right)/data.length; //1項目の幅
         double rate = (yzero-top)/max;   //値*rate→パネル上の値
         myg.setColor(c);
         myg.drawLine(left,yzero,left+dx*data.length,yzero); //x軸
         myg.drawLine(left,yzero,left,top); //y軸
         myg.setColor(cf);
         for(int i=0; data.length>i ; i++){
              int w = (int)(..??..) ;
              int h = (int)(data[i]*rate) ;
              int x = (int)(..??..) ;
              int y = .....??.... ;
              myg.fillRect(x,y,w,h);
         }
       }
    }
}

データの値が増えています。520でははみ出します。めんどうなので、データが越えない最大値をmaxとして設定します。

データの値がmaxのときに、パネル上の高さが(yzero-top)になるように、rateを設定します。

pw, ph はウインドウの大きさが400x300でない場合に、ここだけを直せばいいようにしたものです。(将来的には setPreferredSize の値で済ませます)

データ数も増えています。1項目の幅を計算しdxに設定しています。

..??..の部分はpw,ph,top,yzero,....などの変数や数値を使った計算式を入れなければなりません。下図を参考に x や w の値の関係をつかんでください。

棒グラフの課題

(int)はdoubleなどの値をintの変数に代入するために値を変換するために使っています。fillRectの引数がintでなければならないからです。

(int)(10.0/3.0)では値は3になります。(int)10.0/3.0では10/3.0になってしまうのでintになりません。

フレームのリサイズ

このプログラムではWindowをマウスで拡大したときグラフの大きさは変わらず、余白が広くなります。

棒グラフの課題

課題

1

上記プログラムをつくりなさい。

ファイル名 DrawRectG2.java


Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Oct.2009
Oct.2012