解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Excel VBA でショートカットキーを作成する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


久しぶりに Excel VBA でマクロ組んでる時にショーカットキーを割り当てたくて、エクセル既存のショートカットキー以外で、実際に Ctrl + Q とかを押しながら使えそうなキーの組み合わせを調べました。

もちろん、他にも使えるキーの組み合わせはあると思いますが、せっかく総当たり的に調べたので、忘れない為にも記事にしておきます。



動作環境


Windows 10
Excel 2013



ショートカットキー

キー組み合わせの右側には Excel VBA で実行すると macro というサブルーチンもしくは関数にショートカットキーが割り当てられるソースコードを書いています。

キー組み合わせ


Ctrl + R   Application.OnKey "^r", "macro"
Ctrl + Y   Application.OnKey "^y", "macro"
Ctrl + D   Application.OnKey "^d", "macro"
Ctrl + J   Application.OnKey "^j", "macro"
Ctrl + M   Application.OnKey "^m", "macro"
Ctrl + 6   Application.OnKey "^6", "macro"
Ctrl + 7   Application.OnKey "^7", "macro"
Ctrl + <   Application.OnKey "^<", "macro"
Ctrl + >   Application.OnKey "^>", "macro"

Alt  + Q   Application.OnKey "%q", "macro"
Alt  + U   Application.OnKey "%u", "macro"
Alt  + S   Application.OnKey "%s", "macro"
Alt  + G   Application.OnKey "%g", "macro"
Alt  + J   Application.OnKey "%j", "macro"
Alt  + K   Application.OnKey "%k", "macro"
Alt  + L   Application.OnKey "%l", "macro"
Alt  + Z   Application.OnKey "%z", "macro"
Alt  + C   Application.OnKey "%c", "macro"
Alt  + B   Application.OnKey "%b", "macro"

Ctrl + Shift + Q   Application.OnKey "+^q", "macro"
Ctrl + Shift + E   Application.OnKey "+^e", "macro"
Ctrl + Shift + R   Application.OnKey "+^r", "macro"
Ctrl + Shift + T   Application.OnKey "+^t", "macro"
Ctrl + Shift + Y   Application.OnKey "+^y", "macro"
Ctrl + Shift + I   Application.OnKey "+^i", "macro"
Ctrl + Shift + A   Application.OnKey "+^a", "macro"
Ctrl + Shift + S   Application.OnKey "+^s", "macro"
Ctrl + Shift + D   Application.OnKey "+^d", "macro"
Ctrl + Shift + G   Application.OnKey "+^g", "macro"
Ctrl + Shift + H   Application.OnKey "+^h", "macro"
Ctrl + Shift + J   Application.OnKey "+^j", "macro"
Ctrl + Shift + K   Application.OnKey "+^k", "macro"
Ctrl + Shift + Z   Application.OnKey "+^z", "macro"
Ctrl + Shift + X   Application.OnKey "+^x", "macro"
Ctrl + Shift + C   Application.OnKey "+^c", "macro"
Ctrl + Shift + V   Application.OnKey "+^v", "macro"
Ctrl + Shift + B   Application.OnKey "+^b", "macro"
Ctrl + Shift + N   Application.OnKey "+^n", "macro"
Ctrl + Shift + M   Application.OnKey "+^m", "macro"



コメント

基本的にアルファベットキーで使えるようにしました。

実は忘れた頃に Excel でマクロにショートカットキーを割り当てたくなるので毎回調べていました。

2度と同じ調べ物はしたくないものですね。



以上

Python で OpenGL を使ってみたい



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


かなり前の記事になりますが、 Python から OpenCV を使って画像認識の記事を結構たくさん書きました。

C# からは OpenGL を使っていたのですが、 Python では使ってませんでした。

【参考にしたサイト】
WindowsのPythonでOpenGLを使う - TadaoYamaokaの日記

とりあえず参考にしたサイトのソースコードを動かしてひとまず描画をやってみます。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

PyOpenGL をインストールします。

画像の通りに pip でインストール出来ます。



あとは、参考にしたサイトによると GLUT なるものが必要みたいです。

.zip なのでさっさとダウンロードして解凍しましょう。

