我目前正在尝试使用matplotlib和pandas库绘制一个相当小的数据集。数据集的格式是CSV文件。这是数据集:
camera
我使用pandas加载数据集(可以看出,保存该数据集的文件名为' dataset.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
然后我尝试使用matplotlib绘制加载的数据集:
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('dataset.csv')
dataset['DATE'] = pd.to_datetime(dataset['DATE'])
上面的代码大部分工作正常,并显示如下图:
然而,问题是我希望在x轴上显示的数据,似乎只是以两个间隔绘制:
我发现问题Changing the “tick frequency” on x or y axis in matplotlib?,这与我的问题有关。但是,从我的测试来看,似乎只能使用积分值。
我还发现了问题controlling the number of x ticks in pyplot,它似乎为我的问题提供了解决方案。答案说使用的方法plt.plot(dataset['DATE'], dataset['UNRATE'])
plt.show()
是DatetimeIndex
的一种方法。由于我的理解是pandas.to_datetime
默认会返回to_pydatetime
,因此我可以在DatetimeIndex
上使用to_pydatetime
:
dataset['DATE']
然而,我收到了错误:
plt.xticks(dataset['DATE'].to_pydatetime())
由于这似乎只是默认行为,是否有办法强制matplotlib沿x轴绘制每个点的图形,而不是简单地绘制每个其他点的图形?
答案 0 :(得分:6)
要消除错误,您可以按如下方式转换日期,并相应地设置标签:
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个月显示为勾选标签。
对于其他情况,这可能会导致不同的刻度位置。
在一般情况下,您可以使用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()