如何根据条件更改点之间的线条 colored颜色 -PASS COUNT,在示例中是"UPD_PASS"数据帧中的"COUNT"列.情况如下:计数越大, colored颜色 越变为红色:
如果我在这个循环中使用"ENUMPERATE",可能会更容易做到这一点(然而,我想不出如何在这里使用"ENUMPERATE"):
# Lines between points:
for x0, y0, x1, y1 in zip(x, y, xr, yr):
plt.plot((x0, x1), (y0, y1), '-ro', color='tab:blue', linewidth=3, alpha=0.2, zorder=1)
另外,我有一种强烈的感觉,我在这里对数据帧的操作做得太多了,请原谅我对Python很熟悉:) 完整代码示例:
import matplotlib.colors
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.patheffects as PathEffects
import matplotlib.colors as cm
pd.set_option('display.width', 400)
pd.set_option('display.max_columns', 10)
players = pd.DataFrame([[1, 'Player 1'],
[2, 'Player 2'],
[3, 'Player 3'],
[4, 'Player 4'],
[5, 'Player 5'],
[6, 'Player 6'],
[7, 'Player 7']], columns=['Player_id', 'Name'])
avg_positions = pd.DataFrame([[1, 15, 34],
[2, 35, 48],
[3, 58, 27],
[4, 62, 55],
[5, 52, 40],
[6, 69, 31],
[7, 27, 9]], columns=['Player_id', 'avg_pos_x', 'avg_pos_y'])
avg_positions2 = pd.DataFrame(avg_positions, columns=['Player_id', 'avg_pos_x', 'avg_pos_y'])
avg_positions2.rename(columns={'Player_id': 'Receiver_id'}, inplace=True)
passes = pd.DataFrame([[1, 2],
[1, 2],
[1, 3],
[2, 1],
[2, 5],
[3, 6],
[6, 1],
[4, 2],
[4, 2],
[5, 7],
[6, 2],
[7, 3],
[7, 3],
[7, 3],
[7, 1]], columns=['Player_id', 'Receiver_id'])
receivers = pd.DataFrame(players, columns=['Player_id', 'Name'])
receivers.rename(columns={'Player_id': 'Receiver_id'}, inplace=True)
plt.style.use('_mpl-gallery')
# Making a final dataframe with all the necessary data combined in one dataframe:
upd_passes = pd.merge(players, passes, on='Player_id')
upd_passes = upd_passes.groupby(['Player_id', 'Name', 'Receiver_id']).size().reset_index()
upd_passes.columns = [*upd_passes.columns[:-1], 'Count']
upd_passes = pd.merge(upd_passes, avg_positions, on='Player_id')
upd_passes.rename(columns={'Name': 'Player_name', 'avg_pos_x': 'Player_x', 'avg_pos_y': 'Player_y'}, inplace=True)
upd_passes = pd.merge(upd_passes, avg_positions2, on='Receiver_id')
upd_passes.rename(columns={'avg_pos_x': 'Receiver_x', 'avg_pos_y': 'Receiver_y'}, inplace=True)
upd_passes = pd.merge(upd_passes, receivers, on='Receiver_id')
upd_passes.rename(columns={'Name': 'Receiver_name'}, inplace=True)
upd_passes = upd_passes[['Player_id', 'Player_name', 'Player_x', 'Player_y', 'Receiver_id', 'Receiver_name', 'Receiver_x', 'Receiver_y', 'Count']]
upd_passes.sort_values(by=['Player_id'], inplace=True)
upd_passes.reset_index(drop=True, inplace=True)
print(upd_passes)
passes_count = passes.groupby('Player_id')['Player_id'].count()
# print(passes_count)
# Player (dots) coordinates:
xa = avg_positions.avg_pos_y
ya = avg_positions.avg_pos_x
# Player's coordinates:
x = upd_passes.Player_y
y = upd_passes.Player_x
# Receiver's coordinates:
xr = upd_passes.Receiver_y
yr = upd_passes.Receiver_x
# Point sizes and colors:
sizes = passes_count * 80
colors = passes_count
# Define player names for text annotations:
names = players.Name
# plot
fig, ax = plt.subplots()
ax.scatter(xa, ya, s=sizes, c=colors, vmin=0, vmax=5, cmap=plt.get_cmap('viridis'), zorder=2)
# Text above points:
for i, txt in enumerate(names):
ax.annotate(txt, xy=(xa[i], ya[i]), xytext=(xa[i]-3, ya[i]+2), fontsize=9, color='black',
path_effects=[PathEffects.withStroke(linewidth=3, foreground="w")])
# line_colors = upd_passes['Count']
# count = len(line_colors.index)
# cmap = plt.get_cmap('plasma')
# colors = cm.Colormap(line_colors, 256)
# Lines between points:
for x0, y0, x1, y1 in zip(x, y, xr, yr):
plt.plot((x0, x1), (y0, y1), '-ro', color='tab:blue', linewidth=3, alpha=0.2, zorder=1)
fig.set_size_inches(5, 5)
# ax.grid(True)
plt.show()