为了账号安全,请及时绑定邮箱和手机立即绑定

根据 pandas 数据框向散点图添加过滤器

根据 pandas 数据框向散点图添加过滤器

繁花如伊 2022-06-14 16:48:53
我假装使用以下数据框的过滤器制作散点图(代表整个赛季的球员、球队和赛季,并计算篮球队球员所做的辅助和非辅助点):player          team_name       season          assisted    notassistedA. DANRIDGE     NACIONAL        Season_17_18    130         445A. DANRIDGE     NACIONAL        Season_18_19    132         382D. ROBINSON     TROUVILLE       Season_18_19    89          286D. DAVIS        AGUADA          Season_18_19    101         281E. BATISTA      WELCOME         Season_17_18    148         278F. MARTINEZ     GOES            Season_18_19    52          259D. ALVAREZ      AGUADA          Season_17_18    114         246M. HICKS        H. MACABI       Season_17_18    140         245在 x 轴上我想放置辅助点,在 y 轴上放置非辅助点。但我也想按赛季、球队和球员进行过滤,所以当我选择球队的一名确定球员时,我可以看到他们的分数用一种颜色显示,而其他分数显示为灰色,或者例如,如果我想选择两个或更多我可以在他们之间进行比较(用不同的颜色),并且其他点是可见的,但是是灰色的。我还想比较两个不同球队的球员和过滤器的组合。我正在学习数据科学,使用图书馆 plotly express 我可以制作散点图并按团队过滤,我可以比较两个不同的团队(或赛季或球员)。但是我无法以一种奇特的方式添加多个过滤器,而且我也不知道如何显示选定的过滤器并将其他过滤器置于灰色(不会使它们消失)。代码如下:import plotly.express as pxfig = px.scatter(pointsperplayer, x='assisted', y='notassisted', hover_name='player',                  hover_data=['team_name','season'], color='season')fig.show()图形结果如下:总而言之,我想要三个过滤器,一个是赛季,另一个是球队,另一个是球员,能够在每个过滤器中有多个选择,并获得不同的颜色,其余的点变灰,这样我就可以将结果与其他结果进行比较,我不确定是否可以使用 plotly express 或者我是否应该使用不同的库。
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

所以我无法操纵图例,但我可以通过在此处找到的下拉小部件添加过滤器。根据您的 IDE,您可能需要使用 Jupyter 来使小部件工作。我遇到了 VSCode 无法显示小部件的问题。我下面的功能是按球队名称、赛季或球员进行过滤,并在该过滤器中比较两个选项。我希望这可以扩展以满足您的需求。


import pandas as pd

import plotly.express as px

import plotly.graph_objects as go

import ipywidgets as ipy

from ipywidgets import Output, VBox, widgets



# First gather the data I need and choose the display colors

playerData = pd.read_csv("playerData.csv")

teamNames = list(playerData['team_name'].unique().tolist());

seasons = list(playerData['season'].unique().tolist());

players = list(playerData['player'].unique().tolist());

color1 = 'red'

color2 = 'blue'

color3 = 'gray'


# This creates the initial figure.

# Note that px.scatter generates multiple scatter plot 'traces'. Each trace contains 

# the data points associated with 1 team/season/player depending on what the property

# of 'color' is set to.

trace1 = px.scatter(playerData, x='assisted', y='notassisted', color='team_name')

fig = go.FigureWidget(trace1)


# Create all our drop down widgets

filterDrop = widgets.Dropdown(

    description='Filter:',

    value='team_name',

    options=['team_name', 'season','player']  

)

teamDrop1 = widgets.Dropdown(

    description='Team Name:',

    value='NACIONAL',

    options=list(playerData['team_name'].unique().tolist())  

)

teamDrop2 = widgets.Dropdown(

    description='Team Name:',

    value='NACIONAL',

    options=list(playerData['team_name'].unique().tolist())  

)

playerDrop1 = widgets.Dropdown(

    description='Player:',

    value='A. DANRIDGE',

    options=list(playerData['player'].unique().tolist())  

)

playerDrop2 = widgets.Dropdown(

    description='Player:',

    value='A. DANRIDGE',

    options=list(playerData['player'].unique().tolist())  

)

seasonDrop1 = widgets.Dropdown(

    description='Season:',

    value='Season_17_18',

    options=list(playerData['season'].unique().tolist())  

)

seasonDrop2 = widgets.Dropdown(

    description='Season:',

    value='Season_17_18',

    options=list(playerData['season'].unique().tolist())  

)


# This will be called when the filter dropdown changes. 

def filterResponse(change):

    # generate the new traces that are filtered by teamname, season, or player

    tempTrace = px.scatter(playerData, x='assisted', y='notassisted', color=filterDrop.value)

    with fig.batch_update():

        # Delete the old traces and add the new traces in one at a time

        fig.data = []

        for tr in tempTrace.data:

            fig.add_scatter(x = tr.x, y = tr.y, hoverlabel = tr.hoverlabel, hovertemplate = tr.hovertemplate, \

                           legendgroup = tr.legendgroup, marker = tr.marker, mode = tr.mode, name = tr.name)

    # Call response so that it will color the markers appropriately

    response(change)


# This is called by all the other drop downs

def response(change):

    # colorList is a list of strings the length of the # of traces 

    if filterDrop.value == 'team_name':

        colorList = [color1 if x == teamDrop1.value else color2 if x == teamDrop2.value else color3 for x in teamNames]

    elif filterDrop.value == 'season':

        colorList = [color1 if x == seasonDrop1.value else color2 if x == seasonDrop2.value else color3 for x in seasons]

    else:

        colorList = [color1 if x == playerDrop1.value else color2 if x == playerDrop2.value else color3 for x in players]

    with fig.batch_update():

        # Color each trace according to our chosen comparison traces

        for i in range(len(colorList)):

            fig.data[i].marker.color = colorList[i]


# These determine what function should be called when a drop down changes

teamDrop1.observe(response, names="value")

seasonDrop1.observe(response, names="value")

playerDrop1.observe(response, names="value")

teamDrop2.observe(response, names="value")

seasonDrop2.observe(response, names="value")

playerDrop2.observe(response, names="value")

filterDrop.observe(filterResponse, names="value")


# HBox and VBox are used to organize the other widgets and figures

container1 = widgets.HBox([filterDrop]) 

container2 = widgets.HBox([teamDrop1, seasonDrop1, playerDrop1])

container3 = widgets.HBox([teamDrop2, seasonDrop2, playerDrop2])

widgets.VBox([container1, container2, container3, fig])


结果如下所示

查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号