2017-08-09 4 views
0

私は、この基準の中央値を下回る平均よりも大きいビューを受け取る分類されたものを比較しています。私は以前の "高性能"の分類を呼び出します。ここではこれを示す簡単なcountplotです:比率のプロットタイプ(色合い付き)

enter image description here

hueは、単に分類が持っていた写真の枚数です。

私の質問は、絶対数ではなくプロポーションを示す海底またはmatplotlibにプロットタイプがありますか?

私は本質的に同じカウントプロットを望んでいますが、各バーはその特定のカテゴリの合計アイテムの%として必要です。たとえば、カウントプロットでは、3つの写真を含む広告がhigh perfカテゴリのずっと大きな割合を占めていることに注意してください。その情報を収集するまでには時間がかかります。それぞれのバーの高さが代わりにそのカテゴリへの寄与率で表される場合、それははるかに簡単な比較になります。それが私が探しているものを探している理由です。

例は素晴らしいでしょう。

答えて

2

あなたが望むものを正確に行う特殊なプロット関数を見つけるのではなく、データの生成と視覚化を分けておくことをお勧めします。最終的には、いくつかの値の棒グラフをプロットすることです。そのため、簡単にプロットできるような方法でデータを生成することが考えられます。

この目的のために、問題の2つの列をcrosstabとし、結果の表の各行(または列)をその合計で除算することができます。この表は、パンダプロットラッパーを使用して簡単にプロットすることができます。

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(42) 
import pandas as pd 
plt.rcParams["figure.figsize"] = 5.6, 7.0 

n = 100 
df = pd.DataFrame({"performance": np.random.choice([0,1], size=n, p=[0.7,0.3]), 
        "photo" : np.random.choice(range(4), size=n, p=[0.6,0.1,0.2,0.1]), 
        "someothervalue" : np.random.randn(n) }) 

fig, (ax,ax2, ax3) = plt.subplots(nrows=3) 

freq = pd.crosstab(df["performance"],df["photo"]) 
freq.plot(kind="bar", ax=ax) 

relative = freq.div(freq.sum(axis=1), axis=0) 
relative.plot(kind="bar", ax=ax2) 

relative = freq.div(freq.sum(axis=0), axis=1) 
relative.plot(kind="bar", ax=ax3) 


ax.set_title("countplot of absolute frequency") 
ax2.set_title("barplot of relative frequency by performance") 
ax3.set_title("barplot of relative frequency by photo") 
for a in [ax, ax2, ax3]: a.legend(title="Photo", loc=6, bbox_to_anchor=(1.02,0.5)) 
plt.subplots_adjust(right=0.8,hspace=0.6) 
plt.show() 

enter image description here

関連する問題