我目前正在尝试使用matplotlib和pandas库绘制一个相当小的数据集.数据集的格式是CSV文件.这是数据集:
DATE,UNRATE
1948-01-01,3.4
1948-02-01,3.8
1948-03-01,4.0
1948-04-01,3.9
1948-05-01,3.5
1948-06-01,3.6
1948-07-01,3.6
1948-08-01,3.9
1948-09-01,3.8
1948-10-01,3.7
1948-11-01,3.8
1948-12-01,4.0
我使用pandas加载数据集(可以看出,保存该数据集的文件名为’dataset.csv’):
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('dataset.csv')
dataset['DATE'] = pd.to_datetime(dataset['DATE'])
然后我尝试使用matplotlib绘制加载的数据集:
plt.plot(dataset['DATE'], dataset['UNRATE'])
plt.show()
然而,问题是我希望在x轴上显示的数据似乎只是以两个间隔绘制:
我找到了问题,Changing the “tick frequency” on x or y axis in matplotlib?,这与我的问题有关.但是,从我的测试来看,似乎只能使用积分值.
我还发现了问题controlling the number of x ticks in pyplot,它似乎为我的问题提供了解决方案.答案说使用的方法to_pydatetime是DatetimeIndex
的方法.由于我的理解是默认情况下pandas.to_datetime
会返回DatetimeIndex,我可以在数据集[‘DATE’]上使用to_pydatetime:
plt.xticks(dataset['DATE'].to_pydatetime())
但是,我收到了错误:
AttributeError: 'Series' object has no attribute 'to_pydatetime'
由于这似乎只是默认行为,是否有办法强制matplotlib沿x轴绘制每个点的图形,而不是简单地绘制每个其他点的图形?
解决方法:
plt.xticks(dataset['DATE'].tolist(),dataset['DATE'].tolist())
或者如评论中提到的那样
plt.xticks(dataset['DATE'].dt.to_pydatetime(),dataset['DATE'].dt.to_pydatetime())
但是让我们看看一些更有用的选项.
绘制字符串
首先,可以按原样绘制数据,即作为字符串.
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('dateunrate.txt')
plt.plot(dataset['DATE'], dataset['UNRATE'])
plt.setp(plt.gca().get_xticklabels(), rotation=45, ha="right")
plt.show()
这就像绘制plt.plot([“apple”,“banana”,“cherry”],[1,2,3]).这意味着连续日期只是在轴上一个接一个地放置,而不管它们是分钟,一天还是一年.例如.如果您的日期是2018-01-01,2018-01-03,2018-01-27,那么它们在轴上的间距仍会相等.
用熊猫绘制日期(自动)
如果日期在数据框的索引中,Pandas可以很好地绘制开箱即用的日期.为此,您可以以第一个csv列被解析为索引的方式读取数据帧.
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('dateunrate.txt', parse_dates=[0], index_col=0)
dataset.plot()
plt.show()
这相当于
dataset = pd.read_csv('../dateunrate.txt', parse_dates=[0])
dataset = dataset.set_index("DATE")
dataset.plot()
要么
dataset = pd.read_csv('../dateunrate.txt')
dataset["DATE"] = pd.to_datetime(dataset["DATE"])
dataset = dataset.set_index("DATE")
dataset.plot()
甚至
dataset = pd.read_csv('../dateunrate.txt')
dataset["DATE"] = pd.to_datetime(dataset["DATE"])
dataset.plot(x="DATE",y="UNRATE")
在这种情况下这很好用,因为你碰巧每月有一个日期,并且在这种情况下,大熊猫将决定将所有12个月显示为ticklabels.
对于其他情况,这可能导致不同的刻度位置.
用matplotlib或pandas绘图日期(手动)
在一般情况下,您可以使用matplotlib.dates格式化程序和定位器以您想要的方式调整tick(标签).在这里,我们可以使用MonthLocator并将ticklabel格式设置为“%b%Y”.这适用于matplotlib plot或pandas plot(x_compat = True).
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
dataset = pd.read_csv('dateunrate.txt', parse_dates=[0], index_col=0)
plt.plot(dataset.index, dataset['UNRATE'])
## or use
#dataset.plot(x_compat=True) #note the x_compat argument
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.setp(plt.gca().get_xticklabels(), rotation=45, ha="right")
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。