如何用FacetGrid绘制东西部Top5 C位NBA球员得分柱状图
用Seaborn FacetGrid实现东西部C位Top5得分柱状图对比
首先需要导入seaborn库(FacetGrid是seaborn的核心组件),然后优化数据处理逻辑,再通过FacetGrid实现分面可视化:
步骤1:修正原代码错误并准备数据
原代码里matploltlib为拼写错误,需改为matplotlib;同时用更简洁的方式筛选并提取东西部C位的Top5球员:
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 导入seaborn库 # 生成模拟数据 fake_data = {} for i in range(100): name = str(float(np.random.rand(1))) pos = 'C' if np.random.rand(1) > 0.3 else 'D' pts = float(np.random.randint(0,2000,1)) conf = 'East' if np.random.rand(1) > 0.5 else 'West' fake_data[name] = {'pos':pos,'pts':pts,'conf':conf} df = pd.DataFrame(fake_data).T # 筛选C位球员,按东西部分组后取每组得分Top5 df_c_top5 = df[df['pos'] == 'C'].groupby('conf').apply( lambda x: x.sort_values('pts', ascending=False).head(5) ).reset_index(drop=True)
步骤2:用FacetGrid绘制分面柱状图
通过FacetGrid按conf(东西部)分面,然后映射柱状图到每个子图:
# 创建FacetGrid对象,按conf列分面,1行2列,设置画布尺寸 g = sns.FacetGrid(df_c_top5, col='conf', height=6, aspect=0.8) # 映射柱状图:x轴为球员name,y轴为得分pts,指定排序顺序 g.map(sns.barplot, 'name', 'pts', order=df_c_top5.groupby('conf')['name'].apply(list)) # 设置全局标题和子图标题 g.figure.suptitle('Top scorers of position C by conf', y=1.02) # y参数调整标题位置避免重叠 g.set_titles(col_template='{col_name}') # 旋转x轴标签避免文字重叠 g.set_xticklabels(rotation=45) plt.show()
关键说明
groupby+apply的方式可一次性获取东西部的Top5数据,比分开处理更简洁;FacetGrid.map()会自动为每个分面(东/西部)绘制对应柱状图;order参数确保每个子图的球员按得分从高到低排序,和原matplotlib实现逻辑一致;- 通过
set_titles快速设置子图标题,suptitle设置全局标题。
内容的提问来源于stack exchange,提问作者enter_thevoid
相关产品推荐
相关产品推荐

