俺言語。

自分にしか理解できない言語で書かれた備忘録

【論文】Matplotlibでのグラフ出力 トラブル&解決方法

Matplotlibで論文用のグラフを出力した際に起こったトラブルと解決方法覚え書き

1. epsで出力した画像がLaTex上でうまく表示されない (グラフが画像の枠からはみ出る)

これはmatplotlibがepsを出力する際のbouding box値にバグがあるためらしく、下記のサイトでは一度PDFに変換して再度epsに戻すことで解決していました。
自分の環境では、epsをpdfに変換するのがうまくいかず断念。
結局は LaTexに直接貼るものはpdfで出力することにしました.
ami-gs.hatenablog.com

2. Matplotlibから出力したpdfをLaTexに貼ると、no BoundingBoxとエラーが出る

matplotlibから出力されたpdfをそのままLaTexに貼ろうとすると今度は"no BoundingBox"とエラーが出ました。
これは,LaTexの画像挿入のところで、bbを定義してあげると解決しました。

\includegraphics[bb=0 0 404 295, scale=0.6]

bbの値はLaTexに付属のextractbbコマンドを使うことで入手できる。
画像があるフォルダと同階層で,コマンドプロンプトから

extractbb img.pdf

と入力するとそのフォルダに.xbbファイルが生成され、その中にbb値が存在する.
www.ic.daito.ac.jp

3. matplotlibから出力されたeps、pdfをInkScapeにインポートするとフォントが変わってしまう

matplotlibでは、New Times Romanに設定したグラフがInkScapeにインポートするとSanSerifになってしまう事象がありました。
InkScape上で全て手作業でフォントを直すのはかなり大変なため,matplotlibから出力されるpdfのフォントを埋め込みではなくアウトライン化することで対応。
但し、InkScapeで編集するときに重くなるので注意が必要。
アウトライン化の方法は、

  1. matplotlib.patheffectsをインポート
  2. アウトライン化したいtextオブジェクトを取得
  3. そのtextオブジェクトのset_path_effectsメソッドを引数path_effects.Normal()で実行
import matplotlib.patheffects as path_effects

tx = ax.get_xaxis().get_label()
tx.set_path_effects([path_effects.Normal()])

matplotlib.org

【Android】Error: missing feature: WATCH

コードを実行しようとすると上記エラーが発生.

直前でAndroid studioをアップデートしたことと関連しているようで、Manifest内の設定が変わってしまった模様.Target deviceの位置にも”Missing...”と表示される.

リンク先を参考に下記を削除すると解決しました.

f:id:hukkuramamemoti:20220106101039p:plain

newbedev.com

【Android】【Spinner】プルダウンで項目を選択できるSpinner

ボタンをクリックするとアイテムのリストがプルダウンで表示されて、そこから項目を選ぶタイプのUI実装方法。
かなりわかりづらい。

シェイプ等を変えず背景色とフォント色のみ設定する場合に必要になるファイルは

  1. ***.java : SpinnerインスタンスとSpinnerアイテムを格納するためのArrayAdapterインスタンスを作成、SpinnerにArrayAdapterをセットする。

Itemが選択されたときに呼ばれるリスナーをセットする。

  1. spinner_item.xml(layout) : ボタン上に表示される部分の定義
  2. spinner_dropdown/xml(layout) : ドロップダウンで表示される部分の定義


各ファイルのコード

