python x轴为年月格式_python-matplotlib:x轴上的时间戳格式

我正在尝试在天气数据图中格式化x轴.我对y轴感到满意,但是到目前为止,我为使x轴成为一种体面的,人类可读的格式所做的所有尝试都没有奏效.因此,经过数小时的反复试验,希望能对您有所帮助.

我正在努力实现的目标

最后,我希望每30分钟就有一个刻度线,每小时有一个垂直的虚线网格线,其下方写有HH:MM的时间,另外还有每天晚上00:00点写的日期.诸如此类(注意,前面的ASCII艺术不好!):

: : :

: : :

: : :

: : :

: : :

|====|====|====|====|====|====|====

23:00 00:00 01:00

09JAN18

所有时间都是UTC,这将是最终的豪华版本.但是我的问题是从更早开始的.

我的代码段

首先,我尝试将其转换为可读的格式.我想出了

locator = mdates.AutoDateLocator()

plt.gca().xaxis.set_major_locator(locator)

plt.gca().xaxis.set_major_formatter(mdates.AutoDateFormatter(locator))

希望我能摆脱经验

结果

输出不完全是我希望的:

pi@raspi3b:~/wx-logging $python plot.py

[( 15.94, 57.86, 992.65, 1019.99, 1515460740)

( 15.96, 57.8 , 992.65, 1019.99, 1515460745)

( 15.99, 57.79, 992.68, 1020.02, 1515460750) ...,

( 13.25, 55.7 , 990.16, 1017.43, 1515496060)

( 13.31, 56. , 990.14, 1017.41, 1515496065)

( 13.34, 56.32, 990.13, 1017.4 , 1515496070)]

Traceback (most recent call last):

File "plot.py", line 123, in

plt.savefig("plot.png", dpi=150)

File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 697, in savefig

res = fig.savefig(*args, **kwargs)

File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1572, in savefig

self.canvas.print_figure(*args, **kwargs)

File "/usr/lib/python2.7/dist-packages/matplotlib/backend_bases.py", line 2244, in print_figure

**kwargs)

File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 545, in print_png

FigureCanvasAgg.draw(self)

File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 464, in draw

self.figure.draw(self.renderer)

File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 63, in draw_wrapper

draw(artist, renderer, *args, **kwargs)

File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1143, in draw

renderer, self, dsu, self.suppressComposite)

File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images

a.draw(renderer)

File "/usr/lib/python2.7/dist-packages/mpl_toolkits/axes_grid1/parasite_axes.py", line 295, in draw

self._get_base_axes_attr("draw")(self, renderer)

File "/usr/lib/python2.7/dist-packages/mpl_toolkits/axisartist/axislines.py", line 778, in draw

super(Axes, self).draw(renderer, inframe)

File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 63, in draw_wrapper

draw(artist, renderer, *args, **kwargs)

File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 2409, in draw

mimage._draw_list_compositing_images(renderer, self, dsu)

File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images

a.draw(renderer)

File "/usr/lib/python2.7/dist-packages/mpl_toolkits/axisartist/axis_artist.py", line 915, in draw

gl = self._grid_helper.get_gridlines(self._which, self._axis)

File "/usr/lib/python2.7/dist-packages/mpl_toolkits/axisartist/axislines.py", line 546, in get_gridlines

locs.extend(self.axes.xaxis.major.locator())

File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 983, in __call__

self.refresh()

File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 1003, in refresh

dmin, dmax = self.viewlim_to_dt()

File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 760, in viewlim_to_dt

return num2date(vmin, self.tz), num2date(vmax, self.tz)

File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 401, in num2date

return _from_ordinalf(x, tz)

File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 254, in _from_ordinalf

dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)

ValueError: year is out of range

pi@raspi3b:~/wx-logging $

并不完全有希望.我不知道为什么会说ValueError:year超出范围,因为它是unix时代的时间戳.

我究竟做错了什么?如何获得上面概述的预期结果?我非常感谢朝着正确方向前进.谢谢您的帮助!

