【问题标题】:Matplotlib pyplot - tick control and showing dateMatplotlib pyplot - 刻度控制和显示日期
【发布时间】:2014-08-13 06:32:24
【问题描述】:

我的matplotlib pyplot 有太多xticks - 它目前在 15 年期间每年和每月都显示,例如“2001-01”,但我只希望 x 轴显示年份(例如 2001 年)。

输出将是一个折线图,其中 x 轴显示日期,y 轴显示销售和租金价格。

# Defining the variables
ts1 = prices['Month'] # eg. "2001-01" and so on
ts2 = prices['Sale'] 
ts3 = prices['Rent'] 

# Reading '2001-01' as year and month
ts1 = [dt.datetime.strptime(d,'%Y-%m').date() for d in ts1]

plt.figure(figsize=(13, 9))
# Below is where it goes wrong. I don't know how to set xticks to show each year. 
plt.xticks(ts1, rotation='vertical')
plt.xlabel('Year')
plt.ylabel('Price')
plt.plot(ts1, ts2, 'r-', ts1, ts3, 'b.-')
plt.gcf().autofmt_xdate()
plt.show()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    尝试完全删除 plt.xticks 函数调用。然后 matplotlib 将使用默认的 AutoDateLocator 函数来查找最佳刻度位置。

    或者,如果默认值包括一些您不想要的月份,那么您可以使用matplotlib.dates.YearLocator,这将强制刻度仅为年。

    您可以在一个简单的示例中如下所示设置定位器:

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdate
    import numpy as np
    import datetime as dt
    
    x = [dt.datetime.utcnow() + dt.timedelta(days=i) for i in range(1000)]
    y = range(len(x))
    
    plt.plot(x, y)
    
    locator = mdate.YearLocator()
    plt.gca().xaxis.set_major_locator(locator)
    
    plt.gcf().autofmt_xdate()
    
    plt.show()
    

    【讨论】:

      【解决方案2】:

      您可以使用plt.xticks 来做到这一点。

      作为一个例子,我在这里设置了 xticks 频率以显示每三个索引。在您的情况下,您可能希望每十二个索引执行一次。

      import numpy as np
      import matplotlib.pyplot as plt
      
      x = np.arange(10)
      y = np.random.randn(10)
      
      plt.plot(x,y)
      plt.xticks(np.arange(min(x), max(x)+1, 3))
      plt.show()
      

      在您的情况下,由于您使用的是日期,因此您可以将上面倒数第二行的参数替换为 ts1[0::12] 之类的内容,这将从 ts1 或 np.arange(0, len(dates), 12) 中选择每个第 12 个元素,这将选择每个与您要显示的刻度对应的第 12 个索引。

      【讨论】:

      • min 和 max 似乎不适用于日期。您对如何将“1999-01”设置为最小值和“2014-06”设置为最大值有什么建议吗?
      • 您可以尝试使用日期索引吗?尝试使用np.arange(0, len(dates), 12)。
      • 您也可以执行plt.xticks(ts1[0::12]) 之类的操作。 (有关双冒号选择器行为的示例,请参见(此处)[stackoverflow.com/questions/1403674/…。)
      • 很高兴知道为什么这被否决了,这样我就可以改进我的答案。谢谢!
      • 我否决了它,因为您在 cmets 中提供了尚未编辑到答案本身的额外细节(这意味着人们需要通读 cmets(可能被删除)才能理解所有内容)。如果您编辑其中的细节,我很乐意将其反转(尽管我不同意您的方法并且(显然:P)更喜欢我自己的方法)。抱歉,我花了一段时间才回复,但正在通勤上班。
      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多