matplotlib只在x轴上没有周末的工作日与plot_date

leo*_*lds 5 python matplotlib

我有以下持久性问题:

以下代码应绘制一条直线:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
d = pd.date_range(start="1/1/2012", end="2/1/2012", freq="B")
v = np.linspace(1,10,len(d))
plt.plot_date(d,v,"-")
Run Code Online (Sandbox Code Playgroud)

但我得到的只是一条参差不齐的线,因为"​​plot_date"以某种方式用周末填写"d"中的日期.

有没有办法强制matplotlib采取我的日期(仅工作日),而不是提交周末日期?

锯齿状线而不是直线

>>>d
DatetimeIndex(['2012-01-02', '2012-01-03', '2012-01-04', '2012-01-05',
               '2012-01-06', '2012-01-09', '2012-01-10', '2012-01-11',
               '2012-01-12', '2012-01-13', '2012-01-16', '2012-01-17',
               '2012-01-18', '2012-01-19', '2012-01-20', '2012-01-23',
               '2012-01-24', '2012-01-25', '2012-01-26', '2012-01-27',
               '2012-01-30', '2012-01-31', '2012-02-01'],
               dtype='datetime64[ns]', freq='B')
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 6

plot_date有一个技巧,它将日期转换为自 1-1-1 以来的天数并使用这些数字进行绘图,然后再次将刻度转换为日期以绘制漂亮的刻度标签。因此,使用plot_date每一天都算作 1,无论业务与否。

您可以根据统一的数字范围绘制数据,但如果您想要日期作为刻度标签,则需要自己完成。

d = pd.date_range(start="1/1/2012", end="2/1/2012", freq="B")
v = np.linspace(1,10,len(d))

plt.plot(range(d.size), v)
xticks = plt.xticks()[0]
xticklabels = [(d[0] + x).strftime('%Y-%m-%d') for x in xticks.astype(int)]
plt.xticks(xticks, xticklabels)
plt.autoscale(True, axis='x', tight=True)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但请注意,标签可能具有误导性。2012-01-02 和 2012-01-09 之间的段代表五天,而不是七天。