亀の歩み

備忘録として

pandasのデータフレームに手間取った

pandas+matplotlibで3D棒グラフを作る - HPCメモ

このページを参考にして、matplotlibによる3Dグラフのことを書こうと思っていましたが、pandasのデータフレームの取り扱いに四苦八苦したので、そのことについて書きます。

3d棒グラフを書くために、4x3のデータフレームを作ろうと思いました。

import pandas as pd

df=pd.DataFrame(
    {u"しりとり":[580, 420, 520],
     u"りんご":[280, 260, 300],
     u"ごりら":[300, 320, 280],
     u"らっぱ":[30, 32, 10]},
     index=(u"A", u"B", u"C"))

print(df)
   ごりら  しりとり  らっぱ  りんご
A  300   580   30  280
B  320   420   32  260
C  280   520   10  300

列の名前がソートされてしまいました。
リストを辞書型にしてひもつけているので、こういう結果になるようです。
ソートされると、グラフ作成のときに要素がちゃんと設定されないので、書いた順番に列名を並べる必要があります。


ならば、辞書型にしているのをリストに直して、後から行と列の名前を入れてみればいいと思いつきました。

df=pd.DataFrame(
    [[580, 420, 520],
     [280, 260, 300],
     [300, 320, 280],
     [30, 32, 10]])
df.index=(u"A", u"B", u"C")
df.columns=(u"しりとり",u"りんご",u"ごりら",u"らっぱ")

print(df)
ValueError: Length mismatch: Expected axis has 4 elements,
new values have 3 elements

要素の数がおかしいとエラー。
どうやら、2重リストのときは行と列が逆になるようです。

df=pd.DataFrame(
    [[580,280,300,30],
     [420,260,320,32],
     [520,300,280,10]])   
df.index=(u"A", u"B", u"C")
df.columns=(u"しりとり",u"りんご",u"ごりら",u"らっぱ")

print(df)
   しりとり  りんご  ごりら  らっぱ
A   580  280  300   30
B   420  260  320   32
C   520  300  280   10

これで望んでいた形のデータフレームを作成することができました。

Windowsでgcc(MinGW)を使う

WindowsC言語コンパイルしたくて、gccを使うことにしました。

今回取り扱うのは、gccWindowsに移植したバージョンであるMinGWです。
他にもあるようですが、説明しているサイトが多いものにしました。

インストール

まずはインストーラーをダウンロードしました。
Getting Started | MinGW

実行しようとすると、「gcc.exeディスクがありません ドライブディスクがありません ディスクをドライブE:に挿入してください」とエラー。
調べてみると、開発者がEドライブを使用しているためのエラーとのこと……。
Windows8.1でMinGWをインストールしたのですが、動作確認時に分から... - Yahoo!知恵袋


仕方がないので、手元のインストーラーをゴミ箱に放り込んで、新しいインストーラーを使うことにしました。
http://mingw-w64.org/doku.php/start

Downloads→Mingw-buildsからダウンロードできました。

インストーラーを起動すると、settingの項目が並んだ画面が出てきます。
f:id:shinep:20160207052543p:plain

Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について | cutlassfish

上のページを参考にして、項目を選んでいきます。
f:id:shinep:20160207052941p:plain
今回はこの組み合わせにしました。

後は、通常通りのインストール手順です。

パスを通す

インストールが終わったら、パスを通して、コマンドプロンプトでコマンドとして認識されるようにしていきます。
C言語入門 - MinGW - gcc の環境設定(パスを通す) - Windows環境 - Webkaru

コントロールパネル→システムとセキュリティ→システム
→システムの詳細設定→環境変数

ユーザー環境変数かシステム環境変数のどちらかのPATHを選択し、「編集」を押します。(分からない場合は、システム環境変数に)
先ほどインストールしたMinGw内のbinフォルダのパスを末尾にコピーします。

;C:\Program Files\mingw-w64\x86_64-5.3.0-win32-seh-rt_v4-rev0\mingw64\bin

※私の場合

複数ある場合は、浅い階層にあるbinのパスを入力してください。


これで、パスを通すことができました。

テスト

Hello worldを書いて、test.cとして保存しておきます。

#include <stdio.h>

int main(void) {
	printf("Hello World!");
	return 0;
}

パスを通したので、コマンドプロンプトに直でgccが打てます。

$ gcc test.c

もし、ヘッダが見つからない場合は、読み込むよう設定されているフォルダにヘッダを移動させる必要があります。
http://www.teradas.net/archives/12443/

$ a.exe

Hello worldが表示できました。


しかし、実行ファイルを直接実行した場合、すぐにコマンドプロンプトが閉じてしまいます。
これは、どうやらコマンドプロンプトの仕様のようです。
そのため、Hello worldを目視したければ、キーを押すまで終了させないような仕組みが必要となります。

#include <stdio.h>

int main(void) {
	printf("Hello World!");
	while(getchar() != '\n'); //キーを押すまでループし続ける
	return 0;
}

これで、じっくりHello worldを眺められるようになりました。

matplotlibのTex表記とグラフの大きさ

ギリシャ文字

matplotlibで、ギリシャ文字を軸ラベルに表記しても認識されませんでした。
y軸にギリシャ文字のρを入れようとしています。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 11, 1)
y = np.arange(0, 21, 2)

plt.plot(x, y)
plt.xlabel('time')
plt.ylabel(u'ρ')
plt.show()

f:id:shinep:20160124220644p:plain

解決方法は、日本語の表記と同じようにフォントを指定する方法と、Tex表記を使う方法があります。

チラシ裏のラクガキ: Python,Matplotlibでギリシャ文字出力方法


適当なフォントを指定してみます。

from matplotlib.font_manager import FontProperties

fp = FontProperties(fname=r'C:\WINDOWS\Fonts\Arial.ttf', size=14)
#フォント指定

plt.ylabel(u'ρ', fontproperties=fp) #plt.ylabelを差し替え

f:id:shinep:20160124221613p:plain


次に、Tex表記をしてみます。

plt.ylabel(r'$\rho$') #plt.ylabelを差し替え

f:id:shinep:20160124222122p:plain

どちらにしろ、他のラベルや目盛りのフォントを合わせる必要がありそうです。
参考:Python - matplotlibで日本語 - Qiita

グラフの大きさ

話変わって、グラフの大きさを変える方法。

plt.figureのdpifigsizeオプションで変えることができます。

縦横比を変えないなら、dpi。
デフォルトは80。

そうでなければ、figsize。
デフォルトは(8, 6)。

plt.figure(figsize=(6, 6), dpi=80)

のように表記します。

f:id:shinep:20160124223934p:plain

Matplotlibでグラフのサイズを変更 - 西尾泰和のはてなダイアリー