韜晦日記

韜晦日記

Rietveldよりもプログラミングメインになりつつある

Rietveld解析初心者による備忘録とつぶやき

描画ライブラリPlotlyの使い方を徹底解説 | Python

Pythonでもっとぐりぐりグラフを弄ってみたり描画しながら編集したいとは思いませんか?
今回はそんな方にオススメのグラフ描画ライブラリのPlotlyについてできる限り詳細に解説したいと思います。

Plotlyとは

PlotlyはPython, R, JavaScript, MATLABに提供されているオープンソースのグラフ作成ライブラリです。インタラクティブなグラフを簡単に作ることができ、グラフをグリグリ動かして見たい時には非常に便利なライブラリです。

Plotlyはインタラクティブな操作が可能な上に3Dプロットを含む30種類以上のグラフスタイルに対応しています。
では、インタラクティブな操作って何よ?と思う方向けにデモとグラフの操作方法についての説明をいくつか用意しました。

またPythonでグラフを一度生成すれば、オンライン上で直接レイアウトを編集できるようになります。
そのほかにもPlotlyで作成したグラフを使ってプレゼンテーションを作成するためのソフトや、Powerpointへの埋め込みを行う為のプラグインも提供されています。
Powerpointでグラフがグリグリ動かして見ることができるのは画期的ですよね。

