次は、キーボード”[”と”]”で、デーブル内の対象データコラムを更新できるようにする。
global変数の使い方がようやく理解できてきた。
for in rangeの使い方(FloatTableクラス修正)に要注意。
※range関数は指定した長さの、連続した整数のリストを自動で生成する関数で、for文とrange関数を組み合わせることで、任意の回数だけループをすることができる。
for 変数 in range([始まりの数値,] 最後の数値[, 増加する量]):
#ループ処理
rangeには始まりの数値、最後の数値、増加する量の3つの引数があるが、このうち始まりの数値と増加する量は省略することができる。range()に数値を1つ渡すと、それが最後の数値となり、0から「最後の数値 ? 1」までの値が格納されたリストが作成される。つまり、0から実行されて、「最後の数値」そのものは実行されない点に注意する必要がある。
対象のコラムを動かす方法は、グローバル変数currenetColumnを追加し、draw()関数内で
1 |
drawDataPoints(currentColumn) |
と呼び出す。新たにdrawTitle()を作成し、
1 2 |
title = data.getColumnName(currentColumn) text(title, plotX1, plotY1 - 10) |
でコラム名をローカル変数titleに収めて、表示させる。
キーボード・キー”[” & “]”のプッシュでcurrentColumn変数を更新させるため、keyPressed()関数を以下のように作成する。
1 2 3 4 5 6 7 8 9 10 11 12 |
def keyPressed(): global currentColumn global columnCount if (key == '['): currentColumn = currentColumn - 1 if (currentColumn < 0): currentColumn = columnCount - 1 elif (key == ']'): currentColumn = currentColumn + 1 if (currentColumn == columnCount): currentColumn = 0 |
X軸yearのラベルを追加するため、drawYearLabels()関数内で、
1 2 3 4 5 6 |
rowCount = data.getRowCount() for row in range(rowCount): if (years[row] % yearInterval == 0): x = map(years[row], yearMin, yearMax, plotX1, plotX2) text(years[row], x, plotY2 + 5) |
としてグローバル変数yearInterval=10として設定した、10年で割り切れる年ごとだけをラベル表示させる。
figure_03_lables_py.pyde
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
import FloatTable width = 720 height = 405 plotX1 = 50 plotX2 = width - plotX1 plotY1 = 60 plotY2 = height - plotY1 dataMin = 0 dataMax = 0 currentColumn = 0 yearInterval = 10 years =[] value =[] def setup(): global data global dataMin global dataMax global years global years_str global yearMin global yearMax global plotX1 global plotX2 global plotY1 global plotY2 global currentColumn global columnCount global rowCount size(width, height) data = FloatTable.FloatTable("milk-tea-coffee.tsv") columnCount = data.getColumnCount() years_str = data.getRowNames() for i in range(len(years_str)): years.append(int(years_str[i])) print "years=:" print years yearMin = years[0] yearMax = years[len(years) - 1] dataMax = data.getTableMax() smooth() def draw(): global plotX1 global plotX2 global plotY1 global plotY2 background(224) #Show the plot area as a white box fill(255) rectMode(CORNERS) noStroke() rect(plotX1, plotY1, plotX2, plotY2) drawTitle() drawYearLabels() strokeWeight(5) stroke('#5679C1') drawDataPoints(currentColumn) def drawDataPoints(col): global rowCount global data global dataMin global dataMax global years global yearMin global yearMax global plotX1 global plotX2 global plotY1 global plotY2 rowCount = data.getRowCount() for row in range(rowCount): if (data.isValid(row, col)): value = data.getFloat(row, col) x = map(years[row], yearMin, yearMax, plotX1, plotX2) y = map(value, dataMin, dataMax, plotY2, plotY1) point(x, y) def drawTitle(): global data global plotX1 global plotY1 global currentColumn fill(0) textSize(20) textAlign(LEFT) title = data.getColumnName(currentColumn) text(title, plotX1, plotY1 - 10) def drawYearLabels(): global rowCount global data global plotX1 global plotX2 global plotY1 global plotY2 global years global yearMin global yearMax global yearInterval fill(0) textSize(10) textAlign(CENTER, TOP) stroke(224) strokeWeight(1) rowCount = data.getRowCount() for row in range(rowCount): if (years[row] % yearInterval == 0): x = map(years[row], yearMin, yearMax, plotX1, plotX2) text(years[row], x, plotY2 + 5) def keyPressed(): global currentColumn global columnCount if (key == '['): currentColumn = currentColumn - 1 if (currentColumn < 0): currentColumn = columnCount - 1 elif (key == ']'): currentColumn = currentColumn + 1 if (currentColumn == columnCount): currentColumn = 0 |
次に、drawYearLables()関数内で、line()関数を用いて、X軸ラベルごとに縦の罫線を描画させる。
1 2 3 4 5 |
for row in range(rowCount): if (years[row] % yearInterval == 0): x = map(years[row], yearMin, yearMax, plotX1, plotX2) text(years[row], x, plotY2 + 5) line(x, plotY1, x, plotY2) |
figure_04_grid_py_pyde
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
import FloatTable width = 720 height = 405 dataMin = 0 dataMax = 0 #Corners of the plotted time series plotX1 = 50 plotX2 = width - plotX1 plotY1 = 60 plotY2 = height - plotY1 currentColumn = 0 yearInterval = 10 years =[] value =[] def setup(): global data global dataMin global dataMax global value global years global years_str global yearMin global yearMax global plotX1 global plotX2 global plotY1 global plotY2 global currentColumn global columnCount global rowCount size(width, height) data = FloatTable.FloatTable("milk-tea-coffee.tsv") columnCount = data.getColumnCount() years_str = data.getRowNames() for i in range(len(years_str)): years.append(int(years_str[i])) print "years=:" print years yearMin = years[0] yearMax = years[len(years) - 1] dataMax = data.getTableMax() #dataMax = 100 smooth() def draw(): global plotX1 global plotX2 global plotY1 global plotY2 global currentColumn background(224) #Show the plot area as a white box fill(255) rectMode(CORNERS) noStroke() rect(plotX1, plotY1, plotX2, plotY2) drawTitle() drawYearLabels() strokeWeight(5) stroke('#5679C1') drawDataPoints(currentColumn) def drawDataPoints(col): global rowCount global data global dataMin global dataMax global value global years global yearMin global yearMax global plotX1 global plotX2 global plotY1 global plotY2 rowCount = data.getRowCount() for row in range(rowCount): if (data.isValid(row, col)): value = data.getFloat(row, col) x = map(years[row], yearMin, yearMax, plotX1, plotX2) y = map(value, dataMin, dataMax, plotY2, plotY1) point(x, y) def drawTitle(): global data global plotX1 global plotY1 global currentColumn fill(0) textSize(20) textAlign(LEFT) title = data.getColumnName(currentColumn) text(title, plotX1, plotY1 - 10) def drawYearLabels(): global rowCount global data global plotX1 global plotX2 global plotY1 global plotY2 global years global yearMin global yearMax global yearInterval fill(0) textSize(10) textAlign(CENTER, TOP) stroke(224) strokeWeight(1) rowCount = data.getRowCount() for row in range(rowCount): if (years[row] % yearInterval == 0): x = map(years[row], yearMin, yearMax, plotX1, plotX2) text(years[row], x, plotY2 + 5) line(x, plotY1, x, plotY2) def keyPressed(): global currentColumn global columnCount if (key == '['): currentColumn = currentColumn - 1 if (currentColumn < 0): currentColumn = columnCount - 1 elif (key == ']'): currentColumn = currentColumn + 1 if (currentColumn == columnCount): currentColumn = 0 |