originproパッケージを使ったコードサンプル


目次


はじめに

このページではPythonコードのサンプルを紹介します。サンプルを試す簡単な方法は以下の通りです。

  1. Originのメニューから接続 > untitled.pyを開く...を選択します。これにより、コードビルダでuntitled.pyが開きます。
  2. 各サンプルにあるコードをコピーして貼り付けます(すでにコードが入力されている場合は置換)。
  3. F5キーを押して実行します。実行前に保存する必要はありません。

サンプルには、あらかじめPythonパッケージのインストールが必要なものもあります。パッケージをインストールするコマンドを使用してから、コードビルダでPython IDEにサンプルコードをコピーして実行してください。

ワークシートデータ

new_sheetなどの関数は、project.pyを参照してください。

from_listは、worksheetを参照してください。

列にデータを入力

import originpro as op
data=[x/10.for x in range(50)]
wks=op.new_sheet()
wks.from_list('A',data, 'time', 'sec',axis='N')
data1=[x*1.5 for x in range(50)]
wks.from_list('B', data1, axis='X')
wks.cols=3
wks.from_list(2, [sum(i) for i in zip(data, data1)], comments = 'A+B')

データをインポート

import originpro as op
f=op.path('e')+r'Samples\Curve Fitting\Enzyme.dat'
#ワークシートがアクティブであると仮定
wks=op.find_sheet()
wks.from_file(f)
print(wks.shape)

DataFrameと列フォーマット

DataFrameでは、列名と、カテゴリ列や日時といった列データフォーマットの両方を使用できます。originproは、from_dfto_dfを呼び出すだけです。

以下のサンプルを試す前に、必ずpandasをインストールしてください。このモジュールをインストールするには、スクリプトウィンドウを開き(Shift+Alt+3)、以下を入力してEnterキーを押します。

pip install pandas

インストール済みか確認してからインストールするには以下を実行します。

pip -chk pandas
import originpro as op
import pandas as pd
df = pd.DataFrame({
    'Date': ['10/25/2018','02/21/2019','04/01/2020'],
    'Gender':['Male','Male','Female'],
    'Score': [75.5, 86.7, 91],
})

df['Date'] = pd.to_datetime(df['Date'])
df['Gender']= pd.Categorical(df['Gender'])

wks=op.new_sheet()
wks.from_df(df)
#このようにしてブック作成と第一シートを取得可能
wks2=op.new_book('w', 'Copy using DF')[0]
#日付などの列フォーマットは自動的に処理
df1=wks.to_df()
wks2.from_df(df1)

データセットを訓練データおよびテストデータに分割

このサンプルでは、sklearnパッケージを使って、複数列のデータセットをTrainとTestという2つのデータセットに分割します。パッケージの有無をチェックしてインストールするには、スクリプトウィンドウを開き(Shift+Alt+3)、以下を入力してEnterキーを押します

pip -chk pandas sklearn

サンプルデータセットの一つをインポートし、訓練データとテストデータセットにランダムに分割するサンプルです。

import numpy as np
import pandas as pd
import originpro as op
from sklearn.model_selection import train_test_split


# データをインポートして独立データと従属データをそれぞれXとyに取得 respectively
ws=op.new_sheet()
ws.from_file(fname=op.path('e')+r"Samples\Statistics\Fisher's Iris Data.dat", keep_DC=False)
X = ws.to_df(c1=0, numcols=4)  # 最初の4列をXとして取得
y = ws.to_df(c1=4, numcols=1)  #最後の列をYとして取得

# データセットを訓練およびテストデータセットに分割
# 訓練データセットは70%のサンプルを含み、テストデータセット30%のサンプルを含む
# 分割前にデータをシャッフル
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True, random_state=1)

# 分割したデータセット用にワークブックを作成
wks = op.new_sheet('w', 'Split')
Num = X_train.columns.shape[0]
wks.from_list(Num, y_train.iloc[:, 0].tolist(), comments='Train', lname=y_train.columns[0])
wks.from_list(Num*2+1, y_test.iloc[:, 0].tolist(), comments='Test', lname=y_train.columns[0])
for idx in range(Num):
	wks.from_list(idx, X_train.iloc[:, idx].tolist(), comments='Train', lname=X_train.columns[idx])
	wks.from_list(Num+1+idx, X_test.iloc[:, idx].tolist(), comments='Test', lname=X_train.columns[idx])

行列データの操作

Originの行列シートは、同じ形状の2D配列である複数の行列オブジェクトを保持できるので、行列シートは3D配列を保持できます。このセクションでは、OriginのMatrixSheetとNumPy配列間のデータ転送に焦点を当てます。 詳細は、matrix.pyを参照してください。

numpyを使った行列のドット積

このサンプルではNumPyを使用します。NumPyはPandasに含まれており、遅かれ早かれ必要になるPandasをインストールするのが最善です。パッケージの有無をチェックしてインストールするには、スクリプトウィンドウを開き(Shift+Alt+3)、以下を入力してEnterキーを押します。

pip -chk pandas

これは、Originの行列とNumpy配列間の基本的なデータ転送を示すサンプルです。