以下にPlotlyの特徴として良い点とあまり良くない点を纏めておきます。

  • Plotlyの良い点

    • グラフの軸移動や拡大縮小、系列の表示・非表示が自由自在
    • 作成したグラフをWeb上に保存できる。
    • Web上にグラフが保存されているので、ブログなどへの埋め込みも非常にシンプル。(埋め込み用の短いURLが生成される。)
    • インタラクティブに動かせるグラフをそのままHTML化して人に渡すことができる。
    • 作成したグラフはPowerpointにも埋め込める ←これマジですごい。
    • Excel上でもExcelのグラフの代わりにPlotlyのグラフを使える。 ←これも凄い
    • Plotly専用のパワポ的ツールがある。 ← まだ最低限の機能しかなく発展途上感がある。
      Githubの更新は2年前のver0.1.4で止まっているので今後どうなるかはわからない。
    • タイトルやキャプションがLatexで記述できる。(Matplotlibでもできるけど)
    • とにかく綺麗にプロットできる。
    • 軸ラベルやタイトルもその場で変更可能 (https://plot.ly/python/configuration-options/#)
  • あまり良くない点

    • 一部の機能が有料。そしてそれが高い。
    • オンライン版の表示が少し重い。オフライン版はかなり軽量。 ←複雑で無ければ気になりません。
    • ドキュメントの説明が不十分という噂をちらほら聞く。

正直他のライブラリを多用しないので悪い点があまり思いつきません。。。
でも確かに、たまにドキュメントを参照しても書いておらず、Plotlyのライブラリを読み込んでhelp( )コマンドで参照しないと解決しないなんてこともあります。
そこで今回自分自身がPlotlyを使う中で知ったことを改めてし整理したいと思います。
と言っても、当然ですが、Plotlyの公式ドキュメントに書いてあることがほとんどです。
手っ取り早くみたい方はそちらで十分かも知れません。英語ですが難しくはありません。

あと、私の実行環境は以下の通りです。  

  • Python 3.7.0  
  • Plotly 3.4.0

インストール・各種環境の準備

インストール

インストールはpipを使って通常通り行います。
大抵の場合、Pythonをインストールした時点でpipが入っているはずなのでpipの説明は割愛します。

$ pip install plotly
# あるいは
$ sudo pip install plotly
#condaを使う場合は
$ conda install -c plotly
# PlotlyのGithubではバージョンを明示的に指定してインストールしています。
$ pip install plotly==3.4.0

アップデート

アップデートは以下のコマンドで実行します。pipの基本的な操作と変わりありません。

$ pip install plotly --upgrade

Jupyter notebookを使ってグラフを描く準備

Jupyter notebook上でもPlotlyを使ってインタラクティブなグラフを描画することができます。
ということでまずJupyterのインストール。
正直な話、自分がどうやってJupyterの環境を構築したのか忘れましたので各自調べてください。
公式のインストール方法では以下のように指定されています。 またGoogle ChromeやFierFoxを既定のブラウザに指定し、IEの仕様は避けた方が良いそうです。

$ pip install --upgrade pip
$ pip install jupyter

# 起動する場合は
$ jupyter notebook

hydrogenを使ってAtom上でグラフを描く準備

Atomというエディタがありますが、hydrogenというパッケージを導入することでAtomの画面上でコードの実行とグラフを描画が可能になります。 特にステップインでコードの実行ができるのは便利です。
Atomでhydrogenを使用するためにはjupyter notebookがインストールされている必要があります。
jupyter notebookをインストールして動作することを確認したらAtomを開きます。
Atom設定 > インストール > hydrogenで検索 > 出てきたパッケージをインストール
これで終わりです。

オンラインでプロットする方法

オフラインでプロットする方法

掲載 詳細な図などを入れた解説はまた後ほど

無料アカウントの制限と有料アカウントの料金について

後日掲載

各種メソッドの説明

後日掲載

レイアウトの指定

後日掲載

go.Scatterの設定

後日掲載

Configの設定

後日掲載

画像を出力

後日掲載

スライド作成 (プレゼンテーション作成)

Powerpointへの埋め込み

後日掲載

Plotly専用ソフト【Spectacle Editor】

後日掲載

Web・ブログへの貼り付け

後日掲載

困ったときは

後日掲載

グラフの画像やPDFが出力できない。

Chart Studioで画像を出力する際に大量のデータ点を扱っている場合、以下のようなエラーが吐かれて出力できません。
opps there was an error exporting your plot.
他の方法で画像を出力させるとエラーは吐かれずいダウンロードエラーが生じます。
この問題はGoogleの画像出力システムが50,000点以上の出力をサポートしていないためだと説明されています。

Unable to export - Chart Studio - Plotly Forum

質問者さんめっちゃ怒っているように見えますね 笑
コミュニティ上でも明確な解決法が提案されておらず、これは最早あきらめるしかなさそうです。
解決法としてはAPIで直接画像を出力させる方法が考えられますが、私自身未確認ですので実際に試した方がいれば教えてください。
私はめんどくさいのでスクショで済ませました。

Plotlyのグラフ描画デモ 【plotly demo】

Plotlyのデモをいくつか用意しました。
グラフ上での操作方法についても軽く触れているので参考にしてください。
スマホだと表示がうまくいっていないかも知れません。
plotlyが悪いのではなく僕が適当にレイアウトしたから。。。

二次元プロット

二次元プロットの公式デモはこちら。
plot.ly

二次元プロットの操作方法

操作 やり方
視点移動 右上の十字矢印を押してマウスを使う。
拡大 範囲選択して拡大, 任意軸のみ拡大する時は
ドラックを拡大軸に対して水平に行う。
縮小 グラフ上でダブルクリック
軸の移動 軸上でクリックしながらマウスを移動。
軸の端では軸の拡大縮小も可能
グラフの表示・非表示 表示・非表示にしたい反例をクリック
最初の表示に戻す 右上の家マークをクリック

普通の折れ線グラフ

下のスライドバーで自由に横軸の範囲を変更できたりもする(オプション設定)。
表示されている文字は全て注釈で、良い感じに配置することも簡単にできる。※凡例とは違います。

棒グラフ

右横に表示されているのが凡例。 凡例をクリックすると表示・非表示を変更できる。非表示にすると自動で軸を変更してくれる。

エラーバーの表示

グラフ in グラフも可能(グラブの中にグラフを表示させる)

おしゃれなグラフ

<出展: HOW MUCH DOES ONE LEGO PIECE COST? by WIRED>
How Much Does One Lego Piece Cost? | WIRED

シリコンのバンド構造の計算結果

VASPで計算した結果になります。
軸ラベルはLatexで表記しています。

三次元プロット

3Dプロットの公式デモはこちら。
plot.ly

3Dプロットの操作方法

操作 やり方
視点移動 グラフ上でクリックしてマウスを動かす
拡大縮小 マウスホイールを使う。
グラフの回転 2本指で左右に動かす(トラックパッド)。
最初の表示に戻す 右上の家マークをクリック

メビウスの輪, 多面体表示

折れ線グラフの3Dプロット

こんなレイアウトもボタン一つで出来ちゃうレイアウトのプリセットも用意されている。

脳のCTスキャン

Playボタンを押すことでパラパラ漫画のように再生できるようになります。

なんか綺麗な等密度面

面心立方構造のフェルミ面みたいですね。

地図の表示なんかもOK

アニメーション

材料系の人は歓喜の三元系プロット

各メニューバーの意味

あとで追加します。

RIETAN-FPにて発生するエラーとその対処法

後で書きます

RIETAN-FPでのエラー

RIETAN-FPの計算では何かしらの問題が発生すると計算を中断してエラーログを出力したうえで終了します。 エラーの大部分は以下のような内容になるかと思います。

  • パラメータや変数の入力が間違っている。
  • 計算が発散した
  • 必要なファイルが存在しない
  • 何らかの理由で計算ができない

これらのエラーに関して、エラー表示を基に対処法を書いていこうと思います。

An error occurred during reading *.int. The end-of-line code may be incorrect.

エラーログ

An error occurred during reading *.int. The end-of-line code may be incorrect.

intファイルが作成されていない場合やinsファイルの中身が間違っている場合に起きるようです。

対処法

  • intファイルをinsファイルと同じフォルダ内に作成しているか確認
  • insファイルの中身が正しいか確認

Intensity data will be input from *.int.

エラーログ

Intensity data will be input from *.int. Error during reading intensity data.

これはintファイルが正しく作成されていない場合に起きるエラーです。 特に私の場合はintファイルの改行コードが正しくない場合に生じました。

対処法

  • intファイルの改行コードが正しいか(windows版ではCRLF以外は受け付けないようです。

Check the above values of NVOXA, NVOXB, and NVOXC. If necessary, set them at zero temporarily.

エラーログ

Check the above values of NVOXA, NVOXB, and NVOXC. If necessary, set them at zero temporarily.

これはvoxelsの値が誤っている場合に発生するようです。特にinsファイルを流用した際に変更し忘れてるとおきます。

対処法

MEM解析を行わないのであれば、基本的に0で大丈夫です。

   NVOXA = 0: Number of voxels along the a axis.
   NVOXB = 0: Number of voxels along the b axis.
   NVOXC = 0: Number of voxels along the c axis.

としましょう。

Check decay parameters

エラーログ

Check decay parameters

対処法

プロファイルパラメータにある減衰パラメータの値がおかしい場合などに生じるエラー # Decay parameters, eta_L0, eta_L1, eta_H0, and eta_H1.以下のパラメータを直せばよい。Fapatiteなどのテンプレートファイルからコピペするとよい。

NPRFN=1, 2, 3の時に減衰パラメータが必要になるのでどうしても直らない場合はNPRFN=0を試すのもひとつの手。

The number of linear constraints is smaller than that expected from the ID values of parameters

エラーログ

The number of linear constraints is smaller than that expected from the ID values of parameters これは線形制約条件が構造パラメータのIDでしている数より、少ない場合に生じます。 例えば

Al1/Al  1.0  0.5  0.5  0.5 1.0 20000
Fe1/Fe  1.0  0.5  0.5  0.5 1.0 10000

Al2/Al  1.0  0.5  0.0  0.5 1.0 20000
Fe2/Fe  1.0  0.5  0.0  0.5 1.0 10000

と構造パラメータでは2つの線形制約条件を課しているにもかかわらず

A(Al1, g) = 1 - (Fe1, g)

と1つしか線形制約条件を記入していないときなど。

対処法

線形制約条件を正しく指定してあげれば大丈夫なはずです。 ここで線形制約条件の式は左辺のIDが2、右辺のIDが1となることにも注意します。

A zero intensity has been found. Delete it!

エラーログ

Intensity data will be input from *.int.
Intensity data recorded in *.int:
Zero intensity at   5.000 degrees -->   0.00000    
Zero intensity at   5.010 degrees -->   0.00000    
Zero intensity at   5.020 degrees -->  0.466467    
Zero intensity at   5.030 degrees -->   1.02623    
Zero intensity at   5.050 degrees -->   5.85135    
Zero intensity at   5.080 degrees -->   5.89882  

A zero intensity has been found. Delete it!

回折強度に0が含まれていると生じる。

対処法

0にならないようにする。データがバックグラウンドを差し引いたデータを使っていないか確認する

原因不明のエラー

エラーログ

forrtl: severe (59): list-directed I/O syntax error, unit 4, file C:\Users\ユーザー名\AppData\Local\Temp\FOREC5E.tmp
Image              PC                Routine            Line        Source
rietan.exe         00007FF6DBF6E26A  Unknown               Unknown  Unknown
rietan.exe         00007FF6DBF6BDA8  Unknown               Unknown  Unknown
rietan.exe         00007FF6DBE658FE  Unknown               Unknown  Unknown
rietan.exe         00007FF6DC019216  Unknown               Unknown  Unknown
rietan.exe         00007FF6DBFF6DEF  Unknown               Unknown  Unknown
KERNEL32.DLL       00007FFB135D81F4  Unknown               Unknown  Unknown
ntdll.dll          00007FFB147CA251  Unknown               Unknown  Unknown

であったり、

      forrtl: 致命的なエラー (29): ファイルが見つかりません。ユニット 31、ファイル
    Image              PC        Routine            Line        Source
    RIETAN.exe         00D49DE9  Unknown               Unknown  Unknown
    RIETAN.exe         00D12142  Unknown               Unknown  Unknown
    RIETAN.exe         00C6218D  Unknown               Unknown  Unknown
    RIETAN.exe         00D6A037  Unknown               Unknown  Unknown
    RIETAN.exe         00D37C9A  Unknown               Unknown  Unknown

こんなエラーを吐かれてRIETANが全く実行できない問題にぶち当たったことがある。
このエラーはコンソール上に吐かれて実際には.lst上には記録されない。
なのでちゃんとコンソールを見ていないと見逃してしまうでしょう。
さて、このエラーが何者かについては依然として分かってはいません。
現状分かっている原因は2つあります。

  • 記入すべき位置にパラメータが書かれていない。
  • Windowsマシン自体の問題

前者は比較的問題解決は簡単です。以前に解析して成功していた場合はそちらのファイルを使って実行可能か確かめます。
そしてファイルを比較して誤っている個所を探すのみです。
実際に私は線形条件を入力すべき場所ではない部分に入力していたためエラーが生じていました。
これはあくまで推測なのですが、実行時に値がないことで変数内がnullなど空の値を保持した結果実行エラーを生じたものだと考えています。

そして問題なのが後者です。
私の場合は講習会に参加した際に泉先生の配布したプログラマム、データを用いて実行しようとしましたが上記のエラーにより計算が正常に終了しません。
どんな方法を試してもダメで、会場内でただ一人私だけがRIETANを動かすことが出来ませんでした。
周囲の人や、泉先生ご本人にも原因を追究してもらいましたが結局分からず仕舞いでした。
ワタシの当時わたしのWindowは8.1でした。そこでまず内部の個人データなどは保持したままでOSを再インストールしましたが結果は変わりません。
仕方ないのでWindows10をクリーンインストールしました。PCのデータを全消去するのでかなり大掛かりな作業になりましたが、その結果RIETANは正常に実行できるようになりました。
結局原因はわかりませんが、PC内部の潜在的な問題が潜んでいたのでしょう。
同じような症状に陥った場合はOSのクリーンインストールを検討することも視野に入れた方がよさそうです。
またこのエラーログを確認するためには、cmdを起動して直接コマンドを入力してRIETANを実行します。
その辺のやり方は別記事に書きたいと思います。

Plot出来ない。

対処法

OFFSETの値が0になっていないか確認する

その他注意したい点

テンプレートファイルの流用

基本的にRIETAN-FPのファイルはテンプレートファイルを流用します。
その方が入力のミスも少なく、また簡単に入力ファイルを作成することが出来ます。 単相解析の場合はFapatite.ins、多相解析の場合はCu3Fe4P6.insを使うといいでしょう。 しかしこれらを流用する際に見落としがちな注意点があるので書いておきます。

Fapatite.insの場合

  • NVOXA, NVOXB, NVOXCを0にする
    MEM解析を行わない場合は基本的にvoxelsの値は0で大丈夫です。ここを変更し忘れていると大体エラーを吐かれます。
  • NUPDTを確認する
    NUPDTが0になっているのでここの変更を忘れているといくら解析をしても値が更新されません。無駄にプログラムを回し続けることになります。

Cu3Fe4P6.insの場合

  • R12 = 0.5に変更する
    この実験では単色化された線源を用いているようです。そのためR12 = 0.0となっています。
    通常の実験系で測定した場合はKa2線も入っているはずなのでR12 = 0.5に変更します。
  • NUPDTを確認する
    Fapatiteと同じです。
  • NPHASE@ = 3を任意の値に変更する
    ここでは多相解析する相の数を入力します。 ここを間違えるとエラーが吐かれてしまいます。
    合わせて# Effective radii (micrometers) for NPHASE@ phases.のところも変更しておきます。
# Effective radii (micrometers) for NPHASE@ phases.
# Enter '/' when neglecting microabsorption.
5.0  5.0  5.0   ←相の数と合わせる。
  • NINT = 1にする
    XRDデータ(intファイル)の形式がRIETANfromatになっているのでx-y形式に変更する。RIETANformatを使う人はそのままでいいけど。x-y形式の方が主流な気がします。
  • OFFSET1, OFFSET2, ....OFFSETn(n相解析)の値を変更する
    スペクトル描画の軸のサイズを変更するのは当然だが、忘れがちなのがOFFSET
    多相解析では各相の回折線を個別で描画できるため、その位置を指定しなくてはならない。OFFSETの数は解析する相に合わせる

Mendeley Desktopでの問題(クラッシュなど)の解決法

文献管理ソフトMendeley

Mendeleyは論文を管理するためのソフトです。Windows, Mac, iPhone, Androidの各OSで提供されており同期が可能なため複数のPCやタブレットを使用する私にとっては有難い存在です。
Mendeleyを使うと"Microsoft Word"で資料を書く際の文献管理、参考文献の挿入も自動でできるようになります。
また、MendeleyがElserverに買収されたことにより文献データベース「Science Direct」と連携が可能になり更に使いやすくなったかと思います。*1

そんなMendeleyですが、MaciOS版ではクラッシュやバグに悩まされることがたまにあります。

今回はバグが発生した時の対処法について書いて行きたいと思います。

Mac版 Mendeley Desktop

起動時にクラッシュする。

Mendeley desktopは起動時の同期読み込み中にクラッシュすることがあります。一度クラッシュを起こしてしまうとその後何度起動しても途中でクラッシュしてしまうのでウンザリです。。。

ターミナルからMendeleyを実行するとログが出力されるのでログを観察して原因を探ります。

  1. ターミナルを開きMendeleyの実行ファイルのディレクトリに移動
    以下を入力してretrun(あるいは以下のディレクトリに移動してcommafnd + T)
cd /Applications/Mendeley Desktop.app/Contents/MacOS/<br>
  1. ターミナルからMendeleyを実行
    Mendeley Desktopは名前の間にスペースがあるため ” ” で囲む
./"Mendeley Desktop"
  1. ログが出力されるのでクラッシュした時のログから問題になっているファイルを削除してみる。

私の場合はWordとの連携に問題があったようで、一度Word上のプラグインを削除し、Mendeleyを再起動したところ直りました。
※ネットでクラッシュの問題を検索してみると基本的にはMendeleyを再インストールすると直るようなバグが多いようです。

ウィンドウの最大化が直らない。最小化ボタンなどが消える。

MendeleyのMac版では起動時に最大化・最小化ボタンが表示されず、画面の大きさも変更できない問題が生じるようです。
僕自身で原因を調べてみたところ、Mendeleyの画面を最大化している状態で [command + Q]を押してアプリケーションを終了すると、次回起動すると最大化・最小化ボタンが消えさるようです。再現性は取れていました。以下の写真がその症状です。

f:id:tanisuke_str:20181019170624p:plainf:id:tanisuke_str:20181019170615p:plain
1枚目(左):最大化・最小化ボタンが消えた場合, 2枚目(右):正常な状態

対処法

  1. Mendeleyを終了
  2. Finder > [移動] > [フォルダへ移動]
  3. ~/Library/Preferences と入力
  4. [ com.mendeley.Mendeley Desktop.plist ]というファイルを探して削除
  5. 再度Mendeley起動

これで直っているはずです。
直らない場合は、もう1つ同じフォルダにmendeleyの名前が含まれた.plistファイルが生成されていると思うので探して消して見るといいと思います。

iOS版Mendeley

iOS版のMendeleyでは起動しようとすると即座にクラッシュする症状がみられました。
iOS版ではファルの操作などはiPhone上で行えないので、基本的にはアンインストール > 再インストールとするしかないです。
私の場合はそれで直りました。
再インストールして下さいって感じの投げやりな解決策はあまり好きではないんですが、これしか方法がありませんでした。
何か根本的な解決策が明らかになったらまた更新します。

Gitでプログラムも論文もバージョン管理する

もはや何番煎じかわからないくらいのGit解説記事。需要は皆無だろうけど備忘録としてまた世の中に無駄な記事を増やします。

はじめに

大学院の生活にも慣れ、何故かあるテスト期間も終わり、実験し放題の夏です。 かくいう僕は合間を縫って兼ねてから計画していたソフトウェア開発に着手している訳ですが、ここで気になってくるのがバージョン管理の問題です。 新たな機能の追加やプログラムの分岐に役立つのがGitです。 このGitの操作方法について忘れないように簡単に記します。

Gitとは

Gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムです。(by Wiki) プログラムではないですが、私の卒論の作成時にはこんな感じにファイルが増殖していました。

f:id:tanisuke_str:20180811131457j:plain:w640
大量に増殖したファイルたち。
これは最高にダサい。Gitを使えば見かけ上のファイルを1つのままにバージョンの管理が容易にできるようになります。そして変更履歴を保存しているのでいつでも過去の状態に戻すことができます。 変更中に戻したくなったが間違って上書きしてた!!死! なんて悲劇は起きなるでしょう。

Gitの操作

git init →リポジトリの初期化

Gitの操作ではまず始めにリポジトリを初期化します。 リポジトリは変更履歴を保存する倉庫のようなものと思っています。 まずは最初にGit管理するフォルダを作成し、git initコマンドを使用してリポジトリの初期化を行います。 対象となるディレクトリをcdしてそこでgit initします。

$ mkdir git-tutorial
$ cd git-tutorial
$ git init
Initialized empty Git repository in /Users/abekeishi/Public/Programing/git-tutorial/.git/

すると.gitという65kB程度の隠しフォルダが生成されます。 Gitではgit-tutorialフォルダをワークツリーを呼び、ここでファイルの編集を行います。 そして生成されたリポジトリで変更履歴の管理を行います。

git status → リポジトリの状態を確認

Gitリポジトリの状態を表示するためにはgit statusコマンドを使用します。 その前にREADMe.mdファイルを作成して見ます。

$ touch READMe.md
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .DS_Store
        touch READMe.md
nothing added to commit but untracked files present (use "git add" to track)

On branch masterと表示され、現在はmasterブランチにいることがわかります。 またUntracked files.DS_Storetouch READMe.mdが表示されています。 これはまだリポジトリに追加されていないファイルを示しています。

git add →ステージ領域へフィルを追加

先ほどの操作でもわかりますが、ファイルを作成しただけではリポジトリには追加されません。 リポジトリへの追加はgit addを叩きます。

$ git add READMe.md
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   READMe.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .DS_Store

こうすることによって変更が適用されます。

git commit →リポジトリの履歴を記録

git commitコマンドは、ステージ領域に登録されている時点のファイル群を実際にリポジトリの履歴として記録します。 この履歴を元にワーキングツリーに復元したり更新したりすることができます。

git commit -m "First commit" →一行のコミットメッセージを記述

$ git commit -m "First commit"
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 READMe.md
 create mode 100644 test.txt

取り敢えず今日はこの辺にします。

Pythonに関するメモ

完全に個人的なメモ

hydrogenを使ってplotlyが実行できない。

何をやってもエラーが解決されず、絶望したが再起動したら直った。色々やったので直接的な解決策がこれで正しいいのか分からないが、おそらく以下の通りであろう。 ipythonをインストール エラー時に表示されるコマンドを実行して再起動すると直った。

ファイルを開く際にUnicodeDecodeErrorに襲われる。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position

こンな感じのエラーだ。Pythonエンコードはデフォルトでutf-8なのでそれ以外のファイルを開くと言いそうな。 簡単な解決方法として読み込むファイルの文字コードutf-8に変換するそれだけで良い。 openメソッドの引数は以下のようになっている。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

引数のmodeは以下のような設定が可能.

文字 意味
'r' 読み込み用に開く (デフォルト)
'w' 書き込み用に開き、まずファイルを切り詰める
'a' 書き込み用に開き、ファイルが存在する場合は末尾に追記する
'x' 排他的な生成に開き、ファイルが存在する場合は失敗する
'b' バイナリモード
't' テキストモード (デフォルト)
'+' ディスクファイルを更新用に開く (読み込み/書き込み)
'U' ユニバーサル改行 モード (非推奨)

関数の可変長引数

引数の先頭に*をつけることで可変長引数とすることができる。

# 引数2つ、戻り値なしの関数の定義
def function(*arg):
    print(sum(arg))

# 引数2つを入れて、関数の呼び出し
function(2, 4)

この時、argはタプル型であることに注意しなければならない。

正規表現に関して

import re

で使う。 使える関数は以下の通り

  • 文字列の先頭がパターンにマッチするかを調べるmatch()

  • 先頭に限らずパターンにマッチするかを調べるsearch()

  • マッチする部分すべてをリストで返すfindall()

  • マッチする部分すべてをイテレータで返すfinditer()

  • マッチした部分を置換するsub()、subn()

  • パターンで文字列を分割するsplit()

  • 正規表現オブジェクトをコンパイルするcompile()

検索を行う前に正規表現のパターンをコンパイルするか、関数の引数にそのままパターンを渡す方法がある。 パターンをコンパイルするというのは、compile()関数を使ってコンパイルしたパターンをメソッド?クラス?として使うようだ。

import re
regex = r'ab+'
text = "abbabbabaaabb"
pattern = re.compile(regex)
matchObj = pattern.match(text)

この時、パターンの前にあるrは文字列のバックスラッシュをそのままバックスラッシュとして扱えるようにするための物

またパターンにそのまま引数として与える場合は以下のようにかく。

import re
regex = r'ab+'
text = "abbabbabaaabb"
matchObj = re.match(regex, text)

Hydrogenに関するメモ

実行結果の表示を別ウィンドで

command+shift+pでHydrogen : Toggle Output Area とするといい。

実行結果の削除

実行を繰り返しながらコードを書いていると実行結果が鬱陶しくなる時がある。 そんな時はCtrl+Shift+BackSpace

クラスに関して

if name == ‘main’:について

pythonのファイルは直接実行されるとnameという変数が自動で作られ、さらに実行しているスクリプトのモジュール名が自動的に代入される。 Pythonスクリプトを直接実行した時には、そのスクリプトファイルは「main」という名前のモジュールとして認識される。 「if name == ‘main’:」の意味は、「直接実行された場合のみ実行し、それ以外の場合は実行しない」という意味 ちなみに、atomifmainとタイプすると自動補完で出せる。

リスト全体に同じ関数を適用

map関数 listの全て要素に対して同じ処理を行う - Python学習講座

Python3でmatplotlibを使おうとしたらハマったので解決法の備忘録

MacbookProを買い、もう2ヶ月ほどが経とうとしています。 あっという間にMacに慣れ、その辺のMACerよりは使いこなせるようになって来たんじゃないかと思います。でもやっぱり10年近くWindowsを使っていたのでWindowsが体に馴染みますな。。

MacにはWindowsにはない良いところが沢山あるし、クソな所もまあある。それはWindowsも同じで、結局使う人次第なんだなとつくづく思います。 OS批判をしている人は基本的には単に使いこなせていないか、使いこなすのが面倒だという人でしょう。

本題に入ろうか。

実験データをプロットするためにMac版のOffice Excelを使ってたのだがこれがマジでクソすぎる。てかMac版Officeが全体的にクソすぎで笑うしかない。Mac民がMicrosoftを蔑むのもこれを見たら仕方ない気もする。そんなレベル。
と、見事に序盤の発言が転覆している訳で。 そんな訳で、Excelには見切りをつけてPythonからGnuplotなりMatplotlibを使ってデータをプロットすることにした。
MacにはデフォルトでPython2.7がインストールされているが、やはり最新のPython3を使いたいのでインストールする。

本当の本題

環境は以下の通り。

MacOS 10.13 High Sierra
Python3(3.7.0)

Pythonのインストール手順

なんでエラーが起きたのか今後の為に一応インストール手順を記します。

  1. homebrewのインストール

  2. homebrewでpython3をインストール

  3. homebrewでpyenvをインストール

  4. pyenvのコマンドを使えるようにパスを通す

  5. python3系のバージョンを選択してインストール

  6. インストールしたpythonのバージョンに切り替え

  7. pip3を使って諸々のライブラリ(numpy, matplotlibなど)をインストール

てな感じです。この辺を参考にしました。 hajipro.com いやあ、Unix系の環境構築の楽さが沁みる。Windowsだったら倍の時間かかってただろう。 この辺はやっぱりMacが強い。

謎のエラー

と言うことで、早速グラフをプロットしてみようと以下のコードを実行してみた。

import matplotlib.pyplot as plt
import numpy as np

# データ生成
x = np.linspace(0, 10, 100)
y = x + np.random.randn(100)

# プロット
plt.plot(x, y, label="test")

# 凡例の表示
plt.legend()

# プロット表示(設定の反映)
plt.show()

すると以下のエラーを吐き出した。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/backends/backend_macosx.py", line 17, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

いやあ、これが原因が全然わからない。 しかし、TracebackとかRuntimeErrorで調べるとバックエンドの問題が発生しているそうな。僕には分からないけど。

解決法

$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"

とターミナルに打ち込んで、matplotlibrcという名のファイルを探す。 このファイルをエディタで開き、35~40行目あたりにある

backend : macosx

backend : TkAgg

に変更すると良いそうだ。 実際にやってみたら治った。 めでたしめでたいし。

参考文献

Pythonでmatplotlibをimportするとエラーが出る場合の対処策(Mac) - Qiita

pyenvとvirtualenvで環境構築した時にmatplotlib.pyplotが使えなかった時の対処法 - Qiita

Python 3.3でmatplitlibとpylabを使おうとしたら RuntimeError: Python is not installed as a frameworkというエラーが発生したときの解決方法 - Qiita

matplotlibを使ってみる - abcdefg.....

f:id:tanisuke_str:20180704205505p:plain
実際にプロットできた様子。