2017-02-10 23 views
2

Datashaderの例では、notebook demonstrating linesが入力されていますが、入力はPandas DataFrameです(Dask DataFrameも同様です)。私のデータはNumPy配列になっています。データシートを最初にDataFrameに配置しなくても、データシートを使ってNumPy配列の線をプロットすることはできますか?Datashaderを使用してNumPy配列のデータをプロットする最良の方法は何ですか?

line glyphのドキュメントはこれが可能であることを示していますが、例は見つかりませんでした。私がリンクしている例のノートブックはCanvas.lineを使用していますが、これはドキュメントに見つかりませんでした。

答えて

0

OrderedDictおよびxarray.concatの方法は、多くのデータ曲線に適用すると非常に遅くなりました。次の例は、はるかに高速なメソッドを示しています。時間と詳細については、this GitHub issueを参照してください。フィードバックのための

import pandas as pd 
import numpy as np 
import datashader 
import bokeh.plotting 
import collections 
import xarray 
import time 
from bokeh.palettes import Colorblind7 as palette 

bokeh.plotting.output_notebook() 

# create some data worth plotting 
nx = 50 
x = np.linspace(0, np.pi * 2, nx) 
y = np.sin(x) 
n = 10000 
data = np.empty([n+1, len(y)]) 
data[0] = x 
prng = np.random.RandomState(123) 

# scale the data using a random normal distribution 
offset = prng.normal(0, 0.1, n).reshape(n, -1) 
data[1:] = y 
data[1:] += offset 

# make some data noisy 
n_noisy = prng.randint(0, n,5) 
for i in n_noisy: 
    data[i+1] += prng.normal(0, 0.5, nx) 

dfs = [] 
split = pd.DataFrame({'x': [np.nan]}) 
for i in range(len(data)-1): 
    x = data[0] 
    y = data[i+1] 
    df = pd.DataFrame({'x': x, 'y': y}) 
    dfs.append(df) 
    dfs.append(split) 

df = pd.concat(dfs, ignore_index=True) 

canvas = datashader.Canvas(x_range=x_range, y_range=y_range, 
          plot_height=300, plot_width=300) 
agg = canvas.line(df, 'x', 'y', datashader.count()) 
img = datashader.transfer_functions.shade(agg, how='eq_hist') 
img 

enter image description here

2

データフレームにデータを配置せずにNumPy配列にデータをプロットする方法が見つかりませんでした。これを行う方法は特に直感的ではありませんでした.Datashaderは列ラベルを数値以外の文字列にする必要があるため、df.col_label構文を使用して呼び出すことができます(df[col_label]構文ではなく、これには十分な理由があります)。

現在のシステムでは、Datapaderが受け入れる列ラベル付きNumPy配列をDataFrameに取得するために、次の操作が必要でした。

df = pd.DataFrame(data=data.T) 
data_cols = ['c{}'.format(c) for c in df.columns] 
df.columns = data_cols 
df['x'] = x_values 

y_range = data.min(), data.max() 
x_range = x_values[0], x_values[-1] 

canvas = datashader.Canvas(x_range=x_range, y_range=y_range, 
          plot_height=300, plot_width=900) 
aggs = collections.OrderedDict((c, canvas.line(df, 'q', c)) for c in data_cols) 

merged = xarray.concat(saxs_aggs.values(), dim=pd.Index(cols, name='cols')) 
saxs_img = datashader.transfer_functions.shade(merged.sum(dim='cols'), 
               how='eq_hist') 

それはx列(最初は直感的ではない)を除外しなければならなかったので、data_cols変数は、df.columns使用することが重要ではなく、単にだったことに注意してください。

結果は、軸がbokehを使用して追加された例です。 enter image description here

+0

ありがとう!生のNumPy配列を使用する方法はわかりませんが、Githubサイトで問題として登録するのが合理的な機能要求です。数値の列名の使用に関する問題を提起することも役立ちます。私は、col_label構文を利便性以外に使用する特別な理由はないと思っています。純粋に数値の列ラベルを使って実行しているわけではありません。一般に、Githubの問題は私たちと連絡を取るためのよりよい方法です。時間の経過と共にコメントを追跡することができます。 –

+0

@ JamesA.Bednarハウツーについては、スタックオーバーフロー、部分的に他の人を助けるための質問、また簡単に参照できるようにするという利己的な理由から質問することをお勧めします。 Githubの問題として提出されたい質問はありますか?私はこれが一般的に落胆していると思った。私は列ラベルとnumpy配列を受け入れるという考えに関連する問題を提出します。 –

+0

SOは、使用方法に関する質問には優れています。既に何かをする方法がなければならないと思っていて、それが何であるか把握するのに役立つ人が必要です。しかし、データ・セキュリティー開発者が、機能リクエストやバグ・レポートを追跡するのは難しい方法です。どちらもランダムなSOポストに座っていると対処される可能性は非常に低いです。もちろん、自分の状況や、ソフトウェア自体の問題かどうかを判断することは難しいでしょう。この場合、改善する必要があるのはあなたのソフトウェアなので、githubの問題を提出してください。 –

関連する問題