明日の研究者になりたい

中国地方の某大学院博士課程に進学が決まったブログ.

Pythonで3Dグラフの軸ラベル位置を変える

3Dグラフを描画した際に軸ラベルのフォントサイズを変更するとどうしても軸の値と被ってしまい,位置の調整でかなり時間を使ってしまったので備忘録がてら手法を記します.

3Dプロット

3Dプロットにはmatplotlibのpyplotとmpl_toolkitsのmplot3dを使います.
グラフの例としては力センサから得た値をベクトルとして3次元空間上に表現するとします.
(値は何でも良いです)

import matplotlib.cm as cm #カラーマップ
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
%matplotlib inline

X = np.linspace(5,10,10)
Y = np.linspace(0,20,10)
Z = np.linspace(-20,20,10)

figure = pyplot.figure(figsize=(10,10), facecolor='w')
ax = figure.gca(projection='3d')
xlabel = ax.set_xlabel("X-axis [N]")
ylabel = ax.set_ylabel("Z-axis [N]")
zlabel = ax.set_zlabel("Y-axis [N]")
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.set_zlim(-20,20)
for i in range(len(X)):
    ax.plot([0,X[i]], [0,Y[i]], [0,Z[i]], "-^", color=cm.winter(200-(i+1)*20), ms=7, mew=0.5, lw=3)
    
    #3D空間上で原点が見にくいので,原点描画用
    ax.plot([-21,21], [0,0], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [-21,21], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [0,0], [-21,21], "-", color="gray", lw=1, linestyle = 'dotted')
    
    #3Dグラフの視点の変更
    ax.view_init(30, 30)

出力すると,
f:id:bigface00:20181108093426j:plain
のようになります.
でもこのままだと,軸ラベルが非常に見にくいですよね.
軸の値と軸ラベルの大きさを調整してみます.
軸の値はax.tick_paramsを追加し,

ax.tick_params(labelsize = 13)

軸ラベルにfontsizeを追加することでフォントサイズがそれぞれ変わります.

xlabel = ax.set_xlabel("X-axis [N]", fontsize = 18)
ylabel = ax.set_ylabel("Z-axis [N]", fontsize = 18)
zlabel = ax.set_zlabel("Y-axis [N]", fontsize = 18)

変更後の全体は

import matplotlib.cm as cm #カラーマップ
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
%matplotlib inline

X = np.linspace(5,10,10)
Y = np.linspace(0,20,10)
Z = np.linspace(-20,20,10)

figure = pyplot.figure(figsize=(10,10), facecolor='w')
ax = figure.gca(projection='3d')
xlabel = ax.set_xlabel("X-axis [N]", fontsize = 18) ##fontsize追加
ylabel = ax.set_ylabel("Z-axis [N]", fontsize = 18) ##fontsize追加
zlabel = ax.set_zlabel("Y-axis [N]", fontsize = 18) ##fontsize追加
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.set_zlim(-20,20)
for i in range(len(X)):
    ax.tick_params(labelsize = 13)##tick_params追加
    ax.plot([0,X[i]], [0,Y[i]], [0,Z[i]], "-^", color=cm.winter(200-(i+1)*20), ms=7, mew=0.5, lw=3)
    
    #3D空間上で原点が見にくいので,原点描画用
    ax.plot([-21,21], [0,0], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [-21,21], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [0,0], [-21,21], "-", color="gray", lw=1, linestyle = 'dotted')
    
    #3Dグラフの視点の変更
    ax.view_init(30, 30)
plt.savefig("output2.jpg")

出力すると,
f:id:bigface00:20181108093839j:plain
のようになり,軸ラベルが数値と被ってしまいます.
これではかなり不細工なので,軸ラベルの位置を調整したいと思います.
調整するには,

from matplotlib import rcParams
rcParams['axes.labelpad'] = 16

を追加するだけでいけます.
rcParams['axes.labelpad'] はX,Y,Z全ての軸ラベルをまとめて調整することが可能です.
出力すると,
f:id:bigface00:20181108095934j:plain
となり,軸ラベル全体でばっちりマージンがとれています.
rcParamsではmatplotlibのパラメータを調整することができます(下記サイトが参考になると思います).
qiita.com

M5StackでMPU9250が動かない

