Guest User

Untitled

a guest
Nov 1st, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.23 KB | None | 0 0
  1. # coding: utf-8
  2.  
  3. import os, cairo
  4. from random import choice, random as rnd
  5. from math import radians
  6.  
  7.  
  8. # = DATA =======================================================================
  9.  
  10. def generate_data(print_generated_data):
  11.     set_of_As = ['Столбец №%i' % i for i in range(1,11)]
  12.     set_of_Bs = ['Строка №%i' % i for i in range(1,11)]
  13.  
  14.     data = {}
  15.     for A in set_of_As:
  16.         for B in set_of_Bs:
  17.             C = rnd() - 0.5
  18.             if C > 0.33-0.5:
  19.                 data[A] = data.get(A) or {}
  20.                 data[A][B] = C
  21.                 if print_generated_data:
  22.                     print('%s : %s = %+f' % (A.ljust(12), B.ljust(12), C))
  23.     return set_of_As, set_of_Bs, data
  24.    
  25. def data_from_file(filename):
  26.     ## A : B = C
  27.     data = {}
  28.     As, Bs = set(), set()
  29.     for line in open(filename):
  30.         AB, Cstr = line.split('=', 1)
  31.         A, B = map(str.strip, AB.split(':', 1))
  32.         C = float(Cstr)
  33.         data[A] = data.get(A) or {}
  34.         data[A][B] = C
  35.         As |= {A}
  36.         Bs |= {B}
  37.     return sorted(As), sorted(Bs), data
  38.  
  39.  
  40. #~ set_of_As, set_of_Bs,  DATA = data_from_file('data.txt')
  41. set_of_As, set_of_Bs,  DATA = generate_data(False)
  42.  
  43.  
  44. # = SETUP ======================================================================
  45.  
  46. COL_WIDTH  = 60
  47. ROW_HEIGHT = 25
  48. BORDER = 10
  49. FIRST_COL_OFFSET = BORDER + 130     # text baseline of the first column header
  50. FIRST_ROW_OFFSET = BORDER + 120     # text baseline of the first row
  51. COL_NAMES_ROTATION = 75
  52. CELL_FORMAT = '%+.3f'
  53. CELL_PADDING_LEFT = 10
  54.  
  55. FONT = 'Open Sans Light'
  56. #~ FONT = 'Sans'
  57. FONT_SIZE = 14
  58. GRID_ALPHA = 0.05   # color is semirandom :)
  59.  
  60. FILE_NAME = 'image.png'
  61. #~ FILE_NAME = 'image.svg'
  62.  
  63.  
  64. # = DRAWING CONTEXT SETUP ======================================================
  65.  
  66. WIDTH  = FIRST_COL_OFFSET + len(set_of_As) * COL_WIDTH + BORDER - COL_WIDTH//2
  67. HEIGHT = FIRST_ROW_OFFSET + (len(set_of_Bs)-1) * ROW_HEIGHT + BORDER + \
  68.                                                 (ROW_HEIGHT - FONT_SIZE)//2 + 2
  69.  
  70. class MyCairoContext(cairo.Context):
  71.     def text(c, text, x, y, a=0):
  72.         c.save()
  73.         c.translate(x, y)
  74.         c.rotate(radians(-a))
  75.         c.translate(-x, -y)
  76.         c.move_to(x, y)
  77.         c.show_text(text)
  78.         c.restore()
  79.         c.new_path()
  80.  
  81. if FILE_NAME.lower().endswith('.svg'):
  82.     SURF = cairo.SVGSurface(FILE_NAME, WIDTH, HEIGHT)
  83. else:
  84.     SURF = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
  85.  
  86. c = MyCairoContext(SURF)
  87. c.set_source_rgb(1, 1, 1)
  88. c.paint()
  89. c.select_font_face(FONT, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
  90. c.set_font_size(FONT_SIZE)
  91.  
  92.  
  93. # = DRAWING ====================================================================
  94.  
  95. # Column names and grid
  96. y = FIRST_ROW_OFFSET - ROW_HEIGHT//2 - FONT_SIZE
  97. for i, A in enumerate(set_of_As):
  98.     if not i%2:     # vertical grid
  99.         c.set_source_rgba(0, 0, rnd(), GRID_ALPHA)  # grid color
  100.         x = i * COL_WIDTH + FIRST_COL_OFFSET - COL_WIDTH/2
  101.         c.rectangle(x, BORDER, COL_WIDTH, HEIGHT-BORDER*2)
  102.         c.fill()
  103.        
  104.     c.set_source_rgb(0, rnd(), rnd())   # text color
  105.     x = i * COL_WIDTH + FIRST_COL_OFFSET
  106.     c.text(A, x, y, COL_NAMES_ROTATION)
  107.  
  108.  
  109. # Row names and grid
  110. x = BORDER + 10
  111. for i, B in enumerate(set_of_Bs):
  112.     if not i%2:     # horizontal grid
  113.         c.set_source_rgba(rnd(), 0, 0, GRID_ALPHA)  # grid color
  114.         y = i * ROW_HEIGHT + FIRST_ROW_OFFSET - ROW_HEIGHT/2 - FONT_SIZE/2 + 2
  115.         c.rectangle(BORDER, y, WIDTH-BORDER*2, ROW_HEIGHT)
  116.         c.fill()
  117.        
  118.     c.set_source_rgb(rnd(), rnd(), 0)   # text color
  119.     y = i * ROW_HEIGHT + FIRST_ROW_OFFSET
  120.     c.text(B, x, y)
  121.  
  122.  
  123. # Cell data
  124. c.set_source_rgb(0.1, 0.1, 0.1) # text color, dark grey, almost black
  125. for A in DATA:
  126.     for B in DATA[A]:
  127.         C = DATA[A][B]
  128.         x = set_of_As.index(A) * COL_WIDTH  + FIRST_COL_OFFSET - COL_WIDTH/2
  129.         y = set_of_Bs.index(B) * ROW_HEIGHT + FIRST_ROW_OFFSET
  130.         c.text(CELL_FORMAT % C, x + CELL_PADDING_LEFT, y)
  131.  
  132.  
  133. # = OUTPUT IF RASTER ===========================================================
  134.  
  135. if type(SURF) is cairo.ImageSurface:
  136.     SURF.write_to_png(FILE_NAME)
  137.     os.system('feh -F %s' % FILE_NAME)  # 'feh' is an image viewer
Add Comment
Please, Sign In to add comment