祝一切顺利,

克里斯

完整的脚本

为了给您一些背景,到目前为止我完整的脚本.

#!/usr/bin/python

# -*- coding: utf-8 -*-

import matplotlib

matplotlib.use('AGG')

from mpl_toolkits.axes_grid1 import host_subplot

import mpl_toolkits.axisartist as aa

import matplotlib.pyplot as plt

import matplotlib.dates as mdates

from matplotlib.ticker import FuncFormatter

import numpy as np

from numpy import vectorize

import datetime

import shutil

import math

# Dewpoint calculation

def dewpoint(tempC, rlHum):

r = 8314.3

mw = 18.016

if tempC >= 0:

a = 7.5

b = 237.3

# over water:

# elif tempC < 0:

# a = 7.6

# b = 240.7

#

# over ice:

elif tempC < 0:

a = 9.5

b = 265.5

saettDampfDruck = 6.1078 * 10**((a*tempC)/(b+tempC))

dampfDruck = rlHum / 100.0 * saettDampfDruck

v = math.log10(dampfDruck/6.1078)

dewpC = b*v/(a-v)

return dewpC

# translate cm into inches

def cm2inch(*tupl):

inch = 2.54

if isinstance(tupl[0], tuple):

return tuple(i/inch for i in tupl[0])

else:

return tuple(i/inch for i in tupl)

vdewpoint = vectorize(dewpoint)

convertDate = lambda x: datetime.datetime.utcfromtimestamp(x)

data = np.genfromtxt('/home/pi/wx-logging/wx-log2.txt',

delimiter=';',

usecols=(1, 2, 3, 5, 6),

names=['temp', 'humidity', 'press', 'slp', 'time'],

converters={'6': convertDate},

dtype='float, float, float, float, int')

print data

plt.figure(figsize=cm2inch(29.7, 21))

host = host_subplot(111, axes_class=aa.Axes)

plt.subplots_adjust(right=0.75)

par1 = host.twinx()

par2 = host.twinx()

offset = 70 # offset of detached axis

new_fixed_axis = par2.get_grid_helper().new_fixed_axis

par2.axis["right"] = par2.get_grid_helper().new_fixed_axis(loc="right",

axes=par2,

offset=(offset, 0))

par1.axis["right"].toggle(all=True)

par2.axis["right"].toggle(all=True)

host.set_title("Weather Station")

host.set_xlabel("Time")

host.set_ylabel("Temperature & Dewpoint [" + u'°'+ "C]")

par1.set_ylabel("Sealevel Pressure [hPa]")

par2.set_ylabel("relative Humidity [%]")

host.set_ylim([-20, 40]) # temperature range -20C ... +40C

par1.set_ylim([980, 1040]) # slp range 980hPa ... 1040hPa

par2.set_ylim([0, 100]) # percent

p1, = host.plot(data['time'],

data['temp'],

label="Temperature",

color="red",

linewidth=2)

p2, = host.plot(data['time'],

vdewpoint(data['temp'],

data['humidity']),

label="Dewpoint",

color="salmon",

linewidth=0.75)

p3, = par1.plot(data['time'],

data['slp'],

label="Sealevel Pressure",

color="blue",

linewidth=0.75)

p4, = par2.plot(data['time'],

data['humidity'],

label="rel. Humidity",

color="grey",

linewidth=0.5)

locator = mdates.AutoDateLocator()

plt.gca().xaxis.set_major_locator(locator)

plt.gca().xaxis.set_major_formatter(mdates.AutoDateFormatter(locator))

plt.legend(bbox_to_anchor=(0.05, 0.05),

loc=3,

ncol=2,

borderaxespad=0.)

plt.savefig("plot.png", dpi=150)

shutil.copyfile('/home/pi/wx-logging/plot.png', '/var/www/html/plot.png')

EDIT1:您可以下载带有示例数据的wx-log2.txt(?58KB),以试验脚本. tiago正确建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值