You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

说明

  1. 不使用so.Nominal(),保留X轴的连续时间类型,确保时间间距正确。
  2. 通过ax.set_xticks(unique_dates)强制显示所有唯一的日期刻度。
  3. 使用mdates.DateFormatter格式化日期显示格式,提升可读性。
  4. 旋转刻度标签并调用plt.tight_layout()避免标签重叠或被截断。

内容的提问来源于stack exchange,提问作者linkey apiacess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:49:50