Matplotlib pyplot - 刻度控制和日期显示

9

我的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()
2个回答

11
尝试完全删除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()

enter image description here


7
你可以使用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中选择每12个元素或选择每12个索引对应于所需显示的刻度的np.arange(0,len(dates),12)


1
min和max在日期上似乎无法正常工作。您有什么建议可以将"1999-01"设为最小值,"2014-06"设为最大值吗? - Coloane
你可以尝试使用日期的索引来实现吗?尝试使用 np.arange(0, len(dates), 12) - Pythontology
1
你也可以像这样做:plt.xticks(ts1[0::12])。(在此处查看双冒号选择器的行为示例。) - Pythontology
很想知道为什么这个回答被踩了,以便我可以改进它。谢谢! - Pythontology
我给它点了踩,因为你在评论中提供了额外的细节,但这些细节并没有编辑到答案本身中(这意味着人们需要阅读评论(可能会被删除)才能理解一切)。如果你编辑了这些细节,我很乐意撤销我的踩(尽管我不同意你的方法,而是更喜欢我的方法:P)。抱歉让你等了一段时间,我正在通勤上班。 - Ffisegydd
我修正了我的回答 - 感谢您的反馈。我在SO上还比较新,非常感谢您的建议 :) - Pythontology

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接