无法在matplotlib中设置plt.xticks [英] Unable to set plt.xticks in matplotlib
问题描述
我有一个熊猫数据框( df
)
参数日期浓度单位规定标准是否超过标准? (是/否)备注
1 NaN 02/01/2017 26.10μg/ m3 NaN NaN NaN
2 NaN 03/01/2017 30.27μg/ m3 NaN NaN NaN
3 NaN 04 / 01/2017 36.36 µg / m3 NaN NaN NaN
4 NaN 2017年5月5日33.41 µg / m3 NaN NaN NaN
我试图绘制日期与浓度
的时间序列图,我使用<$ c将日期转换为datetime对象$ c> .to_datetime()
参数日期浓度单位规定的标准是否超过标准? (是/否)备注
1 NaN 2017-01-02 26.10 µg / m3 NaN NaN NaN
2 NaN 2017-01-03 30.27 µg / m3 NaN NaN NaN
3 NaN 2017- 01-04 36.36 µg / m3 NaN NaN NaN
4 NaN 2017-01-05 33.41 µg / m3 NaN NaN NaN NaN
使用以下命令可以轻松完成时间序列图:
plt.plot(df [ Date] [:322],df [浓度] [:322], +,color = red,线宽= 0.5)
但是,如果我尝试将xlabel更改为其他名称,请说出月份名称, plt.xticks([ Jan, Feb, Mar , Apr, May, Jun, Jul, Aug, Sept, Oct, Nov, Dec]))))))
错误:
----------------------- -------------------------------------------------- -
TypeError跟踪(最近一次通话最近)
〜/ .local / lib / python3.6 / site-packages / pandas / core / tools / datetimes.py in _convert_listlike(arg,box,for垫子,名称,tz)
302试试:
-> 303个值,tz = tslib.datetime_to_datetime64(arg)
304返回DatetimeIndex._simple_new(values,name = name,tz = tz)
pandas / _libs / tslib.pyx在pandas._libs中.tslib.datetime_to_datetime64()
TypeError:无法识别的值类型:< class'str'>
在处理上述异常期间,发生了另一个异常:
OutOfBoundsDatetime追溯(最近一次通话)
〜/ .local / lib / python3.6 / _convert_1d中的site-packages / pandas / plotting / _converter.py(值,单位,轴)
310试试:
-> 311值= tools.to_datetime(值)
312 if isinstance(值,索引):
〜/ .local / lib / python3.6 / site-packages / pandas / core / tools to_datetime中的/datetimes.py(arg,错误,dayfirst,yearfirst,utc,box,format,exact,unit,infer_datetime_format,origin)
379 elif is_list_like(arg):
-> 380结果= _convert_listlike(arg,box,format)
381 else:
〜/ .local / lib / python3.6 / site-packages / pandas / core / tools / datetimes.py在_convert_listlike(arg,box,format,name,tz)中
305除了(ValueError,TypeError):
-> 306提高e
307
〜/ .local / lib / python3.6 / site-packages / pandas / core / tools / datetimes.py in _convert_listlike(arg,box,format,name ,tz)
293 yearfirst = yearfirst,
-> 294 require_iso8601 = require_iso8601
295)
pandas中的pandas / _libs / tslib.pyx._libs.tslib.array_to_datetime()
pandas / _libs / tslib.pyx在pandas._libs.tslib.array_to_datetime()中
在pandas中的pandas / _libs / tslib.pyx._libs.tslib.array_to_datetime()
pandas / _libs / tslib.pyx在pandas._libs.tslib.array_to_datetime()中
在pandas中的pandas / _libs / tslib.pyx._libs.tslib.convert_datetime_to_tsobject()
pandas / _libs / tslib.pyx在pandas._libs.tslib._check_dts_bounds()中
OutOfBoundsDatetime:越界纳秒时间戳:1-01-01 00:00:00
在处理上述异常期间,则发生另一个异常:
AttributeError跟踪(最近一次调用最近)
< ipython-input-26-7f51ae7566c4>在< module>()
4
5 plt.plot(df_btm_pm25 [ Date] [:322],df_btm_pm25 [ Concentration] [:322], +,color =红色,线宽= 0.5)
----> 6 plt.xticks([ Jan, Feb, Mar, Apr, May, Jun, Jul])#, Aug, Sept, Oct, Nov, Dec])
7#axes.set_xticks(x)
8 axes.locator_params(nbins = 12)
〜/ .local / lib / python3。 6 / site-packages / matplotlib / pyplot.py in xticks(* args,** kwargs)
1722标签= ax.get_xticklabels()
1723 elif len(args)== 1:
-> 1724位置= ax.set_xticks(args [0])
1725标签= ax.get_xticklabels()
1726 Elif len(args)== 2:
〜/ .local set_xticks中的/lib/python3.6/site-packages/matplotlib/axes/_base.py(self,ticks,minor)
3206默认为``False''。
3207
-> 3208 ret = self.xaxis.set_ticks(ticks,minor = minor)
3209 self.stale = True
3210 return ret
〜/ .local / lib / python3.6 / site-packages / matplotlib / axis.py在set_ticks中(self,ticks,minor)
1676
1677#XXX if用户更改单位后,信息将丢失在这里
-> 1678滴答= self.convert_units(滴答声)
如果len(滴答声)> 1679 1:
1680 xleft,xright = self.get_view_interval()
〜/ .local / lib / python3.6 / site-packages / matplotlib / axis.py在convert_units(self,x )
1524回报x
1525
-> 1526 ret = self.converter.convert(x,self.units,self)
1527 return ret
1528
〜/ .local / lib / python3.6 / site- package / pandas / plotting / _converter.py in convert(values,unit,axis)
278 for v in values]
279 else:
-> 280个值= DatetimeConverter._convert_1d(值,单位,轴)
281个返回值
282
〜/ .local / lib / python3.6 / site-packages / pandas / _convert_1d(值,单位,轴)中的plotting / _converter.py
315值= [_x值中的__dt_to_float_ordinal(x)]
316,但例外:
-> 317个值= _dt_to_float_ordinal(值)
318
319个返回值
〜/ .local / lib / python3.6 / site-packages / pandas / plotting / _converter.py _dt_to_float_ordinal(dt)
263 base = days.epoch2num(dt.asi8 / 1.0E9)
264 else:
-> 265 base = dates.date2num(dt)
266 return base
267
〜/ .local / lib / python3.6 / site-packages / matplotlib / dates.py date2num(d)
450,如果不是d.size:
451 return d
-> 452 return _to_ordinalf_np_vectorized(d)
453
454
〜/ .local / lib / python3.6 / site-packages / numpy / lib / function_base.py在__call __(self ,* args,** kwargs)
2753 vargs.extend([kwargs [_n] for _n名称]))
2754
-> 2755 return self._vectorize_call(func = func,args = vargs)
2756
2757 def _get_ufunc_and_otypes(self,func,args):
〜/ .local / lib / python3 .6 / site-packages / numpy / lib / function_base.py in _vectorize_call(self,func,args)
2823 res = func()
2824 else:
-> 2825 ufunc,otypes = self._get_ufunc_and_otypes(func = func,args = args)
2826
2827#首先将args转换为对象数组
〜/ .local / lib / python3 .6 / site-packages / numpy / lib / function_base.py in _get_ufunc_and_otypes(self,func,args)
2783
2784输入= [arg.flat [0] for args中的arg]
-> 2785输出= func(*输入)
2786
2787#性能说明:性能分析表明-对于简单的
〜/ .local / lib / python3.6 / site- _to_ordinalf(dt)中的packages / matplotlib / dates.py
253 tzi = UTC
254
-> 255 base = float(dt.toordinal())
256
257#如果它的日期时间足够长,它将有一个`date()`方法
AttributeError:' str'对象没有属性'toordinal'
尽管,我可以通过<$ c $来更改刻度c> set_xticks 。我在这里缺少什么?
正如@ImportanceOfBeingErnest建议的那样,您应该使用
strftime()
指令 中提取的
I have a pandas dataframe (df
)
Parameter Date Concentration Unit Prescribed Standard Exceeding Standard? (Yes/No) Remarks
1 NaN 02/01/2017 26.10 µg/m3 NaN NaN NaN
2 NaN 03/01/2017 30.27 µg/m3 NaN NaN NaN
3 NaN 04/01/2017 36.36 µg/m3 NaN NaN NaN
4 NaN 05/01/2017 33.41 µg/m3 NaN NaN NaN
I am trying to plot the timeseries plot of Date vs Concentration
I converted the dates to datetime object using .to_datetime()
Parameter Date Concentration Unit Prescribed Standard Exceeding Standard? (Yes/No) Remarks
1 NaN 2017-01-02 26.10 µg/m3 NaN NaN NaN
2 NaN 2017-01-03 30.27 µg/m3 NaN NaN NaN
3 NaN 2017-01-04 36.36 µg/m3 NaN NaN NaN
4 NaN 2017-01-05 33.41 µg/m3 NaN NaN NaN
The time series plot is easily done using:
plt.plot(df["Date"][:322], df["Concentration"][:322], "+", color="red", linewidth=0.5)
But if I try to change the xlabels to anything else, say month names, plt.xticks(["Jan", "Feb","Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"])])
I get an error:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~/.local/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
302 try:
--> 303 values, tz = tslib.datetime_to_datetime64(arg)
304 return DatetimeIndex._simple_new(values, name=name, tz=tz)
pandas/_libs/tslib.pyx in pandas._libs.tslib.datetime_to_datetime64()
TypeError: Unrecognized value type: <class 'str'>
During handling of the above exception, another exception occurred:
OutOfBoundsDatetime Traceback (most recent call last)
~/.local/lib/python3.6/site-packages/pandas/plotting/_converter.py in _convert_1d(values, unit, axis)
310 try:
--> 311 values = tools.to_datetime(values)
312 if isinstance(values, Index):
~/.local/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, unit, infer_datetime_format, origin)
379 elif is_list_like(arg):
--> 380 result = _convert_listlike(arg, box, format)
381 else:
~/.local/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
305 except (ValueError, TypeError):
--> 306 raise e
307
~/.local/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
293 yearfirst=yearfirst,
--> 294 require_iso8601=require_iso8601
295 )
pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas/_libs/tslib.pyx in pandas._libs.tslib.convert_datetime_to_tsobject()
pandas/_libs/tslib.pyx in pandas._libs.tslib._check_dts_bounds()
OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1-01-01 00:00:00
During handling of the above exception, another exception occurred:
AttributeError Traceback (most recent call last)
<ipython-input-26-7f51ae7566c4> in <module>()
4
5 plt.plot(df_btm_pm25["Date"][:322], df_btm_pm25["Concentration"][:322], "+", color="red", linewidth=0.5)
----> 6 plt.xticks(["Jan", "Feb","Mar", "Apr", "May", "Jun", "Jul"])#, "Aug", "Sept", "Oct", "Nov", "Dec"])
7 #axes.set_xticks(x)
8 axes.locator_params(nbins=12)
~/.local/lib/python3.6/site-packages/matplotlib/pyplot.py in xticks(*args, **kwargs)
1722 labels = ax.get_xticklabels()
1723 elif len(args)==1:
-> 1724 locs = ax.set_xticks(args[0])
1725 labels = ax.get_xticklabels()
1726 elif len(args)==2:
~/.local/lib/python3.6/site-packages/matplotlib/axes/_base.py in set_xticks(self, ticks, minor)
3206 Default is ``False``.
3207 """
-> 3208 ret = self.xaxis.set_ticks(ticks, minor=minor)
3209 self.stale = True
3210 return ret
~/.local/lib/python3.6/site-packages/matplotlib/axis.py in set_ticks(self, ticks, minor)
1676 """
1677 # XXX if the user changes units, the information will be lost here
-> 1678 ticks = self.convert_units(ticks)
1679 if len(ticks) > 1:
1680 xleft, xright = self.get_view_interval()
~/.local/lib/python3.6/site-packages/matplotlib/axis.py in convert_units(self, x)
1524 return x
1525
-> 1526 ret = self.converter.convert(x, self.units, self)
1527 return ret
1528
~/.local/lib/python3.6/site-packages/pandas/plotting/_converter.py in convert(values, unit, axis)
278 for v in values]
279 else:
--> 280 values = DatetimeConverter._convert_1d(values, unit, axis)
281 return values
282
~/.local/lib/python3.6/site-packages/pandas/plotting/_converter.py in _convert_1d(values, unit, axis)
315 values = [_dt_to_float_ordinal(x) for x in values]
316 except Exception:
--> 317 values = _dt_to_float_ordinal(values)
318
319 return values
~/.local/lib/python3.6/site-packages/pandas/plotting/_converter.py in _dt_to_float_ordinal(dt)
263 base = dates.epoch2num(dt.asi8 / 1.0E9)
264 else:
--> 265 base = dates.date2num(dt)
266 return base
267
~/.local/lib/python3.6/site-packages/matplotlib/dates.py in date2num(d)
450 if not d.size:
451 return d
--> 452 return _to_ordinalf_np_vectorized(d)
453
454
~/.local/lib/python3.6/site-packages/numpy/lib/function_base.py in __call__(self, *args, **kwargs)
2753 vargs.extend([kwargs[_n] for _n in names])
2754
-> 2755 return self._vectorize_call(func=func, args=vargs)
2756
2757 def _get_ufunc_and_otypes(self, func, args):
~/.local/lib/python3.6/site-packages/numpy/lib/function_base.py in _vectorize_call(self, func, args)
2823 res = func()
2824 else:
-> 2825 ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
2826
2827 # Convert args to object arrays first
~/.local/lib/python3.6/site-packages/numpy/lib/function_base.py in _get_ufunc_and_otypes(self, func, args)
2783
2784 inputs = [arg.flat[0] for arg in args]
-> 2785 outputs = func(*inputs)
2786
2787 # Performance note: profiling indicates that -- for simple
~/.local/lib/python3.6/site-packages/matplotlib/dates.py in _to_ordinalf(dt)
253 tzi = UTC
254
--> 255 base = float(dt.toordinal())
256
257 # If it's sufficiently datetime-like, it will have a `date()` method
AttributeError: 'str' object has no attribute 'toordinal'
Although, I can change the ticks by set_xticks
. What am I missing here?
As @ImportanceOfBeingErnest suggested, you should use locators to reformat the xtick labels. I have implemented them below:
### Import necessary packages
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates # For formatting dates
### Make the figure
fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(15, 4.18))
# Original plot
ax[0].plot(df["Date"][:322],
df["Concentration"][:322],
"+", color="red", linewidth=0.5)
ax[0].set_title('Original plot')
# New xticks plot
months = mdates.MonthLocator() # Add tick every month
days = mdates.DayLocator(range(1,32,5)) # Add tick every 5th day in a month
monthFmt = mdates.DateFormatter('%b') # Use abbreviated month name
# Add the locators to the axis
ax[1].xaxis.set_major_locator(months)
ax[1].xaxis.set_major_formatter(monthFmt)
ax[1].xaxis.set_minor_locator(days)
# Plot
ax[1].plot(df["Date"][:322],
df["Concentration"][:322],
"+", color="red", linewidth=0.5)
ax[1].set_title('Updated xticks')
plt.show()
Here are some helpful resources:
- The matplotlib.dates api
strftime()
directives- This example, which I drew from heavily
这篇关于无法在matplotlib中设置plt.xticks的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!