投稿

7月, 2022の投稿を表示しています

python: デフォルト機能でXMLを解析する

イメージ
Python 3.9.6 で確認。 Pythonにデフォルトで備わっている xml.etree.ElementTree を用いることで簡易的なXML解析が可能。名前が長いので、公式ドキュメントでもエイリアスを使用している。 準備 必要なライブラリを import するには以下。 import xml . etree . ElementTree as ET ファイルから読み出すなら tree = ET . parse ( 'test_data.xml' ) root = tree . getroot ( ) あるいは文字列から読みだすなら root = ET . fromstring ( test_data_str ) という形でアクセスできる。 具体例 具体的な利用例を見てみる。例えば、 Yahooニュースの主要トピックRSS から主要なニュースを取り出し、表示してみる。 URLへのアクセスに requests を利用している。 pip install requests で導入可能。 import xml . etree . ElementTree as ET import requests res = requests . get ( 'https://news.yahoo.co.jp/rss/topics/top-picks.xml' ) # res.contentにデータが格納されている。 # データはUTF-8としてdecodeする必要がある。 root = ET . fromstring ( res . content . decode ( 'utf-8' ) ) items = root . findall ( './channel/item' ) for item in items : title = item . find ( 'title' ) . text print ( f '{title}' ) findall により、指定した XPath に該当する要素をすべて取り出すことができる。XPathは、 簡単に使う分にはXMLの木構造をディレクトリ構造の

python: bytesからstrへの変換

イメージ
bytes から str への変換について。 decode を利用。 data # ここに utf-8 として読み出せるbyteデータが入っているとする mojiretsu = data . decode ( 'utf-8' ) 例えば、 web上から取得したデータなどに対して上記の操作が必要だったりする。 以下の例では requests というライブラリを用いている。 import requests res = requests . get ( 'https://news.yahoo.co.jp/' ) print ( res . content . decode ( 'utf-8' ) ) 逆に bytes 型に変換したい場合には encode を利用する。 s = u'日本語utf-8' print(s.encode())

gnuplotで縦線を引きたい

イメージ
概要 gnuplotで描画するグラフにおいて縦線を引きたい。 以下のような感じ。 やり方は2通り やり方(1): 矢じりなし矢印 set arrow from x1, y2 to x2, y2 nohead を利用する やり方(2): with impulse によって特定のポイントへの縦線を描画する (こっちの方が楽かも) やり方(1): arrowによる方法 set arrow コマンドは矢印を描画可能です。 (x1,y1) から (x2,y2) への矢印を描画するには以下の様な命令をします。 set arrow from x1 , y1 to x2 , y2 そんでもって、矢じり部分を消すには nohead を利用します。 矢印から矢じり部分を消すと直線になります。 set arrow from x1 , y1 to x2 , y2 これを利用して、 (x1,y1), (x2,y2) をうまいこと設定すれば 縦線を引くことが可能ですね。 f ( x ) = x ** 2 set arrow from 5 , 0 to 5 , 25 nohead lt 3 plot f ( x ) これだけです。 因みに、 arrow を間違えてしまったなどで消したいときには show arrow で番号を確認して、 unset arrow <number> で消せます。 # ここで確認して show arrow # ここでその番号の arrow を消す unset arrow 1 やり方(2): with impulse による方法 (おすすめ) 座標を指定し、 with impulse によって縦方向の直線を描くことができます。こちらはやり方(1) に比べて終端のみ指定すればよいのが楽なポイント。 具体的には以下のようなコマンドになります。実際に利用する際には x y を直線を引きたい座標に置き換えてください。 plot "< echo x y" with impulse title "" # 極限まで省略すると以下でもOK

gnuplot: for文で回したときに凡例も併せて変更したい / 変数を文字列に埋め込みたい

イメージ
for で回した際に、その数値を文字列に入れ込んで凡例を合わせて更新したかった。 文字列の後に . (ドット) でつなげて変数を置けばいいらしい。 plot for [i = 0:5] i title "plot #".i これにより plot #0 から plot #5 という凡例を各グラフに指定することができる。 配列を利用して、事前定義ということも可能 array a[5] = ['hoge', 'moge', 'fuga', 'hoga', 'moga'] plot for [i = 1:5] i title "plot #".a[i]

gnuplot: グラフの色を変更する

