无法在matplotlib中设置plt.xticks [英] Unable to set plt.xticks in matplotlib

查看:682
本文介绍了无法在matplotlib中设置plt.xticks的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个熊猫数据框( 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:

    这篇关于无法在matplotlib中设置plt.xticks的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