参考にしたサイトにもリンクがありますが、下記の通りです。

GLUT ダウンロードサイト
https://www.transmissionzero.co.uk/software/freeglut-devel/

ダウンロードするのは画像の赤四角で囲われているリンクのファイルです。



.zip ファイルを解凍して中の freeglut\bin\x64\ にある freeglut.dll を C:\Windows\System32 にコピーする。

ソースコード


from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
 
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH)
    glutInitWindowSize(300, 300)     # window size
    glutInitWindowPosition(100, 100) # window position
    glutCreateWindow(b"teapot")      # show window
    glutDisplayFunc(display)         # draw callback function
    glutReshapeFunc(reshape)         # resize callback function
    init(300, 300)
    glutMainLoop()
 
def init(width, height):
    """ initialize """
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glEnable(GL_DEPTH_TEST) # enable shading
 
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    ##set perspective
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
 
def display():
    """ display """
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    ##set camera
    gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    ##draw a teapot
    glColor3f(1.0, 0.0, 0.0)
    glutWireTeapot(1.0)   # wireframe
#    glutSolidTeapot(1.0)  # solid
    glFlush()  # enforce OpenGL command
 
def reshape(width, height):
    """callback function resize window"""
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
 
if __name__ == "__main__":
    main()



結果

参考にしたサイト通りのティーポットが表示されました!

図1 ティーポット



コメント

CAD やアニメーションアプリなんかを作りたいです。

全然関係ないですが、 winpython の情報ってすくないですよね。



以上

Python で LAN (ローカルエリアネットワーク)内のオンラインユーザーを探す



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


通信系のアプリを作ったらオンラインのユーザーを探さないといけないよな…と、まだ全然通信出来た試しも無いのにやってみようと思い立ちました。

結論を言うと動作が遅くて使い物にはならないプログラムが出来上がってしまいました。

書いたプログラムは LAN 内の IP アドレスからホストの逆引きを総当たりして逆引き出来たらオンラインで逆引き出来なければオフラインと判断するものです。

私のような初心者が道を間違えぬようにまとめておきます。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# ホスト一覧取得プログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import socket
 
host = socket.gethostname()     # 自分自身のホスト名取得
ip = socket.gethostbyname(host) # 自分自身の IP アドレス取得
 
# 自分自身の IP アドレスのネットワーク部の取得
pos1 = ip.find('.')
pos1 = ip.find('.', pos1 + 1)
pos1 = ip.find('.', pos1 + 2)
network = ip[0:pos1+1]
 
# C クラスのプライベート IP アドレスを想定して全 IP に対してホスト名逆引きを試みる
for i in range(256):
    ip = str(network) + str(i) # IP アドレス作成
    print(ip + ' : ', end='')  # 表示
    try:
        host = socket.gethostbyaddr(ip) # IP からホスト名逆引き
        print(socket.gethostbyaddr(ip)) # 表示
    except socket.herror:
        print('') # エラーなら次の IP を逆引きする
        continue



結果

オンラインの端末を探すことは出来ていますが、動作がとても遅く、強制終了してしまいました。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/messenger030.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
192.168.220.0 :
192.168.220.1 :
192.168.220.2 :
192.168.220.3 : ('HOST-NAME', [], ['192.168.220.3'])
192.168.220.4 : ('HOST-NAME', [], ['192.168.220.4'])
192.168.220.5 :
192.168.220.6 :
192.168.220.7 :
192.168.220.8 :
192.168.220.9 :
192.168.220.10 :
192.168.220.11 :
192.168.220.12 :
192.168.220.13 :
192.168.220.14 :
192.168.220.15 :
192.168.220.16 :
192.168.220.17 :
192.168.220.18 :
192.168.220.19 :
192.168.220.20 :



コメント

通信系のアプリなんかではアプリ間でオンラインユーザーの確認をしているのだろうと思いました。

アプリ間の通信についてもっと勉強します。



以上

Python で通信プログラミング入門



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


最近、簡単な通信プログラムの必要性を漠然と考えています。

スケジュールアプリなど色んなアプリに付いてたら良いなぁと思うので調べてみました。