/** Spinnerの準備 */
        ArrayAdapter<String> adapter_mode = new ArrayAdapter<String>(this, R.layout._cutom_spinner_item);
        adapter_mode.setDropDownViewResource(R.layout._custom_spinner_dropdown);
        adapter_mode.add("1.***");
        adapter_mode.add("2.***");
        adapter_mode.add("3.***");
        final Spinner spinner_mode = (Spinner) findViewById(R.id.spinner_mode);
        spinner_mode.setAdapter(adapter_mode);
        // リスナーを登録
        spinner_mode.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Spinner spinner = (Spinner)adapterView;
                Spinner_Item = (String)spinner.getSelectedItem();
                // Itemが選択されたときに実行するmethod
                sendModeSig();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
  • _custom_spinner_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android        ="http://schemas.android.com/apk/res/android"
    style                ="?android:attr/spinnerItemStyle"
    android:singleLine   ="true"
    android:layout_width ="fill_parent"
    android:layout_height="fill_parent"
    android:textColor    ="@android:color/white"
    android:backgroundTint="@android:color/white"
    android:gravity      ="center"
    android:ellipsize    ="marquee"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    />
  • _custom_spinner_dropdown.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android        ="http://schemas.android.com/apk/res/android"
    style                ="?android:attr/spinnerItemStyle"
    android:singleLine   ="true"
    android:layout_width ="fill_parent"
    android:layout_height="fill_parent"
    android:textColor    ="@android:color/white"
    android:backgroundTint="@android:color/white"
    android:gravity      ="center"
    android:ellipsize    ="marquee"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    />

こちらが大変参考になりました。感謝。

k-hiura.cocolog-nifty.com

【Python】Import問題

すごくわかりづらいので自分なりにまとめ。まだ合っている自信がない。


- 明示的相対Import

from . import lib

.(ドット)はimportを実行しようとしているモジュールが属している同一パッケージを示す。


- 絶対Import
sys.pathやPYTHONPATHに登録されているパスからモジュールを捜索する。
sys.pathにはルートのスクリプト/モジュールのパスやカレントディレクトリが含まれ、ルートのスクリプト/モジュールからimportされたスクリプト/モジュールのパスは含まれない


- sys.path
sys.pathの中身はrootのスクリプト/モジュールとそこからimportした先のスクリプト/モジュールとで共通
e.g.) rootのスクリプトでsys.pathに追加した内容はimportされたスクリプトからでも確認できる。(変数のスコープの様にスクリプト/モジュールごとのpathだと思ってた)

よく起きる問題

絶対Importだけでは他のスクリプトから呼ばれる場合と自らがrootになる場合とでsys.pathが変わってしまい、Importエラーが起きやすい

  • Importを実行しようとしているファイルの場所をsys.pathに追加する。そうするとこのImportを実行しようとしている下階層のスクリプト/モジュールは常に呼び出せる
sys.path.append(str(pathlib.Paht(__file__).parent)) 

【Android】【debug】 Wifi経由で接続&デバッグ

WifiAndroid端末にアクセスし、デバッグする方法。
端末のUSBポートをPCと接続しなくて済むのでUSBデバイスを使ったAppのデバッグに最適。

以下はadb.exeにパスが通っている前提。adb.exeは通常、\AppData\Local\Android\Sdk\platform-tools にある。

1. Android端末のIPを調べる

2. PCとAndroid端末を有線で接続する

3. adbをTCP/IPデバッグに切り替え

adb.exe tcpip ポート番号 

4. PCとAndroid端末の有線接続を切る

5. TCP/IPで端末と接続

adb.exe connect IP:ポート番号

4. 接続されているかを確認

adb.exe devices
その他
  • error: more than one device/emulator と表示された時
adb emu kill
  • adbの様子がおかしい時。再起動させる。
adb kill-server
adb start-server

【Android】実機デバッグで端末をAndroid studioが認識しないとき

主に新しい端末をAndroid studioで認識するとき用。


1. ビルド番号を数回タッチして開発者向けオプションを表示させる

2. USBデバッグをONにする

3. USB設定をMTP(ファイル転送)モードに設定する

4. SDK Managerから該当するAndroid SDKGoogle USB Driverがインストールされているか確認する

【Python】【wxPython】TextCtrlで一部だけ文字の色を変える

WxPythonのTextCtrlで文字を扱う際、全体の文字色は

m_textctrl.SetForegroundColour(色)

で変更できるが、このメソッドでは一部の文字列だけ色を変えることは出来ない。


一部だけ変える場合には

m_text.SetStyle(最初の文字位置, 終わりの文字位置, 色)

で文字の位置を指定してSetStyleで色を指定する