PandasでMatplotlibの時系列データが作成できない問題
Pandasで横(x)軸を時間に設定しようとすると
"OverflowError: signed integer is greater than maximum"
というエラー文が表示されるか、あるいは横軸がとんでもなく大きな値になる。
Pandasの最近のアップデートに伴うエラーらしい。
import pandas.plotting._converter as pandacnv
pandacnv.register()
の2文を加えてやれば解決した。
ExcelやPowerPointで作成した図を高画質で保存する方法
ExcelとPowerPointで作成したグラフや図をパッと出力したい場合には、右クリックで「図として保存」だけでよいが、
論文投稿用や大判印刷用には高解像度のものが要求される。
今回は750 dpi以上の図を作成する方法を記述する。
必要な手順は2つ。
1.PowerPointの画像出力に関する設定を変更する
PowerPointでエクスポートする際の解像度の設定を変更しておくと、Excelのグラフを高画質で出力したい場合にも、PowerPoint経由で手軽にできるようになる。
しかしデフォルトのままだと96 dpi(ドット/インチ)でエクスポートされてしまい、750 dpiとは程遠い画質に…。
そこでシステム レジストリを編集する。
① 「ファイル名を指定して実行」ウィンドウを、Cortanaに聞くか、「スタート」+「r」で開く。
② 「名前」にregeditと入力し、「OK」。
③ 「レジストリ エディター」ウィンドウが開いたら、バージョンに応じて以下のサブキーを探す。
・ PowerPoint 2016
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\PowerPoint\Options
・ PowerPoint 2013
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\PowerPoint\Options
・ PowerPoint 2010
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\PowerPoint\Options
・ PowerPoint 2007
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\PowerPoint\Options
・ PowerPoint 2003
HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\PowerPoint\Options
④ 右側ボックスで右クリックし、「新規」→「DWORD(32ビット)値」をクリック。
このとき、「QWORD(64ビット)値」と間違えないように注意。
⑤ 名前を「ExportBitmapResolution」に変更する。
⑥ 「ExportBitmapResolution」を右クリックし、「修正」で「DWORD(32ビット)値の編集」ウィンドウを開く。
⑦ 値のデータを0→750 に変更。10進数にチェックを入れて「OK」。
今回は750 としているが、設定したいdpi値を記入すれば良い。
⑧ 「ファイル」メニューで、「レジストリ エディターの終了」 をクリック。
これでシステム レジストリの編集は完了!
2.「ファイル」→「名前をつけて保存」で画像を出力する
レジストリの編集によって、右クリック「図として保存」で出力される図が高画質になったわけではない。これは96 dpiのまま。
「ファイル」メニューの「名前をつけて保存」で図を出力すれば、高画質となる。具体的な手順は以下の通り。
① 「ファイル」メニューの「名前をつけて保存」を選択。
② 拡張子を「PowerPoint プレゼンテーション (*.pptx)」ではなく、出力したい拡張子(例えば .jpg)に変更。
③ 「その他のオプション」→「ツール」→「図の圧縮」→「高品質」にチェックし「OK」。
④ 「保存」→「このスライドのみ」。
で完了。出力された画像を選択し右クリック「プロパティ」→「詳細」欄で、96 dpiではなく750 dpiと記載されていれば成功!
この方法はスライドを図として保存しているので、そのままのスライドサイズだとExcelのグラフを出力したい場合等には余白が多くなってしまうだろう。
余白を調整したい場合には、「デザイン」メニューから「スライドのサイズ」を選択し、「ユーザー設定のスライドのサイズ」で幅と高さを設定すればよい。
Pythonで階層クラスター分析(Ward法) デンドログラムの作成
階層クラスター分析(ward法)に必要なライブラリはNumpy と Matplotlib, Scipy。
n人の生徒を3つの情報(例えば数学・国語・英語の点数)を使ってクラスタリングする場合を考える。
入力データ(score.csv)の並びは、
A1,1 B2,1 C3,1
A1,2 B2,2 C3,2
︙ ︙ ︙
A1,n B2,n C3,n
となる。
以下、スクリプト例
-----
# -*- coding:utf-8 -*-
# 使用ライブラリ
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster, set_link_color_palette
# 1. 入力データの読み込み
X = np.loadtxt('score.csv', delimiter=',')
# 2. クラスター分析(ward法)を行う
z = linkage(X, method='ward')
# 3. 図のフォーマットを指定
plt.figure(figsize=(40, 25))
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 50
plt.title('Hierarchical Clustering Dendrogram', fontsize=60)
plt.xlabel('Observation Points', fontsize=55)
plt.ylabel('Distance', fontsize=55)
# 4. デンドログラムの作成
set_link_color_palette(['purple', 'lawngreen', 'green', 'blue', 'orange', 'red']) # 6クラスタまでの色を指定
dendrogram(z, leaf_font_size=20., # 横軸の文字の大きさを指定
color_threshold=7., # ユークリッド平方距離が7以上を同色で表示
above_threshold_color='black') # ユークリッド平方距離が7以上を黒色に指定
plt.show()
# 5. 各地点のクラスタ―番号の出力
#group = fcluster(z, 10, criterion='distance') # ユークリッド平方距離で分けたい場合
group = fcluster(z, 6, criterion='maxclust') # クラスタ数で分けたい場合
print group
-----
デンドログラムの色分けだけでなく、グルーピング後の番号の振り分けもできるのはありがたい。
Pythonで主成分分析
主成分分析に必要なライブラリはScikit-learn と Numpyだけ。
今回は時系列データに対して主成分分析を行う場合を考える。
地球物理の分野ではEOF解析とも呼ばれる。
n地点×24時間分の気温観測値が与えられているとする。
主成分分析によって気温の時間変動特性を調べたい場合には、各地点の日平均気温からの偏差dTi,j (i = 1, 2, …, 24: j = 1, 2, …, n)を用いる。
解析に用いるデータ(pcadata.csv)の並びは
dT1,1 dT2,1 … dT24,1
dT1,2 dT2,2 … dT24,2
︙ ︙ ︙
dT1,n dT2,n … dT24,n
となる。
以下、スクリプト例
-----
# -*- coding:utf-8 -*-
import numpy as np
from sklearn.decomposition import PCA
# 1. 入力データの読み込み
temp = np.loadtxt('pcadata.csv', delimiter=',')
# 2. 主成分分析を行う(第5主成分まで)
pca = PCA(n_components=5)
pca.fit(temp)
# 3. 主成分の数
print pca.n_components_
# 4. 固有値
print pca.explained_variance_
# 5. 寄与率
print pca.explained_variance_ratio_
# 6. 累積寄与率
print np.cumsum(pca.explained_variance_ratio_)
# 7. 固有ベクトル
print pca.components_
# 8. 第1主成分の固有ベクトルのみ
print pca.components_[0,0:24]
-----
pca.components_で算出される値は、因子負荷量ではなく固有ベクトル(ノルム1だから)かと。
主成分得点は自分で計算するしか無いようだ。
が、dT1,j dT2,j … dT24,j に固有ベクトルをかけて足し合わせるだけなので、そこまで手間な作業ではない。
Matplotlibで作成したsvgファイルをemfファイルに変換
WordファイルをPDF変換したり、大きなスクリーンでプレゼンを行う場合には、拡大縮小に強いベクタ形式の画像が適している。
Microsoft Officeのソフトに挿入可能なベクタ形式はemfファイルであり、
他のepsやsvgファイルは非対応なので挿入するには少し手間がかかる。
Pythonからはinkscapeコマンドでemfの出力(svgからの変換)が可能である。
以下スクリプト例
-----
import numpy as np
import matplotlib.pyplot as plt
import subprocess
x = np.linspace(0,23,24)
y = np.linspace(0,46,24)
plt.plot(x,y)
plt.savefig('sample_image.svg')
subprocess.call('inkscape sample_image.svg -M sample_image.emf', shell=True)
plt.show()
-----
Inkscapeがインストールされていない場合は(ubuntu)、
$sudo apt-get install inkscape
でOK!
WordからPDF変換する際に画質が落ちてしまう問題 【解決】
投稿論文がアクセプトされてから数日後、編集側から早期公開用のPDFファイルと高画質の図を提出してくださいとのメールが来た。
図は600 dpi以上が要求される。
査読段階で提出していたPDFファイルは画質にこだわっていなかったので、もう一度wordファイルから編集し直すことに。
このとき、600 dpi以上の図を貼り付けてPDFとしてエクスポートすれば完成!と簡単にはいかなかった。なぜか図の解像度が低くなってしまっている。
図の解像度を落とさずPDFを作成するための手続きは2つ。
1.Wordの詳細設定を変更
「ファイル」→「オプション」→「詳細設定」で
「イメージサイズと画質」を探し、「ファイル内のイメージを圧縮しない」に✓を入れる。
これで貼り付けた画像が自動圧縮されずに済む。
2.貼り付ける画像をベクタ形式に変換
Wordの詳細設定を変更した後、私は750 dpiのjpgファイルを貼り付けてPDFに変換してみた。…まだ画質が粗い。
jpg形式がダメなのか?と思い、pngやgif、tiff形式でも試してみた…やはり劣化している。
Googleでこの悩みを相談してみると
「ファイル」→「エクスポート」からPDFを作成せず、
①「ファイル」→「名前を付けて保存」でpdf拡張子を選択。
②「その他のオプション」→「オプション」→「アクセシビリティ用のドキュメント構成タグ」と「PDF/A 準拠」のチェックを外して「OK」。
③「ツール」→「図の圧縮」→「高品質」にチェックし「OK」。
④「保存」。
で作成すればよいとのアドバイスがあった。
なるほどと思い試してみる…解決せず。
結局、ラスタ形式じゃなくベクタ形式の画像を貼り付けなきゃいけないことが分かった。
eps・pdf・svg・emf が ベクタ形式である。
eps形式を貼り付けるにはレジストリをイジらないといけないが、emf形式はそのまま貼り付けられる。
ということで私はemf形式に変換して貼り付けることにした。あんまり聞かない拡張子だが、power pointや ArcGIS, Pythonで問題なく出力できる。
Pythonでのemf出力については以下に記載。
出版用に提出する図も、拡大縮小に適したベクタ形式の方が良い。
ラスタ形式だと、完成版に掲載される図の解像度に明らかな劣化を感じることもあるそう。
私はpngで提出した。
== 追記 ==
衛星画像のようなピクセル数が非常に多い図では、この方法はダメだった。
解決したら書き足します。
== 追記終わり ==