調べていくとリンクのサイトが分かりやすくて、サイトの『(1)ソケットクライアントでHTTPリクエスト』をそのまま動かして理解してみることにしました。

Pythonでソケットを使った単一のソケットサーバー VS 複数のソケットクライアントの双方向チャット。 - Qiita



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# HTTP リクエスト テストプログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import socket
 
# ソケット作成 -------------------------------------------------------------------
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 接続先 -----------------------------------------------------------------------
host = "www.yahoo.co.jp"
port = 80
 
# 接続 -------------------------------------------------------------------------
sock.connect((host, port));
 
# リクエスト内容作成 --------------------------------------------------------------
req = "GET / HTTP/1.1" + "\r\n\r\n";
 
# リクエスト ----------------------------------------------------------------------
sock.send(req.encode("UTF-8"));
 
# リクエストのレスポンスを受信 --------------------------------------------------------
read_size = 128
res = "".encode("UTF-8")
while True:
    try:
        sock.settimeout(3)
        t = sock.recv(read_size);
        res += t
        if (len(t) == 0) :
            print(res.decode())
            print("====サーバーからの読み取り終了====")
            break;
    except Exception as e:
        print(e);



結果

コピペしただけのソースコードできちんと動作しているので、他のサンプルも難なく動いてくれそうな予感‼︎

ブラウザってすごいですね。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/messenger000.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
timed out
timed out
timed out
HTTP/1.1 404 Not Found on Accelerator
Date: Tue, 04 Feb 2020 00:49:22 GMT
Connection: keep-alive
Via: http/1.1 edge1840.img.bbt.yahoo.co.jp (ApacheTrafficServer [c s f ])
Server: ATS
Cache-Control: no-store
Content-Type: text/html
Content-Language: en
X-Frame-Options: SAMEORIGIN
Content-Length: 6793
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<link rel="shortcut icon" href="https://s.yimg.jp/c/icon/s/bsc/2.0/favicon.ico" type="image/vnd.microsoft.icon" />
<link rel="icon" href="https://s.yimg.jp/c/icon/s/bsc/2.0/favicon.ico" type="image/vnd.microsoft.icon" />
<title>ページが表示できません - Yahoo! JAPAN</title>
<style type="text/css"><!--
/* yjTmplCommon */
body{margin:0;padding:0;text-align:center;font-family:"メイリオ", "ヒラギノ角ゴ", Helvetica, Arial, sans-serif;}dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,input,p,blockquote,fieldset,div{margin:0;padding:0;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}ul li, ol li{list-style:none;}table{margin:0;padding:0;border-collapse:collapse;border-spacing:0;font-size:100%;}caption{text-align:left;}table,pre,code,select,input,textarea,kbd,var,ins,del,samp{font-size:100%;}address,cite,dfn,em,strong,var,th,ins,del,samp{font-weight:normal;font-style:normal;}a img{border:0;}hr.yjSeparation{display:none;}fieldset{border:none;}#wrapper{text-align:left;font-size:medium;line-height:1.56;}#yjContentsBody{position:relative;}.yjGuid{display:block;height:0;overflow:hidden;font-size:0;line-height:0;text-indent:-9999px;}.yjSkip{display:block;height:0;overflow:hidden;font-size:0;line-height:0;text-indent:-9999px;}.yj950-1 #wrapper{ width:950px;margin:0 auto;padding:0 10px;}.yj950-1 #contents{text-align:left;}
 
