グラフの描画

-------------------------------main---------------------------------

/****************************/
/* グラフの描画             */
/*      coded by Y.Suganuma */
/****************************/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test {
	public static void main (String[] args)
	{
		Win win = new Win("グラフの描画");
	}
}

class Win extends JFrame implements ActionListener
{

	String title[];   // グラフ,x軸,及び,y軸のタイトル
	String g_title[];   // 凡例(グラフの内容)
	String x_title[];   // x軸への表示
	double x_scale[];   // x軸目盛り
	double y_scale[];   // y軸目盛り
	double data_x[][], data_y[][];   // データ
	JRadioButton c1, c2, c3, c4, c5, c6, c7, c8;

	/******************/
	/* コンストラクタ */
	/******************/
	Win(String name)
	{
					// JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// Windowの大きさ
		setSize(640, 270);
					// レイアウト,フォント,背景色
		Container cp = getContentPane();
		cp.setBackground(new Color(238, 255, 238));
		Font f = new Font("TimesRoman", Font.BOLD, 20);
					// ラジオボタン
		JPanel pn1 = new JPanel();
		pn1.setLayout(new GridLayout(4, 2, 5, 10));
		pn1.setBackground(new Color(238, 255, 238));
		cp.add(pn1, BorderLayout.CENTER);

		ButtonGroup gp = new ButtonGroup();
		c1 = new JRadioButton("棒グラフ");
		c1.setFont(f);
		c1.setBackground(new Color(238, 255, 238));
		gp.add(c1);
		pn1.add(c1);
		c2 = new JRadioButton("折れ線グラフ(1)");
		c2.setFont(f);
		c2.setBackground(new Color(238, 255, 238));
		gp.add(c2);
		pn1.add(c2);
		c3 = new JRadioButton("折れ線グラフ(2)");
		c3.setFont(f);
		c3.setBackground(new Color(238, 255, 238));
		gp.add(c3);
		pn1.add(c3);
		c4 = new JRadioButton("積み上げ棒グラフ");
		c4.setFont(f);
		c4.setBackground(new Color(238, 255, 238));
		gp.add(c4);
		pn1.add(c4);
		c5 = new JRadioButton("円グラフ");
		c5.setFont(f);
		c5.setBackground(new Color(238, 255, 238));
		gp.add(c5);
		pn1.add(c5);
		c6 = new JRadioButton("散布図");
		c6.setFont(f);
		c6.setBackground(new Color(238, 255, 238));
		gp.add(c6);
		pn1.add(c6);
		c7 = new JRadioButton("レーダーチャート");
		c7.setFont(f);
		c7.setBackground(new Color(238, 255, 238));
		gp.add(c7);
		pn1.add(c7);
		c8 = new JRadioButton("ボード線図(片対数グラフ)");
		c8.setFont(f);
		c8.setBackground(new Color(238, 255, 238));
		gp.add(c8);
		pn1.add(c8);
					// ボタン
		JPanel pn2 = new JPanel();
		pn2.setBackground(new Color(238, 255, 238));
		cp.add(pn2, BorderLayout.SOUTH);
		JButton bt = new JButton("描画");
		bt.setFont(f);
		bt.setBackground(Color.pink);
		bt.addActionListener(this);
		pn2.add(bt);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/******************************/
	/* 上,左,下,右の余白の設定 */
	/******************************/
	public Insets getInsets()
	{
		return new Insets(50, 20, 20, 20);
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}

	/******************************/
	/* ボタンが押されたときの処理 */
	/******************************/
	public void actionPerformed(ActionEvent e)
	{
					//
					// 棒グラフ
					//
		if (c1.isSelected()) {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [3];
			title[0] = "棒グラフの例";
			title[1] = "x軸タイトル";
			title[2] = "y軸タイトル";
						// 凡例(グラフの内容)
			g_title = new String [6];
			g_title[0] = "自己啓発";
			g_title[1] = "目的意識";
			g_title[2] = "国際感覚";
			g_title[3] = "実行力";
			g_title[4] = "創造力";
			g_title[5] = "交渉力・調整力・コミュニケーション";
						// x軸への表示
			x_title = new String [5];
			x_title[0] = "非常に重視する";
			x_title[1] = "やや重視する";
			x_title[2] = "普通";
			x_title[3] = "あまり考慮しない";
			x_title[4] = "全く考慮しない";
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = 0.0;   // 最小値
			y_scale[1] = 200.0;   // 最大値
			y_scale[2] = 50.0;   // 刻み幅
						// データ
			data_y = new double [6][5];
			data_y[0][0] = 114;
			data_y[0][1] = 146;
			data_y[0][2] = 40;
			data_y[0][3] = 0;
			data_y[0][4] = 0;
			data_y[1][0] = 144;
			data_y[1][1] = 130;
			data_y[1][2] = 24;
			data_y[1][3] = 0;
			data_y[1][4] = 1;
			data_y[2][0] = 10;
			data_y[2][1] = 56;
			data_y[2][2] = 160;
			data_y[2][3] = 36;
			data_y[2][4] = 15;
			data_y[3][0] = 179;
			data_y[3][1] = 100;
			data_y[3][2] = 21;
			data_y[3][3] = 0;
			data_y[3][4] = 0;
			data_y[4][0] = 101;
			data_y[4][1] = 141;
			data_y[4][2] = 46;
			data_y[4][3] = 0;
			data_y[4][4] = 1;
			data_y[5][0] = 131;
			data_y[5][1] = 104;
			data_y[5][2] = 60;
			data_y[5][3] = 1;
			data_y[5][4] = 0;
						// 作図
			BarGraph gp = new BarGraph(title, g_title, x_title, y_scale, 0, data_y, true, true);
		}
					//
					// 折れ線グラフ(1)
					//
		else if (c2.isSelected()) {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [3];
			title[0] = "折れ線グラフの例(1)";
			title[1] = "x軸タイトル";
			title[2] = "y軸タイトル";
						// 凡例(グラフの内容)
			g_title = new String [6];
			g_title[0] = "自己啓発";
			g_title[1] = "目的意識";
			g_title[2] = "国際感覚";
			g_title[3] = "実行力";
			g_title[4] = "創造力";
			g_title[5] = "交渉力・調整力・コミュニケーション";
						// x軸への表示
			x_title = new String [5];
			x_title[0] = "非常に重視する";
			x_title[1] = "やや重視する";
			x_title[2] = "普通";
			x_title[3] = "あまり考慮しない";
			x_title[4] = "全く考慮しない";
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = 0.0;   // 最小値
			y_scale[1] = 200.0;   // 最大値
			y_scale[2] = 50.0;   // 刻み幅
						// データ
			data_y = new double [6][5];
			data_y[0][0] = 114;
			data_y[0][1] = 146;
			data_y[0][2] = 40;
			data_y[0][3] = 0;
			data_y[0][4] = 0;
			data_y[1][0] = 144;
			data_y[1][1] = 130;
			data_y[1][2] = 24;
			data_y[1][3] = 0;
			data_y[1][4] = 1;
			data_y[2][0] = 10;
			data_y[2][1] = 56;
			data_y[2][2] = 160;
			data_y[2][3] = 36;
			data_y[2][4] = 15;
			data_y[3][0] = 179;
			data_y[3][1] = 100;
			data_y[3][2] = 21;
			data_y[3][3] = 0;
			data_y[3][4] = 0;
			data_y[4][0] = 101;
			data_y[4][1] = 141;
			data_y[4][2] = 46;
			data_y[4][3] = 0;
			data_y[4][4] = 1;
			data_y[5][0] = 131;
			data_y[5][1] = 104;
			data_y[5][2] = 60;
			data_y[5][3] = 1;
			data_y[5][4] = 0;
						// 作図
			LineGraph gp = new LineGraph(title, g_title, x_title, y_scale, 0, data_y, true, true);
		}
					//
					// 折れ線グラフ(2)
					//
		else if (c3.isSelected()) {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [3];
			title[0] = "折れ線グラフの例(2)";
			title[1] = "x軸タイトル";
			title[2] = "y軸タイトル";
						// 凡例(グラフの内容)
			g_title = new String [3];
			g_title[0] = "自己啓発";
			g_title[1] = "目的意識";
			g_title[2] = "国際感覚";
						// y軸目盛り
			x_scale = new double[3];
			x_scale[0] = 0.0;   // 最小値
			x_scale[1] = 100.0;   // 最大値
			x_scale[2] = 20.0;   // 刻み幅
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = 0.0;   // 最小値
			y_scale[1] = 200.0;   // 最大値
			y_scale[2] = 50.0;   // 刻み幅
						// データ
			data_x = new double [3][4];
			data_y = new double [3][4];
			data_x[0][0] = 0;
			data_x[0][1] = 14;
			data_x[0][2] = 40;
			data_x[0][3] = 100;
			data_x[1][0] = 0;
			data_x[1][1] = 30;
			data_x[1][2] = 34;
			data_x[1][3] = 100;
			data_x[2][0] = 0;
			data_x[2][1] = 56;
			data_x[2][2] = 60;
			data_x[2][3] = 100;
			data_y[0][0] = 179;
			data_y[0][1] = 100;
			data_y[0][2] = 21;
			data_y[0][3] = 0;
			data_y[1][0] = 101;
			data_y[1][1] = 141;
			data_y[1][2] = 46;
			data_y[1][3] = 10;
			data_y[2][0] = 131;
			data_y[2][1] = 104;
			data_y[2][2] = 60;
			data_y[2][3] = 100;
						// 作図
			LineGraph gp = new LineGraph(title, g_title, x_scale, 1, y_scale, 0, data_x, data_y, true, true);
		}
					//
					// 積み上げ棒グラフ
					//
		else if (c4.isSelected()) {
						// グラフのタイトル
			title = new String [3];
			title[0] = "積み上げ棒グラフの例(全体:300人)";
			title[1] = "x軸タイトル";
			title[2] = "y軸タイトル";
						// グラフの内容
			g_title = new String [21];
			g_title[0] = "自己啓発";
			g_title[1] = "目的意識";
			g_title[2] = "国際感覚";
			g_title[3] = "実行力";
			g_title[4] = "創造力";
			g_title[5] = "交渉力・調整力・コミュニケーション";
			g_title[6] = "情報収集力";
			g_title[7] = "プレゼンテーション能力";
			g_title[8] = "積極性・自主性・チャレンジ精神";
			g_title[9] = "柔軟性・協調性";
			g_title[10] = "好奇心・探求心";
			g_title[11] = "持続力・忍耐力";
			g_title[12] = "責任感";
			g_title[13] = "明朗さ";
			g_title[14] = "真面目さ";
			g_title[15] = "基礎学力(数学・物理等)";
			g_title[16] = "専門知識";
			g_title[17] = "専門技術";
			g_title[18] = "日本語(文章読解・文章作成)";
			g_title[19] = "英語";
			g_title[20] = "コンピュータ・情報処理";
						// 項目(凡例)
			x_title = new String [5];
			x_title[0] = "非常に重視する";
			x_title[1] = "やや重視する";
			x_title[2] = "普通";
			x_title[3] = "あまり考慮しない";
			x_title[4] = "全く考慮しない";
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = 0.0;   // 最小値
			y_scale[1] = 100.0;   // 最大値
			y_scale[2] = 20.0;   // 刻み幅
						// データ
			data_y = new double [21][5];
			data_y[0][0] = 114;
			data_y[0][1] = 146;
			data_y[0][2] = 40;
			data_y[0][3] = 0;
			data_y[0][4] = 0;
			data_y[1][0] = 144;
			data_y[1][1] = 130;
			data_y[1][2] = 24;
			data_y[1][3] = 0;
			data_y[1][4] = 1;
			data_y[2][0] = 10;
			data_y[2][1] = 56;
			data_y[2][2] = 160;
			data_y[2][3] = 36;
			data_y[2][4] = 15;
			data_y[3][0] = 179;
			data_y[3][1] = 100;
			data_y[3][2] = 21;
			data_y[3][3] = 0;
			data_y[3][4] = 0;
			data_y[4][0] = 101;
			data_y[4][1] = 141;
			data_y[4][2] = 46;
			data_y[4][3] = 0;
			data_y[4][4] = 1;
			data_y[5][0] = 131;
			data_y[5][1] = 104;
			data_y[5][2] = 60;
			data_y[5][3] = 1;
			data_y[5][4] = 0;
			data_y[6][0] = 55;
			data_y[6][1] = 122;
			data_y[6][2] = 107;
			data_y[6][3] = 5;
			data_y[6][4] = 1;
			data_y[7][0] = 43;
			data_y[7][1] = 95;
			data_y[7][2] = 132;
			data_y[7][3] = 13;
			data_y[7][4] = 3;
			data_y[8][0] = 215;
			data_y[8][1] = 75;
			data_y[8][2] = 11;
			data_y[8][3] = 0;
			data_y[8][4] = 0;
			data_y[9][0] = 115;
			data_y[9][1] = 142;
			data_y[9][2] = 41;
			data_y[9][3] = 0;
			data_y[9][4] = 0;
			data_y[10][0] = 87;
			data_y[10][1] = 139;
			data_y[10][2] = 61;
			data_y[10][3] = 2;
			data_y[10][4] = 1;
			data_y[11][0] = 116;
			data_y[11][1] = 141;
			data_y[11][2] = 39;
			data_y[11][3] = 0;
			data_y[11][4] = 1;
			data_y[12][0] = 172;
			data_y[12][1] = 107;
			data_y[12][2] = 23;
			data_y[12][3] = 0;
			data_y[12][4] = 1;
			data_y[13][0] = 106;
			data_y[13][1] = 122;
			data_y[13][2] = 67;
			data_y[13][3] = 2;
			data_y[13][4] = 1;
			data_y[14][0] = 115;
			data_y[14][1] = 107;
			data_y[14][2] = 68;
			data_y[14][3] = 3;
			data_y[14][4] = 1;
			data_y[15][0] = 43;
			data_y[15][1] = 116;
			data_y[15][2] = 121;
			data_y[15][3] = 12;
			data_y[15][4] = 3;
			data_y[16][0] = 44;
			data_y[16][1] = 104;
			data_y[16][2] = 124;
			data_y[16][3] = 13;
			data_y[16][4] = 7;
			data_y[17][0] = 41;
			data_y[17][1] = 99;
			data_y[17][2] = 125;
			data_y[17][3] = 16;
			data_y[17][4] = 8;
			data_y[18][0] = 32;
			data_y[18][1] = 98;
			data_y[18][2] = 150;
			data_y[18][3] = 6;
			data_y[18][4] = 3;
			data_y[19][0] = 9;
			data_y[19][1] = 48;
			data_y[19][2] = 158;
			data_y[19][3] = 50;
			data_y[19][4] = 17;
			data_y[20][0] = 46;
			data_y[20][1] = 106;
			data_y[20][2] = 128;
			data_y[20][3] = 13;
			data_y[20][4] = 1;

			int i1, i2;
			double s;
			for (i1 = 0; i1 < 21; i1++) {
				s = 0.0;
				for (i2 = 0; i2 < 5; i2++)
					s += data_y[i1][i2];
				for (i2 = 0; i2 < 5; i2++)
					data_y[i1][i2] = data_y[i1][i2] / s * 100.0;
			}
						// 作図
			StackGraph gp = new StackGraph(title, g_title, x_title, y_scale, 0, data_y, true);
		}
					//
					// 円グラフ
					//
		else if (c5.isSelected()) {
						// グラフのタイトル
			title = new String [1];
			title[0] = "円グラフの例(全体:277人)";
						// 凡例
			x_title = new String [5];
			x_title[0] = "非常に重視する";
			x_title[1] = "やや重視する";
			x_title[2] = "普通";
			x_title[3] = "あまり考慮しない";
			x_title[4] = "全く考慮しない";
						// データ
			data_y = new double [6][5];
			data_y[2][0] = 10;
			data_y[2][1] = 56;
			data_y[2][2] = 160;
			data_y[2][3] = 36;
			data_y[2][4] = 15;

			int i1;
			double s = 0.0;
			for (i1 = 0; i1 < 5; i1++)
				s += data_y[2][i1];
			for (i1 = 0; i1 < 5; i1++)
				data_y[2][i1] = data_y[2][i1] / s * 100.0;
						// 作図
			PieGraph gp = new PieGraph(title[0], x_title, data_y[2], true);
		}
					//
					// 散布図
					//
		else if (c6.isSelected()) {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [3];
			title[0] = "散布図の例";
			title[1] = "x軸タイトル";
			title[2] = "y軸タイトル";
						// y軸目盛り
			x_scale = new double[3];
			x_scale[0] = 0.0;   // 最小値
			x_scale[1] = 150.0;   // 最大値
			x_scale[2] = 30.0;   // 刻み幅
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = 0.0;   // 最小値
			y_scale[1] = 200.0;   // 最大値
			y_scale[2] = 50.0;   // 刻み幅
						// データ
			data_y = new double [2][10];
			data_y[0][0] = 11;
			data_y[0][1] = 146;
			data_y[0][2] = 40;
			data_y[0][3] = 70;
			data_y[0][4] = 100;
			data_y[0][5] = 120;
			data_y[0][6] = 50;
			data_y[0][7] = 130;
			data_y[0][8] = 80;
			data_y[0][9] = 130;
			data_y[1][0] = 17;
			data_y[1][1] = 170;
			data_y[1][2] = 21;
			data_y[1][3] = 80;
			data_y[1][4] = 140;
			data_y[1][5] = 100;
			data_y[1][6] = 80;
			data_y[1][7] = 190;
			data_y[1][8] = 60;
			data_y[1][9] = 180;
						// 作図
			ScatterDiagram gp = new ScatterDiagram(title, x_scale, y_scale, 0, 0, data_y, true);
		}
					//
					// レーダーチャート
					//
		else if (c7.isSelected()) {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [1];
			title[0] = "レーダーチャートの例";
						// 凡例(グラフの内容)
			g_title = new String [2];
			g_title[0] = "重要度";
			g_title[1] = "評価";
						// 項目
			x_title = new String [21];
			x_title[0] = "自己啓発";
			x_title[1] = "目的意識";
			x_title[2] = "国際感覚";
			x_title[3] = "実行力";
			x_title[4] = "創造力";
			x_title[5] = "交渉力・調整力・コミュニケーション";
			x_title[6] = "情報収集力";
			x_title[7] = "プレゼンテーション能力";
			x_title[8] = "積極性・自主性・チャレンジ精神";
			x_title[9] = "柔軟性・協調性";
			x_title[10] = "好奇心・探求心";
			x_title[11] = "持続力・忍耐力";
			x_title[12] = "責任感";
			x_title[13] = "明朗さ";
			x_title[14] = "真面目さ";
			x_title[15] = "基礎学力(数学・物理等)";
			x_title[16] = "専門知識";
			x_title[17] = "専門技術";
			x_title[18] = "日本語(文章読解・文章作成)";
			x_title[19] = "英語";
			x_title[20] = "コンピュータ・情報処理";
						// 目盛り
			y_scale = new double[3];
			y_scale[0] = 1.0;   // 最小値
			y_scale[1] = 5.0;   // 最大値
			y_scale[2] = 1.0;   // 刻み幅
						// データ
			data_y = new double [2][21];
			data_y[0][0] = 4.2;
			data_y[0][1] = 4.4;
			data_y[0][2] = 3.0;
			data_y[0][3] = 4.5;
			data_y[0][4] = 4.2;
			data_y[0][5] = 4.2;
			data_y[0][6] = 3.8;
			data_y[0][7] = 3.6;
			data_y[0][8] = 4.7;
			data_y[0][9] = 4.2;
			data_y[0][10] = 4.1;
			data_y[0][11] = 4.2;
			data_y[0][12] = 4.5;
			data_y[0][13] = 4.1;
			data_y[0][14] = 4.1;
			data_y[0][15] = 3.6;
			data_y[0][16] = 3.6;
			data_y[0][17] = 3.5;
			data_y[0][18] = 3.5;
			data_y[0][19] = 2.9;
			data_y[0][20] = 3.6;
			data_y[1][0] = 3.4;
			data_y[1][1] = 3.5;
			data_y[1][2] = 2.7;
			data_y[1][3] = 3.5;
			data_y[1][4] = 3.2;
			data_y[1][5] = 3.2;
			data_y[1][6] = 3.1;
			data_y[1][7] = 2.9;
			data_y[1][8] = 3.4;
			data_y[1][9] = 3.6;
			data_y[1][10] = 3.3;
			data_y[1][11] = 3.6;
			data_y[1][12] = 3.8;
			data_y[1][13] = 3.5;
			data_y[1][14] = 4.0;
			data_y[1][15] = 3.3;
			data_y[1][16] = 3.2;
			data_y[1][17] = 3.2;
			data_y[1][18] = 3.1;
			data_y[1][19] = 2.7;
			data_y[1][20] = 3.4;
						// 作図
			RadarChart gp = new RadarChart(title[0], g_title, x_title, y_scale, 1, data_y, true, true);
		}
					//
					// ボード線図(片対数グラフ)
					//
		else {
						// グラフ,x軸,及び,y軸のタイトル
			title = new String [3];
			title[0] = "ボード線図の例";
			title[1] = "角周波数";
			title[2] = "ゲイン(dB)";
						// 凡例(グラフの内容)
			g_title = new String [2];
			g_title[0] = "一次遅れ要素";
			g_title[1] = "二次遅れ要素";
						// x軸目盛り
			x_scale = new double[3];
			x_scale[0] = 0.01;   // 最小値
			x_scale[1] = 100.0;   // 最大値
			x_scale[2] = 1.0;   // 最大値
						// y軸目盛り
			y_scale = new double[3];
			y_scale[0] = -80.0;   // 最小値
			y_scale[1] = 20.0;   // 最大値
			y_scale[2] = 20.0;   // 刻み幅
						// データ
			data_x = new double [2][101];
			data_y = new double [2][101];
			data_x[0][0] = 0.01;
			data_x[0][1] = 0.0109647819614318;
			data_x[0][2] = 0.0120226443461741;
			data_x[0][3] = 0.013182567385564;
			data_x[0][4] = 0.0144543977074592;
			data_x[0][5] = 0.0158489319246111;
			data_x[0][6] = 0.0173780082874937;
			data_x[0][7] = 0.0190546071796325;
			data_x[0][8] = 0.0208929613085404;
			data_x[0][9] = 0.0229086765276777;
			data_x[0][10] = 0.0251188643150958;
			data_x[0][11] = 0.0275422870333817;
			data_x[0][12] = 0.0301995172040202;
			data_x[0][13] = 0.0331131121482591;
			data_x[0][14] = 0.0363078054770102;
			data_x[0][15] = 0.0398107170553498;
			data_x[0][16] = 0.0436515832240167;
			data_x[0][17] = 0.0478630092322639;
			data_x[0][18] = 0.0524807460249773;
			data_x[0][19] = 0.0575439937337158;
			data_x[0][20] = 0.0630957344480195;
			data_x[0][21] = 0.0691830970918938;
			data_x[0][22] = 0.0758577575029186;
			data_x[0][23] = 0.0831763771102673;
			data_x[0][24] = 0.0912010839355912;
			data_x[0][25] = 0.1;
			data_x[0][26] = 0.109647819614318;
			data_x[0][27] = 0.120226443461741;
			data_x[0][28] = 0.131825673855641;
			data_x[0][29] = 0.144543977074593;
			data_x[0][30] = 0.158489319246111;
			data_x[0][31] = 0.173780082874938;
			data_x[0][32] = 0.190546071796325;
			data_x[0][33] = 0.208929613085404;
			data_x[0][34] = 0.229086765276778;
			data_x[0][35] = 0.251188643150959;
			data_x[0][36] = 0.275422870333817;
			data_x[0][37] = 0.301995172040202;
			data_x[0][38] = 0.331131121482592;
			data_x[0][39] = 0.363078054770102;
			data_x[0][40] = 0.398107170553498;
			data_x[0][41] = 0.436515832240167;
			data_x[0][42] = 0.47863009232264;
			data_x[0][43] = 0.524807460249774;
			data_x[0][44] = 0.575439937337159;
			data_x[0][45] = 0.630957344480195;
			data_x[0][46] = 0.691830970918939;
			data_x[0][47] = 0.758577575029186;
			data_x[0][48] = 0.831763771102674;
			data_x[0][49] = 0.912010839355913;
			data_x[0][50] = 1;
			data_x[0][51] = 1.09647819614318;
			data_x[0][52] = 1.20226443461741;
			data_x[0][53] = 1.31825673855641;
			data_x[0][54] = 1.44543977074593;
			data_x[0][55] = 1.58489319246111;
			data_x[0][56] = 1.73780082874938;
			data_x[0][57] = 1.90546071796325;
			data_x[0][58] = 2.08929613085404;
			data_x[0][59] = 2.29086765276778;
			data_x[0][60] = 2.51188643150958;
			data_x[0][61] = 2.75422870333817;
			data_x[0][62] = 3.01995172040202;
			data_x[0][63] = 3.31131121482592;
			data_x[0][64] = 3.63078054770102;
			data_x[0][65] = 3.98107170553498;
			data_x[0][66] = 4.36515832240167;
			data_x[0][67] = 4.7863009232264;
			data_x[0][68] = 5.24807460249774;
			data_x[0][69] = 5.75439937337159;
			data_x[0][70] = 6.30957344480195;
			data_x[0][71] = 6.91830970918939;
			data_x[0][72] = 7.58577575029186;
			data_x[0][73] = 8.31763771102674;
			data_x[0][74] = 9.12010839355913;
			data_x[0][75] = 10;
			data_x[0][76] = 10.9647819614318;
			data_x[0][77] = 12.0226443461741;
			data_x[0][78] = 13.1825673855641;
			data_x[0][79] = 14.4543977074593;
			data_x[0][80] = 15.8489319246112;
			data_x[0][81] = 17.3780082874938;
			data_x[0][82] = 19.0546071796325;
			data_x[0][83] = 20.8929613085404;
			data_x[0][84] = 22.9086765276778;
			data_x[0][85] = 25.1188643150959;
			data_x[0][86] = 27.5422870333818;
			data_x[0][87] = 30.1995172040203;
			data_x[0][88] = 33.1131121482592;
			data_x[0][89] = 36.3078054770103;
			data_x[0][90] = 39.8107170553499;
			data_x[0][91] = 43.6515832240168;
			data_x[0][92] = 47.8630092322641;
			data_x[0][93] = 52.4807460249775;
			data_x[0][94] = 57.543993733716;
			data_x[0][95] = 63.0957344480196;
			data_x[0][96] = 69.183097091894;
			data_x[0][97] = 75.8577575029188;
			data_x[0][98] = 83.1763771102676;
			data_x[0][99] = 91.2010839355915;
			data_x[0][100] = 100;
			data_x[1][0] = 0.01;
			data_x[1][1] = 0.0109647819614318;
			data_x[1][2] = 0.0120226443461741;
			data_x[1][3] = 0.013182567385564;
			data_x[1][4] = 0.0144543977074592;
			data_x[1][5] = 0.0158489319246111;
			data_x[1][6] = 0.0173780082874937;
			data_x[1][7] = 0.0190546071796325;
			data_x[1][8] = 0.0208929613085404;
			data_x[1][9] = 0.0229086765276777;
			data_x[1][10] = 0.0251188643150958;
			data_x[1][11] = 0.0275422870333817;
			data_x[1][12] = 0.0301995172040202;
			data_x[1][13] = 0.0331131121482591;
			data_x[1][14] = 0.0363078054770102;
			data_x[1][15] = 0.0398107170553498;
			data_x[1][16] = 0.0436515832240167;
			data_x[1][17] = 0.0478630092322639;
			data_x[1][18] = 0.0524807460249773;
			data_x[1][19] = 0.0575439937337158;
			data_x[1][20] = 0.0630957344480195;
			data_x[1][21] = 0.0691830970918938;
			data_x[1][22] = 0.0758577575029186;
			data_x[1][23] = 0.0831763771102673;
			data_x[1][24] = 0.0912010839355912;
			data_x[1][25] = 0.1;
			data_x[1][26] = 0.109647819614318;
			data_x[1][27] = 0.120226443461741;
			data_x[1][28] = 0.131825673855641;
			data_x[1][29] = 0.144543977074593;
			data_x[1][30] = 0.158489319246111;
			data_x[1][31] = 0.173780082874938;
			data_x[1][32] = 0.190546071796325;
			data_x[1][33] = 0.208929613085404;
			data_x[1][34] = 0.229086765276778;
			data_x[1][35] = 0.251188643150959;
			data_x[1][36] = 0.275422870333817;
			data_x[1][37] = 0.301995172040202;
			data_x[1][38] = 0.331131121482592;
			data_x[1][39] = 0.363078054770102;
			data_x[1][40] = 0.398107170553498;
			data_x[1][41] = 0.436515832240167;
			data_x[1][42] = 0.47863009232264;
			data_x[1][43] = 0.524807460249774;
			data_x[1][44] = 0.575439937337159;
			data_x[1][45] = 0.630957344480195;
			data_x[1][46] = 0.691830970918939;
			data_x[1][47] = 0.758577575029186;
			data_x[1][48] = 0.831763771102674;
			data_x[1][49] = 0.912010839355913;
			data_x[1][50] = 1;
			data_x[1][51] = 1.09647819614318;
			data_x[1][52] = 1.20226443461741;
			data_x[1][53] = 1.31825673855641;
			data_x[1][54] = 1.44543977074593;
			data_x[1][55] = 1.58489319246111;
			data_x[1][56] = 1.73780082874938;
			data_x[1][57] = 1.90546071796325;
			data_x[1][58] = 2.08929613085404;
			data_x[1][59] = 2.29086765276778;
			data_x[1][60] = 2.51188643150958;
			data_x[1][61] = 2.75422870333817;
			data_x[1][62] = 3.01995172040202;
			data_x[1][63] = 3.31131121482592;
			data_x[1][64] = 3.63078054770102;
			data_x[1][65] = 3.98107170553498;
			data_x[1][66] = 4.36515832240167;
			data_x[1][67] = 4.7863009232264;
			data_x[1][68] = 5.24807460249774;
			data_x[1][69] = 5.75439937337159;
			data_x[1][70] = 6.30957344480195;
			data_x[1][71] = 6.91830970918939;
			data_x[1][72] = 7.58577575029186;
			data_x[1][73] = 8.31763771102674;
			data_x[1][74] = 9.12010839355913;
			data_x[1][75] = 10;
			data_x[1][76] = 10.9647819614318;
			data_x[1][77] = 12.0226443461741;
			data_x[1][78] = 13.1825673855641;
			data_x[1][79] = 14.4543977074593;
			data_x[1][80] = 15.8489319246112;
			data_x[1][81] = 17.3780082874938;
			data_x[1][82] = 19.0546071796325;
			data_x[1][83] = 20.8929613085404;
			data_x[1][84] = 22.9086765276778;
			data_x[1][85] = 25.1188643150959;
			data_x[1][86] = 27.5422870333818;
			data_x[1][87] = 30.1995172040203;
			data_x[1][88] = 33.1131121482592;
			data_x[1][89] = 36.3078054770103;
			data_x[1][90] = 39.8107170553499;
			data_x[1][91] = 43.6515832240168;
			data_x[1][92] = 47.8630092322641;
			data_x[1][93] = 52.4807460249775;
			data_x[1][94] = 57.543993733716;
			data_x[1][95] = 63.0957344480196;
			data_x[1][96] = 69.183097091894;
			data_x[1][97] = 75.8577575029188;
			data_x[1][98] = 83.1763771102676;
			data_x[1][99] = 91.2010839355915;
			data_x[1][100] = 100;
			data_y[0][0] = -0.00043427276862636;
			data_y[0][1] = -0.000522105424932322;
			data_y[0][2] = -0.000627701152241214;
			data_y[0][3] = -0.000754651740749838;
			data_y[0][4] = -0.000907275005683991;
			data_y[0][5] = -0.00109076142866441;
			data_y[0][6] = -0.00131135036701045;
			data_y[0][7] = -0.0015765417703246;
			data_y[0][8] = -0.00189535052688523;
			data_y[0][9] = -0.00227861197648364;
			data_y[0][10] = -0.00273934881496565;
			data_y[0][11] = -0.00329321162892171;
			data_y[0][12] = -0.00395900769500453;
			data_y[0][13] = -0.00475933552387765;
			data_y[0][14] = -0.00572134599940977;
			data_y[0][15] = -0.00687765494318666;
			data_y[0][16] = -0.00826743661415132;
			data_y[0][17] = -0.00993773312918616;
			data_y[0][18] = -0.0119450211581656;
			data_y[0][19] = -0.014357084593869;
			data_y[0][20] = -0.017255250287929;
			data_y[0][21] = -0.0207370534016865;
			data_y[0][22] = -0.0249194093944646;
			data_y[0][23] = -0.0299423809918071;
			data_y[0][24] = -0.0359736402894658;
			data_y[0][25] = -0.0432137378264255;
			data_y[0][26] = -0.051902300972248;
			data_y[0][27] = -0.0623252917208117;
			data_y[0][28] = -0.0748234565761777;
			data_y[0][29] = -0.0898020952083107;
			data_y[0][30] = -0.10774225511957;
			data_y[0][31] = -0.129213420154599;
			data_y[0][32] = -0.154887692755856;
			data_y[0][33] = -0.185555362732532;
			data_y[0][34] = -0.222141596415848;
			data_y[0][35] = -0.265723755961027;
			data_y[0][36] = -0.317548557029209;
			data_y[0][37] = -0.379047887154574;
			data_y[0][38] = -0.451851641314966;
			data_y[0][39] = -0.537795410636778;
			data_y[0][40] = -0.6389203414338;
			data_y[0][41] = -0.757462064101649;
			data_y[0][42] = -0.895825422443528;
			data_y[0][43] = -1.05654200302736;
			data_y[0][44] = -1.2422083724146;
			data_y[0][45] = -1.45540463109294;
			data_y[0][46] = -1.69859540490393;
			data_y[0][47] = -1.97401850619972;
			data_y[0][48] = -2.2835697095824;
			data_y[0][49] = -2.62869465226149;
			data_y[0][50] = -3.01029995663982;
			data_y[0][51] = -3.42869465226149;
			data_y[0][52] = -3.8835697095824;
			data_y[0][53] = -4.37401850619973;
			data_y[0][54] = -4.89859540490394;
			data_y[0][55] = -5.45540463109295;
			data_y[0][56] = -6.04220837241461;
			data_y[0][57] = -6.65654200302738;
			data_y[0][58] = -7.29582542244354;
			data_y[0][59] = -7.95746206410166;
			data_y[0][60] = -8.63892034143381;
			data_y[0][61] = -9.33779541063679;
			data_y[0][62] = -10.0518516413149;
			data_y[0][63] = -10.7790478871545;
			data_y[0][64] = -11.5175485570292;
			data_y[0][65] = -12.265723755961;
			data_y[0][66] = -13.0221415964158;
			data_y[0][67] = -13.7855553627325;
			data_y[0][68] = -14.5548876927558;
			data_y[0][69] = -15.3292134201546;
			data_y[0][70] = -16.1077422551196;
			data_y[0][71] = -16.8898020952083;
			data_y[0][72] = -17.6748234565762;
			data_y[0][73] = -18.4623252917208;
			data_y[0][74] = -19.2519023009722;
			data_y[0][75] = -20.0432137378264;
			data_y[0][76] = -20.8359736402895;
			data_y[0][77] = -21.6299423809918;
			data_y[0][78] = -22.4249194093944;
			data_y[0][79] = -23.2207370534017;
			data_y[0][80] = -24.0172552502879;
			data_y[0][81] = -24.8143570845939;
			data_y[0][82] = -25.6119450211582;
			data_y[0][83] = -26.4099377331292;
			data_y[0][84] = -27.2082674366141;
			data_y[0][85] = -28.0068776549432;
			data_y[0][86] = -28.8057213459994;
			data_y[0][87] = -29.6047593355239;
			data_y[0][88] = -30.403959007695;
			data_y[0][89] = -31.2032932116289;
			data_y[0][90] = -32.002739348815;
			data_y[0][91] = -32.8022786119765;
			data_y[0][92] = -33.6018953505269;
			data_y[0][93] = -34.4015765417703;
			data_y[0][94] = -35.201311350367;
			data_y[0][95] = -36.0010907614287;
			data_y[0][96] = -36.8009072750057;
			data_y[0][97] = -37.6007546517408;
			data_y[0][98] = -38.4006277011522;
			data_y[0][99] = -39.2005221054249;
			data_y[0][100] = -40.0004342727686;
			data_y[1][0] = 0.000760038415382399;
			data_y[1][1] = 0.000913772766359686;
			data_y[1][2] = 0.00109860460812431;
			data_y[1][3] = 0.00132082497033832;
			data_y[1][4] = 0.0015879978301257;
			data_y[1][5] = 0.00190921780497035;
			data_y[1][6] = 0.00229542006615489;
			data_y[1][7] = 0.00275975307888415;
			data_y[1][8] = 0.00331802694011069;
			data_y[1][9] = 0.00398925269639393;
			data_y[1][10] = 0.00479629117620189;
			data_y[1][11] = 0.00576663367903434;
			data_y[1][12] = 0.0069333414679863;
			data_y[1][13] = 0.00833617658612594;
			data_y[1][14] = 0.0100229632730993;
			data_y[1][15] = 0.0120512274603127;
			data_y[1][16] = 0.0144901717990999;
			data_y[1][17] = 0.0174230558361977;
			data_y[1][18] = 0.0209500658109257;
			data_y[1][19] = 0.0251917767617845;
			data_y[1][20] = 0.0302933320307221;
			data_y[1][21] = 0.0364294929122781;
			data_y[1][22] = 0.043810745501032;
			data_y[1][23] = 0.0526906945590592;
			data_y[1][24] = 0.0633750278465736;
			data_y[1][25] = 0.0762324020119698;
			data_y[1][26] = 0.0917076870782207;
			data_y[1][27] = 0.11033811653403;
			data_y[1][28] = 0.132773031837264;
			data_y[1][29] = 0.159798094398276;
			data_y[1][30] = 0.192365079368509;
			data_y[1][31] = 0.231628683657635;
			data_y[1][32] = 0.278992202428454;
			data_y[1][33] = 0.336164489672405;
			data_y[1][34] = 0.405231365272613;
			data_y[1][35] = 0.488745617523805;
			data_y[1][36] = 0.589841028229403;
			data_y[1][37] = 0.712377430460434;
			data_y[1][38] = 0.861125568145392;
			data_y[1][39] = 1.0420019107726;
			data_y[1][40] = 1.26236286023883;
			data_y[1][41] = 1.53136003903385;
			data_y[1][42] = 1.86032983314904;
			data_y[1][43] = 2.26310269847673;
			data_y[1][44] = 2.7558619659877;
			data_y[1][45] = 3.35544406114777;
			data_y[1][46] = 4.07285867859558;
			data_y[1][47] = 4.8930591948081;
			data_y[1][48] = 5.71985312756973;
			data_y[1][49] = 6.26638529740493;
			data_y[1][50] = 6.02059991327959;
			data_y[1][51] = 4.66638529740486;
			data_y[1][52] = 2.51985312756961;
			data_y[1][53] = 0.0930591948079767;
			data_y[1][54] = -2.32714132140453;
			data_y[1][55] = -4.64455593885234;
			data_y[1][56] = -6.84413803401239;
			data_y[1][57] = -8.93689730152335;
			data_y[1][58] = -10.939670166851;
			data_y[1][59] = -12.8686399609662;
			data_y[1][60] = -14.7376371397612;
			data_y[1][61] = -16.5579980892274;
			data_y[1][62] = -18.3388744318546;
			data_y[1][63] = -20.0876225695396;
			data_y[1][64] = -21.8101589717706;
			data_y[1][65] = -23.5112543824762;
			data_y[1][66] = -25.1947686347274;
			data_y[1][67] = -26.8638355103276;
			data_y[1][68] = -28.5210077975716;
			data_y[1][69] = -30.1683713163424;
			data_y[1][70] = -31.8076349206315;
			data_y[1][71] = -33.4402019056017;
			data_y[1][72] = -35.0672269681628;
			data_y[1][73] = -36.689661883466;
			data_y[1][74] = -38.3082923129218;
			data_y[1][75] = -39.9237675979881;
			data_y[1][76] = -41.5366249721535;
			data_y[1][77] = -43.147309305441;
			data_y[1][78] = -44.756189254499;
			data_y[1][79] = -46.3635705070877;
			data_y[1][80] = -47.9697066679693;
			data_y[1][81] = -49.5748082232382;
			data_y[1][82] = -51.1790499341891;
			data_y[1][83] = -52.7825769441638;
			data_y[1][84] = -54.3855098282009;
			data_y[1][85] = -55.9879487725397;
			data_y[1][86] = -57.5899770367269;
			data_y[1][87] = -59.1916638234139;
			data_y[1][88] = -60.7930666585321;
			data_y[1][89] = -62.394233366321;
			data_y[1][90] = -63.9952037088238;
			data_y[1][91] = -65.5960107473037;
			data_y[1][92] = -67.1966819730599;
			data_y[1][93] = -68.7972402469212;
			data_y[1][94] = -70.3977045799339;
			data_y[1][95] = -71.9980907821951;
			data_y[1][96] = -73.5984120021699;
			data_y[1][97] = -75.1986791750297;
			data_y[1][98] = -76.7989013953919;
			data_y[1][99] = -78.3990862272337;
			data_y[1][100] = -79.9992399615847;
						// 作図
			Bode gp = new Bode(title, g_title, x_scale, 2, y_scale, 0, data_x, data_y, true, true);
		}
	}
}

-------------------------------BarGraph---------------------------------

/****************************/
/* 棒グラフの描画           */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class BarGraph extends JFrame {

	Draw_bar pn;

	/*****************************************************/
	/* コンストラクタ                                    */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : 凡例                             */
	/*      x_title_i : 横軸の表示項目                   */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_i : 小数点以下の桁数                   */
	/*      data_i : グラフのデータ                      */
	/*      d_t_i : タイトル表示の有無                   */
	/*      d_g_i : 凡例表示の有無                       */
	/*****************************************************/
	BarGraph(String title_i[], String g_title_i[], String x_title_i[],
             double y_scale_i[], int place_i, double data_i[][],
             boolean d_t_i, boolean d_g_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("棒グラフ");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_bar(title_i, g_title_i, x_title_i, y_scale_i, place_i, data_i, d_t_i, d_g_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_bar extends JPanel {

	String title[];   // グラフのタイトル
	String g_title[];   // 凡例(グラフの内容)
	String x_title[];   // x軸への表示
	double y_scale[];   // y軸目盛り
	double data[][];   // データ
	boolean d_t;   // タイトル表示の有無
	boolean d_g;   // 凡例表示の有無
	boolean ver = true;   // 縦か横か
	int place;   // 小数点以下の桁数
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	BarGraph bar;
	String change = "横 色";   // 表示切り替えボタン
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_g;   // グラフの数

	/*****************************************************/
	/* コンストラクタ                                    */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : 凡例                             */
	/*      x_title_i : 横軸の表示項目                   */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_i : 小数点以下の桁数                   */
	/*      data_i : グラフのデータ                      */
	/*      d_t_i : タイトル表示の有無                   */
	/*      d_g_i : 凡例表示の有無                       */
	/*****************************************************/
	Draw_bar(String title_i[], String g_title_i[], String x_title_i[],
             double y_scale_i[], int place_i, double data_i[][],
             boolean d_t_i, boolean d_g_i, BarGraph bar_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		x_title = x_title_i;
		y_scale = y_scale_i;
		place   = place_i;
		data    = data_i;
		d_t     = d_t_i;
		d_g     = d_g_i;
		bar     = bar_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1, sp;
		int i1, i2, k, k1, k2, kx, ky, han, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_p;   // データの数
		int g_w;   // グラフの幅
		String s1;
		Font f;
		FontMetrics fm;
		Graphics2D g2 = (Graphics2D)g;
					//
					// Windowサイズの取得
					//
		Insets insets = bar.getInsets();
		Dimension d = bar.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title[0]);
			g.drawString(title[0], (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= f_size;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_g = g_title.length;
		if (d_g) {
			han = 0;
			for (i1 = 0; i1 < n_g; i1++) {
				len = fm.stringWidth(g_title[i1]);
				if (len > han)
					han = len;
			}
			han += 15;
			r    = 0.2;   // 凡例領域の割合
			k1   = (int)((x_r - x_l) * r);
			if (han > k1)
				han = k1;
			kx = x_r - han;
			ky = y_u + 3 * f_size / 2;
			k  = 0;
			g2.setStroke(new BasicStroke(7.0f));
			for (i1 = 0; i1 < n_g; i1++) {
				g.setColor(cl[k]);
				g.drawLine(kx, ky, kx+10, ky);
				g.setColor(Color.black);
				g.drawString(g_title[i1], kx+15, ky+2*f_size/5);
				k++;
				if (k >= cl.length)
					k = 0;
				ky += f_size;
			}
			g2.setStroke(new BasicStroke(1.0f));
			x_r -= (han + 10);
		}
		else
			x_r -= (int)(0.03 * (x_r - x_l));
					//
					// x軸及びy軸のタイトルの表示
					//
		if (ver) {   // 縦
			if (title[1].length() > 0 && !title[1].equals("-")) {
				len = fm.stringWidth(title[1]);
				g.drawString(title[1], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[2].length() > 0 && !title[2].equals("-")) {
				g.drawString(title[2], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
		else {   // 横
			if (title[2].length() > 0 && !title[2].equals("-")) {
				len = fm.stringWidth(title[2]);
				g.drawString(title[2], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[1].length() > 0 && !title[1].equals("-")) {
				g.drawString(title[1], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
					//
					// x軸,y軸,及び,各軸の目盛り
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f    = new Font("TimesRoman", Font.PLAIN, f_size);
		fm   = g.getFontMetrics(f);
		y_d -= 3 * f_size / 2;
		k    = (int)((y_scale[1] - y_scale[0]) / (0.99 * y_scale[2]));
		n_p  = x_title.length;
		g.setFont(f);

		DecimalFormat df;
		if (place == 0)
			df = new DecimalFormat("#");
		else {
			s1 = "#.";
			for (i1 = 0; i1 < place; i1++)
				s1 += "0";
			df = new DecimalFormat(s1);
		}
						// 縦表示
		if (ver) {
							// y軸
			y1  = y_scale[0];
			len = 0;
			for (i1 = 0; i1 < k+1; i1++) {
				s1 = df.format(y1);
				k1 = fm.stringWidth(s1);
				if (k1 > len)
					len = k1;
				y1 += y_scale[2];
			}
			g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
			g.drawLine(x_r, y_u, x_r, y_d);
			y1 = y_scale[0];
			x1 = y_d;
			sp = (double)(y_d - y_u) / k;
			for (i1 = 0; i1 < k+1; i1++) {
				ky = (int)Math.round(x1);
				s1 = df.format(y1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, x_l+len-k1, ky+f_size/2);
				g.drawLine(x_l+len+5, ky, x_r, ky);
				y1 += y_scale[2];
				x1 -= sp;
			}
			x_l += (len + 5);
							// x軸
			sp  = (double)(x_r - x_l) / n_p;
			x1  = x_l + sp / 2.0;
			for (i1 = 0; i1 < n_p; i1++) {
				kx  = (int)Math.round(x1);
				k1 = fm.stringWidth(x_title[i1]);
				g.drawString(x_title[i1], kx-k1/2, y_d+6*f_size/5);
				g.drawLine(kx, y_d, kx, y_d-5);
				x1 += sp;
			}
		}
						// 横表示
		else {
							// y軸
			len = 0;
			for (i1 = 0; i1 < n_p; i1++) {
				k1 = fm.stringWidth(x_title[i1]);
				if (k1 > len)
					len = k1;
			}
			g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
			g.drawLine(x_r, y_u, x_r, y_d);
			sp = (double)(y_d - y_u) / n_p;
			y1 = y_d - sp / 2.0;
			for (i1 = 0; i1 < n_p; i1++) {
				ky = (int)Math.round(y1);
				k1 = fm.stringWidth(x_title[n_p-1-i1]);
				g.drawString(x_title[n_p-1-i1], x_l+len-k1, ky+f_size/2);
				g.drawLine(x_l+len+5, ky, x_l+len+10, ky);
				y1 -= sp;
			}
			g.drawLine(x_l+len+5, y_u, x_r, y_u);
			g.drawLine(x_l+len+5, y_d, x_r, y_d);
			x_l += (len + 5);
							// x軸
			x1 = y_scale[0];
			y1 = x_l;
			sp = (double)(x_r - x_l) / k;
			for (i1 = 0; i1 < k+1; i1++) {
				kx = (int)Math.round(y1);
				s1 = df.format(x1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
				g.drawLine(kx, y_d, kx, y_u);
				x1 += y_scale[2];
				y1 += sp;
			}
		}
					//
					// グラフの表示
					//
						// 縦表示
		if (ver) {
			g_w = (int)(0.8 * (x_r - x_l) / (n_g * n_p));
			sp  = (double)(x_r - x_l) / n_p;
			x1  = x_l + sp / 2.0;
			for (i1 = 0; i1 < n_p; i1++) {
				kx  = (int)Math.round(x1);
				k1 = 0;
				k2 = kx - n_g * g_w / 2;
				for (i2 = 0; i2 < n_g; i2++) {
					ky = y_d - (int)((y_d - y_u) * (data[i2][i1] - y_scale[0]) / (y_scale[1] - y_scale[0]));
					g.setColor(cl[k1]);
					g.fillRect(k2, ky, g_w, y_d-ky);
					k2 += g_w;
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
				x1 += sp;
			}
		}
						// 横表示
		else {
			g_w = (int)(0.8 * (y_d - y_u) / (n_g * n_p));
			sp  = (double)(y_d - y_u) / n_p;
			y1  = y_d - sp / 2.0;
			for (i1 = 0; i1 < n_p; i1++) {
				ky = (int)Math.round(y1);
				k1 = 0;
				k2 = ky - n_g * g_w / 2;
				for (i2 = 0; i2 < n_g; i2++) {
					kx = (int)((x_r - x_l) * (data[i2][n_p-1-i1] - y_scale[0]) / (y_scale[1] - y_scale[0]));
					g.setColor(cl[k1]);
					g.fillRect(x_l, k2, kx, g_w);
					k2 += g_w;
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
				y1 -= sp;
			}
		}
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_bar db;

		ClickMouse(Draw_bar db1)
		{
			db = db1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// 縦表示と横表示の変換
			if (xp > bx1 && xp < bx1+(bx2-bx1)/2 && yp > by1 && yp < by2) {
				if (ver) {
					ver    = false;
					change = "縦 色";
				}
				else {
					ver    = true;
					change = "横 色";
				}
				repaint();
			}
					// グラフの色,線の太さ等
			else if (xp > bx1+(bx2-bx1)/2 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(db.bar, db);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------LineGraph---------------------------------

/****************************/
/* 折れ線グラフの描画       */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class LineGraph extends JFrame {

	Draw_line pn;

	/*****************************************************/
	/* コンストラクタ(折れ線グラフ1)                  */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : 凡例                             */
	/*      x_title_i : 横軸の表示項目                   */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_y_i : 小数点以下の桁数(y軸)         */
	/*      data_y_i : グラフのデータ                    */
	/*      d_t_i : タイトル表示の有無                   */
	/*      d_g_i : 凡例表示の有無                       */
	/*****************************************************/
	LineGraph(String title_i[], String g_title_i[], String x_title_i[],
              double y_scale_i[], int place_y_i, double data_y_i[][],
              boolean d_t_i, boolean d_g_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("折れ線グラフ(1)");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_line(title_i, g_title_i, x_title_i, y_scale_i, place_y_i, data_y_i, d_t_i, d_g_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/*********************************************************/
	/* コンストラクタ(折れ線グラフ2)                      */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル     */
	/*      g_title_i : 凡例                                 */
	/*      x_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_x_i : 小数点以下の桁数(x軸)             */
	/*      y_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_y_i : 小数点以下の桁数(y軸)             */
	/*      data_x_i : グラフのデータ(x軸)                */
	/*      data_y_i : グラフのデータ(y軸)                */
	/*      d_t_i : タイトル表示の有無                       */
	/*      d_g_i : 凡例表示の有無                           */
	/*********************************************************/
	LineGraph(String title_i[], String g_title_i[], double x_scale_i[],
              int place_x_i, double y_scale_i[], int place_y_i,
              double data_x_i[][], double data_y_i[][], boolean d_t_i,
              boolean d_g_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("折れ線グラフ(2)");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_line(title_i, g_title_i, x_scale_i, place_x_i, y_scale_i, place_y_i, data_x_i, data_y_i, d_t_i, d_g_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_line extends JPanel {

	String title[];   // グラフのタイトル
	String g_title[];   // 凡例(グラフの内容)
	String x_title[];   // x軸への表示
	double x_scale[];   // y軸目盛り
	double y_scale[];   // y軸目盛り
	double data_x[][], data_y[][];   // データ
	boolean d_t;   // タイトル表示の有無
	boolean d_g;   // 凡例表示の有無
	boolean type = true;   // 横軸が項目かデータか
	boolean ver = true;   // 縦か横か
	int place_x;   // 小数点以下の桁数(x軸)
	int place_y;   // 小数点以下の桁数(y軸)
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	LineGraph line;
	String change = "横 色";   // 表示切り替えボタン
	float line_w = 1.0f;   // 折れ線グラフ等の線の太さ
	boolean line_m = true;   // 折れ線グラフ等にマークを付けるか否か
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_g;   // グラフの数

	/*****************************************************/
	/* コンストラクタ(折れ線グラフ1)                  */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : 凡例                             */
	/*      x_title_i : 横軸の表示項目                   */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_y_i : 小数点以下の桁数(y軸)         */
	/*      data_y_i : グラフのデータ                    */
	/*      d_t_i : タイトル表示の有無                   */
	/*      d_g_i : 凡例表示の有無                       */
	/*****************************************************/
	Draw_line(String title_i[], String g_title_i[], String x_title_i[],
              double y_scale_i[], int place_y_i, double data_y_i[][],
              boolean d_t_i, boolean d_g_i, LineGraph line_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		x_title = x_title_i;
		y_scale = y_scale_i;
		place_y = place_y_i;
		data_y  = data_y_i;
		d_t     = d_t_i;
		d_g     = d_g_i;
		line    = line_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/*********************************************************/
	/* コンストラクタ(折れ線グラフ2)                      */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル     */
	/*      g_title_i : 凡例                                 */
	/*      x_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_x_i : 小数点以下の桁数(x軸)             */
	/*      y_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_y_i : 小数点以下の桁数(y軸)             */
	/*      data_x_i : グラフのデータ(x軸)                */
	/*      data_y_i : グラフのデータ(y軸)                */
	/*      d_t_i : タイトル表示の有無                       */
	/*      d_g_i : 凡例表示の有無                           */
	/*********************************************************/
	Draw_line(String title_i[], String g_title_i[], double x_scale_i[],
              int place_x_i, double y_scale_i[], int place_y_i,
              double data_x_i[][], double data_y_i[][], boolean d_t_i,
              boolean d_g_i, LineGraph line_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		x_scale = x_scale_i;
		place_x = place_x_i;
		y_scale = y_scale_i;
		place_y = place_y_i;
		data_x  = data_x_i;
		data_y  = data_y_i;
		d_t     = d_t_i;
		d_g     = d_g_i;
		type    = false;
		line    = line_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1, sp;
		int i1, i2, cr, k, k_x, k_y, k1, k2, kx, kx1, ky, ky1, han, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_p;   // データの数
		String s1;
		Font f;
		FontMetrics fm;
		Graphics2D g2 = (Graphics2D)g;
					//
					// Windowサイズの取得
					//
		Insets insets = line.getInsets();
		Dimension d = line.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title[0]);
			g.drawString(title[0], (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= f_size;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_g = g_title.length;
		if (d_g) {
			han = 0;
			for (i1 = 0; i1 < n_g; i1++) {
				len = fm.stringWidth(g_title[i1]);
				if (len > han)
					han = len;
			}
			han += 15;
			r    = 0.2;   // 凡例領域の割合
			k1   = (int)((x_r - x_l) * r);
			if (han > k1)
				han = k1;
			kx = x_r - han;
			ky = y_u + 3 * f_size / 2;
			k  = 0;
			g2.setStroke(new BasicStroke(7.0f));
			for (i1 = 0; i1 < n_g; i1++) {
				g.setColor(cl[k]);
				g.drawLine(kx, ky, kx+10, ky);
				g.setColor(Color.black);
				g.drawString(g_title[i1], kx+15, ky+2*f_size/5);
				k++;
				if (k >= cl.length)
					k = 0;
				ky += f_size;
			}
			g2.setStroke(new BasicStroke(1.0f));
			x_r -= (han + 10);
		}
		else
			x_r -= (int)(0.03 * (x_r - x_l));
					//
					// x軸及びy軸のタイトルの表示
					//
		if (ver) {   // 縦
			if (title[1].length() > 0 && !title[1].equals("-")) {
				len = fm.stringWidth(title[1]);
				g.drawString(title[1], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[2].length() > 0 && !title[2].equals("-")) {
				g.drawString(title[2], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
		else {   // 横
			if (title[2].length() > 0 && !title[2].equals("-")) {
				len = fm.stringWidth(title[2]);
				g.drawString(title[2], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[1].length() > 0 && !title[1].equals("-")) {
				g.drawString(title[1], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
					//
					// x軸,y軸,及び,各軸の目盛り
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f    = new Font("TimesRoman", Font.PLAIN, f_size);
		fm   = g.getFontMetrics(f);
		y_d -= 3 * f_size / 2;
		k_y  = (int)((y_scale[1] - y_scale[0]) / (0.99 * y_scale[2]));
		k_x  = 0;
		if (!type)
			k_x = (int)((x_scale[1] - x_scale[0]) / (0.99 * x_scale[2]));
		g.setFont(f);

		DecimalFormat df_x, df_y;
		df_x = new DecimalFormat("#");
		df_y = new DecimalFormat("#");
		if (!type) {
			if (place_x != 0) {
				s1 = "#.";
				for (i1 = 0; i1 < place_x; i1++)
					s1 += "0";
				df_x = new DecimalFormat(s1);
			}
		}
		if (place_y != 0) {
			s1 = "#.";
			for (i1 = 0; i1 < place_y; i1++)
				s1 += "0";
			df_y = new DecimalFormat(s1);
		}
						// 縦表示
		if (ver) {
							// y軸
			y1  = y_scale[0];
			len = 0;
			for (i1 = 0; i1 < k_y+1; i1++) {
				s1 = df_y.format(y1);
				k1 = fm.stringWidth(s1);
				if (k1 > len)
					len = k1;
				y1 += y_scale[2];
			}
			g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
			g.drawLine(x_r, y_u, x_r, y_d);
			y1 = y_scale[0];
			x1 = y_d;
			sp = (double)(y_d - y_u) / k_y;
			for (i1 = 0; i1 < k_y+1; i1++) {
				ky = (int)Math.round(x1);
				s1 = df_y.format(y1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, x_l+len-k1, ky+f_size/2);
				g.drawLine(x_l+len+5, ky, x_r, ky);
				y1 += y_scale[2];
				x1 -= sp;
			}
			x_l += (len + 5);
							// x軸
			if (type) {
				n_p = x_title.length;
				sp  = (double)(x_r - x_l) / n_p;
				x1  = x_l + sp / 2.0;
				for (i1 = 0; i1 < n_p; i1++) {
					kx = (int)Math.round(x1);
					k1 = fm.stringWidth(x_title[i1]);
					g.drawString(x_title[i1], kx-k1/2, y_d+6*f_size/5);
					g.drawLine(kx, y_d, kx, y_d-5);
					x1 += sp;
				}
			}
			else {
				x1 = x_scale[0];
				y1 = x_l;
				sp = (double)(x_r - x_l) / k_x;
				for (i1 = 0; i1 < k_x+1; i1++) {
					kx = (int)Math.round(y1);
					s1 = df_x.format(x1);
					k1 = fm.stringWidth(s1);
					g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
					g.drawLine(kx, y_d, kx, y_u);
					x1 += x_scale[2];
					y1 += sp;
				}
			}
		}
						// 横表示
		else {
							// y軸
			if (type) {
				n_p = x_title.length;
				len = 0;
				for (i1 = 0; i1 < n_p; i1++) {
					k1 = fm.stringWidth(x_title[i1]);
					if (k1 > len)
						len = k1;
				}
				g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
				g.drawLine(x_r, y_u, x_r, y_d);
				sp = (double)(y_d - y_u) / n_p;
				x1 = y_d - sp / 2.0;
				for (i1 = 0; i1 < n_p; i1++) {
					ky = (int)Math.round(x1);
					k1 = fm.stringWidth(x_title[n_p-1-i1]);
					g.drawString(x_title[n_p-1-i1], x_l+len-k1, ky+f_size/2);
					g.drawLine(x_l+len+5, ky, x_l+len+10, ky);
					x1 -= sp;
				}
				g.drawLine(x_l+len+5, y_u, x_r, y_u);
				g.drawLine(x_l+len+5, y_d, x_r, y_d);
				x_l += (len + 5);
			}
			else {
				y1  = x_scale[0];
				len = 0;
				for (i1 = 0; i1 < k_x+1; i1++) {
					s1 = df_x.format(y1);
					k1 = fm.stringWidth(s1);
					if (k1 > len)
						len = k1;
					y1 += x_scale[2];
				}
				g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
				g.drawLine(x_r, y_u, x_r, y_d);
				y1 = x_scale[0];
				x1 = y_d;
				sp = (double)(y_d - y_u) / k_x;
				for (i1 = 0; i1 < k_x+1; i1++) {
					ky = (int)Math.round(x1);
					s1 = df_x.format(y1);
					k1 = fm.stringWidth(s1);
					g.drawString(s1, x_l+len-k1, ky+f_size/2);
					g.drawLine(x_l+len+5, ky, x_r, ky);
					y1 += x_scale[2];
					x1 -= sp;
				}
				x_l += (len + 5);
			}
							// x軸
			x1 = y_scale[0];
			y1 = x_l;
			sp = (double)(x_r - x_l) / k_y;
			for (i1 = 0; i1 < k_y+1; i1++) {
				kx = (int)Math.round(y1);
				s1 = df_y.format(x1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
				g.drawLine(kx, y_d, kx, y_u);
				x1 += y_scale[2];
				y1 += sp;
			}
		}
					//
					// グラフの表示
					//
		g2.setStroke(new BasicStroke(line_w));
		cr = (int)line_w + 6;
						// 縦表示
		if (ver) {
			if (type) {
				n_p = x_title.length;
				sp  = (double)(x_r - x_l) / n_p;
				k1  = 0;
				for (i1 = 0; i1 < n_g; i1++) {
					g.setColor(cl[k1]);
					x1  = x_l + sp / 2.0;
					kx1 = 0;
					ky1 = 0;
					for (i2 = 0; i2 < n_p; i2++) {
						kx = (int)Math.round(x1);
						ky = y_d - (int)((y_d - y_u) * (data_y[i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]));
						if (line_m)
							g.fillOval(kx-cr/2, ky-cr/2, cr, cr);
						if (i2 > 0)
							g.drawLine(kx1, ky1, kx, ky);
						kx1  = kx;
						ky1  = ky;
						x1  += sp;
					}
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
			}
			else {
				n_p = data_x[0].length;
				k1  = 0;
				for (i1 = 0; i1 < n_g; i1++) {
					g.setColor(cl[k1]);
					kx1 = 0;
					ky1 = 0;
					for (i2 = 0; i2 < n_p; i2++) {
						kx = x_l + (int)((x_r - x_l) * (data_x[i1][i2] - x_scale[0]) / (x_scale[1] - x_scale[0]));
						ky = y_d - (int)((y_d - y_u) * (data_y[i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]));
						if (line_m)
							g.fillOval(kx-cr/2, ky-cr/2, cr, cr);
						if (i2 > 0)
							g.drawLine(kx1, ky1, kx, ky);
						kx1 = kx;
						ky1 = ky;
					}
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
			}
		}
						// 横表示
		else {
			if (type) {
				n_p = x_title.length;
				sp = (double)(y_d - y_u) / n_p;
				k1 = 0;
				for (i1 = 0; i1 < n_g; i1++) {
					g.setColor(cl[k1]);
					y1  = y_d - sp / 2.0;
					kx1 = 0;
					ky1 = 0;
					for (i2 = 0; i2 < n_p; i2++) {
						ky = (int)Math.round(y1);
						kx = x_l + (int)((x_r - x_l) * (data_y[i1][n_p-1-i2] - y_scale[0]) / (y_scale[1] - y_scale[0]));
						if (line_m)
							g.fillOval(kx-cr/2, ky-cr/2, cr, cr);
						if (i2 > 0)
							g.drawLine(kx1, ky1, kx, ky);
						kx1  = kx;
						ky1  = ky;
						y1  -= sp;
					}
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
			}
			else {
				n_p = data_x[0].length;
				k1  = 0;
				for (i1 = 0; i1 < n_g; i1++) {
					g.setColor(cl[k1]);
					kx1 = 0;
					ky1 = 0;
					for (i2 = 0; i2 < n_p; i2++) {
						kx = x_l + (int)((x_r - x_l) * (data_y[i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]));
						ky = y_d - (int)((y_d - y_u) * (data_x[i1][i2] - x_scale[0]) / (x_scale[1] - x_scale[0]));
						if (line_m)
							g.fillOval(kx-cr/2, ky-cr/2, cr, cr);
						if (i2 > 0)
							g.drawLine(kx1, ky1, kx, ky);
						kx1 = kx;
						ky1 = ky;
					}
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
			}
		}
		g2.setStroke(new BasicStroke(1.0f));
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_line dr;

		ClickMouse(Draw_line dr1)
		{
			dr = dr1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// 縦表示と横表示の変換
			if (xp > bx1 && xp < bx1+(bx2-bx1)/2 && yp > by1 && yp < by2) {
				if (ver) {
					ver    = false;
					change = "縦 色";
				}
				else {
					ver    = true;
					change = "横 色";
				}
				repaint();
			}
					// グラフの色,線の太さ等
			else if (xp > bx1+(bx2-bx1)/2 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(dr.line, dr);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------StackGraph---------------------------------

/****************************/
/* 積み上げ棒グラフの描画   */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class StackGraph extends JFrame {

	Draw_stack pn;

	/*****************************************************/
	/* コンストラクタ                                    */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : グラフの内容                     */
	/*      item_i : 凡例                                */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_i : 小数点以下の桁数                   */
	/*      data_i : グラフのデータ                      */
	/*      d_t_i : タイトル表示の有無                   */
	/***************************************************/
	StackGraph(String title_i[], String g_title_i[], String item_i[],
               double y_scale_i[], int place_i, double data_i[][],
               boolean d_t_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("積み上げ棒グラフ");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_stack(title_i, g_title_i, item_i, y_scale_i, place_i, data_i, d_t_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_stack extends JPanel {

	String title[];   // グラフのタイトル
	String g_title[];   // グラフの内容
	String item[];   // 凡例
	double y_scale[];   // y軸目盛り
	double data[][];   // データ
	boolean d_t;   // タイトル表示の有無
	boolean ver = true;   // 縦か横か
	int place;   // 小数点以下の桁数
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	StackGraph stack;
	String change = "横 色";   // 表示切り替えボタン
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_p;   // データの数

	/*****************************************************/
	/* コンストラクタ                                    */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル */
	/*      g_title_i : グラフの内容                     */
	/*      item_i : 凡例                                */
	/*      y_scale_i : データの最小値,最大値,目盛幅   */
	/*      place_i : 小数点以下の桁数                   */
	/*      data_i : グラフのデータ                      */
	/*      d_t_i : タイトル表示の有無                   */
	/***************************************************/
	Draw_stack(String title_i[], String g_title_i[], String item_i[],
               double y_scale_i[], int place_i, double data_i[][],
               boolean d_t_i, StackGraph stack_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		item    = item_i;
		y_scale = y_scale_i;
		place   = place_i;
		data    = data_i;
		d_t     = d_t_i;
		stack   = stack_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1, y2, sp;
		int i1, i2, k, k1, k2, kx, ky, han, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_g;   // グラフの数
		int g_w;   // グラフの幅
		String s1;
		Font f;
		FontMetrics fm;
					//
					// Windowサイズの取得
					//
		Insets insets = stack.getInsets();
		Dimension d = stack.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title[0]);
			g.drawString(title[0], (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= 3 * f_size / 2;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_p = item.length;
		han = 0;
		for (i1 = 0; i1 < n_p; i1++) {
			len = fm.stringWidth(item[i1]);
			if (len > han)
				han = len;
		}
		han += 15;
		r    = 0.2;   // 凡例領域の割合
		k1   = (int)((x_r - x_l) * r);
		if (han > k1)
			han = k1;
		kx = x_r - han;
		ky = y_u + 3 * f_size / 2;
		k  = 0;
		for (i1 = 0; i1 < n_p; i1++) {
			g.setColor(cl[k]);
			g.fillRect(kx, ky-3, 10, 6);
			g.setColor(Color.black);
			g.drawString(item[i1], kx+15, ky+2*f_size/5);
			k++;
			if (k >= cl.length)
				k = 0;
			ky += f_size;
		}
		x_r -= (han + 10);
					//
					// x軸及びy軸のタイトルの表示
					//
		if (ver) {   // 縦
			if (title[1].length() > 0 && !title[1].equals("-")) {
				len = fm.stringWidth(title[1]);
				g.drawString(title[1], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[2].length() > 0 && !title[2].equals("-")) {
				g.drawString(title[2], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
		else {   // 横
			if (title[2].length() > 0 && !title[2].equals("-")) {
				len = fm.stringWidth(title[2]);
				g.drawString(title[2], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
				y_d -= 7 * f_size / 4;
			}
			else
				y_d -= f_size / 2;
			if (title[1].length() > 0 && !title[1].equals("-")) {
				g.drawString(title[1], x_l, y_u+f_size/2);
				y_u += f_size;
			}
		}
					//
					// x軸,y軸,及び,各軸の目盛り
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f    = new Font("TimesRoman", Font.PLAIN, f_size);
		fm   = g.getFontMetrics(f);
		y_d -= 3 * f_size / 2;
		k    = (int)((y_scale[1] - y_scale[0]) / (0.99 * y_scale[2]));
		n_g  = g_title.length;
		g.setFont(f);

		DecimalFormat df;
		if (place == 0)
			df = new DecimalFormat("#");
		else {
			s1 = "#.";
			for (i1 = 0; i1 < place; i1++)
				s1 += "0";
			df = new DecimalFormat(s1);
		}
						// 縦表示
		if (ver) {
							// y軸
			y1  = y_scale[0];
			len = 0;
			for (i1 = 0; i1 < k+1; i1++) {
				s1 = df.format(y1) + "%";
				k1 = fm.stringWidth(s1);
				if (k1 > len)
					len = k1;
				y1 += y_scale[2];
			}
			g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
			g.drawLine(x_r, y_u, x_r, y_d);
			y1 = y_scale[0];
			x1 = y_d;
			sp = (double)(y_d - y_u) / k;
			for (i1 = 0; i1 < k+1; i1++) {
				ky = (int)Math.round(x1);
				s1 = df.format(y1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, x_l+len-k1, ky+f_size/2);
				g.drawLine(x_l+len+5, ky, x_r, ky);
				y1 += y_scale[2];
				x1 -= sp;
			}
			x_l += (len + 5);
							// x軸
			sp  = (double)(x_r - x_l) / n_g;
			x1  = x_l + sp / 2.0;
			for (i1 = 0; i1 < n_g; i1++) {
				kx  = (int)Math.round(x1);
				k1 = fm.stringWidth(g_title[i1]);
				g.drawString(g_title[i1], kx-k1/2, y_d+6*f_size/5);
				g.drawLine(kx, y_d, kx, y_d-5);
				x1 += sp;
			}
		}
						// 横表示
		else {
							// y軸
			len = 0;
			for (i1 = 0; i1 < n_g; i1++) {
				k1 = fm.stringWidth(g_title[i1]);
				if (k1 > len)
					len = k1;
			}
			g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
			g.drawLine(x_r, y_u, x_r, y_d);
			sp = (double)(y_d - y_u) / n_g;
			y1 = y_d - sp / 2.0;
			for (i1 = 0; i1 < n_g; i1++) {
				ky = (int)Math.round(y1);
				k1 = fm.stringWidth(g_title[n_g-1-i1]);
				g.drawString(g_title[n_g-1-i1], x_l+len-k1, ky+f_size/2);
				g.drawLine(x_l+len+5, ky, x_l+len+10, ky);
				y1 -= sp;
			}
			g.drawLine(x_l+len+5, y_u, x_r, y_u);
			g.drawLine(x_l+len+5, y_d, x_r, y_d);
			x_l += (len + 5);
							// x軸
			x1 = y_scale[0];
			y1 = x_l;
			sp = (double)(x_r - x_l) / k;
			for (i1 = 0; i1 < k+1; i1++) {
				kx = (int)Math.round(y1);
				s1 = df.format(x1);
				k1 = fm.stringWidth(s1);
				g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
				g.drawLine(kx, y_d, kx, y_u);
				x1 += y_scale[2];
				y1 += sp;
			}
		}
					//
					// グラフの表示
					//
						// 縦表示
		if (ver) {
			g_w = (int)(0.8 * (x_r - x_l) / n_g);
			sp  = (double)(x_r - x_l) / n_g;
			x1  = x_l + sp / 2.0;
			for (i1 = 0; i1 < n_g; i1++) {
				kx = (int)Math.round(x1);
				k1 = 0;
				y1 = y_d;
				for (i2 = 0; i2 < n_p; i2++) {
					ky = (int)Math.round(y1);
					g.setColor(cl[k1]);
					y2 = (y_d - y_u) * (data[i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]);
					k2 = (int)Math.round(y2);
					g.fillRect(kx-g_w/2, ky-k2, g_w, k2);
					y1 -= y2;
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
				x1 += sp;
			}
		}
						// 横表示
		else {
			g_w = (int)(0.8 * (y_d - y_u) / n_g);
			sp  = (double)(y_d - y_u) / n_g;
			y1  = y_d - sp / 2.0;
			for (i1 = 0; i1 < n_g; i1++) {
				ky = (int)Math.round(y1);
				k1 = 0;
				x1 = x_l;
				for (i2 = 0; i2 < n_p; i2++) {
					kx = (int)Math.round(x1);
					g.setColor(cl[k1]);
					y2 = (x_r - x_l) * (data[n_g-1-i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]);
					k2 = (int)Math.round(y2);
					g.fillRect(kx, ky-g_w/2, k2, g_w);
					x1 += y2;
					k1++;
					if (k1 >= cl.length)
						k1 = 0;
				}
				y1 -= sp;
			}
		}
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_stack ds;

		ClickMouse(Draw_stack ds1)
		{
			ds = ds1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// 縦表示と横表示の変換
			if (xp > bx1 && xp < bx1+(bx2-bx1)/2 && yp > by1 && yp < by2) {
				if (ver) {
					ver    = false;
					change = "縦 色";
				}
				else {
					ver    = true;
					change = "横 色";
				}
				repaint();
			}
					// グラフの色,線の太さ等
			else if (xp > bx1+(bx2-bx1)/2 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(ds.stack, ds);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------PieGraph---------------------------------

/****************************/
/* 円グラフの描画           */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class PieGraph extends JFrame {

	Draw_pie pn;

	/***********************************/
	/* コンストラクタ                  */
	/*      title_i : グラフのタイトル */
	/*      item_i : 凡例              */
	/*      data_i : グラフのデータ    */
	/*      d_t_i : タイトル表示の有無 */
	/***********************************/
	PieGraph(String title_i, String item_i[], double data_i[], boolean d_t_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("円グラフ");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_pie(title_i, item_i, data_i, d_t_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_pie extends JPanel {

	String title;   // グラフのタイトル
	String item[];   // 凡例
	double data[];   // データ
	boolean d_t;   // タイトル表示の有無
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	PieGraph pie;
	String change = " 色 ";   // 表示切り替えボタン
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_p;   // データの数

	/***********************************/
	/* コンストラクタ                  */
	/*      title_i : グラフのタイトル */
	/*      item_i : 凡例              */
	/*      data_i : グラフのデータ    */
	/*      d_t_i : タイトル表示の有無 */
	/***********************************/
	Draw_pie(String title_i, String item_i[], double data_i[], boolean d_t_i, PieGraph pie_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title = title_i;
		item  = item_i;
		data  = data_i;
		d_t   = d_t_i;
		pie   = pie_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1;
		int i1, a1, a2, k, k1, kx, ky, han, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		String s1;
		Font f;
		FontMetrics fm;
					//
					// Windowサイズの取得
					//
		Insets insets = pie.getInsets();
		Dimension d = pie.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title);
			g.drawString(title, (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= 3 * f_size / 2;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_p = item.length;
		han = 0;
		for (i1 = 0; i1 < n_p; i1++) {
			len = fm.stringWidth(item[i1]);
			if (len > han)
				han = len;
		}
		han += 15;
		r    = 0.2;   // 凡例領域の割合
		k1   = (int)((x_r - x_l) * r);
		if (han > k1)
			han = k1;
		kx  = x_r - han;
		ky  = y_u + 3 * f_size / 2;
		k   = 0;
		len = 0;
		DecimalFormat df = new DecimalFormat("#.0");
		for (i1 = 0; i1 < n_p; i1++) {
			g.setColor(cl[k]);
			g.fillRect(kx, ky-3, 10, 6);
			g.setColor(Color.black);
			g.drawString(item[i1], kx+15, ky+2*f_size/5);
			s1 = df.format(data[i1]) + "%";
			k1 = fm.stringWidth(s1);
			if (k1 > len)
				len = k1;
			g.drawString(s1, kx-k1-5, ky+2*f_size/5);
			k++;
			if (k >= cl.length)
				k = 0;
			ky += f_size;
		}
		x_r -= (han + len + 15);
					//
					// グラフの表示
					//
		if (x_r-x_l < y_d-y_u)
			k1 = x_r - x_l;
		else
			k1 = y_d - y_u;
		len = 9 * k1 / 10;
		kx  = (x_r + x_l - len) / 2;
		ky  = (y_d + y_u - len) / 2;
		a1  = 90;
		a2  = (int)Math.round(3.60 * data[n_p-1]);
		k--;
		if (k < 0)
			k = 9;
		for (i1 = 0; i1 < n_p; i1++) {
			g.setColor(cl[k]);
			g.fillArc(kx, ky, len, len, a1, a2);
			if (i1 < n_p-1) {
				a1 += a2;
				a2  = (int)Math.round(3.60 * data[n_p-2-i1]);
				k--;
				if (k < 0)
					k = cl.length - 1;
			}
		}
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_pie dp;

		ClickMouse(Draw_pie dp1)
		{
			dp = dp1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// グラフの色,線の太さ等
			if (xp > bx1 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(dp.pie, dp);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------ScatterDiagram---------------------------------

/****************************/
/* 散布図の描画             */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ScatterDiagram extends JFrame {

	Draw_scat pn;

	/*********************************************************/
	/* コンストラクタ                                        */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル     */
	/*      x_scale_i : x軸のデータの最小値,最大値,目盛幅 */
	/*      y_scale_i : y軸のデータの最小値,最大値,目盛幅 */
	/*      place_x_i : 小数点以下の桁数(x軸)             */
	/*      place_y_i : 小数点以下の桁数(y軸)             */
	/*      data_i : グラフのデータ                          */
	/*      d_t_i : タイトル表示の有無                       */
	/*********************************************************/
	ScatterDiagram(String title_i[], double x_scale_i[],
                   double y_scale_i[], int place_x_i, int place_y_i,
                   double data_i[][], boolean d_t_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("散布図");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_scat(title_i, x_scale_i, y_scale_i, place_x_i, place_y_i, data_i, d_t_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_scat extends JPanel {

	String title[];   // グラフのタイトル
	double x_scale[];   // x軸目盛り
	double y_scale[];   // y軸目盛り
	double data[][];   // データ
	boolean d_t;   // タイトル表示の有無
	int place_x;   // 小数点以下の桁数(x軸)
	int place_y;   // 小数点以下の桁数(y軸)
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	ScatterDiagram scat;

	/*********************************************************/
	/* コンストラクタ                                        */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル     */
	/*      x_scale_i : x軸のデータの最小値,最大値,目盛幅 */
	/*      y_scale_i : y軸のデータの最小値,最大値,目盛幅 */
	/*      place_x_i : 小数点以下の桁数(x軸)             */
	/*      place_y_i : 小数点以下の桁数(y軸)             */
	/*      data_i : グラフのデータ                          */
	/*      d_t_i : タイトル表示の有無                       */
	/*********************************************************/
	Draw_scat(String title_i[], double x_scale_i[],
                   double y_scale_i[], int place_x_i, int place_y_i,
                   double data_i[][], boolean d_t_i, ScatterDiagram scat_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		x_scale = x_scale_i;
		y_scale = y_scale_i;
		place_x = place_x_i;
		place_y = place_y_i;
		data    = data_i;
		d_t     = d_t_i;
		scat    = scat_i;
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1, sp;
		int i1, cr, k, k1, kx, ky, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_p;   // データの数
		String s1;
		Font f;
		FontMetrics fm;
					//
					// Windowサイズの取得
					//
		Insets insets = getInsets();
		Dimension d = getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title[0]);
			g.drawString(title[0], (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= f_size;
		}
					//
					// x軸及びy軸のタイトルの表示
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		if (title[1].length() > 0 && !title[1].equals("-")) {
			len = fm.stringWidth(title[1]);
			g.drawString(title[1], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
			y_d -= 7 * f_size / 4;
		}
		else
			y_d -= f_size / 2;
		if (title[2].length() > 0 && !title[2].equals("-")) {
			g.drawString(title[2], x_l, y_u+f_size/2);
			y_u += f_size;
		}
					//
					// x軸,y軸,及び,各軸の目盛り
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f    = new Font("TimesRoman", Font.PLAIN, f_size);
		fm   = g.getFontMetrics(f);
		y_d -= 3 * f_size / 2;
		n_p  = data[0].length;
		g.setFont(f);
							// y軸
		DecimalFormat df;
		if (place_y == 0)
			df = new DecimalFormat("#");
		else {
			s1 = "#.";
			for (i1 = 0; i1 < place_y; i1++)
				s1 += "0";
			df = new DecimalFormat(s1);
		}

		k   = (int)((y_scale[1] - y_scale[0]) / (0.99 * y_scale[2]));
		y1  = y_scale[0];
		len = 0;
		for (i1 = 0; i1 < k+1; i1++) {
			s1 = df.format(y1);
			k1 = fm.stringWidth(s1);
			if (k1 > len)
				len = k1;
			y1 += y_scale[2];
		}
		g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
		g.drawLine(x_r, y_u, x_r, y_d);
		y1 = y_scale[0];
		x1 = y_d;
		sp = (double)(y_d - y_u) / k;
		for (i1 = 0; i1 < k+1; i1++) {
			ky = (int)Math.round(x1);
			s1 = df.format(y1);
			k1 = fm.stringWidth(s1);
			g.drawString(s1, x_l+len-k1, ky+f_size/2);
			g.drawLine(x_l+len+5, ky, x_r, ky);
			y1 += y_scale[2];
			x1 -= sp;
		}
		x_l += (len + 5);
							// x軸
		if (place_x == 0)
			df = new DecimalFormat("#");
		else {
			s1 = "#.";
			for (i1 = 0; i1 < place_x; i1++)
				s1 += "0";
			df = new DecimalFormat(s1);
		}

		k  = (int)((x_scale[1] - x_scale[0]) / (0.99 * x_scale[2]));
		x1 = x_scale[0];
		y1 = x_l;
		sp = (double)(x_r - x_l) / k;
		for (i1 = 0; i1 < k+1; i1++) {
			kx = (int)Math.round(y1);
			s1 = df.format(x1);
			k1 = fm.stringWidth(s1);
			g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
			if (i1 < k)
				g.drawLine(kx, y_d, kx, y_u);
			x1 += x_scale[2];
			y1 += sp;
		}
					//
					// グラフの表示
					//
		cr = f_size / 2;
		if (cr == 0)
			cr = 1;
		for (i1 = 0; i1 < n_p; i1++) {
			kx = x_l + (int)((x_r - x_l) * (data[0][i1] - x_scale[0]) / (x_scale[1] - x_scale[0]));
			ky = y_d - (int)((y_d - y_u) * (data[1][i1] - y_scale[0]) / (y_scale[1] - y_scale[0]));
			g.fillOval(kx-cr/2, ky-cr/2, cr, cr);
		}
					//
					// 相関係数
					//
		double vii = 0.0, vjj = 0.0, vij = 0.0, mi = 0.0, mj = 0.0;
		for (i1 = 0; i1 < n_p; i1++) {
			mi += data[0][i1];
			mj += data[1][i1];
		}
		mi /= n_p;
		mj /= n_p;
		for (i1 = 0; i1 < n_p; i1++) {
			vii += (data[0][i1] - mi) * (data[0][i1] - mi);
			vjj += (data[1][i1] - mj) * (data[1][i1] - mj);
			vij += (data[0][i1] - mi) * (data[1][i1] - mj);
		}
		vii /= (n_p - 1);
		vjj /= (n_p - 1);
		vij /= (n_p - 1);
		x1   = vij / (Math.sqrt(vii) * Math.sqrt(vjj));
		df   = new DecimalFormat("0.000");
		s1   = "相関係数: " + df.format(x1);
		k1   = fm.stringWidth(s1);
		g.drawString(s1, x_r-k1, y_u-f_size/2);
	}
}

-------------------------------RadarChart---------------------------------

/****************************/
/* レーダーチャートの描画   */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class RadarChart extends JFrame {

	Draw_radar pn;

	/*************************************************/
	/* コンストラクタ                                */
	/*      title_i : グラフのタイトル               */
	/*      g_title_i : 凡例(グラフの内容)         */
	/*      item_i : 項目                            */
	/*      scale_i : データの最小値,最大値,目盛幅 */
	/*      place_i : 小数点以下の桁数               */
	/*      data_i : グラフのデータ                  */
	/*      d_t_i : タイトル表示の有無               */
	/*      d_g_i : 凡例表示の有無                   */
	/*************************************************/
	RadarChart(String title_i, String g_title_i[], String item_i[],
               double scale_i[], int place_i, double data_i[][],
               boolean d_t_i, boolean d_g_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("レーダーチャート");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_radar(title_i, g_title_i, item_i, scale_i, place_i, data_i, d_t_i, d_g_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_radar extends JPanel {

	String title;   // グラフのタイトル
	String g_title[];   // 凡例(グラフの内容)
	String item[];   // 項目
	double scale[];   // 目盛り
	double data[][];   // データ
	boolean d_t;   // タイトル表示の有無
	boolean d_g;   // 凡例表示の有無
	int place;   // 小数点以下の桁数
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	RadarChart radar;
	String change = " 色 ";   // 表示切り替えボタン
	float line_w = 1.0f;   // 折れ線グラフ等の線の太さ
	boolean line_m = true;   // 折れ線グラフ等にマークを付けるか否か
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_g;   // グラフの数

	/*************************************************/
	/* コンストラクタ                                */
	/*      title_i : グラフのタイトル               */
	/*      g_title_i : 凡例(グラフの内容)         */
	/*      item_i : 項目                            */
	/*      scale_i : データの最小値,最大値,目盛幅 */
	/*      place_i : 小数点以下の桁数               */
	/*      data_i : グラフのデータ                  */
	/*      d_t_i : タイトル表示の有無               */
	/*      d_g_i : 凡例表示の有無                   */
	/*************************************************/
	Draw_radar(String title_i, String g_title_i[], String item_i[],
               double scale_i[], int place_i, double data_i[][],
               boolean d_t_i, boolean d_g_i, RadarChart radar_i)
	{
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		item    = item_i;
		scale   = scale_i;
		place   = place_i;
		data    = data_i;
		d_t     = d_t_i;
		d_g     = d_g_i;
		radar   = radar_i;
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double a, as, r, xx, x0, x11, x12, x21, x22, yy, y0, y11, y12, y21, y22, sp;
		int i1, i2, cx, cy, cr, k, k1, kx, kx0, kx1, kx2, ky, ky0, ky1, ky2, han, len, pt;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_p;   // 項目の数
		String s1;
		Font f;
		FontMetrics fm;
		Graphics2D g2 = (Graphics2D)g;
					//
					// Windowサイズの取得
					//
		Insets insets = radar.getInsets();
		Dimension d = radar.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title);
			g.drawString(title, (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= 3*f_size/2;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_g = g_title.length;
		if (d_g) {
			han = 0;
			for (i1 = 0; i1 < n_g; i1++) {
				len = fm.stringWidth(g_title[i1]);
				if (len > han)
					han = len;
			}
			han += 15;
			r    = 0.2;   // 凡例領域の割合
			k1   = (int)((x_r - x_l) * r);
			if (han > k1)
				han = k1;
			kx = x_r - han;
			ky = y_u + 3 * f_size / 2;
			k  = 0;
			g2.setStroke(new BasicStroke(7.0f));
			for (i1 = 0; i1 < n_g; i1++) {
				g.setColor(cl[k]);
				g.drawLine(kx, ky, kx+10, ky);
				g.setColor(Color.black);
				g.drawString(g_title[i1], kx+15, ky+2*f_size/5);
				k++;
				if (k >= cl.length)
					k = 0;
				ky += f_size;
			}
			g2.setStroke(new BasicStroke(1.0f));
			x_r -= (han + 10);
		}
		else
			x_r -= (int)(0.03 * (x_r - x_l));
					//
					// 軸,及び,軸の目盛り
					//
						// フォントサイズ
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);

		DecimalFormat df;
		if (place == 0)
			df = new DecimalFormat("#");
		else {
			s1 = "#.";
			for (i1 = 0; i1 < place; i1++)
				s1 += "0";
			df = new DecimalFormat(s1);
		}
						// 大きさの決定
		n_p = item.length;
		a   = 0.5 * Math.PI;
		as  = 2.0 * Math.PI / n_p;
		x11 = 0.0;
		x12 = 0.0;
		x21 = 0.0;
		x22 = 0.0;
		y11 = 0.0;
		y12 = 0.0;
		y21 = 0.0;
		y22 = 0.0;
		for (i1 = 0; i1 < n_p; i1++) {
			xx = 100 * Math.cos(a);
			yy = 100 * Math.sin(a);
			k1 = fm.stringWidth(item[i1]);
			if (i1 == 0) {
				x12 = 0.5 * k1;
				x22 = x12;
				y11 = 100.0;
				y12 = 5.0 * f_size / 4.0;
			}
			else if (Math.abs(xx) < 1.0e-5) {
				x0 = 0.5 * k1;
				if (x0 > x12)
					x12 = x0;
				if (x0 > x22)
					x22 = x0;
				y21 = 100.0;
				y22 = f_size + 5.0;
			}
			else {
				if (yy < 0.0) {
					y0 = -yy + 0.5 * f_size;
					if (y0 > y21+y22) {
						y21 = -yy;
						y22 = 0.5 * f_size;
					}
				}
				if (xx > 0.0) {
					x0 = xx + k1 + 5.0;
					if (x0 > x21+x22) {
						x21 = xx;
						x22 = k1 + 5.0;
					}
				}
				else {
					x0 = -xx + k1 + 5.0;
					if (x0 > x11+x12) {
						x11 = -xx;
						x12 = k1 + 5.0;
					}
				}
			}
			a += as;
		}
		x0 = x12 + x22;
		xx = (x_r - x_l - x0 - 10) / (x11 + x21);
		y0 = y12 + y22;
		yy = (y_d - y_u - y0 - 10) / (y11 + y21);
		r  = (xx < yy) ? xx : yy;
		cr = (int)(100 * r);
		xx = x_l + r * x11 + x12 + 5.0;
		cx = (int)(xx + (x_r - x_l - r * x11 - x12 - r * x21 - x22 - 5) / 2);
		yy = y_u + r * y11 + y12 + 5.0;
		cy = (int)(yy + (y_d - y_u - r * y11 - y12 - r * y21 - y22 - 5) / 2);
						// 軸とタイトルの描画
		k  = (int)((scale[1] - scale[0]) / (0.99 * scale[2])) + 1;
		xx = (double)cr / k;
		a  = 0.5 * Math.PI;
		as = 2.0 * Math.PI / n_p;
		for (i1 = 0; i1 < n_p; i1++) {
			kx = (int)Math.round(cr * Math.cos(a));
			ky = (int)Math.round(cr * Math.sin(a));
			k1 = fm.stringWidth(item[i1]);
			g.drawLine(cx, cy, cx+kx, cy-ky);
			yy = xx;
			for (i2 = 0; i2 < k; i2++) {
				kx0 = cx + (int)Math.round(yy * Math.cos(a));
				ky0 = cy - (int)Math.round(yy * Math.sin(a));
				kx1 = kx0 + (int)Math.round(3 * Math.cos(a+0.5*Math.PI));
				ky1 = ky0 - (int)Math.round(3 * Math.sin(a+0.5*Math.PI));
				kx2 = kx0 + (int)Math.round(3 * Math.cos(a-0.5*Math.PI));
				ky2 = ky0 - (int)Math.round(3 * Math.sin(a-0.5*Math.PI));
				g.drawLine(kx1, ky1, kx2, ky2);
				yy += xx;
			}
			if (i1 == 0) {
				g.drawString(item[i1], cx+kx-k1/2, cy-ky-5*f_size/4);
				yy = xx;
				sp = scale[0];
				for (i2 = 0; i2 < k; i2++) {
					s1  = df.format(sp);
					kx0 = cx + (int)Math.round(yy * Math.cos(a)) + 5;
					ky0 = cy - (int)Math.round(yy * Math.sin(a)) + 2 * f_size / 5;
					g.drawString(s1, kx0, ky0);
					yy += xx;
					sp += scale[2];
				}
			}
			else if (kx == 0)
				g.drawString(item[i1], cx+kx-k1/2, cy-ky+f_size+5);
			else if (kx > 0)
				g.drawString(item[i1], cx+kx+5, cy-ky+f_size/2);
			else
				g.drawString(item[i1], cx+kx-k1-5, cy-ky+f_size/2);
			a += as;
		}
					//
					// グラフの表示
					//
		g2.setStroke(new BasicStroke(line_w));
		pt = (int)line_w + 6;
		k1 = 0;
		for (i1 = 0; i1 < n_g; i1++) {
			g.setColor(cl[k1]);
			a   = 0.5 * Math.PI;
			as  = 2.0 * Math.PI / n_p;
			kx1 = 0;
			ky1 = 0;
			kx2 = 0;
			ky2 = 0;
			for (i2 = 0; i2 < n_p; i2++) {
				yy = xx + (cr - xx) * (data[i1][i2] - scale[0]) / (scale[1] - scale[0]);
				kx = cx + (int)Math.round(yy * Math.cos(a));
				ky = cy - (int)Math.round(yy * Math.sin(a));
				if (line_m)
					g.fillOval(kx-pt/2, ky-pt/2, pt, pt);
				if (i2 == 0) {
					kx2 = kx;
					ky2 = ky;
				}
				else {
					g.drawLine(kx1, ky1, kx, ky);
					if (i2 == n_p-1)
						g.drawLine(kx2, ky2, kx, ky);
				}
				kx1  = kx;
				ky1  = ky;
				a   += as;
			}
			k1++;
			if (k1 >= cl.length)
				k1 = 0;
		}
		g2.setStroke(new BasicStroke(1.0f));
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_radar da;

		ClickMouse(Draw_radar da1)
		{
			da = da1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// グラフの色,線の太さ等
			if (xp > bx1 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(da.radar, da);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------Bode---------------------------------

/****************************/
/* ボード線図の描画         */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Bode extends JFrame {

	Draw_bode pn;

	/*********************************************************/
	/* コンストラクタ                                        */
	/*      title_i : グラフ,x軸,及び,y軸のタイトル     */
	/*      g_title_i : 凡例                                 */
	/*      x_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_x_i : 小数点以下の桁数(x軸)             */
	/*      y_scale_i : データの最小値,最大値,目盛幅(y) */
	/*      place_y_i : 小数点以下の桁数(y軸)             */
	/*      data_x_i : グラフのデータ(x軸)                */
	/*      data_y_i : グラフのデータ(y軸)                */
	/*      d_t_i : タイトル表示の有無                       */
	/*      d_g_i : 凡例表示の有無                           */
	/*********************************************************/
	Bode(String title_i[], String g_title_i[], double x_scale_i[],
              int place_x_i, double y_scale_i[], int place_y_i,
              double data_x_i[][], double data_y_i[][], boolean d_t_i,
              boolean d_g_i)
	{
					// JFrameクラスのコンストラクタの呼び出し
		super("ボード線図");
					// Windowサイズと表示位置を設定
		int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
		setSize(width, height);
		Toolkit tool = getToolkit();
		Dimension d  = tool.getScreenSize();
		setLocation(d.width / 2 - width / 2, d.height / 2 - height / 2);
					// 描画パネル
		Container cp = getContentPane();
		pn = new Draw_bode(title_i, g_title_i, x_scale_i, place_x_i, y_scale_i, place_y_i, data_x_i, data_y_i, d_t_i, d_g_i, this);
		cp.add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
		addComponentListener(new ComponentResize());
	}

	/**********************/
	/* Windowのサイズ変化 */
	/**********************/
	class ComponentResize extends ComponentAdapter
	{
		public void componentResized(ComponentEvent e)
		{
			pn.repaint();
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
		}
	}
}

class Draw_bode extends JPanel {

	String title[];   // グラフのタイトル
	String g_title[];   // 凡例(グラフの内容)
	double xx_scale[];   // y軸目盛り
	double x_scale[];   // 元のy軸目盛り
	double y_scale[];   // y軸目盛り
	double data_x[][];   // 元のデータ
	double data_xx[][], data_y[][];   // データ
	boolean d_t;   // タイトル表示の有無
	boolean d_g;   // 凡例表示の有無
	boolean log_c = false;   // 対数に変換したか否か
	int place_x;   // 小数点以下の桁数(x軸)
	int place_y;   // 小数点以下の桁数(y軸)
	int width = 900, height = 600;   // Windowの大きさ(初期サイズ)
	int bx1, bx2, by1, by2;   // 表示切り替えボタンの位置
	Bode bd;
	String change = " 色 ";   // 表示切り替えボタン
	float line_w = 1.0f;   // 折れ線グラフ等の線の太さ
	Color cl[] = {Color.black, Color.magenta, Color.blue, Color.orange, Color.cyan,
	              Color.pink, Color.green, Color.yellow, Color.darkGray, Color.red};   // グラフの色
	int n_g;   // グラフの数

	/******************/
	/* コンストラクタ */
	/******************/
	Draw_bode(String title_i[], String g_title_i[], double x_scale_i[],
              int place_x_i, double y_scale_i[], int place_y_i,
              double data_x_i[][], double data_y_i[][], boolean d_t_i,
              boolean d_g_i, Bode bd1) {
					// 背景色
		setBackground(Color.white);
					// テーブルデータの保存
		title   = title_i;
		g_title = g_title_i;
		x_scale = x_scale_i;
		place_x = place_x_i;
		y_scale = y_scale_i;
		place_y = place_y_i;
		data_x  = data_x_i;
		data_y  = data_y_i;
		d_t     = d_t_i;
		d_g     = d_g_i;
		bd      = bd1;

		int i1, i2;
		int n_g = g_title.length;
		int n_p = data_x[0].length;
		xx_scale  = new double [3];
		data_xx   = new double [n_g][n_p];
		xx_scale[0] = x_scale[0];
		xx_scale[1] = x_scale[1];
		for (i1 = 0; i1 < n_g; i1++) {
			for (i2 = 0; i2 < n_p; i2++)
				data_xx[i1][i2] = data_x[i1][i2];
		}
					// イベントアダプタ
		addMouseListener(new ClickMouse(this));
	}

	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)

		double r, x1, y1, y2, sp, x_scale_org = 0.0;
		int i1, i2, k, k_x, k_y, k1, k2, kx, kx1, ky, ky1, han, len;
		int x_l, x_r, y_u, y_d;   // 描画領域
		int f_size;   // フォントサイズ
		int n_p;   // データの数
		String s1;
		Font f;
		FontMetrics fm;
		Graphics2D g2 = (Graphics2D)g;
					//
					// Windowサイズの取得
					//
		Insets insets = bd.getInsets();
		Dimension d = bd.getSize();
		width  = d.width - (insets.left + insets.right);
		height = d.height - (insets.top + insets.bottom);
		x_l    = insets.left + 10;
		x_r    = d.width - insets.right - 10;
		y_u    = 20;
		y_d    = d.height - insets.bottom - insets.top;
					//
					// グラフタイトルの表示
					//
		r      = 0.05;   // タイトル領域の割合
		f_size = ((y_d - y_u) < (x_r - x_l)) ? (int)((y_d - y_u) * r) : (int)((x_r - x_l) * r);
		if (f_size < 5)
			f_size = 5;
		if (d_t) {
			f = new Font("TimesRoman", Font.BOLD, f_size);
			g.setFont(f);
			fm  = g.getFontMetrics(f);
			len = fm.stringWidth(title[0]);
			g.drawString(title[0], (x_l+x_r)/2-len/2, y_d-f_size/2);
			y_d -= f_size;
		}
					//
					// 表示切り替えボタンの設置
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f  = new Font("TimesRoman", Font.PLAIN, f_size);
		fm = g.getFontMetrics(f);
		g.setFont(f);
		g.setColor(Color.yellow);
		len = fm.stringWidth(change);
		bx1 = x_r - len - 7 * f_size / 10;
		by1 = y_u - f_size / 2;
		bx2 = bx1 + len + f_size / 2;
		by2 = by1 + 6 * f_size / 5;
		g.fill3DRect(bx1, by1, len+f_size/2, 6*f_size/5, true);
		g.setColor(Color.black);
		g.drawString(change, x_r-len-f_size/2, y_u+f_size/2);
					//
					// 凡例の表示
					//
		n_g = g_title.length;
		if (d_g) {
			han = 0;
			for (i1 = 0; i1 < n_g; i1++) {
				len = fm.stringWidth(g_title[i1]);
				if (len > han)
					han = len;
			}
			han += 15;
			r    = 0.2;   // 凡例領域の割合
			k1   = (int)((x_r - x_l) * r);
			if (han > k1)
				han = k1;
			kx = x_r - han;
			ky = y_u + 3 * f_size / 2;
			k  = 0;
			g2.setStroke(new BasicStroke(7.0f));
			for (i1 = 0; i1 < n_g; i1++) {
				g.setColor(cl[k]);
				g.drawLine(kx, ky, kx+10, ky);
				g.setColor(Color.black);
				g.drawString(g_title[i1], kx+15, ky+2*f_size/5);
				k++;
				if (k >= cl.length)
					k = 0;
				ky += f_size;
			}
			g2.setStroke(new BasicStroke(1.0f));
			x_r -= (han + 10);
		}
		else
			x_r -= (int)(0.03 * (x_r - x_l));
					//
					// x軸の対数
					//
		n_p         = data_x[0].length;
		x_scale_org = x_scale[0];
		xx_scale[0] = Math.log(x_scale[0]) / Math.log(10.0);
		xx_scale[1] = Math.log(x_scale[1]) / Math.log(10.0);
		xx_scale[2] = 1.0;
		for (i1 = 0; i1 < n_g; i1++) {
			for (i2 = 0; i2 < n_p; i2++)
				data_xx[i1][i2] = Math.log(data_x[i1][i2]) / Math.log(10.0);
		}
					//
					// x軸及びy軸のタイトルの表示
					//
		if (title[1].length() > 0 && !title[1].equals("-")) {
			len = fm.stringWidth(title[1]);
			g.drawString(title[1], (x_l+x_r)/2-len/2, y_d-4*f_size/5);
			y_d -= 7 * f_size / 4;
		}
		else
			y_d -= f_size / 2;
		if (title[2].length() > 0 && !title[2].equals("-")) {
			g.drawString(title[2], x_l, y_u+f_size/2);
			y_u += f_size;
		}
					//
					// x軸,y軸,及び,各軸の目盛り
					//
		f_size = (int)(0.8 * f_size);
		if (f_size < 5)
			f_size = 5;
		f    = new Font("TimesRoman", Font.PLAIN, f_size);
		fm   = g.getFontMetrics(f);
		y_d -= 3 * f_size / 2;
		k_y  = (int)((y_scale[1] - y_scale[0]) / (0.99 * y_scale[2]));
		k_x  = (int)((xx_scale[1] - xx_scale[0]) / (0.99 * xx_scale[2]));
		g.setFont(f);

		DecimalFormat df_x, df_y;
		df_x = new DecimalFormat("#");
		df_y = new DecimalFormat("#");
		if (place_x != 0) {
			s1 = "0.";
			for (i1 = 0; i1 < place_x; i1++)
				s1 += "0";
			df_x = new DecimalFormat(s1);
		}
		if (place_y != 0) {
			s1 = "#.";
			for (i1 = 0; i1 < place_y; i1++)
				s1 += "0";
			df_y = new DecimalFormat(s1);
		}
						// y軸
		y1  = y_scale[0];
		len = 0;
		for (i1 = 0; i1 < k_y+1; i1++) {
			s1 = df_y.format(y1);
			k1 = fm.stringWidth(s1);
			if (k1 > len)
				len = k1;
			y1 += y_scale[2];
		}
		g.drawLine(x_l+len+5, y_u, x_l+len+5, y_d);
		g.drawLine(x_r, y_u, x_r, y_d);
		y1 = y_scale[0];
		x1 = y_d;
		sp = (double)(y_d - y_u) / k_y;
		for (i1 = 0; i1 < k_y+1; i1++) {
			ky = (int)Math.round(x1);
			s1 = df_y.format(y1);
			k1 = fm.stringWidth(s1);
			g.drawString(s1, x_l+len-k1, ky+f_size/2);
			g.drawLine(x_l+len+5, ky, x_r, ky);
			y1 += y_scale[2];
			x1 -= sp;
		}
		x_l += (len + 5);
						// x軸
		x1 = x_scale_org;
		y1 = x_l;
		sp = (double)(x_r - x_l) / k_x;
		for (i1 = 0; i1 < k_x+1; i1++) {
			kx = (int)Math.round(y1);
			s1 = df_x.format(x1);
			k1 = fm.stringWidth(s1);
			g.drawString(s1, kx-k1/2, y_d+6*f_size/5);
			g.drawLine(kx, y_d, kx, y_u);
			if (i1 != k_x) {
				g.setColor(Color.darkGray);
				for (i2 = 2; i2 <= 9; i2++) {
					y2 = Math.log(x1 * i2) / Math.log(10.0);
					kx = x_l + (int)Math.round(((x_r - x_l) * (y2 - xx_scale[0]) / (xx_scale[1] - xx_scale[0])));
					g.drawLine(kx, y_d, kx, y_u);
				}
				g.setColor(Color.black);
			}
			x1 *= 10.0;
			y1 += sp;
		}
					//
					// グラフの表示
					//
		g2.setStroke(new BasicStroke(line_w));
		k1  = 0;
		for (i1 = 0; i1 < n_g; i1++) {
			g.setColor(cl[k1]);
			kx1 = 0;
			ky1 = 0;
			for (i2 = 0; i2 < n_p; i2++) {
				kx = x_l + (int)((x_r - x_l) * (data_xx[i1][i2] - xx_scale[0]) / (xx_scale[1] - xx_scale[0]));
				ky = y_d - (int)((y_d - y_u) * (data_y[i1][i2] - y_scale[0]) / (y_scale[1] - y_scale[0]));
				if (i2 > 0)
					g.drawLine(kx1, ky1, kx, ky);
				kx1 = kx;
				ky1 = ky;
			}
			k1++;
			if (k1 >= cl.length)
				k1 = 0;
		}
		g2.setStroke(new BasicStroke(1.0f));
	}

	/************************************/
	/* マウスがクリックされたときの処理 */
	/************************************/
	class ClickMouse extends MouseAdapter
	{
		Draw_bode dd;

		ClickMouse(Draw_bode dd1)
		{
			dd = dd1;
		}

		public void mouseClicked(MouseEvent e)
		{
			int xp = e.getX();
			int yp = e.getY();
					// グラフの色,線の太さ等
			if (xp > bx1 && xp < bx2 && yp > by1 && yp < by2) {
				Modify md = new Modify(dd.bd, dd);
				md.setVisible(true);
			}
		}
	}
}

-------------------------------Modify---------------------------------

/****************************/
/* 色及び線の太さの変更     */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Modify extends JDialog implements ActionListener, TextListener {
	Draw_line dr;   // 折れ線グラフ
	JButton bt_dr;
	Draw_stack ds;   // 積み上げ棒グラフ
	JButton bt_ds;
	Draw_bar db;   // 棒グラフ
	JButton bt_db;
	Draw_bode dd;   // ボード線図
	JButton bt_dd;
	Draw_pie dp;   // 円グラフ
	JButton bt_dp;
	Draw_radar da;   // レーダーチャート
	JButton bt_da;
	TextField rgb[];
	TextField r[];
	TextField g[];
	TextField b[];
	JTextField tx;
	JRadioButton r1, r2;
	float line_w = 1.0f;   // 折れ線グラフ等の線の太さ
	boolean line_m = true;   // 折れ線グラフ等にマークを付けるか否か
	Color cl[];   // グラフの色
	int n_g;   // グラフの数
	int wd;   // 線の太さを変更するか
	int mk;   // マークを変更するか
	int n;
	JPanel jp[];
					// 折れ線グラフ
	Modify(Frame host, Draw_line dr1)
	{
		super(host, "色と線の変更", true);
							// 初期設定
		dr  = dr1;
		wd  = 1;
		mk  = 1;
		n_g = dr.n_g;
		if (n_g > 10)
			n_g = 10;
		n      = n_g + 3;
		line_w = dr.line_w;
		line_m = dr.line_m;
		cl     = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = dr.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_dr = new JButton("OK");
		bt_dr.setFont(f);
		bt_dr.addActionListener(this);
		jp[n-1].add(bt_dr);
	}
					// 積み上げ棒グラフ
	Modify(Frame host, Draw_stack ds1)
	{
		super(host, "色の変更", true);
							// 初期設定
		ds  = ds1;
		wd  = 0;
		mk  = 0;
		n_g = ds.n_p;
		if (n_g > 10)
			n_g = 10;
		n  = n_g + 1;
		cl = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = ds.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_ds = new JButton("OK");
		bt_ds.setFont(f);
		bt_ds.addActionListener(this);
		jp[n-1].add(bt_ds);
	}
					// 棒グラフ
	Modify(Frame host, Draw_bar db1)
	{
		super(host, "色の変更", true);
							// 初期設定
		db  = db1;
		wd  = 0;
		mk  = 0;
		n_g = db.n_g;
		if (n_g > 10)
			n_g = 10;
		n  = n_g + 1;
		cl = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = db.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_db = new JButton("OK");
		bt_db.setFont(f);
		bt_db.addActionListener(this);
		jp[n-1].add(bt_db);
	}
					// ボード線図
	Modify(Frame host, Draw_bode dd1)
	{
		super(host, "色と線の変更", true);
							// 初期設定
		dd  = dd1;
		wd  = 1;
		mk  = 0;
		n_g = dd.n_g;
		if (n_g > 10)
			n_g = 10;
		n      = n_g + 2;
		line_w = dd.line_w;
		cl     = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = dd.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_dd = new JButton("OK");
		bt_dd.setFont(f);
		bt_dd.addActionListener(this);
		jp[n-1].add(bt_dd);
	}
					// 円グラフ
	Modify(Frame host, Draw_pie dp1)
	{
		super(host, "色の変更", true);
							// 初期設定
		dp  = dp1;
		wd  = 0;
		mk  = 0;
		n_g = dp.n_p;
		if (n_g > 10)
			n_g = 10;
		n  = n_g + 1;
		cl = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = dp.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_dp = new JButton("OK");
		bt_dp.setFont(f);
		bt_dp.addActionListener(this);
		jp[n-1].add(bt_dp);
	}
					// レーダーチャート
	Modify(Frame host, Draw_radar da1)
	{
		super(host, "色と線の変更", true);
							// 初期設定
		da  = da1;
		wd  = 1;
		mk  = 1;
		n_g = da.n_g;
		if (n_g > 10)
			n_g = 10;
		n      = n_g + 3;
		line_w = da.line_w;
		line_m = da.line_m;
		cl     = new Color[n_g];
		for (int i1 = 0; i1 < n_g; i1++)
			cl[i1] = da.cl[i1];
		set();
							// ボタン
		Font f = new Font("TimesRoman", Font.BOLD, 20);
		bt_da = new JButton("OK");
		bt_da.setFont(f);
		bt_da.addActionListener(this);
		jp[n-1].add(bt_da);
	}
					// 設定
	void set()
	{
		setSize(450, 60*(n));
		Container cp = getContentPane();
		cp.setBackground(Color.white);
		cp.setLayout(new GridLayout(n, 1, 5, 5));
		jp = new JPanel[n];
		for (int i1 = 0; i1 < n; i1++) {
			jp[i1] = new JPanel();
			cp.add(jp[i1]);
		}
		Font f = new Font("TimesRoman", Font.BOLD, 20);
							// 色の変更
		JLabel lb[][] = new JLabel[n_g][3];
		rgb = new TextField[n_g];
		r = new TextField[n_g];
		g = new TextField[n_g];
		b = new TextField[n_g];
		for (int i1 = 0; i1 < n_g; i1++) {
			rgb[i1] = new TextField(3);
			rgb[i1].setFont(f);
			rgb[i1].setBackground(new Color(cl[i1].getRed(), cl[i1].getGreen(), cl[i1].getBlue()));
			jp[i1].add(rgb[i1]);
			lb[i1][0] = new JLabel(" 赤");
			lb[i1][0].setFont(f);
			jp[i1].add(lb[i1][0]);
			r[i1] = new TextField(3);
			r[i1].setFont(f);
			r[i1].setBackground(Color.white);
			r[i1].setText(Integer.toString(cl[i1].getRed()));
			r[i1].addTextListener(this);
			jp[i1].add(r[i1]);
			lb[i1][1] = new JLabel("緑");
			lb[i1][1].setFont(f);
			jp[i1].add(lb[i1][1]);
			g[i1] = new TextField(3);
			g[i1].setFont(f);
			g[i1].setBackground(Color.white);
			g[i1].setText(Integer.toString(cl[i1].getGreen()));
			g[i1].addTextListener(this);
			jp[i1].add(g[i1]);
			lb[i1][2] = new JLabel("青");
			lb[i1][2].setFont(f);
			jp[i1].add(lb[i1][2]);
			b[i1] = new TextField(3);
			b[i1].setFont(f);
			b[i1].setBackground(Color.white);
			b[i1].setText(Integer.toString(cl[i1].getBlue()));
			b[i1].addTextListener(this);
			jp[i1].add(b[i1]);
		}
							// 線の変更
		if (wd > 0) {
			JLabel lb1 = new JLabel("線の太さ:");
			lb1.setFont(f);
			jp[n_g].add(lb1);
			tx = new JTextField(2);
			tx.setFont(f);
			tx.setBackground(Color.white);
			tx.setText(Integer.toString((int)line_w));
			jp[n_g].add(tx);
		}

		if (mk > 0) {
			JLabel lb2 = new JLabel("マーク:");
			lb2.setFont(f);
			jp[n-2].add(lb2);
			ButtonGroup gp = new ButtonGroup();
			r1 = new JRadioButton("付ける");
			r1.setFont(f);
			gp.add(r1);
			jp[n-2].add(r1);
			r2 = new JRadioButton("付けない");
			r2.setFont(f);
			gp.add(r2);
			jp[n-2].add(r2);
			if (line_m)
				r1.doClick();
			else
				r2.doClick();
		}
	}
					// TextFieldの内容が変更されたときの処理
	public void textValueChanged(TextEvent e)
	{
		for (int i1 = 0; i1 < n_g; i1++) {
			if (e.getSource() == r[i1] || e.getSource() == g[i1] || e.getSource() == b[i1]) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				rgb[i1].setBackground(new Color(rc, gc, bc));
			}
		}
	}
					// 値の設定
	public void actionPerformed(ActionEvent e)
	{
							// 折れ線グラフ
		if (e.getSource() == bt_dr) {
			for (int i1 = 0; i1 < n_g; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				dr.cl[i1] = new Color(rc, gc, bc);
			}
			dr.line_w = Integer.parseInt(tx.getText());
			if (r1.isSelected())
				dr.line_m = true;
			else
				dr.line_m = false;
			dr.repaint();
		}
							// 積み上げ棒グラフ
		else if (e.getSource() == bt_ds) {
			for (int i1 = 0; i1 < ds.n_p; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				ds.cl[i1] = new Color(rc, gc, bc);
			}
			ds.repaint();
		}
							// 棒グラフ
		else if (e.getSource() == bt_db) {
			for (int i1 = 0; i1 < db.n_g; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				db.cl[i1] = new Color(rc, gc, bc);
			}
			db.repaint();
		}
							// ボード線図
		else if (e.getSource() == bt_dd) {
			for (int i1 = 0; i1 < n_g; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				dd.cl[i1] = new Color(rc, gc, bc);
			}
			dd.line_w = Integer.parseInt(tx.getText());
			dd.repaint();
		}
							// 円グラフ
		else if (e.getSource() == bt_dp) {
			for (int i1 = 0; i1 < dp.n_p; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				dp.cl[i1] = new Color(rc, gc, bc);
			}
			dp.repaint();
		}
							// レーダーチャート
		else if (e.getSource() == bt_da) {
			for (int i1 = 0; i1 < n_g; i1++) {
				String str = r[i1].getText();
				int rc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = g[i1].getText();
				int gc = str.length()>0 ? Integer.parseInt(str) : 0;
				str = b[i1].getText();
				int bc = str.length()>0 ? Integer.parseInt(str) : 0;
				da.cl[i1] = new Color(rc, gc, bc);
			}
			da.line_w = Integer.parseInt(tx.getText());
			if (r1.isSelected())
				da.line_m = true;
			else
				da.line_m = false;
			da.repaint();
		}

		setVisible(false);
	}
}