如何 set_xticklabels 到 pandas DataFrame 的相应 "dates" 列?
How to set_xticklabels to corresponding "dates" column of a pandas DataFrame?
问题
我有一个 pandas 数据框,其中包含两列数据和另一列中的相应日期时间。我想为两组数据制作一个线图,并将日期时间(字符串列表)作为 x 轴刻度标签。但是当我绘制绘图时,刻度标签与该日期的相应数据不一致。相反,xlabels 仅来自日期列的前 n 个条目。
我原来的程序在每个数据点都有一个刻度,所以我尝试设置 ax.set_xticks 来减少刻度的数量,这就是这个问题出现的时候。
代码
import numpy as np
import datetime
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
data = { 'Set1': np.random.rand(24),
'Set2': np.random.rand(24)
}
df = pd.DataFrame(data,columns=['Set1','Set2'])
date_list = []
base = datetime.datetime(2000,1,1,0)
for i in range(len(df.Set1)):
date = base + datetime.timedelta(hours=i*3)
date_frmt = date.strftime("%b%d%Hz")
date_list.append(str(date_frmt))
df['Dates'] = date_list
print(df)
Set1 Set2 Dates
0 0.521824 0.371057 Jan0100z
1 0.726503 0.945712 Jan0103z
2 0.881100 0.725798 Jan0106z
3 0.432198 0.549191 Jan0109z
4 0.083255 0.297057 Jan0112z
5 0.428145 0.441973 Jan0115z
6 0.168049 0.411889 Jan0118z
7 0.654588 0.822227 Jan0121z
8 0.540984 0.824515 Jan0200z
9 0.999410 0.809121 Jan0203z
10 0.055359 0.901241 Jan0206z
11 0.163407 0.085901 Jan0209z
12 0.523488 0.011856 Jan0212z
13 0.133038 0.881413 Jan0215z
14 0.880946 0.301656 Jan0218z
15 0.575265 0.972408 Jan0221z
16 0.489332 0.399983 Jan0300z
17 0.119246 0.216152 Jan0303z
18 0.805346 0.873699 Jan0306z
19 0.806190 0.277772 Jan0309z
20 0.868357 0.311854 Jan0312z
21 0.042386 0.461695 Jan0315z
22 0.354832 0.262534 Jan0318z
23 0.209049 0.780153 Jan0321z
ax = df.plot(figsize=(10, 5))
ax.set_xticklabels(df.Dates)
问题
如何让刻度标签与其对应数据正确对齐?
你可以在ax = df.plot(figsize=(10, 5))
之后使用这一行:
plt.xticks(np.arange(df.shape[0])[::1], df.Dates[::1], rotation=35)
索引部分[::1]
让你选择你想要放置它们的间隔(这里是所有的,但它会很杂乱)。所以你不需要这一行 ax.set_xticklabels(df.Dates)
.
你可以使用pyplot的DateFormatter
:
fig, ax = plt.subplots()
for col in ['Set1', 'Set2']:
ax.plot(df['Dates'], df[col], label=col)
ax.legend()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b%d%Hz'))
输出:
问题
我有一个 pandas 数据框,其中包含两列数据和另一列中的相应日期时间。我想为两组数据制作一个线图,并将日期时间(字符串列表)作为 x 轴刻度标签。但是当我绘制绘图时,刻度标签与该日期的相应数据不一致。相反,xlabels 仅来自日期列的前 n 个条目。
我原来的程序在每个数据点都有一个刻度,所以我尝试设置 ax.set_xticks 来减少刻度的数量,这就是这个问题出现的时候。
代码
import numpy as np
import datetime
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
data = { 'Set1': np.random.rand(24),
'Set2': np.random.rand(24)
}
df = pd.DataFrame(data,columns=['Set1','Set2'])
date_list = []
base = datetime.datetime(2000,1,1,0)
for i in range(len(df.Set1)):
date = base + datetime.timedelta(hours=i*3)
date_frmt = date.strftime("%b%d%Hz")
date_list.append(str(date_frmt))
df['Dates'] = date_list
print(df)
Set1 Set2 Dates 0 0.521824 0.371057 Jan0100z 1 0.726503 0.945712 Jan0103z 2 0.881100 0.725798 Jan0106z 3 0.432198 0.549191 Jan0109z 4 0.083255 0.297057 Jan0112z 5 0.428145 0.441973 Jan0115z 6 0.168049 0.411889 Jan0118z 7 0.654588 0.822227 Jan0121z 8 0.540984 0.824515 Jan0200z 9 0.999410 0.809121 Jan0203z 10 0.055359 0.901241 Jan0206z 11 0.163407 0.085901 Jan0209z 12 0.523488 0.011856 Jan0212z 13 0.133038 0.881413 Jan0215z 14 0.880946 0.301656 Jan0218z 15 0.575265 0.972408 Jan0221z 16 0.489332 0.399983 Jan0300z 17 0.119246 0.216152 Jan0303z 18 0.805346 0.873699 Jan0306z 19 0.806190 0.277772 Jan0309z 20 0.868357 0.311854 Jan0312z 21 0.042386 0.461695 Jan0315z 22 0.354832 0.262534 Jan0318z 23 0.209049 0.780153 Jan0321z
ax = df.plot(figsize=(10, 5))
ax.set_xticklabels(df.Dates)
问题
如何让刻度标签与其对应数据正确对齐?
你可以在ax = df.plot(figsize=(10, 5))
之后使用这一行:
plt.xticks(np.arange(df.shape[0])[::1], df.Dates[::1], rotation=35)
索引部分[::1]
让你选择你想要放置它们的间隔(这里是所有的,但它会很杂乱)。所以你不需要这一行 ax.set_xticklabels(df.Dates)
.
你可以使用pyplot的DateFormatter
:
fig, ax = plt.subplots()
for col in ['Set1', 'Set2']:
ax.plot(df['Dates'], df[col], label=col)
ax.legend()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b%d%Hz'))
输出: