如何用Python创建带图例的分类柱状图并可视化游戏销售DataFrame
在Python中绘制指定DataFrame的分组柱状图
要实现你需要的可视化效果(以Year_of_Release为X轴,Global_Sales为柱高,Genre作为图例且不同类型对应不同颜色),可以用Matplotlib或Seaborn这两个常用库来实现,以下是具体方案:
先准备示例数据
假设你的DataFrame结构如下,我们先构造一个测试用例:
import pandas as pd data = { 'Year_of_Release': [2010, 2010, 2011, 2011, 2012, 2012, 2010, 2011], 'Genre': ['Action', 'RPG', 'Action', 'RPG', 'Action', 'RPG', 'Adventure', 'Adventure'], 'Global_Sales': [15.2, 8.7, 16.5, 9.3, 14.8, 10.1, 5.4, 6.2] } df = pd.DataFrame(data) # 如果原始数据是单条游戏记录,需先按年份+类型聚合营收总和 df_agg = df.groupby(['Year_of_Release', 'Genre'])['Global_Sales'].sum().reset_index()
方法1:使用Seaborn(简洁高效)
Seaborn的barplot可以自动处理分组逻辑,无需手动计算柱子位置,适合快速实现需求:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格 sns.set_style("whitegrid") # 创建画布 plt.figure(figsize=(10, 6)) # 绘制分组柱状图 sns.barplot( data=df_agg, x='Year_of_Release', # X轴:发行年份 y='Global_Sales', # Y轴:全球营收 hue='Genre', # 分组依据:游戏类型 palette='tab10' # 颜色调色板,自动为不同Genre分配不同颜色 ) # 设置图表标签与标题 plt.xlabel('发行年份') plt.ylabel('全球营收(单位:百万)') plt.title('各年份不同类型游戏全球营收对比') # 调整布局,避免标签被截断 plt.tight_layout() plt.show()
方法2:使用Matplotlib(高度自定义)
如果需要更精细的控制(比如调整柱子间距、自定义颜色映射),可以用Matplotlib手动实现:
import matplotlib.pyplot as plt import numpy as np # 获取唯一的年份和游戏类型 unique_years = df_agg['Year_of_Release'].unique() unique_genres = df_agg['Genre'].unique() year_count = len(unique_years) genre_count = len(unique_genres) # 设置柱子宽度和基准X轴位置 bar_width = 0.2 x_base = np.arange(year_count) # 创建画布 fig, ax = plt.subplots(figsize=(10, 6)) # 循环绘制每个Genre的柱子 for idx, genre in enumerate(unique_genres): # 筛选当前类型的聚合数据 genre_data = df_agg[df_agg['Genre'] == genre] # 绘制柱子,位置根据类型索引偏移 ax.bar( x_base + idx * bar_width, genre_data['Global_Sales'], width=bar_width, label=genre, alpha=0.8 # 柱子透明度 ) # 设置X轴标签位置和内容 ax.set_xticks(x_base + bar_width * (genre_count - 1) / 2) ax.set_xticklabels(unique_years) # 设置图表标签与标题 ax.set_xlabel('发行年份') ax.set_ylabel('全球营收(单位:百万)') ax.set_title('各年份不同类型游戏全球营收对比') # 添加图例(按Genre分组) ax.legend(title='游戏类型', bbox_to_anchor=(1.05, 1), loc='upper left') # 调整布局 plt.tight_layout() plt.show()
说明
- 如果你的原始DataFrame已经是按
Year_of_Release和Genre聚合后的结果,可以跳过groupby步骤直接使用。 - 调色板可以根据需求替换,比如
palette='viridis'、palette='Set2',或者手动指定颜色列表(如palette=['#FF5733', '#33FF57', '#3357FF'])。
内容的提问来源于stack exchange,提问作者vthapa
相关产品推荐
相关产品推荐

