利用python進行吃雞(絕地求生)視覺化分析
阿新 • • 發佈:2018-12-13
相關資料下載,請關注公眾號"一行資料",回覆"pubg"可得
既然學習一段時間python了,那麼得拿些好玩的東西練練手,這裡通過載入幾萬局的吃雞資料,來對吃雞勝率進行視覺化分析。 通過繪製擊殺地圖和被擊殺地圖查詢LYB的藏身之地 下面貼上程式碼,和分析。
#這個程式碼,是通過展示地圖擊殺和死亡最多的地方,讓我們可以挑選出有哪些好玩的地方
#載入模組
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from scipy.misc.pilutil import imread
f = open(r'F:\spyder\kernel專案\pubg\PUBG_MatchData_Flattened.tsv')#新增路徑
df = pd.read_csv(f,sep = '\t')
#edf和mdf是兩個地圖,下面把兩張地圖分開進行處理
edf = df.loc[df['map_id'] == 'ERANGEL']
mdf = df.loc[df['map_id'] == 'MIRAMAR']
#print(edf.head())
def killer_victim_df_maker(df):
#挑出地圖中擊殺和被殺玩家的座標
df = edf
victim_x_df = df.filter(regex = 'victim_position_x')
victim_y_df = df.filter(regex = 'victim_position_y')
killer_x_df = df.filter(regex = 'killer_position_x')
killer_y_df = df.filter(regex = 'killer_position_y')
#ravel()將多維矩陣變成一維
victim_x_s = pd.Series(victim_x_df.values. ravel('F'))
victim_y_s = pd.Series(victim_y_df.values.ravel('F'))
killer_x_s = pd.Series(killer_x_df.values.ravel('F'))
killer_y_s = pd.Series(killer_y_df.values.ravel('F'))
vdata = {'x':victim_x_s, 'y':victim_y_s}
kdata = {'x':killer_x_s, 'y':killer_y_s}
#dropna(how = 'any')刪除帶nan的行
#再留下座標等於0(在邊界上的異常資料)剔除
victim_df = pd.DataFrame(data = vdata).dropna(how = 'any')
victim_df = victim_df[victim_df['x'] > 0]
killer_df = pd.DataFrame(data = kdata).dropna(how = 'any')
killer_df = killer_df[killer_df['x'] > 0]
return killer_df, victim_df
ekdf,evdf = killer_victim_df_maker(edf)
mkdf,mvdf = killer_victim_df_maker(mdf)
# print(ekdf.head())#在森林擊殺的座標資料
# print(evdf.head())#在森林被殺的座標資料
# print(mkdf.head())
# print(mvdf.head())
# print(len(ekdf), len(evdf), len(mkdf), len(mvdf))
#將dataframe轉換成numpy array
plot_data_ev = evdf[['x','y']].values
plot_data_ek = ekdf[['x','y']].values
plot_data_mv = mvdf[['x','y']].values
plot_data_mk = mkdf[['x','y']].values
#將獲得的座標資料與地圖上的座標資料進行匹配
plot_data_ev = plot_data_ev * 4040 /800000
plot_data_ek = plot_data_ek * 4040 /800000
plot_data_mv = plot_data_mv * 976 /800000
plot_data_mk = plot_data_mk * 976 /800000
#載入模組
from scipy.ndimage.filters import gaussian_filter
import matplotlib.cm as cm
from matplotlib.colors import Normalize
#熱力圖函式
def heatmap(x, y, s, bins = 100):
# x = plot_data_ev[:,0]
# y = plot_data_ev[:,1]
# s = 1.5
# bins = 800
#np.histogram2d()將兩列數值轉為矩陣
heatmap, xedges, yedges = np.histogram2d(x, y, bins = bins)
#高斯銳化模糊物件
heatmap = gaussian_filter(heatmap, sigma = s)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
return heatmap.T, extent
#讀取森林地圖底圖
#Normalize歸一化
#np.clip(x,a,b)將x中小於a的值設為a,大於b的值設為b
#cm.bwr 藍白紅
bg = imread('erangel.jpg')
hmap, extent = heatmap(plot_data_ev[:,0], plot_data_ev[:,1], 1.5, bins =800)
alphas = np.clip(Normalize(0, hmap.max()/100, clip=True)(hmap)*1.5,0.0,1.)
colors = Normalize(hmap.max()/100, hmap.max()/20, clip=True)(hmap)
colors = cm.bwr(colors)
colors[..., -1] = alphas
hmap2, extent2 = heatmap(plot_data_ek[:,0],plot_data_ek[:,1],1.5, bins = 800)
alphas2 = np.clip(Normalize(0, hmap2.max()/100, clip = True)(hmap2)*1.5, 0.0, 1.)
colors2 = Normalize(hmap2.max()/100, hmap2.max()/20, clip=True)(hmap2)
colors2 = cm.RdBu(colors2)
colors2[...,-1] = alphas2
#'森林死亡率圖'
fig, ax = plt.subplots(figsize = (24,24))
ax.set_xlim(0, 4096);ax.set_ylim(0, 4096)
ax.imshow(bg)
ax.imshow(colors, extent = extent, origin = 'lower', cmap = cm.bwr, alpha = 1)
#ax.imshow(colors2, extent = extent2, origin = 'lower', cmap = cm.RdBu, alpha = 0.5)
plt.gca().invert_yaxis()
plt.title('森林地圖死亡率圖')
從圖中可以看出來,港口,軍事基地,p城,學校等這些紅色的地方傷亡人數最大,而且很明顯能看出下島的兩座橋上網率也很大,想來鋼槍還是躲開人群都可以借鑑
#森林擊殺圖
fig, ax = plt.subplots(figsize = (24,24))
ax.set_xlim(0, 4096); ax.set_ylim(0, 4096)
ax.imshow(bg)
ax.imshow(colors2, extent = extent2, origin = 'lower', cmap = cm.RdBu, alpha = 1)
plt.gca().invert_yaxis()
plt.colorbar()
plt.title('森林地圖擊殺率圖')
這是森林擊殺圖,和森林死亡圖基本重合,有人在的被擊殺的地方就肯定有人擊殺,不過要是仔細看的話,還有一點的差異,這便是LYB的藏身之地。
#沙漠地圖
bg = imread('miramar.jpg')
hmap, extent = heatmap(plot_data_mv[:,0], plot_data_mv[:,1], 1.5, bins = 800)
alphas = np.clip(Normalize(0, hmap.max()/200, clip=True)(hmap2)*1.5, 0.0, 1.)
colors2 = Normalize(hmap2.max()/100, hmap2.max()/20, clip=True)(hmap2)
colors2 = cm.rainbow(colors2)
colors2[..., -1] = alphas2
hmap2, extent2 = heatmap(plot_data_mv[:,0], plot_data_mv[:,1], 1.5, bins = 800)
alphas2 = np.clip(Normalize(0, hmap2.max()/200, clip=True)(hmap2)*1.5, 0.0, 1.)
colors = Normalize(hmap.max()/100, hmap.max()/20, clip=True)(hmap)
colors = cm.rainbow(colors)
colors[..., -1] = alphas
a = colors2[...,-1]
colors3 = colors2
colors3[...,-1] = np.clip(abs(colors2[...,-1]-colors[...,-1]),0.0,1.)
np.mean(colors2[...,-1]-colors[...,-1])
#沙漠LYB圖
fig, ax = plt.subplots(figsize = (24,24))
ax.set_xlim(0, 1000);ax.set_ylim(0, 1000)
ax.imshow(bg)
#ax.imshow(colors, extent = extent, origin = 'lower', cmap = cm.Blues, alpha = 0.5)
ax.imshow(colors3, extent = extent2, origin = 'lower', cmap = cm.Reds, alpha = 0.5)
plt.gca().invert_yaxis()
plt.title('沙漠地圖擊殺率圖')
#通過對比擊殺率和死亡率,尋找lyb藏身之地
#color3,擊殺率大於死亡率的地方
'''
在檢視上面的熱圖時,重要的是要記住藍圈對整體死亡的影響。
地圖中心區域的許多紫色斑點可能是由於區域向內推動玩家!
同樣,通過檢視時間片可以稍微減輕這種情況。
我將建立另一個核心來執行此操作,因為它需要更改此核心的第一個程式碼塊。
在此之前,讓我們嘗試檢視每個垃圾箱中的殺死率。
首先,讓我們定義一個除法函式,這樣我們就不會除以0。
'''
def divbutnotbyzero(a, b):
c = np.zeros(a.shape)
for i, row in enumerate(b):
for j, el in enumerate(row):
if el == 0:#如果擊殺率等於0的話
c[i][j] = a[i][j]#c值就等於死亡率的值
else:
c[i][j] = a[i][j]/el#擊殺/死亡
return c
bg = imread('erangel.jpg')
hmap, extent = heatmap(plot_data_ev[:,0], plot_data_ev[:,1], 0, bins = 800)
hmap2, extent2 = heatmap(plot_data_ek[:,0], plot_data_ek[:,1], 0, bins = 800)
hmap3 = divbutnotbyzero(hmap, hmap2)
alphas = np.clip(Normalize(0, hmap3.max()/100, clip=True)(hmap)*1.5, 0.0,1.)
colors = Normalize(hmap3.max()/100, hmap3.max()/20, clip=True)(hmap)
colors = cm.rainbow(colors)
colors[...,-1] = alphas
fig, ax = plt.subplots(figsize = (24, 24))
ax.set_xlim(0,4096); ax.set_ylim(0, 4096)
ax.imshow(bg)
ax.imshow(colors, extent = extent, origin = 'lower', cmap = cm.rainbow, alpha = 0.5)
plt.gca().invert_yaxis()
'''
Pretty cool! Notably, the typical "hot zones" arent
the only places for getting a good kill/death ratio.
Anywhere that you are seeing red is a pretty good spot to land.
Let's print the k/d mean:
太酷了! 值得注意的是,典型的“熱區”並不是獲得良好殺傷/死亡率的唯一場所。
你看到紅色的任何地方都是降落的好地方。 讓我們列印k / d的意思是:
'''
print(hmap3.mean())
bg = imread('miramar.jpg')
hmap, extent = heatmap(plot_data_mv[:,0], plot_data_mv[:,1], 0, bins=800)
hmap2, extent2 = heatmap(plot_data_mk[:,0], plot_data_mk[:,1], 0, bins=800)
hmap3 = divbutnotbyzero(hmap,hmap2)
alphas = np.clip(Normalize(0, hmap3.max()/100, clip=True)(hmap)*1.5, 0.0, 1.)
colors = Normalize(hmap3.max()/100, hmap3.max()/20, clip=True)(hmap)
colors = cm.rainbow(colors)
colors[..., -1] = alphas
fig, ax = plt.subplots(figsize=(24,24))
ax.set_xlim(0, 1000); ax.set_ylim(0, 1000)
ax.imshow(bg)
ax.imshow(colors, extent=extent, origin='lower', cmap=cm.rainbow, alpha=0.5)
plt.gca().invert_yaxis()