/* fonts */
.s115{line-height:115%;}.s130{line-height:130%;}.s150{line-height:150%;}.yjXXL{font-size:x-large;voice-family:"\"}\"";voice-family:inherit;font-size:xx-large;font-size /**/:x-large;}html>body .yjXXL{font-size:180%;font-size/**/:xx-large;}.yjXL{font-size:large;voice-family:"\"}\"";voice-family:inherit;font-size:x-large;font-size /**/:large;}html>body .yjXL{font-size:150%;font-size/**/:x-large;}.yjL{font-size:medium;voice-family:"\"}\"";voice-family:inherit;font-size:large;font-size /**/:medium;}html>body .yjL{font-size:120%;font-size/**/:large;}.yjM{font-size:small;voice-family:"\"}\"";voice-family:inherit;font-size:medium;font-size /**/:small;}html>body .yjM{font-size:100%;font-size/**/:medium;}.yjMt{font-size:small;line-height:1.4em;voice-family:"\"}\"";voice-family:inherit;font-size:medium;font-size /**/:small;}html>body .yjMt{font-size:100%;font-size/**/:medium;}.yjS{font-size:x-small;voice-family:"\"}\"";voice-family:inherit;font-size:small;font-size /**/:x-small;}html>body .yjS{font-size:84%;font-size/**/:small;}.yjSt{font-size:x-small;line-height:1.3em;voice-family:"\"}\"";voice-family:inherit;font-size:small;font-size /**/:x-small;}html>body .yjSt{font-size:84%;font-size/**/:small;}.yjXS{font-size:xx-small;voice-family:"\"}\"";voice-family:inherit;font-size:x-small;font-size /**/:xx-small;}html>body .yjXS{font-size:70%;font-size/**/:x-small;}
 
/* masthead */
.yjmth{*height:1%;}.yjmth img{vertical-align:middle;border:0px;}.yjmth a{border:0px;}div.yjmthproplogoarea{float:left;}div.yjmthloginarea{float:left;margin:0px 0px 0px 3px;font-size:smaller;text-align:left;line-height:110%}div.yjmthcplogoarea{float:right;}div.yjmthcmnlnkarea{/*\*/float:right;/* */margin:10px 3px 0px 0px;font-size:smaller;text-align:right;line-height:110%;}br.yjmthclear{clear:both;}div.yjgrplink{text-align:right;font-size:smaller;line-height:115%;}div#music div.yjmthloginarea{margin-top:16px;margin-left:7px;}div#music div.yjmthcmnlnkarea{margin-top:26px;}div#music div.yjmthcplogoarea{margin-top:14px;}#masthead{width:100%;height:41px;margin:10px auto;text-align:left;}#masthead strong{font-weight:bold;}#masthead:after{content:"."; display:block; position:relative;height:0; clear:both; visibility:hidden;}/*\*/* html #masthead{height:1%;}* html #masthead .yjmth{margin:0;padding:0;}/**//* ie/mac \*//*/#masthead{display:inline-table;}/**/
@media print{div.yjmthloginarea{display:none;}}
 
/* footer */
#footer{text-align:center;}#footer address{padding:10px 0 20px;border-top:1px solid #ccc;font-size:small;line-height:1.4;}
 
