マインクラフト JavaEdition公開サーバ「ThlivingServer」はコチラ!

グラフ描画GUIを作ってみたお話①

自己紹介

これ見てどうぞ。ちなみにIDは二度と気胸にはならないというお気持ち表明。みんなも気胸には気を付けよう(細身の男性がなりやすいらしい、別名イケメン病)。細身の男性=イケメンとかいう安直な考えで別名つけるのは本当にやめてほしい。そこそこ重症になると手術することになって、お゛ぉ゛ん!!となる。

※パソコンには疎いので雑な表現とかが散見されますが許してください。

事の発端

学部2回生でほぼ毎週実験レポートを出すことになった。当然、測定結果をグラフにしてレポートに載せるわけだが、Excelで作ったグラフはデフォルトがダサい(無知なだけで何かいい方法があるかもしれないが)。そう思っていたころ、matplotlibで描くといい感じになるというのをチラッと聞いたのでやってみたら、結構きれいだったので使い始めたが、複雑なグラフになってくるといろいろと打ち込まないといけないわけで、コマンド的somethingを覚えるのは正直しんどいし、そのうちどうせ忘れる。じゃあ、GUI作ってサクッと描けるようにすればいいだろと思ってグラフ描画GUIを作った(私のGitに飛びます、version管理ガバガバなのは許して)。ちなみにexeファイルもあります。

概要

言語はpythonで(それはそう)、メインで使用したライブラリはtkinterとmatplotlibです。GUIをtkinterで作成し、そのGUIから取得したデータを基にmatplotlibでグラフを描くといった流れです。このブログでは、グラフ描画GUI “Graph Generator” の基本構造、tkinterやmatplotlibを使うときに困った点などを書いていこうと思います。初回は、2020年7月19日現在のver2.4.1の使い方を解説します。

Graph Generatorの使い方

Gitにはpythonファイルが置いてあるので、環境構築が終わってる&使用されているライブラリがインストールされている必要があります。起動に時間が少しかかりますが、一応exeファイルにもしたので、とりあえず使いたいという人はexeファイルをダウンロードして使ってください(ここにあります)。インストールしたやつをdist→GraphGenの順に開いて、GraphGenフォルダ内のGraphGen.exeで使用できます(動作はWindows10 64bitのみ確認済み)。

さて、最初に起動するとコマンドプロンプト(黒い画面)が現れて、しばらく経つと以下の画面が現れます。

この画面の”Import file”をクリックすると、別でウィンドウが表示されるので、どのデータを取り込むか指定できます。今回はGraphgenフォルダ→Sampleフォルダに用意してsample.csvを取り込んでみます。

取り込んだら、上の画像に示したウィンドウが下の画像に示すウィンドウに切り替わると思います。

では、さっそくグラフを描いてみましょう。”Dataname”列の”y=x”行のY1をクリックしてチェックを入れます。そして、”Output”をクリックすると…

無事表示されたと思います。コマンドプロンプトに”No handles with labels found to put in legend.”と表示されますが、凡例が指定されてないと言われているだけで描画は問題なく行われています。さて、ここからは詳細な使い方について解説していきます。

左画面の設定について

赤線で示された部分について解説していきます。

  • X-axis name
    x軸の名前の設定(空欄可、LaTeX数式可)
  • Y1-axis name
    y軸(左側)の名前の設定(空欄可、LaTeX数式可)
  • Y2-axis name
    y軸(右側)の名前の設定(空欄可、LaTeX数式可)
  • X-range
    x軸の描画範囲をbeginからendまでに設定(空欄可※1)
    tick間隔で補助目盛を描画(空欄可)
  • Y1-range
    X-rangeのy軸(左側)バージョン
  • Y2-range
    X-rangeのy軸(右側)バージョン
  • Font size
    labelは各軸および凡例のフォントサイズ設定(デフォルト24pt)
    tickは目盛のフォントサイズ設定(デフォルト20pt)
  • sci
    各軸の表記を指数表記にするか設定
  • MarkerSize
    プロット時のマーカーのサイズ設定(デフォルト10pt)
  • LineWidth
    線の太さを設定(デフォルト2.5pt)
  • grid
    グリッド線の有無を設定
  • WindowSize
    グラフ描画時のウィンドウサイズを設定(デフォルトは正方形)
  • encoding
    csvファイル読み込み時のエンコードを設定(基本utf-8がいいと思います)

    ※1 beginもしくはendどちらか一方だけ空欄だとエラー出ます

