2017-06-02 18 views
8

カテゴリの行と列のラベルを持つpandas DataFrameの散布図をmatplotlibで作成したいと考えています。サンプルDataFrameは次のようになります。パンタグラフをプロットするpandas DataFrameのラベル付き行/列を

import pandas as pd 
df = pd.DataFrame({"a": [1,2], "b": [3,4]}, index=["c","d"]) 
# a b 
#c 1 2 
#d 3 4 

マーカーのサイズは、それぞれのDataFrame値の関数です。これまでのところ、私は、基本的に行と列を列挙厄介な解決策を考え出したデータをプロットして、ラベルを再構築:作品の種類

flat = df.reset_index(drop=True).T.reset_index(drop=True).T.stack().reset_index() 
# level_0 level_1 0 
#0  0  0 1 
#1  0  1 2 
#2  1  0 3 
#3  1  1 4 

flat.plot(kind='scatter', x='level_0', y='level_1', s=100*flat[0]) 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

を。 Which kind of works

質問:データとメタデータを分割することなく、理想的にはこの散布図を作成する、より直感的で統合された方法がありますか?

+0

私たちはプロットするために非数値データを使用することができるとは思いません。 AFAIKとにかく個別にティックを設定する必要があります。 – MaxU

+1

質問が翻訳されていると思います。 – ImportanceOfBeingErnest

答えて

7

は多分全体ではなく、答えあなたがしています探していますが、flat=コード行で時間と可読性を節約するためのアイデアです。

パンダunstackは、MultiIndexのシリーズを生成します。

dfu = df.unstack() 

print(dfu.index) 
MultiIndex(levels=[[u'a', u'b'], [u'c', u'd']], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]]) 

マルチインデックスは(labelsで)プロットを構築するために必要なxとyの点を含む含んでいます。ここでは、levelslabelsをプロットに適したより有益な変数名に割り当てます。

xlabels, ylabels = dfu.index.levels 
xs, ys = dfu.index.labels 

プロットはここからかなり簡単です。

plt.scatter(xs, ys, s=dfu*100) 
plt.xticks(range(len(xlabels)), xlabels) 
plt.yticks(range(len(ylabels)), ylabels) 
plt.show() 

enter image description here

私はいくつかの異なるDataFrame形でこれを試み、ホールドアップするように見えました。

4

それはまさにあなたが求めていたものではないが、それは同様の方法で値を視覚化するのに役立ちます。

import seaborn as sns 

sns.heatmap(df[::-1], annot=True) 

結果:

enter image description here

+0

まあ...それは海底ではなく、matplotlibです。しかし、ありがとう! – DyZ

3

たぶん、あなたは下記に示すように、散布図を作成するためにnumpyの配列とpd.meltを使用することができます。

arr = np.array([[i,j] for i in range(df.shape[1]) for j in range(df.shape[0])]) 
plt.scatter(arr[:,0],arr[:,1],s=100*pd.melt(df)['value'],marker='o') 
plt.xlabel('level_0') 
plt.ylabel('level_1') 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

enter image description here

関連する問題