/* contents */
.msg{margin:2.5em 0 4em;}.msg h1{font-size:130%;font-weight:bold;}.msg p{margin-top:2em;background-color:#fff;}.msg p.lnk{text-align:center;}
--></style>
</head>
<body class="yj950-1">
 
<div id="wrapper">
 
<div id="header">
<span class="yjGuid"><a name="yjPagetop" id="yjPagetop"></a><img src="https://s.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" width="1" height="1" alt="このページの先頭です"></span>
<span class="yjSkip"><a href="#yjContentsStart"><img src="https://s.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" alt="このページの本文へ" width="1" height="1" ></a></span>
<div id="masthead">
<div class="yjmth">
<div class="yjmthproplogoarea">
<a href="https://www.yahoo.co.jp/"><img src="https://s.yimg.jp/c/logo/f/2.0/yj_r_34.png" alt="Yahoo! JAPAN" width="136" height="34" border="0"></a></div>
<div class="yjmthcmnlnkarea">
<a href="https://www.yahoo.co.jp/">Yahoo! JAPAN</a>&nbsp;-&nbsp;<a href="https://www.yahoo-help.jp/">ヘルプ</a></div>
</div>
</div><!--/#masthead-->
 
</div><!--/#header-->
 
<hr class="yjSeparation">
 
<div id="contents">
 
<div id="yjContentsBody">
<span class="yjGuid"><a name="yjContentsStart" id="yjContentsStart"></a><img src="https://s.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" alt="ここから本文です" width="1" height="1"></span>
 
<div id="yjMain">
<div class="yjMainGrid">
<div class="msg">
<h1>ページが表示できません</h1>
<p>障害が発生しているため、しばらくしてから、再度アクセスしてください。</p>
<p class="lnk"><a href="https://www.yahoo.co.jp/">Yahoo! JAPAN</a></p>
</div><!--/.msg-->
</div><!--/.yjMainGrid-->
</div><!--/#yjMain-->
 
</div><!--/#yjContentsBody-->
 
<div id="yjContentsFooter">
<span class="yjGuid"><img src="https://s.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" width="1" height="1" alt="本文はここまでです"></span>
<span class="yjSkip">
<a href="#yjPagetop"><img src="https://s.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" alt="このページの先頭へ" width="1" height="1"></a></span>
</div><!--/#yjContentsFooter-->
 
</div><!--/#contents-->
 
<hr class="yjSeparation">
 
<div id="footer">
<address><a href="https://privacy.yahoo.co.jp/">プライバシー</a> - <a href="https://about.yahoo.co.jp/docs/info/terms/">利用規約</a> - <a href="https://www.yahoo-help.jp/">ヘルプ・お問い合わせ</a><br>
Copyright (C) 2020 Yahoo Japan Corporation. All Rights Reserved.
</address>
</div><!--/#footer-->
 
</div><!--/#wrapper-->
 
</body>
</html>
 
====サーバーからの読み取り終了====
 
In [2]:



コメント

背景・目的に貼ったリンクを書いた方には本当に感謝致します。

通信系のプログラムは初めてだったのですが、非常にいい感触がつかめました。

誠にありがとうございます。



以上

Python で最大公約数を求める



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


最大公約数を求めるなんて、とても地味ですが、図形を分割したりする際にとても重要だったりします。

かなり単純なソースコードと出力になりますが、入力値に対して最大公約数を求めます。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 最大公約数計算プログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import fractions
from functools import reduce
 
#==============================================================================
# 関数
#==============================================================================
def gcd(*values):
    return reduce(fractions.gcd, values)
 
#==============================================================================
# 最大公約数を求める値
#==============================================================================
a = 1000.0112354
b = 307
c = 401
 
#==============================================================================
# 最大公約数計算
#==============================================================================
aa = gcd(a, b, c)
 
#==============================================================================
# 表示
#==============================================================================
print('値 = ' + str(a) + ', '  + str(b) + ', '  + str(c))
print('最大公約数 = ' + str(aa))
print(' a/aa = ' + str(a/aa))
print(' b/aa = ' + str(b/aa))
print(' c/aa = ' + str(c/aa))



結果

3つの値 1000.0112354 、 307 、 401 の最大公約数は 2.2737367544323206e-13 と求まりました。

実際の出力結果を下に示します。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/Greatest-Common-Divisor000.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
値 = 1000.0112354, 307, 401
最大公約数 = 2.2737367544323206e-13
a/aa = 4398095924915771.0
b/aa = 1350200278908928.0
c/aa = 1763616650952704.0



コメント

実用的な関数ではないですが、最大公約数を戻ることは重要で有益な事なので、覚えておこうと思います。



以上

Python で曲面近似(サーフェスフィッティング)する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


曲線近似はわりと簡単に出来ました。

もちろん、簡単な近似プログラムなので出来たというのは大げさかもしれませんが…

曲線近似をやったので曲面近似(サーフェスフィッティング)もやってみたいと思います。

リンクの記事の曲線近似と計算手法自体は同じです。
Python で 放射基底関数 (RBF) 補間 - 解析エンジニアの自動化 blog

テスト用のある程度複雑な曲面を作り、 その曲面上の点をランダムに抽出します。
今回は誤差は与えません。

そして、 ランダムに抽出した曲面上の点に対して近似曲面を作ります。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 曲面近似プログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
#==============================================================================
# 曲面作成
#==============================================================================
x, y, z = 10 * np.random.random((3, 10)) # 乱数で適当に x, y, z を作成する
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) # x, y の値の最小・最大から等間隔の配列を作成する
xi, yi = np.meshgrid(xi, yi) # xi, yi から mesh を作成する
 