イメージ
linetypeによる指定 linecolor + 色名による指定 任意の色を指定 linetype の番号によって指定する方法 gnuplotでは事前に定義されたlinetypeというものがあり、番号で指定することができます。これによりグラフの色を変更することが可能です。例えば: plot sin(x) linetype 2 # linetype を lt と省略して以下でも可能 plot sin(x) lt 2 ここで指定できる番号は show linetypes によって確認することができます。 gnuplot> show linetypes linetype 1, linecolor rgb "dark-violet" linewidth 1.000 dashtype solid pointtype 1 pointsize default linetype 2, linecolor rgb "#009e73" linewidth 1.000 dashtype solid pointtype 2 pointsize default linetype 3, linecolor rgb "#56b4e9" linewidth 1.000 dashtype solid pointtype 3 pointsize default linetype 4, linecolor rgb "#e69f00" linewidth 1.000 dashtype solid pointtype 4 pointsize default linetype 5, linecolor rgb "#f0e442" linewidth 1.000 dashtype solid pointtype 5 pointsize default linetype 6, linecolor rgb "#0072b2" linewidth 1.000 dashtype solid pointtype 6 pointsize default

画像付き: gnuplotをWindowsにインストールするまで

イメージ
 なぜか急に思い立って画像付きで記述してみる。 gnuplotの公式サイトのダウンロードページ に行きます。 以下の個所から、"Primary download site on SourceForge" をクリックします。 (一番上のリンク) 以下のような画面になるので、一番バージョンが最新のものを適当に選びましょう。 この画像だと 5.4.4 というところになります。 ちなみに、各リンクの右にあるグラフのようなものは1週間のダウンロード数を示しております。 何だかいっぱいファイルがありますが、 "gp544-win64-mingw.exe" というものがWindows向けのインストーラになります。 一番下にあるPDFファイルはgnuplotのマニュアルになりますので、興味があればダウンロードして読んでみてください(ただし英語)。 ダウンロード画面に移動します。画面中央上あたりにあるカウンタが 5秒 を数え終わるとダウンロードが自動的に開始されます。この画面では特に何もクリックする必要はありません。 5秒待たされるのはおそらく一気にダウンロードなどされないように負荷低減のため。 ダウンロードした .exe ファイルをダブルクリックし、インストーラを起動します。 画面に沿ってインストールをしていきます。 スクショをミスって画面が若干見切れていますが、ご容赦ください... 日本語を選択 (しなくてもいいけど) 使用許諾書に同意。これは必ず同意が必要です。 日本で普通に使う分には問題ないです。 Readme.txt という、そのソフトについての簡単な説明書の中身が表示されます。そんなに熟読しないでもOK。 インストール先の指定。デフォルトでは "C\Program Files\gnuplot" になります。特にポリシーがない方はデフォルトのままでOK。 何をインストールするかを聞かれます。デフォルトでも十分かと思います。そのままだとメニューなどすべてが英語になってしまうので、日本語にしたい方は "日本語対応" にチェック。 スタートメニューにショートカットを作成するかどうかを聞かれます。作っておいた方が後から探したりするとき楽。 そのほかの細かい処理を聞かれます。 ここで最下部にある &quo

WSL1上でguplotを動作させようとした際に生じたQtのエラー

WSL1上でguplotを動作させようとした際に生じたQtのエラー WSLでgnuplotを使うために、適当に sudo apt install gnuplot-qt としてQt版のgnuplotをインストールした。 これでOKと思って動作させると以下のエラー。 > gnuplot gnuplot: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory なぜだか Qt のライブラリが見つけられないらしい。 こちらの記事 を参照すると、以下のコマンドで解消できるようだ。 sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 のところは環境やバージョンにより異なる可能性があるため、実行時に要確認。 本コマンドについてあまり説明が見受けられなかったので、少し調べた。本コマンドは対象のバイナリファイルの中身から一部を削除するコマンド。 バイナリファイルの形式はよく理解はしていないが、一般的に ELF (Executable and Linkable format) という形式で構成されており、実行プログラム本体とは別にある種のメタデータが格納されている箇所がある。このメタデータの .note.ABI-tag という個所を削除しているのがこのコマンドだ。実際のELF形式実行ファイルがどのような形式をしているかなどは Linux であれば readelf などのコマンドで見ることができる。 このセクションでどういったアーキテクチャのプラットフォームで動作できるかなど記述されているようだ。ここの記述がWSL1と相性が悪いらしい。( 参考 ) また、これとは別にX ServerをインストールしなければLinux側のGUIアプリは動作しないため注意。

