2015年
3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2015-03-04 rubyでグラフ

_ BLTを使ってグラフを書いてみた

rubyを使ってグラフを書く方法には、いくつかある。Rやgnuplotをrubyから呼び出す方法や、tkを使って書く方法などがある。tkを使う方法を調べていたら、plotcharやBLTというものを使うと、比較的簡単にグラフを作れるようだ。こんなのは、いつできたんだろう。 plotchartよりもBLTの方がいろいろとできそうなので、それをインストール。aptでlibtk-rubyとbltを入れたら、動くようになった。まず、書いてみたのが、こんなプログラムである。
require 'thread'
require 'tk'
require 'tkextlib/blt'
graph = Tk::BLT::Graph.new.pack
graph.title="title"
graph.axis_configure('x',:title=>'x-axis')
#graph.axis_configure('x',:min=>'0',:max=>'4')
#graph.axis_configure('y',:min=>'0',:max=>'4')
graph.axis_configure('x',:ticklength=>5)
graph.axis_configure('x',:showticks=>true)
graph.gridline_on()
graph.legend_configure( :hide=>'yes')
graph.crosshairs_configure( :hide=>'no')
graph.xaxis_bind('1', proc{|x,y| puts "x(%d,%d)"%[x,y]},"%x %y")
graph.yaxis_bind('1', proc{|x,y| puts "y(%d,%d)"%[x,y]},"%x %y")
xx=Tk::BLT::Vector.new()
yy=Tk::BLT::Vector.new()
zz=Tk::BLT::Vector.new()
plot = Tk::BLT::PlotComponent::Element.new(graph, 'plot1', :label=>'foo')
plot.configure( :xdata=>xx, :ydata=>yy)
plot.configure( :linewidth=>1)
plot.configure( :symbol=>'plus',:pixels=>5)
#"none","circle", "square", "diamond", "plus", "cross", 
#"splus", "scross", "triangle", "arrow"
plot2 = Tk::BLT::PlotComponent::Element.new(graph, 'plot2', :label=>'foo')
plot2.configure( :xdata=>xx, :ydata=>zz)
plot2.configure( :color=>"red")
plot2.configure( :symbol=>'cross',:pixels=>5)
Thread.start{
i=0
loop{
  xx.append(i)
  yy.append(Math.sin(i*0.01) )
  zz.append(Math.cos(i*0.01) )
  sleep 0.2
  i+=1
}}
Tk.mainloop
いろいろなオプションを指定すると、綺麗なグラフをオンタイムで書ける気がする。もう少しいじってみよう。