# カーネル種類
#   線形 RBF => linear
#   ガウシアン RBF => gaussian
#   多重二乗 RBF => multiquadric
#   逆二乗 RBF => inverse
#   多重調和スプライン RBF => cubic(3次), quintic(5次), thin_plate(薄板スプライン)
rbf = interpolate.Rbf(x, y, z, function='gaussian') # x, y, z の値で RBF 補間をして曲面を作成する
 
zi = rbf(xi, yi) # x, y, z の曲面における xi, yi の位置の zi を計算する
 
#==============================================================================
# 3 次元グラフ
#==============================================================================
fig = plt.figure(figsize=(18, 7), dpi=200) # 画像を作成する
el = 55                                    # 視点高さを設定する
 
#==============================================================================
ax = fig.add_subplot(231, projection='3d') # 2 × 3 の 1 枚目に描画する
 
# 曲面のプロット
ax.plot_surface(xi, yi, zi)                      # サーフェスの描画
ax.view_init(elev=el, azim=10)                   # ビューの設定
ax.set_title('elev = ' + str(el) + ', deg = 10') # タイトルの設定
ax.set_xlabel('xi')                              # 軸ラベルの設定
ax.set_ylabel('yi')                              # 軸ラベルの設定
ax.set_zlabel('zi')                              # 軸ラベルの設定
 
#==============================================================================
ax = fig.add_subplot(232, projection='3d') # 2 × 3 の 2 枚目に描画する
 
# 曲面のプロット
ax.plot_surface(xi, yi, zi)                      # サーフェスの描画
ax.view_init(elev=el, azim=45)                   # ビューの設定
ax.set_title('elev = ' + str(el) + ', deg = 45') # タイトルの設定
ax.set_xlabel('xi')                              # 軸ラベルの設定
ax.set_ylabel('yi')                              # 軸ラベルの設定
ax.set_zlabel('zi')                              # 軸ラベルの設定
 
#==============================================================================
ax = fig.add_subplot(233, projection='3d') # 2 × 3 の 3 枚目に描画する
 
# 曲面のプロット
ax.plot_surface(xi, yi, zi)                      # サーフェスの描画
ax.view_init(elev=el, azim=80)                   # ビューの設定
ax.set_title('elev = ' + str(el) + ', deg = 80') # タイトルの設定
ax.set_xlabel('xi')                              # 軸ラベルの設定
ax.set_ylabel('yi')                              # 軸ラベルの設定
ax.set_zlabel('zi')                              # 軸ラベルの設定
 
#==============================================================================
ax = fig.add_subplot(234, projection='3d') # 2 × 3 の 4 枚目に描画する
 
# 曲面のプロット
#   rstride と cstride はステップサイズ
#   cmap は彩色
#   linewidth は曲面のメッシュの線の太さ
ax.plot_wireframe(xi, yi, zi, rstride=1, cstride=1, cmap='hsv', linewidth=0.2) # ワイヤーフレームの描画
ax.view_init(elev=el, azim=10) # ビューの設定
ax.set_xlabel('xi')            # 軸ラベルの設定
ax.set_ylabel('yi')            # 軸ラベルの設定
ax.set_zlabel('zi')            # 軸ラベルの設定
 
#==============================================================================
ax = fig.add_subplot(235, projection='3d') # 2 × 3 の 5 枚目に描画する
 
# 曲面のプロット
#   rstride と cstride はステップサイズ
#   cmap は彩色
#   linewidth は曲面のメッシュの線の太さ
ax.plot_wireframe(xi, yi, zi, rstride=1, cstride=1, cmap='hsv', linewidth=0.2) # ワイヤーフレームの描画
ax.view_init(elev=el, azim=45) # ビューの設定
ax.set_xlabel('xi')            # 軸ラベルの設定
ax.set_ylabel('yi')            # 軸ラベルの設定
ax.set_zlabel('zi')            # 軸ラベルの設定
 
#==============================================================================
ax = fig.add_subplot(236, projection='3d') # 2 × 3 の 6 枚目に描画する
 
