如何基于Seaborn调整折线图代码,展示指定时段多组数据?
解决折线图合并与数据扩展问题
嘿,我来帮你搞定这个折线图的需求!你现在的代码生成两个独立图表,想要把Total和MGO放在同一张图里,还要加上2019全年和2020上半年的数据,咱们一步步来:
第一步:把两个系列合并到同一张图
不用分开调用两次plot,只需要先创建一个Matplotlib轴对象,然后把两个折线都画在这个轴上就行:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 创建画布和轴对象,可指定画布大小 fig, ax = plt.subplots(figsize=(10, 6)) # 在同一个轴上绘制两条折线,添加标签方便区分 Bunker2019_Jan_to_Jun.plot(x='2019', y='Total', ax=ax, label='Total', linewidth=2) Bunker2019_Jan_to_Jun.plot(x='2019', y='MGO', ax=ax, label='MGO', linewidth=2) # 美化图表细节 ax.legend(title='Bunker Type') # 给图例添加标题 ax.set_xlabel('Date', fontsize=12) ax.set_ylabel('Value', fontsize=12) ax.set_title('2019 Jan-Jun Bunker Data', fontsize=14) plt.xticks(rotation=45) # 旋转日期标签避免重叠 plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
第二步:扩展数据到2019全年+2020上半年
首先你需要确保手里有2019年7-12月和2020年1-6月的数据集(假设它们的结构和Bunker2019_Jan_to_Jun一致,列名相同)。我们先把这些数据合并成一个完整的DataFrame,再画图:
1. 合并并整理数据
# 假设你有这两个额外的数据集: # Bunker2019_Jul_to_Dec(2019年7-12月)、Bunker2020_Jan_to_Jun(2020年1-6月) full_data = pd.concat([Bunker2019_Jan_to_Jun, Bunker2019_Jul_to_Dec, Bunker2020_Jan_to_Jun]) # 关键:把日期列转为datetime类型(如果还不是的话),否则x轴会乱序 full_data['2019'] = pd.to_datetime(full_data['2019']) # 建议把日期列名改成通用的`date`,避免混淆2019/2020数据: full_data.rename(columns={'2019': 'date'}, inplace=True)
2. 绘制完整数据的折线图
方法一:用Pandas Plot(延续你原来的写法)
fig, ax = plt.subplots(figsize=(12, 6)) full_data.plot(x='date', y='Total', ax=ax, label='Total', linewidth=2) full_data.plot(x='date', y='MGO', ax=ax, label='MGO', linewidth=2) # 美化设置 ax.legend(title='Bunker Type') ax.set_xlabel('Date', fontsize=12) ax.set_ylabel('Bunker Value', fontsize=12) ax.set_title('Bunker Data: 2019 Full Year & 2020 Jan-Jun', fontsize=14) plt.xticks(rotation=45) plt.tight_layout() plt.show()
方法二:用Seaborn Lineplot(更适合分类数据)
如果把数据转成长格式,Seaborn的lineplot会更简洁,也更符合Seaborn的使用习惯:
# 把宽格式数据转成长格式(melt),方便Seaborn识别分类 melted_data = full_data.melt(id_vars='date', value_vars=['Total', 'MGO'], var_name='Bunker Type', value_name='Value') # 用Seaborn绘制折线图 plt.figure(figsize=(12, 6)) sns.lineplot(data=melted_data, x='date', y='Value', hue='Bunker Type', linewidth=2) # 美化设置 plt.xlabel('Date', fontsize=12) plt.ylabel('Value', fontsize=12) plt.title('Bunker Data: 2019 Full Year & 2020 Jan-Jun', fontsize=14) plt.xticks(rotation=45) plt.tight_layout() plt.show()
重要注意事项
- 确保所有数据集的列名完全一致,否则合并时会出现缺失列的错误;
- 日期列必须是
datetime类型,不然x轴会按字符串排序,导致时间顺序混乱; - 如果2020年的日期列名不是
2019,合并前一定要重命名成统一的(比如date),避免数据错位。
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