ざっとこんなところです。扱えるデータファイルはcsv形式のみで、”sample.csv”の形式であれば、まずエラーは出ないと思います。また、csvファイルがn行m列であると仮定して、n×m全体にデータが入っている必要はなく、空欄部分を消して上に詰めれば読み込み可能です。もし、エラーが出て正常に動作しないときはコメントをいただければと思います。

右画面の設定について

次は右側の設定についてです。

  • Dataname
    csvファイルの一行目に記載されている、その列が示すデータ名
  • X
    あるデータをプロットする際、x軸に何番目のデータを使用するかを指定
  • Y1
    y軸(左側)への描画設定
  • Y2
    y軸(右側)への描画設定
  • Label
    凡例の設定(空欄可、LaTeX数式可)
  • Marker
    マーカーに用いる図形の設定
  • FaceColor
    マーカーの塗りつぶし設定
  • Line
    線の形式設定
  • Color
    線およびマーカーの輪郭の色設定
  • Approx
    近似曲線の描画の有無を設定(現在、多項式近似のみ)※2
  • Degree
    多項式近似を行う際の次数設定
  • Approx Label
    近似曲線の凡例設定(空欄可、LaTeX数式可)
  • Lox axis
    各軸を対数軸にするか設定
  • Invert axis
    各軸を反転するか設定

    ※2 近似曲線描画時、点と点を結ぶ線は消えます

以上です。

いろいろ描いてみる

さきほどは、y=xの非常に単純なグラフでしたので、次は複数のグラフを描いてみます。

こんな感じで設定して、”Output”を押して…

問題なく表示されたと思います。

では、指数関数を表示してみましょう。

Log axisのY1にチェックを入れて表示してみます。

x軸の範囲を2~6にして補助目盛を0.1としましょう。

次は回帰直線を引いてみます。”Approx”にはy=x+[-1~+1のランダム値]のデータを用意しています。

描画されると同時に、コマンドプロンプトに”0.983x+0.5887″と表示されると思います。これが回帰直線の式です。

グラフの保存方法とか

これはmatplotlib側の話なので正直なところここに書く必要があるのか疑問ですが、一応書いておきます。表示されたグラフの最下部の右側のフロッピーディスクのアイコンを押すと別ウィンドウが表示されます。そこから適当なフォルダに、適当な形式で、適当な名前で保存して終わりです。ちなみに、”Output”を押したときに、その時に設定された軸の名前だとか様々な情報がすべて保存されて”拡張子なしcsvファイル名_GG.txt”に保存されます。次回読み込み時、このtxtファイルから前回の設定を読み込みます。

2020/7/19現在判明している問題点

  • 補助目盛が表示されないことがある(目盛のラベルが密になっているときなどに表示されないようです)
  • Invert axis設定時に描画範囲設定のbegin値とend値の間にbegin<endの関係があると軸が反転しない(begin>endとすれば意図したグラフが得られます)
  • 設定保存ファイルが壊れている、versionが変わって読み込みに失敗するなどが原因で、グラフが描画できなくなる(とりあえず、txtファイルを消せば動きます)
  • 一見、”sample.csv”と同じ形式であるのに読み込みが不可能なファイルが存在する(私が確認しているのはリダイレクトで作られたcsvファイル)

上3つに関しては対応可能だと考えているので、そのうち修正します。

他に何か問題点を見つけたら、コメントお願いします。

Graph Generatorの今後の予定について

アレニウスプロットに対応しようかなぁと考えています。

Excelの謎補間曲線とかも暇だったらやろうと思います。

あと、移動平均も実装したほうがいいかもしれない?

X2軸に関しては、現状自分が使うことがなさそうなので実装予定はないです。

ブログの今後の予定について

冒頭でも少し書きましたが、作り方とか困った点とその解決方法について書いていこうと思います。特にtkinterに関しては解説が十分にされてなさそうな気がしたので、詳しく書けたらいいなぁと考えています。

とりあえず、初回はここまで。

コメント

タイトルとURLをコピーしました