1. 程式人生 > >利用python進行吃雞(絕地求生)視覺化分析

利用python進行吃雞(絕地求生)視覺化分析

相關資料下載,請關注公眾號"一行資料",回覆"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()

在這裡插入圖片描述