====== 対数グラフ ====== ===== 基本的な使い方 ===== テンプレートファイル コード require "alone" require "al_graph" class GraphSampleController < AlController def action_index() AlTemplate.run("index.rhtml") end def action_graph_sample() ydata1 = [ 0.1, 1, 10, 100 ] graph = AlGraph.new graph.y_axis.logarithmic() graph.add_data_line(ydata1) graph.draw end end {{ :algraph:log_sample_01.png?nolink&200|}} まず、AlGraph対数.newで、グラフオブジェクトを準備します。 y軸に対して、logarithmicメソッドをコールすることで、対数軸になります。 その他は折れ線グラフと同じですが、対数グラフではゼロやマイナス値などは無視されます。 graph = AlGraph.new graph.y_axis.logarithmic() デフォルトでY軸は自動計算され、与えられた値に従って適切な値が選ばれます。 また、目盛りは10倍ごとに表示されますが、任意に指定することも可能です(後述) ====== サンプル ====== リリースファイルでサンプルとして提供しているものです。 ===== 片対数グラフ(再掲) ===== {{:algraph:log_sample_01.png?nolink |}} def action_log_sample_01 ydata1 = [ 0.1, 1, 10, 100 ] graph = AlGraph.new graph.y_axis.logarithmic() graph.add_data_line(ydata1) graph.draw end ===== 片対数グラフ 軸目盛の指定 異常値の自動排除 ===== {{:algraph:log_sample_02.png?nolink |}} def action_log_sample_02 ydata1 = [ 0.1, 1, 10, 100, 1000, nil ] ydata2 = [ 0.2, 2, 20, 0, -1, 200 ] graph = AlGraph.new graph.y_axis.logarithmic() graph.y_axis.interval = [1,2,5] graph.add_data_line(ydata1, "正常値のみ") graph.add_data_line(ydata2, "異常値含む") graph.draw end ===== 片対数グラフ Y2軸を対数にする ===== {{:algraph:log_sample_03.png?nolink |}} def action_log_sample_03 ydata1 = [5, 3, 6, 3, 2, 5, 6] ydata2 = [0, 1, 4, 10, 9, 13, 13] graph = AlGraph.new graph.add_data_line( ydata1 ) graph.add_data_line_y2( ydata2 ) graph.y2_axis.logarithmic() graph.draw end ===== 両対数グラフ ===== {{:algraph:log_sample_04.png?nolink |}} def action_log_sample_04 xdata1 = [ 0.1, 1, 10, 100 ] ydata1 = [ 0.1, 1, 10, 100 ] graph = AlGraphXY.new graph.x_axis.logarithmic() graph.y_axis.logarithmic() graph.add_data( xdata1, ydata1 ) graph.draw end ===== 積層セラミックコンデンサ周波数特性 ===== {{:algraph:log_sample_05.png?nolink |}} def action_log_sample_05 freq = [ 100, 1e3, 10e3, 100e3, 1e6, 3e6, 10e6, 15e6, 22e6, 30e6, 40e6, 50e6, 60e6, 80e6, 100e6, 400e6, 1e9, 2e9, 4e9, 6e9 ] imp = [18e3, 1.8e3, 180, 18, 1.8, 0.56, 0.15, 0.06, 0.018, 0.04, 0.085, 0.085, 0.13, 0.16, 0.2, 0.7, 1.9, 3.8, 8.0, 12 ] esr = [ 70, 7, 0.7, 0.12, 0.023, 0.014, 0.015, 0.016, 0.018, 0.022, 0.05, 0.04, 0.05, 0.07, 0.06, 0.1, 0.13, 0.25, 0.7, 3.5 ] graph = AlGraphXY.new( 500, 400 ) graph.add_xaxis_title("Frequency (Hz)") graph.add_yaxis_title("Impedance/ESR (Ω)") graph.x_axis.logarithmic() graph.y_axis.logarithmic() graph.x_axis.at_labels[:renderer] = lambda {|v| to_eng(v)} graph.y_axis.at_labels[:renderer] = lambda {|v| to_eng(v)} line1 = graph.add_data( freq, imp, "Impedance" ) line2 = graph.add_data( freq, esr, "ESR" ) line1.clear_marker line2.clear_marker graph.draw end def to_eng( v ) n = Math.log10(v).floor / 3 sprintf("%.0f%s", (v / 10**(n*3)), "yzafpnμm kMGTPEZY"[ n-9 ].strip) end