在图表中显示整个X轴刻度

时间:2016-02-29 12:58:18

标签: python matplotlib

我正在尝试完全显示我的图表的刻度标签,但是尽管付出了努力,但我没有得到理想的结果。

如果我只使用autofmt_xdate(),则会正确显示日期,但不会对每个数据点进行绘制;但是,如果我通过将datetime个对象传递给xtick()来强制显示我的x刻度标签,它似乎只显示年份。

    fig1 = plt.figure(1)
    # x is a list of datetime objects
    plt.title('Portfolio Instruments')
    plt.subplot(111)
    plt.plot(x, y)
    plt.xticks(fontsize='small')
    plt.yticks([i * 5 for i in range(0, 15)])
    fig1.autofmt_xdate()
    plt.show()

将x传递给plt.xticks()的图表: With passed X labels

没有将x传递给plt.xticks()的图表 Without passed X labels

我的错误在哪里?我找不到了。

问题 如何绘制x的所有数据点并对其进行格式化以显示我使用autofmt_xdate()传递图形的整个日期时间对象?

我有一个日期时间对象列表,我想将其作为我的情节的x值传递。

2 个答案:

答案 0 :(得分:1)

我很确定我有类似的问题,我解决它的方法是使用以下代码:

def formatFig():
    date_formatter = DateFormatter('%H:%M:%S') #change the format here to whatever you like
    plt.gcf().autofmt_xdate()
    ax = plt.gca()
    ax.xaxis.set_major_formatter(date_formatter)
    max_xticks = 10      # sets the number of x ticks shown. Change this to number of data points you have
    xloc = plt.MaxNLocator(max_xticks)
    ax.xaxis.set_major_locator(xloc)

def makeFig():
    plt.plot(xList,yList,color='blue')    
    formatFig()

makeFig()
plt.show(block=True)

这是一个非常简单的示例,但您应该能够转移formatfig()部分以在代码中使用。

答案 1 :(得分:1)

将您想要的日期传递到xticks,然后使用plt.gca().xaxis.set_major_formatter设置x轴的主格式化程序:

然后,您可以使用DateFormatter from matplotlib.dates,并使用strftime格式字符串来获取问题中的格式:

import matplotlib.dates as dates
fig1 = plt.figure(1)
# x is a list of datetime objects
plt.title('Portfolio Instruments')
plt.subplot(111)
plt.plot(x, y)

plt.xticks(x,fontsize='small') 
plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%b %d %Y'))

plt.yticks([i * 5 for i in range(0, 15)])

fig1.autofmt_xdate()
plt.show()

enter image description here

注意:我使用下面的代码为上面的图创建了数据,因此x只是一个月中每个工作日的datetime个对象列表(即没有周末)。

import numpy as np
from datetime import datetime,timedelta

start = datetime(2016, 1, 1)
end = datetime(2016, 2, 1)
delta = timedelta(days=1)
d = start
weekend = set([5, 6])

x = []
while d <= end:
    if d.weekday() not in weekend:
        x.append(d)
    d += delta

y = np.random.rand(len(x))*70