如何在Seaborn Objects堆叠面积图X轴显示全部日期
问题:Seaborn Objects堆叠面积图X轴显示异常的解决方法
使用Seaborn barplot无堆叠功能,改用Seaborn Objects类绘制堆叠面积图时,X轴仅显示3个日期;尝试结合Matplotlib设置轴时,因错误将时间轴转为分类变量,导致丢失时间间距,轴显示混乱。需要实现X轴显示全部日期且保留时间间距。
数据样本
import pandas as pd import datetime t = ["2019-05-10 03:00:00", "2019-05-10 09:00:00", "2019-05-10 15:00:00", "2019-05-10 21:00:00", "2019-05-11 03:00:00", "2019-05-11 09:00:00", "2019-05-11 15:00:00", "2019-05-11 21:00:00", "2019-05-12 03:00:00", "2019-05-12 09:00:00", "2019-05-12 15:00:00", "2019-05-12 21:00:00", "2019-05-13 03:00:00", "2019-05-13 09:00:00", "2019-05-13 15:00:00", "2019-05-13 21:00:00", "2019-05-14 03:00:00", "2019-05-14 09:00:00", "2019-05-14 15:00:00", "2019-05-14 21:00:00", "2019-05-15 03:00:00", "2019-05-15 15:00:00", "2019-05-16 15:00:00", "2019-05-10 03:00:00", "2019-05-10 09:00:00", "2019-05-10 15:00:00", "2019-05-10 21:00:00", "2019-05-11 03:00:00", "2019-05-11 09:00:00", "2019-05-11 15:00:00", "2019-05-11 21:00:00", "2019-05-12 03:00:00", "2019-05-12 09:00:00", "2019-05-12 15:00:00", "2019-05-12 21:00:00", "2019-05-13 03:00:00", "2019-05-13 09:00:00", "2019-05-13 15:00:00", "2019-05-13 21:00:00", "2019-05-14 03:00:00", "2019-05-14 09:00:00", "2019-05-14 15:00:00", "2019-05-14 21:00:00", "2019-05-15 03:00:00", "2019-05-15 15:00:00", "2019-05-16 15:00:00"] k = ["hit","hit","hit","hit","hit","hit","hit","hit","hit","hit","hit","hit", "hit","hit","hit","hit","hit","hit","hit","hit","hit","hit","hit", "mis","mis","mis","mis","mis","mis","mis","mis","mis","mis","mis","mis", "mis","mis","mis","mis","mis","mis","mis","mis","mis","mis","mis",] v = [0.1, 0.7, 0.3, 0.4, 0.3, 0.4, 0.5, 0.6, 0.4, 0.3, 0.4, 0.3, 0.4, 0.5, 0.4, 0.5, 0.6, 0.4, 0.3, 0.4, 0.3, 0.4, 0.5, 0.4, 0.3, 0.4, 0.5, 0.6, 0.4, 0.3, 0.4, 0.3, 0.4, 0.5, 0.2, 0.2, 0.3, 0.4, 0.3, 0.4, 0.5, 0.6, 0.4, 0.3, 0.4, 0.3] mydf = pd.DataFrame({"date":t,"attack":k, "score":v}) mydf['date'] = mydf['date'].apply(lambda x: datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S"))
原绘图代码
import seaborn.objects as so so.Plot(mydf, x="date", y="score", color="attack").add(so.Area(), so.Stack())
尝试的解决代码(存在问题)
import matplotlib.pyplot as plt f, ax = plt.subplots() data_plot = so.Plot(mydf, x="date", y="score", color="attack").add(so.Area(), so.Stack()).scale(x=so.Nominal()) plt.xticks(rotation=90) data_plot.on(ax).show()
问题原因:使用scale(x=so.Nominal())将时间轴转为了分类变量,丢失了时间的连续间距,导致轴显示混乱。
正确解决方案
保留X轴的时间类型,通过Matplotlib的日期格式化工具手动设置所有刻度,同时保留时间间距:
import matplotlib.pyplot as plt import matplotlib.dates as mdates import seaborn.objects as so # 绘制堆叠面积图并获取轴对象 fig, ax = plt.subplots(figsize=(12,6)) plot = so.Plot(mydf, x="date", y="score", color="attack").add(so.Area(), so.Stack()) plot.on(ax).show() # 设置X轴刻度为所有唯一的日期 unique_dates = mydf['date'].unique() ax.set_xticks(unique_dates) # 格式化日期显示,避免重叠 ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d %H:%M")) plt.xticks(rotation=90) # 调整布局,防止标签被截断 plt.tight_layout() plt.show()
说明
- 不使用
so.Nominal(),保留X轴的连续时间类型,确保时间间距正确。 - 通过
ax.set_xticks(unique_dates)强制显示所有唯一的日期刻度。 - 使用
mdates.DateFormatter格式化日期显示格式,提升可读性。 - 旋转刻度标签并调用
plt.tight_layout()避免标签重叠或被截断。
内容的提问来源于stack exchange,提问作者linkey apiacess
相关产品推荐
相关产品推荐

