2017-05-15 6 views
1

私はDataFrame.plot.histが驚くほど便利だと思っていますが、この場合は解決策が見つかりません。パンダのDataFrame.plot.histで異なる軸スケールを使用するには?

データセット内の多くの列の分布をプロットする必要があります。問題は、パンダはすべてのx軸に同じ縮尺を保持しているため、大部分のプロットは役に立たないということです。

X.plot.hist(subplots=True, layout=(13, 6), figsize=(20, 45), bins=50, sharey=False, sharex=False) 
plt.show() 

そして、ここでは、結果のセクションです: plots

問題はパンダは無関係に自分の、すべての列に同じビンを使用していることであることが表示されますここで私が使用しているコードがあります値。パンダに便利な解決策があるのですか、私は手でそれをやらなければなりませんか?

私はデータ(ゼロ平均と単位分散)を中心にして、結果は少し改善されましたが、それでも受け入れられません。

答えて

2

オプションのカップルがここにありますが、コードと出力されます:

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

# Dummy data - value ranges differ a lot between columns 
X = pd.DataFrame() 
for i in range(18): 
    X['COL0{0}'.format(i+38)]=(2**i)*np.random.random(1000) 

# Method 1 - just using the hist function to generate each plot 
X.hist(layout=(3, 6), figsize=(20, 10), sharey=False, sharex=False, bins=50) 
plt.title('Method 1') 
plt.show() 

# Method 2 - generate each plot separately 
cols = plt.cm.spectral(np.arange(1,255,13)) 
fig, axes = plt.subplots(3,6,figsize=(20,10)) 
for index, column in enumerate(X.columns): 
    ax = axes.flatten()[index] 
    ax.hist(X[column],bins=50, label=column, fc=cols[index]) 
    ax.legend(loc='upper right') 
    ax.set_ylim((0,1.2*ax.get_ylim()[1])) 
fig.suptitle('Method 2') 
fig.show() 

最初のプロット: enter image description here

2番目のプロット: enter image description here

私は間違いなくお勧めしますあなたが持っている2番目の方法多くの個々のプロットをより詳細に制御します。例えば、軸のスケールを変更することができますラベル、グリッドパラメータ、およびその他のほとんどのものが含まれます。

オリジナルのplot.histビンに個々に計算されたビンを受け入れるように変更することができるものが見つかりませんでした。

こちらがお役に立てば幸いです。

+0

ありがとうございました!私は2番目の方法で行ったが、列の数がグリッドに正確に合わないため、いくつかのサブプロットを削除しなければならなかった。私は 'fig.delaxes'を使って未使用のサブプロットを削除しました。私は別の方法があるかどうかは分かりません。最初の方法では、余分な軸がないことが示されていますが、パンダのコードベースには「delaxes」という言葉はありません。 – rubik

+0

また、** fig.add_subplot **を使って図に軸を追加することもできます。例えばhttps://pythonprogramming.net/subplot2grid-add_subplot-matplotlib-tutorial/を参照してください。うれしかったよ! – Robbie

関連する問題