matplotlib: 2つのグラフを一度に描画する

イメージ
複数のグラフを表示する 1つまたは2つのファイルから2種類のデータを描画する 縦軸が共通の場合と、異なる場合 例えば以下のようなデータが data.csv という名称で存在するとする。 id,value1,value2 1,0.5,10.4 2,5.4,30.9 3,7.9,80.9 4,10.2,140.9 5,13.2,221.3 同じ軸でプロットしてみる。単に2発Plotすればいいだけ。 こちらの記事も参照 import pandas as pd import matplotlib . pyplot as plt df = pd . read_csv ( 'data.csv' , header = 0 , index_col = 0 ) plt . plot ( df . index , df [ 'value1' ] , marker = 'o' ) plt . plot ( df . index , df [ 'value2' ] , marker = 'x' ) plt . show ( ) 簡単に表示はできるが、異なるスケールであるため青色のプロットの変化が見づらくなってしまっている。 このようにスケールが異なる場合には縦軸を変更すると良い。 # サブプロット (分割プロット) コマンドで軸を取得 fig , ax1 = plt . subplots ( ) # ax1 と Xが共通な軸 = y軸を作成 ax2 = ax1 . twinx ( ) # ax1, ax2に対してプロットを実施 # 区別をつけるために色分け、凡例を出すためにlabelを指定。 ax1 . plot ( df . index , df [ 'value1' ] , color = 'red' , label = '1st line' ) ax2 . plot ( df . index , df [ 'value2' ] , color = 'blue' , label = '2nd line' ) # 各Y軸

matplotlib: 超単純なデータの可視化

イメージ
 適当なデータをCSV形式で持っているものとする そのデータをグラフ上で示す インストール pip install matplotlib pandas 例えば以下のようなヘッダ付きのCSVファイルがあるとする。ファイル名を data.csv としておく。適当なデータです。 id,value 1,0.5 2,2.8 3,4.9 4,8.6 5,10.9 プロット import pandas as pd import matplotlib.pyplot as plt # 1行目に各列の説明が書かれているので header=0 # 1列目がインデックスに相当するので index_col=0 df= pd.read_csv('data.csv', header=0, index_col=0) # プロットの実施。x, y として使うデータを指定し、〇で表示する # インデックスは .index でアクセスし、それ以外の列は見出し名でアクセス plt.plot(df.index, df['value'], marker='o') # 表示。表示コマンドが分かれているのは、グラフの見た目調整などを別途実施できるため。 plt.show() 環境によりますが、Windowsでは以下のようなグラフが表示されます。表示されたグラフは移動したりズームしたりすることが可能。 ちなみに、df (DataFrameの略、pandasでCSVデータを読んだときに作成されるクラス)の中身を見るには普通に print をしてみるとわかります。 >>> print(df) value id 1 0.5 2 2.8 3 4.9 4 8.6 5 10.9 これ以外のアクセス方やPandas側の機能を利用したPlotもありますのでご確認ください。

Numpy: 2次元配列を画像として保存したい

 2次元のnumpy行列を白黒画像データとして保存する PIL.Image で利用可能な fromarray() を利用します。 未インストールの場合下記でインストールします。 pip install pillow 実際の画像保存は以下のようになります。 from PIL import Image import numpy as np data = np.zeros((512, 512), np.uint8) img = Image.fromarray(data) img.save('test.png')

Numpy: Grey画像 or 単なる2次元配列からRGB画像を生成したい

3つの異なる配列からRGB画像データを作成する 1つのGrey画像 (greyscale image) から RGB 画像データを生成する dstack を利用し、2次元配列 = greyscale画像からRGB画像を生成します。 以下は説明のためnp.zerosで作成していますが、実際は各 r, g, b に必要なデータを入れてください。各Channelの配列サイズは同じである必要があります。 import numpy as np r = np.zeros((512, 512), np.uint8) g = np.zeros((512, 512), np.uint8) b = np.zeros((512, 512), np.uint8) rgb = np.dstack((r, g, b)) 1つの2次元行列からRGB画像に拡張する場合は以下です。 grey = np.zeros((512,512), np.uint8) rgb = np.dstack((grey,)*3) 画像として保存するのであれば以下。 from PIL import Image Image.fromarray(rgb).save('test.png')