20180528

matplotlibのimshowで円を描く。

02.gif

### 一ピクセルづつ、円を描く。
matplotlibのimshowで円を描く。
いつもはplotで描く。この時は、x座標、y座標を指定する。
その座標は、三角関数を使って用意する。((cosθ, sinθ))
ただ、imshowは配列の用意の仕方が違う。配列のindexが、座標そのものなので戸惑う。

「二次元の配列上に、一次元のプロットと同じ感覚でプロットしたい。」という要求。
↑これは、できなかったけど、まあ何とか形になったし、別にいいか。



### 作戦
下図参照
20180526113622 - コピー.png


結構、面倒だった。
これの右側の話。どうやって、ピクセルのインデックスを指定するのか、ぱっと思いつかなかったので、描いた。
これまでのことを考えると、当たり前のことだったが、、、
- x,yの一次元の配列があって…
- 二次元の場合に当てはめると、インデキシングが、x,yの値に該当して…
- インデキシングで値を指定しようとすると、0〜Nの数字になるからマイナスはどうなっちゃうの?
- そもそも、値1と2の間に、1.9とか1.5とかあるし、imshowの場合は、1と2の間がない。(そういう風に軸を整えれば作れるが。)インデキシングはできない。
とかぐるぐる考えていた。

### コード
```py
import numpy as np
import matplotlib.pyplot as plt
import time
from datetime import datetime as dt



N,M = 32, 64
a=N/2-1


theta = np.linspace(0, 2.0*np.pi, min(N,M)*3)
x = np.cos(theta)*a+a
y = np.sin(theta)*a+a


x2 = np.around(x).astype(int)
y2 = np.around(y).astype(int)



img = np.zeros((N,M))
for i in range(len(x2)):
    img[x2[i]][y2[i]] = 1
    



fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot(x,y)
ax2.imshow(img, cmap="gray",interpolation="None")


ax1.set_aspect("equal", "datalim")



tdatetime = dt.now()
fname = tdatetime.strftime('%Y%m%d'+ time.ctime()[11:13] + time.ctime()[14:16] + time.ctime()[17:19])
plt.savefig("%s.png"%(fname))
```



### 作っていて気付いたこと
##### 円周を、何ピクセル使って表現するか
円を描くとき、角速度が0〜2パイまでを使った。
これを、np.linspaceで**n分割**したの配列にして、変数θとした。
これを、cos θ, sin θに入れた。

n分割のところをどんな値にすれば適切なのか。
- 少ないと、円が途切れる。
- 多いと、単に無駄。
だいたい3で大丈夫。
20180526171408-001-003.png

### サイトの事
- ある記事がバズってる。アクセスカウンタがすごい。
「桁多めに設定しすぎたかなぁ。『こんなブログ、そんなに桁必要ねーよ』とか思われてたら恥ずかしいなぁ…(被害妄想)」と思ってたが、今となっては、「あと1桁くらいあってもいいかな。」と思ってる。
- さくらのブログのアクセスカウンタで、棒グラフが長くなると、積み上げグラフ→単独のグラフに代わる。
初めて見た!
さくらのブログ アクセスカウンタ 棒グラフ.png
- マークダウンをせずに書いても、それなりに読める。むしろ読みやすい。今回だけこのまま放置。
- これだけ、アクセスがあっても、収入はゼロ。
どうなってんの?置き方悪いの?広告が適切でないとか?

バズっているところに、内容にドンピシャで、自分も一年間の使用経験のある、商品の広告を置いてみるなどしてみた。
結果を様子見することにする…
posted by yuchan at 07:00 | Comment(0) | python