# 曲面のプロット
#   rstride と cstride はステップサイズ
#   cmap は彩色
#   linewidth は曲面のメッシュの線の太さ
ax.plot_wireframe(xi, yi, zi, rstride=1, cstride=1, cmap='hsv', linewidth=0.2) # ワイヤーフレームの描画
ax.view_init(elev=el, azim=80) # ビューの設定
ax.set_xlabel('xi')            # 軸ラベルの設定
ax.set_ylabel('yi')            # 軸ラベルの設定
ax.set_zlabel('zi')            # 軸ラベルの設定
 
#==============================================================================
# グラフ出力
file_name = 'Various 3D Images.jpg' # グラフ名設定
plt.savefig(file_name)              # グラフ出力
 
plt.show() # 描画
 
#==============================================================================
# 2 次元グラフ
#==============================================================================
fig = plt.figure(figsize=(18, 7), dpi=200) # 画像を作成する
 
# 曲面のプロット ==================================================================
ax = fig.add_subplot(121, projection='3d') # 1 × 2 の 1 枚目に描画する
ax.plot_surface(xi, yi, zi)                # サーフェスの描画
el = 100                                   # 視点高さを設定する
ax.view_init(elev=el, azim=90)             # ビューの設定
ax.set_title('elev = 100, deg = 90')       # タイトルの設定
ax.set_xlabel('xi')                        # 軸ラベルの設定
ax.set_ylabel('yi')                        # 軸ラベルの設定
ax.set_zlabel('zi')                        # 軸ラベルの設定
 
# コンター =======================================================================
ax = fig.add_subplot(122) # 1 × 2 の 2 枚目に描画する
contour = ax.contourf(xi, yi, zi)
fig.colorbar(contour)
ax.set_xlim([x.max(), x.min()])
ax.set_ylim([y.max(), y.min()])
ax.set_title('contour')       # タイトルの設定
ax.set_xlabel('xi')            # 軸ラベルの設定
ax.set_ylabel('yi')            # 軸ラベルの設定
 
# グラフ出力
file_name = '3D and Contour.jpg' # グラフ名設定
plt.savefig(file_name)           # グラフ出力
 
plt.show()



結果

このプログラムから出力される近似曲線の 3 次元グラフを図1 〜 図2 に示します。

図1 グラフ


図2 コンター




コメント

こんなに綺麗な画像が簡単に作れるとは思いませんでした。

曲線近似は使い所がマニアックなものしか思いつかないので、あまり今後はブログに出てこないかもしれません。



以上

Python で波形データを微分する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


積分をやったんで、微分も記事にまとめます。

2波形について試してみました。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 離散データの微分を計算するプログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import numpy as np
import matplotlib.pyplot as plt
 
#==============================================================================
# テスト用離散データの作成
#==============================================================================
flag = 1
 
if flag == 0:
    x = np.linspace(0, 2.2, num=2**5+1)
    y = 2.1*x**4 - 3.3*x**3 - 2*x + 1
elif flag == 1:
    x = np.arange(-7.0, 8.0, 1)
    y = x**2
 
#==============================================================================
# 微分計算
#==============================================================================
dy = np.gradient(y)
 
#==============================================================================
# グラフ
#==============================================================================
# 微分対象波形
plt.plot(x, y, 'r-', label='wave')
plt.plot(x, y, 'r.')
 
# 微分波形
plt.plot(x, dy, 'b-', label='differential')
plt.plot(x, dy, 'b.')
 
# グラフのタイトル・目盛設定
plt.title("Differential")
 
# 凡例の位置設定
plt.legend(loc='upper left')
 
# 罫線
plt.grid(which='major', color='black', linestyle='-')
plt.grid(which='minor', color='black', linestyle='-')
 
# 軸ラベル
plt.xlabel('x')
plt.ylabel('y')
 
# y 軸目盛
if flag == 1:
    plt.ylim([-20, 70])
 
file_name = 'differential.jpg'
plt.savefig(file_name)
plt.show()



結果

ソースコードの『テスト用離散データの作成』の flag == 0 の時の微分波形を図1 、 flag == 1 の時の微分波形を図2 に示します。

図1 flag == 0


図2 flag == 1



コメント

図1 では微分が正しく行われているか分からなかったので、図2 から微分が正しく行われていることを確認しました。

これで物理量の変換も出来るようになりました。



以上