2017-11-08 11 views
0

私はpython seabornを使って線としてプロットすることができる様々な注文とsin/cos曲線のノイズの多いポリゴン1000個の合成データセットを持っています。ラインベースのヒートマップまたは2Dラインヒストグラム

enter image description here

私は重複しているかなりの数のラインを持っているので、私は私の線グラフのヒートマップやヒストグラムのいくつかの並べ替えをプロットしたいと思います。 私は列の繰り返しを試み、seabornのヒートマップグラフを使用するためにカウントを集計しましたが、多くの行にはかなりの時間がかかります。

私が欲しいものが次に得られるのは、(海底接合図がある)ヘックスビングラフでした。

enter image description here

しかし、それは、(示されたグラフは、750をグリッド寸法あり)ランタイムと粒度との間の妥協です。私は自分の問題のグラフタイプを見つけることができませんでした。しかし、私はまた、それが何が呼び出されるかもしれないかを正確には知らない。

また、線のアルファベットを0.2に設定してみました。この結果、私が望むものと同様のグラフが得られます。しかし、それほど正確ではありません(同じ点で5本以上の線が重なっていれば、すでに透明度がゼロになっています)。また、ヒートマップの典型的な着色を見逃してしまいます。

(ムートの検索用語であった:ヒートマップ、2Dラインヒストグラム、ラインヒストグラム、密度プロット...)

誰がこのより効率的かつ高(ER)品質をプロットするために、パッケージを知っているか、どのように知っています人気のあるPythonプロッタ(matplotlibファミリー:matplotlib、seaborn、bokeh)でそれを行います。私は本当にどんなパッケージでもうまくいく。

答えて

0

これを試したようですが、カウントをプロットすると、データが正しく表示されているようです。しかし、それは本当にあなたがあなたのデータで見つけようとしているものに依存します、それはあなたに何を伝えるべきでしょうか?

長い実行時間の理由は、非常に多くの行をプロットすることによるものですが、カウントに基づくヒートマップはかなり迅速にプロットされます。

ノイズに基づいて、洞結膜のダミーデータを作成しました。線、振幅、シフトの数ボックスプロットとヒートマップの両方を追加しました。

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 
import random 
import pandas as pd 

np.random.seed(0) 

#create dummy data 
N = 200 
sinuses = [] 
no_lines = 200 
for i in range(no_lines): 
    a = np.random.randint(5, 40)/5 #amplitude 
    x = random.choice([int(N/5), int(N/(2/5))]) #random shift 
    sinuses.append(np.roll(a * np.sin(np.linspace(0, 2 * np.pi, N)) + np.random.randn(N), x)) 

fig = plt.figure(figsize=(20/2.54, 20/2.54)) 
sins = pd.DataFrame(sinuses,) 

ax1 = plt.subplot2grid((3,10), (0,0), colspan=10) 
ax2 = plt.subplot2grid((3,10), (1,0), colspan=10) 
ax3 = plt.subplot2grid((3,10), (2,0), colspan=9) 
ax4 = plt.subplot2grid((3,10), (2,9)) 

# plot line data 
sins.T.plot(ax=ax1, color='lightblue',linewidth=.3) 
ax1.legend_.remove() 
ax1.set_xlim(0, N) 

# try boxplot 
sins.plot.box(ax=ax2, showfliers=False) 
xticks = ax2.xaxis.get_major_ticks() 
for index, label in enumerate(ax2.get_xaxis().get_ticklabels()): 
    xticks[index].set_visible(False) # hide ticks where labels are hidden 

#make a list of bins 
no_bins = 20 
bins = list(np.arange(sins.min().min(), sins.max().max(), int(abs(sins.min().min())+sins.max().max())/no_bins)) 
bins.append(sins.max().max()) 

# calculate histogram 
hists = [] 
for col in sins.columns: 
    count, division = np.histogram(sins.iloc[:,col], bins=bins) 
    hists.append(count) 
hists = pd.DataFrame(hists, columns=[str(i) for i in bins[1:]]) 
print(hists.shape, '\n', hists.head()) 

cmap = mpl.colors.ListedColormap(['white', '#FFFFBB', '#C3FDB8', '#B5EAAA', '#64E986', '#54C571', 
      '#4AA02C', '#347C17', '#347235', '#25383C', '#254117']) 

#heatmap 
im = ax3.pcolor(hists.T, cmap=cmap) 
cbar = plt.colorbar(im, cax=ax4) 

yticks = np.arange(0, len(bins)) 
yticklabels = hists.columns.tolist() 
ax3.set_yticks(yticks) 
ax3.set_yticklabels([round(i,1) for i in bins]) 
ax3.set_title('Count') 
yticks = ax3.yaxis.get_major_ticks() 

for index, label in enumerate(ax3.get_yaxis().get_ticklabels()): 
    if index % 3 != 0: #make some labels invisible 
     yticks[index].set_visible(False) # hide ticks where labels are hidden 

plt.show() 

enter image description here

箱ひげ図が解釈するのは簡単ですが、それは非常によく、実際のデータの分布を示していないが、中央値及び分位数がどこにあるか知ることが有用であろう。

1行あたりの行数と値の量を増やすと、線のプロット時間が大幅に長くなりますが、生成するヒートマップはまだかなり速いです。しかし、ボックスプロットは目立たなくなります。

enter image description here

私は正確にあなたのデータを複製(またはそれの実際のサイズを知っている)、おそらくヒートマップは役に立つかもしれませんでした。