最近M5Stackをよく使うようになりました.
www.switch-science.com
ESP32搭載のLCD付きマイコンでサイズもちょうどよく,Grayを買えばIMU付きで素晴らしい代物です.
特にBLEやWiFiが使えることでデータのやり取りもでき,使い勝手もいいです.
今回,後輩がIMUを使ったアシスト制御みたいなのをやるらしくまずはM5Stackを使ってみることにしました.

Arduino IDEで動かす場合,ボードマネージャからESP32 Dev moduleダウンロードすることで書き込みができるようになったようなので,そちらでやってみました.
しかし,M5StackのライブラリについているMPU9250のサンプルであるMPU9250BasicAHRSを書き込むとM5Stackが永遠と再起動してしまう...
シリアルモニタを見ると
Guru Meditation Error: Core 1 panic'ed (IntegerDivideByZero). Exception was unhandled.
とのこと.
全くわからずGoogle先生で調べてみると,I2C通信の問題らしい...
あまりここらへんは詳しくないため途方に暮れてダメ元でGit GUIを使ったESP32ボードのダウンロードを行ったところ,なんと書き込みが成功しました...!!
github.com
今のところは↑のやり方でやった方が良さそうです.

Scipyのoptimize.fmin関数を使った階段法における心理物理曲線

最近,初めて階段法を使った心理物理実験をやりました.
実験の後半は僕も被験者も意識が朦朧としてました...笑
ただ,プロトコルしっかり練って,それに対応したプログラム組めば実験者側はかなり楽になると思います.
被験者側はしっかり休憩挟む以外,楽する方法は無さそうですね笑
心理物理実験の後はその結果に対してカーブフィッティングを行うことで,PSE(主観的等価点),75%閾値などを算出して基準に対する比較刺激のバイアスがあるかどうかを調べていきます.
カーブフィッティングの方法については下記の梶本先生のページが一番わかりやすいと思います.
恒常法のS字カーブフィッティングについて
せっかくMatlabで書いて頂いているのですが,それを参考にして今回はPythonで書いてみました.

続きを読む

ESP32でBLE

ほぼ1年ぶりぐらいの投稿です.

更新しようと思って全くできていなかった...

今年度こそはしっかりやったことを記録としてはてブロに投稿するようにします(_ _)

 

最近,研究の一環で電子工作を頻繁にやるようになりました.

僕の知識はArduino最強!で高専時代から止まっていたのですが,留学生からESP32なるものを紹介されて最近は専らESP32です.

このESP32,Bluetooth,Wifi搭載で価格も安く中々の代物.

今日はBLEの使い方に関して備忘録も兼ねて書いていこうと思います.

続きを読む

Pythonメモ書き(unique,linspaceメソッド)

  • uniqueメソッド

np.unique(array):arrayの中身を重複なしで返す.

例えばarray=[1,1,1,2,3,3]だったら[1,2,3]が返ってくる.

np.unique(array, return_counts=True)とすると,各要素の数も返ってくる.

上の例だと,(array([1,2,3], array([3,1,2]))が返ってくる.

 

  • linspaceメソッド

np.linspace(0,1,50):0~1を50分割したものをストアしたarrayを返す.

 

備忘録:論文投稿【IEEE Transactions on Haptics】

D1にして,初めて論文を投稿しました.

投稿先はタイトルにあるようにIEEE Transactions on Hapticsです.

書き終えるまでも長かったけど,投稿するまでも色々手間取って長くなってしまった...

あとは万事尽くして天命を待つです.

というわけで,次は手間取らないように備忘録を兼ねて手順を書いていきます.

 

続きを読む

研究者としてのスタート地点

まだかまだかと待ちわびていたDC1の科研費申請の結果が遂に返ってきました.

結果としては満額貰えませんでしたが,貰える事自体がめちゃくちゃ嬉しいです.

ノーベル賞をとった山中教授が,受賞した際のインタビューで

「今日からがスタートです」

と仰られており,賞を取ったことで終わったのではなく,むしろその分野のパイオニアとしてスタート地点に立つことができたと話されておりました.

私はその言葉に非常に感銘を受け,いつかは使ってやるぞ!と思っておりましたが,遂に使う日がやってきました.

 

そう,自分の取ってきたお金で研究をする,つまり研究者の端くれとしてのスタート地点に立つことができたのです.


 てなわけで,今日も今日とて進捗報告です.

今日は時間が遅いので,簡単にやります.

続きを読む