我希望X标签像:
00:00 00:30 01:00 01:30 02:00 ...... 23:30
我的代码:
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
import random
data = [random.random() for i in range(48)]
times = pd.date_range('16-09-2017', periods=48, freq='30MIN')
fig, ax = plt.subplots(1)
fig.autofmt_xdate()
plt.plot(times, data)
xfmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)
plt.show()
但我的X-Label看起来像这样:
问题是什么? 我有48个值,每个值代表一天半小时的值
答案 0 :(得分:3)
您可以使用MinuteLocator
并每隔0和30分钟明确设置一次。
minlocator = mdates.MinuteLocator(byminute=[0,30])
ax.xaxis.set_major_locator(minlocator)
并清理它 - 删除无关的刻度并填写空白区域。
xticks = ax.get_xticks()
ax.set_xticks(xticks[2:-2]);
hh = pd.Timedelta('30min')
ax.set_xlim(times[0] - hh, times[-1] + hh)
答案 1 :(得分:-1)
修改强> 由于我的答案已经被接受但是没有正常工作,我为matplotlib和pandas添加了简化的解决方案
关键是正确设置x-ticks
参数
在您的情况下,它可能如下所示:
data = [random.random() for i in range(48)]
times = pd.date_range('16-09-2017', periods=48, freq='30MIN')
在这两种情况下,您只想使用小时和分钟:
hour_minutes = times.strftime('%H:%M')
<强> 1。 Matplotlib解决方案
plt.figure(figsize=(12,5))
plt.plot(range(len(data)),data)
# .plot(times, data)
plt.xticks(range(len(hour_minutes)), hour_minutes, size='small',
rotation=45, horizontalalignment='center')
plt.show()
<强> 2。熊猫解决方案
# create dataframe from arrays (not neccessary, but nice)
df = pd.DataFrame({'values': data,
'hour_minutes': hour_minutes})
# specify size of plot
value_plot = df.plot(figsize=(12,5), title='Value by Half-hours')
# first set number of ticks
value_plot.set_xticks(df.index)
# and label them after
value_plot.set_xticklabels(df.hour_minutes, rotation=45, size='small')
# get the plot figure and save it
fig = value_plot.get_figure()
fig.savefig('value_plot.png')
但我也喜欢这里提出的替代方法:)