ASCII Bar graph using Ruby

I am a big Ruby fan. In the spirit of sharing, here is a small ruby script that draws ASCII bar graphs.

#!/bin/env ruby -w
# Given an array, print it as a bar graph
# Use it at your own risk

class HorizBar
  WIDTH = 72
  HEIGHT = 16
  def initialize(array)
    @values = array
  end
  def draw
    #Adjust X axis when there are more than WIDTH cols
    if @values.length > WIDTH then
      old_values = @values;
      @values = []
      0.upto(WIDTH - 1){ |i| @values << old_values[i\*old_values.length/WIDTH]}
    end
    max = @values.max
    # initialize display with blanks
    display = Array.new(HEIGHT).collect { Array.new(WIDTH, ' ') }
    @values.each_with_index do |e, i|
      num= e\*HEIGHT/max
      (HEIGHT - 1).downto(HEIGHT - 1 - num){|j| display[j][i] = '|'}
    end    
    display.each{|ar| ar.each{|e| putc e}; puts "\\n"} #now print
  end
end

# Sample usage 1
sample = [28829, 29095, 29301, 31827, 43478, 52937,62969]
HorizBar.new(sample).draw

# Another Sample usage
a = []
100.times { a << rand(100)}
HorizBar.new(a).draw

It produces output similar to



 |  |  |             |               |                |      |
 |  |  |             |      |   |    |     |   |      |     ||
 |  |  |             |      ||  |    |    ||   |  |   |     ||
 |  |  |           | |      ||  |    | |  ||   |  |   |   | ||
|| ||  |           | |      ||| |    | |  |||  || |   |   | ||       |
|| ||  |      |   || |      ||| |    | |  |||  || |   |   | ||    |  |
|| ||  |   |  |   || ||   | ||| |    | |  |||  || |   |   | ||    |  |
|| ||  |   |  |   || ||   | ||| | |  | |  |||  || |   |   | ||    |  |
|||||  |   |  |   || |||  | ||| | |  |||  |||  || |   |   | ||    | ||
|||||  |   |  |   || |||  | ||| | | |||||||||  || |  ||   | ||    | ||
|||||  || ||  | | || ||| || ||| ||| |||||||||  || |  ||   ||||    | ||
|||||  || ||  | | || ||| || ||| ||| |||||||||| || || || | ||||    | |||
||||| |||||| || | || |||||| ||| ||| |||||||||| || || || |||||| | ||||||
||||| |||||| ||||||| |||||| ||| |||||||||||||| |||||||| |||||| | ||||||
||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

Rudimentary, but quite useful if you want to look at some data quickly.

Comments:

Post a Comment:
Comments are closed for this entry.
About

realneel

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
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
   
       
Today