Matplotlib直方图时间与百分比(NBA统计数据)

时间:2017-04-16 07:10:00

标签: python matplotlib

我遇到了问题而我正试图绕过它。在pandas / matplotlib上很新。

我想在X轴上显示一个带有镜头时钟(0-24秒)的直方图,以及Y轴上的成功/未命中百分比。

我的数据在一列中有拍摄时钟,在另一列中显示未命中/制作(0和1)。我很难弄清楚如何根据垃圾箱生成百分比。

非常感谢

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 个答案:

答案 0 :(得分: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()