如何从matplotlib图中删除微秒?

时间:2015-03-04 22:40:53

标签: python matplotlib axis-labels

我已经阅读了pylab示例和许多轴格式化问题,但仍然无法从下图中的x轴移除微秒。

尝试更改轴/刻度属性及其输出之前的原始代码。

enter image description here

#filenames to be read in
file0 = 'results'         


#Get data from file strore in record array
def readIn(fileName):
    temp = DataClass()
    with open('%s.csv' % fileName) as csvfile:
        temp = mlab.csv2rec(csvfile,names = ['date', 'band','lat'])
    return temp

#plotting function(position number, x-axis data, y-axis data,
#                       filename,data type, units, y axis scale)
def iPlot(num,xaxi,yaxi,filename,types, units,scale):
    plt.subplot(2,1,num)
    plt.plot_date(xaxi,yaxi,'-')
    plt.title(filename + "--%s" % types )
    plt.ylabel(" %s  %s " % (types,units))
    plt.ylim(0,scale)
    plt.xticks(rotation=20)



# Set plot Parameters and call plot funciton
def plot():
    nameB = "Bandwidth"
    nameL = "Latency"
    unitsB = " (Mbps)"
    unitsL = "(ms)"
    scaleB = 30
    scaleL = 500

    iPlot(1,out0['date'],out0['lat'],file0,nameL,unitsL,scaleL)
    iPlot(2,out0['date'],out0['band'],file0,nameB,unitsB,scaleB)

def main():
    global out0 
    print "Creating plots..."

    out0 = readIn(file0)
    plot()

    plt.show()

main()

我的尝试是通过添加:

来改变上面的代码
months   = date.MonthLocator()  # every month
days     = date.DayLocator()
hours    = date.HourLocator()
minutes    = date.MinuteLocator()
seconds   = date.SecondLocator()


def iPlot(num,xaxi,yaxi,filename,types, units,scale):
    plt.subplot(2,1,num)
    plt.plot_date(xaxi,yaxi,'-')
    plt.title(filename + "--%s" % types )
    plt.ylabel(" %s  %s " % (types,units))
    plt.ylim(0,scale)

    # Set Locators
    ax.xaxis.set_major_locator(days)
    ax.xaxis.set_minor_locator(hours)

    majorFormatter = date.DateFormatter('%M-%D %H:%M:%S')
    ax.xaxis.set_major_formatter(majorFormatter)
    ax.autoscale_view()

我设置的主要格式化程序是否默认写入了?有没有办法只关闭微秒而不会与其余的格式混淆?由于我的数据不包含,我很清楚微秒来自何处。

2 个答案:

答案 0 :(得分:3)

我的代码存在一些问题。首先,它不起作用(我的意思是,即使我制作了所有的模拟样本数据,它也不起作用)。其次,它并不是一个展示错误的最小工作示例,我无法弄清楚date是什么,我推测matplotlib.dates?第三,我看不到你的情节(你的完整标签上还有'%M-%D部分)

现在我遇到的问题是,我无法弄清楚你是如何通过('%M-%D %H:%M:%S')排除错误的语法。 (Matplotlib 1.3.1 Win7都在python2.6.6和3.4上)。我无法看到您的ax是什么,或者您的数据是什么样的,当涉及到这样的内容时,所有这些都可能会出现问题。即使过长的时间跨度也会导致嘀嗒声溢出"溢出" (特别是当你试图将小时定位器放在一定年限范围内时,即我认为在7200个小时内抛出一个错误?)

与此同时,这是我最小的工作示例,它不会显示与您相同的行为。

import matplotlib as mpl
import matplotlib.pyplot as plt
import datetime as dt

days     = mpl.dates.DayLocator()
hours    = mpl.dates.HourLocator()


x = []
for i in range(1, 30):
    x.append(dt.datetime(year=2000, month=1, day=i,
                             hour=int(i/3), minute=i, second=i))
y = []
for i in range(len(x)):
    y.append(i)

fig, ax = plt.subplots()
plt.xticks(rotation=45)
ax.plot_date(x, y, "-")

ax.xaxis.set_major_locator(days)
ax.xaxis.set_minor_locator(hours)

majorFormatter = mpl.dates.DateFormatter('%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(majorFormatter)
ax.autoscale_view()

plt.show()

enter image description here

(这一切都不应该是一个答案,也许它会对你有所帮助,但是它的评论时间太长了)。

答案 1 :(得分:0)

如果您没有使用子图,请不要使用它们。

只需删除对subplot()subplots()函数的任何提及,然后获取您可以使用的轴句柄:ax = plt.gca()高于对ax的任何引用。

可能是这样的:

...
# Set Locators
ax = plt.gca()
ax.xaxis.set_major_locator(days)
ax.xaxis.set_minor_locator(hours)
...

然后,您会收到ValueError: Invalid format string错误 - 可能是因为%D不是valid strftime string formatting directive。 (您可能需要%m-%d %H:%M:%S。)如果您解决了这个问题,您的绘图将与您的格式化程序一起显示。