2017-04-16 122 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