2017-04-16 47 views
0

我有一個問題,我試圖把我的頭圍繞它。非常新的熊貓/ matplotlib。Matplotlib直方圖時間與百分比(NBA統計)

我想要顯示一個直方圖,其中X軸上的鏡頭時鐘(0-24秒)和Y軸上的錯誤百分比。

我的數據在一列中有拍攝時鐘,在另一列中顯示未命中/使(0和1)。我很難弄清楚如何基於bin生成百分比。

多謝

import matplotlib.pyplot as plt 
fig = plt.figure() 
x = nba_hist['SHOT_CLOCK'] 
y = nba_hist['FGM'] 
plt.hist(x) 
plt.show() 


SHOT_CLOCK FGM 
10.8  1 
3.4   0 
5.0   0 
10.3  0 
10.9  0 
9.1   0 
14.5  0 
3.4   1 
12.4  0 
17.4  0 
16   0 
12.1  1 
4.3   1 

編輯:所以用這個代碼我得到的投籃命中率,但它不是整個箱蔓延。有任何想法嗎?

df_miss=nba_hist[nba_hist['FGM'] == 0] 
df_hits=nba_hist[nba_hist['FGM'] == 1] 

bins=np.arange(0,25,6) 
hist_hits, bins_ = np.histogram(df_hits['FGM'], bins=bins) 
hist_miss, bins_ = np.histogram(df_miss['FGM'], bins=bins) 
+1

後的一些數據。 – Serenity

+0

@serenity在這裏你去 – badhairdude

回答

1

通過將絕對頻率除以事件總數得到箱內事件的相對頻率。

因此,您需要計算直方圖,例如,與numpy的

hist, bins = np.histogram(x) 

根據您是否然後通過事件的數量每一段內分裂,或總事件數就可以得到不同的地塊。
從左手邊的人可以輕鬆掌握例如在更長的時間內命中率更高(當然這對真實數據可能沒有意義)。從右邊的情節來看,你應該明白,對於中等時鐘時間進行了更多的試驗 - 如果只顯示相對命中,那麼根本沒有看到。

enter image description here

from __future__ import division 
import pandas as pd 
import numpy as np; np.random.seed(2) 
import matplotlib.pyplot as plt 

t = np.random.rand(100)*24 
hit = np.random.randint(0,2, size=100) 
df = pd.DataFrame({"time":t, "hits":hit}) 
df_miss=df[df.hits == 0] 
df_hits=df[df.hits == 1] 

bins=np.arange(0,28,4) 
hist_hits, bins_ = np.histogram(df_hits.time, bins=bins) 
hist_miss, bins_ = np.histogram(df_miss.time, bins=bins) 

rel_hits = hist_hits/(hist_hits+hist_miss)*100. 
rel_miss = hist_miss/(hist_hits+hist_miss)*100. 

rel_hits_n = hist_hits/np.sum(hist_hits+hist_miss)*100. 
rel_miss_n = hist_miss/np.sum(hist_hits+hist_miss)*100. 


fig , (ax, ax2) = plt.subplots(ncols=2, figsize=(7,3)) 

ax.bar(bins[:-1], rel_hits, width=4, 
     color="mediumseagreen", align="edge", ec="k") 
ax.bar(bins[:-1], rel_miss, bottom=rel_hits, width=4, 
     color="tomato", align="edge", ec="k") 
ax.set_xticks(bins) 
ax.set_ylabel("relative hits and misses [%]") 
ax2.bar(bins[:-1], rel_hits_n, width=4, 
     color="mediumseagreen", align="edge", ec="k", label="hit") 
ax2.bar(bins[:-1], rel_miss_n, bottom=rel_hits_n, width=4, 
     color="tomato", align="edge", ec="k", label="miss") 
ax2.set_xticks(bins) 
ax2.set_ylabel("normalized hits and misses [%]") 

plt.legend() 
plt.tight_layout() 
plt.show() 
+0

編輯的主要職位,我得到的投籃命中率,但它並沒有跨越箱。有任何想法嗎? – badhairdude

+0

當然,你需要計算時間的直方圖(shotclock),而不是目標,因爲你想知道每個**時間的命中和未命中的百分比** bin:'np.histogram(df_hits ['SHOT_CLOCK' ],箱=箱)'。 – ImportanceOfBeingErnest