min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Python3のハッカーっぽい3D画像をgifアニメに

ハピタス登録で1,000円分になるURL

その買うを、もっとハッピーに。|ハピタス

ハッカーっぽい〜♪

できた

前回のこの記事のコードを引数をとるように改善

min117.hatenablog.com

$ vim myKINRI3DArg.py

デッパリの山の大きさを決める21行目引数で指定できるようにした。

 

bashのfor文で画像作成→convertでgifアニメに

こいつをbashで引数つけまくって回す。

$ for i in $(seq 1 10); do echo "$i"; python3 myKINRI3DArg.py -"$i" "$i" && mv myKINRI3Dtest.png myKINRI3Dtest"$i".png; done

それをconvertコマンドでgifアニメにしちゃう

convert -delay 60 -loop 0 myKINRI3Dtest0{1..9}*png myKINRI3Dtest{10..20}*png myKINRI3Dtest99merged.gif

 

こうなる!

次は余白を小さくしてもっとデカく見えるようにしよう。

 

tightレイアウト+x軸に実行時間を

 

ランダムな引数にしたらこんな図形も

$ sudo vim /etc/crontab

rr=`echo $*1`; rr2=`echo $*2`; cd /media/WD30EZRX/PT3; python3 myKINRI3DArg.py $rr $rr2 | tee -a myKINRI3DArg.log

 

角度をつける改良版も

$ python3 myKINRI3DArg2.py '-2' 2 50

 

下から見るのもできる

$ rr=`echo $*3`; rr2=`echo $*4`; rr3=`echo $*5`; cd /media/WD30EZRX/PT3; python3 myKINRI3DArg2.py "$rr" "$rr2" "$rr3" | tee -a myKINRI3DArg2.log

x軸をズラすと塔が動く

$ rr=`echo $*6`; rr2=`echo $*7`; rr3=`echo $*8`; cd /media/WD30EZRX/PT3; python3 myKINRI3DArg2.py "$rr" "$rr2" "$rr3" | tee -a myKINRI3DArg2.log

 

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import axes3d

from matplotlib import cm

 

import sys

import datetime

from datetime import datetime as dt

 

#if len(sys.argv) != 2:

#if len(sys.argv) <= 2:

print('引数2個を強制する')

if len(sys.argv) != 3:

        print(f"Usage: python {sys.argv[0]} X軸 Y軸")

        print(f"Usage: python {sys.argv[0]} -3  2 ")

        sys.exit()

myARG1 = int(sys.argv[1])

myARG2 = int(sys.argv[2])

 

print('myARG1')

print(myARG1)

print('-----')

print('myARG2')

print(myARG2)

print('-----')

now = datetime.datetime.now()

print('実行日時')

print(now.strftime("%Y%m%d_%H%M%S"))

print('-----')

myTODAY = datetime.date.today()

print('今日の日付')

print(myTODAY)

print('-----')

 

 

#関数に投入するデータを作成

#x = y = np.arange(-2, 3, 0.5)

x = y = np.arange(myARG1, myARG2, 0.5)

X, Y = np.meshgrid(x, y)

 

z = np.c_[X.ravel(),Y.ravel()]

 

#二次元正規分布の確率密度を返す関数

def gaussian(x):

    #分散共分散行列の行列式

    det = np.linalg.det(sigma)

    print(det)

    #分散共分散行列の逆行列

    inv = np.linalg.inv(sigma)

    return np.exp(-np.diag*9

 

#2変数の平均値を指定

mu = np.array([0,0])

#2変数の分散共分散行列を指定

sigma = np.array([[1,0],[0,1]])

 

Z = gaussian(z)

shape = X.shape

Z = Z.reshape(shape)

 

#二次元正規分布をplot

fig = plt.figure(figsize = (15, 15))

ax = fig.add_subplot(111, projection='3d')

 

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)

 

print('狭いレイアウト 余白を無くす')

plt.tight_layout(pad=2.5)  # パディングを追加 狭いレイアウト

plt.show()

 

#s = s + str(sys.argv[2]) + '当時ドル円:' + str(round(recent, 2)) + '円\n ' + str(myTODAY) + '足>ドル円:' + str(round(recentTODAY,2 )) + '円\n' + kawacom

#kawacom_str = str(myTODAY)

print('x軸X軸に時間実行日時を目盛りとしてプロット')

ax.set_xlabel(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), fontsize=15)

#ax.set_ylabel(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), fontsize=15)

ax.set_ylabel('arg1='+str(myARG1)+' arg2='+str(myARG2), fontsize=15)

ax.set_zlabel(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), fontsize=15)

 

#plt.savefig('myKINRI3Dtest.png')

plt.savefig('myKINRI3D.png')

 

 

min117.hatenablog.com

 

 

*1:RANDOM % 12 - 1

*2:RANDOM % 13 + 3

*3:RANDOM % 12 - 3

*4:RANDOM % 13 + 3

*5:RANDOM % 50 -40

*6:RANDOM % 4 - 30

*7:RANDOM % 13 + 3

*8:RANDOM % 50 -40

*9:x - mu)@inv@(x - mu).T)/2.0) / (np.sqrt((2 * np.pi) ** n * det