#3つの行列シートを作成してm3 = m1*m2とする
import numpy as np
import originpro as op
#整数の行列データ
aa = np.array([	[1, 2, 3], [4, 5, 6] ])
bb = np.array([	[10,11], [20,21], [30,31] ])
#新しい非表示行列ブックを作製して行列シートを取得
ma=op.new_sheet('m')
#行列シートは3D配列を保持でき、形状とデータ型は自動的に設定される
ma.from_np(aa)
#同じブックの他のシート
mb = ma.get_book().add_sheet()
mb.from_np(bb)

#結果を3番目のシートに出力
mc = ma.get_book().add_sheet('Dot Product')
#numpyを使用して実際の計算を行う
#ここでは各シートに1つの行列オブジェクトしかないため2D配列として取得
cc = np.dot(ma.to_np2d(), mb.to_np2d())
mc.from_np(cc)

OpenCVを使って行列シートにTIFF画像をロード

スクリプトウィンドウで以下を実行して、openCV (cv2)をインストールします。

pip install opencv-python

このサンプルでは、tif画像を3D numpy配列にインポートしてからOriginの行列ブックに渡す方法を示します。

import originpro as op
import numpy as np
import cv2

# 複数のTIF画像を配列にインポート
# 全画像は同じサイズであると仮定
ImArray = np.array([])
for idx in range(7):
	fname = op.path('e') + f'Samples\\Image Processing and Analysis\\myocyte{idx+1}.tif'
	array = np.array(cv2.imread(fname, cv2.IMREAD_UNCHANGED))
	ImArray = np.dstack((ImArray, array)) if ImArray.size else array

# この3D配列をOriginの行列シートに置く
ms = op.new_sheet('m')
ms.from_np(arr=ImArray, dstack=True)
ms.show_slider(True)
ms.show_image(True)

グラフ作成

Originは複雑なグラフを作図できます。したがって、グラフ機能を最大限に活用するには、すでにグラフが作成されているプロジェクトを準備し、データを入れ替えるのが最善の方法です。Pythonコードが添付されたサンプルプロジェクトのページにいくつかサンプルを用意しています。

以下のサンプルでは、originproパッケージでプロット作成やシンプルなカスタマイズを実行する基本的な方法を示します。

対数スケールの折れ線グラフ

このサンプルでは、いくつかのPythonパッケージが必要です。パッケージの有無をチェックしてインストールするには、スクリプトウィンドウを開き(Shift+Alt+3)、以下を入力してEnterキーを押します。

pip -chk scipy numpy

以下のサンプルでは、サンプルの信号データを作成し、このパッケージを使ってピリオドグラムパワースペクトル密度プロットを作成します。

import numpy as np
from scipy import signal
import originpro as op

fs = 10e3
N = 1e5
amp = 2*np.sqrt(2)
freq = 1234.0
noise_power = 0.001 * fs / 2
time = np.arange(N) / fs
x = amp*np.sin(2*np.pi*freq*time)
x += np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
f, Pxx_den = signal.periodogram(x, fs)

wks = op.new_sheet(type='w', lname='Periodogram Power Spectral')
wks.from_list(0, f, lname='Freq', units='Hz')
wks.from_list(1, Pxx_den, lname='PSD', units='V\+(2)/Hz')

graph = op.new_graph(template='line')
graph[0].yscale = 2   #対数スケール
graph[0].set_xlim(begin=0, end=5000, step=1000)
graph[0].set_ylim(1e-7, 1e2, 2) #対数スケールのstep=2
graph[0].label('legend').remove()
graph.set_int('aa', 1)#LTではpage.aa、アンチエイリアス -> On

plot = graph[0].add_plot(wks, coly=1, colx=0, type='line')
plot.color = '#167BB2'

プロジェクト

サンプルプロジェクトのグラフを画像としてエクスポート

サンプルプロジェクトのグラフから画像を作成します。このサンプルを実行すると、my_py_test.pngという名前のファイルが置き換えられることに注意してください。

save_figについての詳細は、graph.pyを参照してください。

import originpro as op
#ラーニングセンターフォルダから
op.open(op.path('c')+ r'\Graphing\Trellis Plots - Box Charts.opju')
gg=op.find_graph(0)
f=''
if gg:
    f=gg.save_fig(op.path()+'my_py_test.png',width=500)

import os
if len(f):
    os.startfile(f)

画像の色を抽出

出版物のグラフといった画像からすべての色を取得します。各色のRGB値がワークシートに出力されます。この例では、Pythonパッケージのextcolorsを事前にインストールする必要があります。

import extcolors
import numpy as np
import originpro as op

file_path = op.file_dialog('*.png;*.jpg;*.bmp','Select an Image')
if len(file_path) ==0:
    raise ValueError('user cancel')
    
colors, pixel_count = extcolors.extract_from_path(file_path)

colors = np.array(colors)
#rgb = colors[:,0]
rgb,pixel = map(list, zip(*colors))
#print(rgb)
r = []
g = []
b = []
for row in rgb:
    r.append(row[0])
    g.append(row[1])
    b.append(row[2])
#色を出力
wks = op.new_sheet()
wks.from_list(0, r)
wks.from_list(1, g)
wks.from_list(2, b)


関連情報: