如何用Seaborn绘制多线图展示各品牌汽车HP分布?
解决多品牌汽车马力分布多线图绘制问题
1. 数据准备(示例)
先模拟你的DataFrame结构:
import pandas as pd data = { 'Brand': ['VW', 'Audi', 'Audi', 'VW', 'VW', 'Ford', 'KIA', 'Audi', 'Audi', 'VW', 'VW'], 'Model': ['Golf 7', 'A4', 'A5', 'Passat', 'Polo', 'A4', 'A4', 'Q3', 'S6', 'Golf 6', 'Golf 5'], 'Power in HP': [150, 190, 190, 240, 80, 190, 190, 150, 400, 140, 116] } df = pd.DataFrame(data)
2. 方法一:使用Seaborn Lineplot(推荐)
Seaborn的lineplot可通过hue参数直接按品牌分组绘图,关键是先处理x轴避免型号名称重复导致的混乱:
import seaborn as sns import matplotlib.pyplot as plt # 按品牌分组,组内按马力升序排序 df_sorted = df.groupby('Brand').apply(lambda x: x.sort_values('Power in HP')).reset_index(drop=True) # 给每个品牌内的型号分配序号作为x轴(解决不同品牌型号重名问题) df_sorted['Model_Index'] = df_sorted.groupby('Brand').cumcount() # 绘制多线图 plt.figure(figsize=(10, 6)) sns.lineplot(data=df_sorted, x='Model_Index', y='Power in HP', hue='Brand', marker='o') # 设置图表样式 plt.xlabel('同品牌内型号序号(按马力排序)') plt.ylabel('马力(HP)') plt.title('各品牌汽车型号马力分布') plt.legend(title='品牌') plt.show()
如果想直接显示型号名称作为x轴,可调整如下(注意旋转标签避免重叠):
plt.figure(figsize=(12, 6)) sns.lineplot(data=df_sorted, x='Model', y='Power in HP', hue='Brand', marker='o') plt.xticks(rotation=45) plt.tight_layout() plt.show()
3. 方法二:使用Matplotlib手动分组绘图
若偏好手动控制绘图逻辑,可按品牌分组后循环绘制:
plt.figure(figsize=(10, 6)) # 按品牌分组并逐个绘制 for brand, group in df.groupby('Brand'): sorted_group = group.sort_values('Power in HP') plt.plot(sorted_group['Model'], sorted_group['Power in HP'], marker='o', label=brand) # 设置图表样式 plt.xlabel('型号') plt.ylabel('马力(HP)') plt.title('各品牌汽车型号马力分布') plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show()
常见问题说明
- 之前
groupby失败可能是因为直接传入分组对象给绘图函数,而非结构化的排序后DataFrame; - 直接传列到
lineplot失败通常是因为x轴用了重复的型号名称,导致不同品牌的数据点重叠,无法形成清晰的线条。
内容的提问来源于stack exchange,提问作者g_user_1000
相关产品推荐
相关产品推荐

