【问题标题】:seaborn plot misplotting x axis dates from pandasseaborn plot 错误地绘制了 pandas 的 x 轴日期
【发布时间】:2019-09-19 05:33:13
【问题描述】:

我正在尝试在 seaborn 中绘制一个线图,其中 y 轴的值和 x 轴的日期来自 pandas 数据框。

当我创建线图而不将日期列转换为日期时间对象时,它会将日期置于错误的顺序。当我将日期列转换为日期时间格式时,它会给出奇怪的 x 标签,并且只显示 5 个日期。

df = pd.read_csv("dddd.csv")
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values(["date"])
ax = sns.lineplot(y=df["google"],x=df["date"],color="red",data=df)

plt.show()

我只想绘制带有 x 标签的数据,这些标签是按顺序排列的日期。这是一些示例数据。

25-03-2019  -100
26-03-2019  -66.66666667
27-03-2019  -80
28-03-2019  -87.08333333
29-03-2019  -88.88888889
30-03-2019  -86.28526646
31-03-2019  -87.5
01-04-2019  -87.87878788
02-04-2019  -82.92682927
03-04-2019  -84.09090909
04-04-2019  -84.7826087
05-04-2019  -85.71428571
06-04-2019  -81.30677848
07-04-2019  -81.98051948
08-04-2019  -82.14285714
09-04-2019  -78.46153846
10-04-2019  -76.05633803
11-04-2019  -75
12-04-2019  -75
13-04-2019  -80
14-04-2019  -83.33333333
15-04-2019  -83.33333333
16-04-2019  -77.77777778
17-04-2019  -68
18-04-2019  -54.70085471
19-04-2019  -64.70588235
20-04-2019  -66.66666667

【问题讨论】:

标签: python matplotlib seaborn


【解决方案1】:

尽管这个问题肯定是重复的,但这里有一些解释:

  1. 如果不转换为 datetime,您的 x 轴是无序的,因为 python 不理解这些值是日期。在这里,它可能会为每个点画一个勾号,因为它不知道如何在连续范围内拟合“16-04-2019”。 (尝试在 x 轴上绘制一个字符串数组作为比较)。

  2. 如果您确实转换为datetimeseaborn,并且 pandas 足够聪明,可以注意到您的日期形成一个连续的刻度。因为ticklabels在绘制所有它们时会重叠,所以它会忽略其中一些,而是定期绘制刻度。

您可以用ax.set_ticks(locations) 影响位置,用ax.tick_params(rotation=90, horizontal_alignment='left') 影响他们的风格或用ax.set_xticklabels(labels) 影响他们的标签。 (以关键字为例)。

你也可以使用

import matplotlib.dates ad md

locs = md.YearLocator() # Locations for yearly ticks
format = md.MajorFormatter('%B %Y') # Format for labels

访问格式化程序函数并ax.set_major_locator / formatter 将它们应用到您的绘图中。

要简单地为每个数据点绘制一个刻度,在您的情况下使用:

ax.set_xticks(df["Date"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2018-03-12
    • 2021-06-17
    • 2021-09-27
    相关资源
    最近更新 更多