Python Plot X Label半小时频繁

时间:2017-09-16 14:12:09

标签: python pandas matplotlib

我希望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看起来像这样:

x-axis image

问题是什么? 我有48个值,每个值代表一天半小时的值

2 个答案:

答案 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)

enter image description here

答案 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()

enter image description here

<强> 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')

enter image description here

但我也喜欢这里提出的替代方法:)