今回は入力されたデータを元にして棒グラフと折れ線グラフを表示します。このようなグラフ描画機能は電卓に用意されているものの方が手軽で高機能・高性能です。ですので、実務・授業等において標準機能で十分かもしれません。
 とはいえ標準では用意されていないグラフや、思い通りのグラフを表示したい場合にはPythonで作成した方がよい場合もあります。ここらへんは用途に応じて使い分けてください。

 なお、ここではすでに作成してある線を描画するライブラリを利用します。glib.pyという名前で実行するpyファイルと同じフォルダ/階層においてください。glib.pyの内容は以下のようになっています。

from casioplot import *
def gLine(x1,y1,x2,y2,col):
  x=x1
  y=y1
  sx=1
  sy=1
  dx=x2-x1
  dy=y2-y1
  if dx<0:
    sx=-1
  if dy<0:
    sy=-1
  if dx==0:
    for i in range(abs(dy)):
      set_pixel(int(x),int(y),col)
      y=y+sy
    return
  if dy==0:
    for i in range(abs(dx)):
      set_pixel(int(x),int(y),col)
      x=x+sx
    return
  if abs(dx)>abs(dy):
    d=dy/abs(dx)
    for i in range(abs(dx)):
      set_pixel(int(x),int(y),col)
      x=x+sx
      y=y+d
  else:
    d=dx/abs(dy)
    for i in range(abs(dy)):
      set_pixel(int(x),int(y),col)
      x=x+d
      y=y+sy

棒グラフを描画する

 まずは棒グラフからです。と、その前にユーザーから入力したデータを配列に入れるプログラムを作成します。複雑(?)なプログラムはいきなり作成するのではなく、簡単に動く部分から作っていくとよいでしょう。
 Pythonでの配列は[]を使って初期化します。data=[]とするとdataの配列が初期化されます。
 また、配列に何か追加する場合はappend()を使います。パラメーターに追加したいデータを指定します。
 input()で入力した数値を配列に追加していくプログラムは以下のようになります。なお、何も入力しない場合は、そこで終了とみなします。最後に入力した配列内容を表示します。

data=[]
while True:
  n=input('data=')
  if n=='':
    break 
  data.append(int(n))
print(data)

 これまでと同様にパソコン側でファイルを作成しておき、電卓に転送します。ファイル名はA1.pyとしてあります。実行すると図のようになります。

 次に棒グラフを表示します。まずは、シンプルに配列に入力された値を線で表示します。線を表示するだけなので簡単です。ただし、数学座標系とコンピューターの座標系はY軸方向が逆になっているので、その点には注意してプログラムを作成する必要があります。
 実際のプログラムは以下のようになります。

from glib import *

data=[]
while True:
  n=input('data=')
  if n=='':
    break 
  data.append(int(n))

clear_screen()
for i in range(len(data)):
  x=i*40
  y=int(data[i])
  gLine(x,191,x,191-y,(255,0,0))
show_screen()

 これまでと同様にパソコン側でファイルを作成しておき、電卓に転送します。ファイル名はA2.pyとしてあります。実行すると図のようになります。

より見やすい棒グラフにする

 縦棒1ピクセルの棒グラフは見やすいとはいえません。また、見た目もイマイチです。そこで今度は一般的な棒グラフを表示してみます。とはいえ、fx-CG50のグラフィック描画速度はパソコンと比べると速くはありません。たくさんの棒グラフを描かせると表示までに時間がかかってしまいます。そこで、まず線だけで描かれた四角形を使って表示することにします。
 まず線だけの四角形を描かせるための関数を用意します。ここではrectという名前の関数を定義しています。XY座標と横幅、縦幅と色を指定すると線だけの四角形を描きます。

def rect(x,y,w,h,col):
  gLine(x,y,x+w,y, col)
  gLine(x+w,y,x+w,y+h, col)
  gLine(x,y,x,y+h, col)
  gLine(x,y+h,x+w,y+h, col)

