如何根据条件更改点之间的线条 colored颜色 -PASS COUNT,在示例中是"UPD_PASS"数据帧中的"COUNT"列.情况如下:计数越大, colored颜色 越变为红色:

enter image description here

如果我在这个循环中使用"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()

推荐答案

您可以使用Seborn color_palette功能,在该功能中您可以 Select 色彩映射表和 colored颜色 数量.在你的 case 中,

import seaborn as sns

line_colors = upd_passes['Count']
cmap = sns.color_palette("plasma", n_colors=line_colors.max()+1)

for x0, y0, x1, y1, line_color in zip(x, y, xr, yr, line_colors):
    plt.plot((x0, x1), (y0, y1), '-o', color=cmap[line_color], linewidth=3, alpha=0.2, zorder=1)

enter image description here

Python相关问答推荐

如何避免Chained when/then分配中的Mypy不兼容类型警告?

在Python中管理打开对话框

Polars:用氨纶的其他部分替换氨纶的部分

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

使用BeautifulSoup抓取所有链接

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

手动设置seborn/matplotlib散点图连续变量图例中显示的值

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

为什么Python内存中的列表大小与文档不匹配?

统计numpy. ndarray中的项目列表出现次数的最快方法

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

如何使用matplotlib查看并列直方图

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

如何在Pandas中用迭代器求一个序列的平均值?

递归链表反转与打印语句挂起

如何从一个维基页面中抓取和存储多个表格?

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)

按列表分组到新列中