この関数が問題なく動けば、できたも同然です。先ほどの1ピクセルしか表示しない部分をrect関数を呼び出すように変更します。
 実際のプログラムは以下のようになります。

from glib import *

def rect(x,y,w,h,col):
  gLine(x,y,x+w,y, col)
  gLine(x+w,y,x+w,y+h, col)
  gLine(x,y,x,y+h, col)
  gLine(x,y+h,x+w,y+h, col)

data=[]
while True:
  n=input('data=')
  if n=='':
    break 
  data.append(int(n))

clear_screen()
for i in range(len(data)):
  x=i*40
  y=int(data[i])
  rect(x,191-y,30,y,(255,0,0))
show_screen()

 これまでと同様にパソコン側でファイルを作成しておき、電卓に転送します。ファイル名はA3.pyとしてあります。実行すると図のようになります。

 次にグリッドを表示してみます。グリッド=目盛りがないとわかりにくいでしょう。今回はグリッドには数値などを表示しませんが、sraw_string()を使えば数値や文字を表示できます。
 グリッドを表示するためにgird関数を定義します。縦横に直線を指定された等間隔で表示するだけです。

def grid(step,col):
  gLine(0,191,384,191,col)
  for x in range(0,384,step):
    gLine(x,0,x,191,col)
  for y in range(0,192,step):
    gLine(0,192-y,383,192-y,col)

 実線ではなく点線にしたい場合はset_pixel()で点を描画した方がよいでしょう。
 実際のプログラムは以下のようになります。

from glib import *

def rect(x,y,w,h,col):
  gLine(x,y,x+w,y, col)
  gLine(x+w,y,x+w,y+h, col)
  gLine(x,y,x,y+h, col)
  gLine(x,y+h,x+w,y+h, col)

def grid(step,col):
  gLine(0,191,384,191,col)
  for x in range(0,384,step):
    gLine(x,0,x,191,col)
  for y in range(0,192,step):
    gLine(0,192-y,383,192-y,col)

data=[]
while True:
  n=input('data=')
  if n=='':
    break 
  data.append(int(n))

clear_screen()
grid(50,(0,0,0))
for i in range(len(data)):
  x=i*40
  y=int(data[i])
  rect(x,191-y,30,y,(255,0,0))
show_screen()

 これまでと同様にパソコン側でファイルを作成しておき、電卓に転送します。ファイル名はA4.pyとしてあります。実行すると図のようになります。

アニメーションさせながら棒グラフを表示

 単純に棒グラフを表示するだけでは電卓に入っているグラフ機能と変わりません。そこで、今度は棒グラフをアニメーションさせながら表示してみます。
 実際のところアニメーションさせながら棒グラフを表示するにはrect関数を以下のように変更します。棒グラフを下から上まで線を表示していくだけです。

def rect(x,y,w,h,col):
  for i in range(h):
    gLine(x,y+h-i,x+w,y+h-i, col)
    show_screen()

 実際のプログラムは以下のようになります。より棒グラフっぽくなり見やすくなりました。

from glib import *

def rect(x,y,w,h,col):
  for i in range(h):
    gLine(x,y+h-i,x+w,y+h-i, col)
    show_screen()

def grid(step,col):
  gLine(0,191,384,191,col)
  for x in range(0,384,step):
    gLine(x,0,x,191,col)
  for y in range(0,192,step):
    gLine(0,192-y,383,192-y,col)

data=[]
while True:
  n=input('data=')
  if n=='':
    break 
  data.append(int(n))

clear_screen()
grid(50,(0,0,0))
for i in range(len(data)):
  x=i*40
  y=int(data[i])
  rect(x,191-y,30,y,(255,0,0))
show_screen()

 これまでと同様にパソコン側でファイルを作成しておき、電卓に転送します。ファイル名はA5.pyとしてあります。実行すると図のようになります。

折れ線グラフ

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら