gpt4 book ai didi

python - 如何禁用 matplotlib 中的日期插值?

转载 作者:太空狗 更新时间:2023-10-30 02:52:03 24 4
gpt4 key购买 nike

尽管在 SO 和 Matplotlib 的文档中尝试了一些可用的解决方案,但我仍然无法禁用 Matplotlib 在 x 轴上创建周末日期。

正如您在下面看到的,它将不在原始 Pandas 列中的日期添加到 x 轴。

enter image description here

我正在绘制我的数据(注释行未能成功实现我的目标):

fig, ax1 = plt.subplots()

x_axis = df.index.values
ax1.plot(x_axis, df['MP'], color='k')
ax2 = ax1.twinx()
ax2.plot(x_axis, df['R'], color='r')

# plt.xticks(np.arange(len(x_axis)), x_axis)
# fig.autofmt_xdate()
# ax1.fmt_xdata = mdates.DateFormatter('%Y-%m-%d')

fig.tight_layout()
plt.show()

下面是我的 Pandas 数据框示例,以日期作为索引:

2019-01-09  1.007042  2585.898714  4.052480e+09  19.980000  12.07     1
2019-01-10 1.007465 2581.828491 3.704500e+09 19.500000 19.74 1
2019-01-11 1.007154 2588.605258 3.434490e+09 18.190001 18.68 1
2019-01-14 1.008560 2582.151225 3.664450e+09 19.070000 14.27 1

我发现的一些建议包括自定义代码 herehere然而,尽管我没有收到错误,但情节缺少我的第二个系列。

关于如何在 matplotlib 中禁用日期插值有什么建议吗?

最佳答案

matplotlib 网站 recommends creating a custom formatter class .如果日期是周末,此类将包含告诉轴标签不显示任何内容的逻辑。这是一个使用数据框的示例,该数据框是我根据您所附图片中的 2018 年数据构建的:

df = pd.DataFrame(
data = {
"Col 1" : [1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
"MP": [2743.002071, 2754.011543, 2746.121450, 2760.169848, 2780.756857, 2793.953050, 2792.675162],
"Col 3": [3.242650e+09, 3.453480e+09, 3.576350e+09, 3.641320e+09, 3.573970e+09, 3.573970e+09, 4.325970e+09],
"Col 4": [9.520000, 10.080000, 9.820000, 9.880000, 10.160000, 10.160000, 11.660000],
"Col 5": [5.04, 5.62, 5.29, 6.58, 8.32, 9.57, 9.53],
"R": [0,0,0,0,0,1,1]
},
index=['2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11',
'2018-01-12', '2018-01-15', '2018-01-16'])
  1. 将索引中的日期移到它们自己的列中:
df = df.reset_index().rename({'index': 'Date'}, axis=1, copy=False)
df['Date'] = pd.to_datetime(df['Date'])
  1. 创建自定义格式化程序类:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import Formatter
%config InlineBackend.figure_format = 'retina' # Get nicer looking graphs for retina displays

class CustomFormatter(Formatter):
def __init__(self, dates, fmt='%Y-%m-%d'):
self.dates = dates
self.fmt = fmt

def __call__(self, x, pos=0):
'Return the label for time x at position pos'
ind = int(np.round(x))
if ind >= len(self.dates) or ind < 0:
return ''

return self.dates[ind].strftime(self.fmt)
  1. 现在让我们绘制MPR 系列。注意我们调用自定义格式化程序的行:
formatter = CustomFormatter(df['Date'])

fig, ax1 = plt.subplots()
ax1.xaxis.set_major_formatter(formatter)
ax1.plot(np.arange(len(df)), df['MP'], color='k')
ax2 = ax1.twinx()
ax2.plot(np.arange(len(df)), df['R'], color='r')
fig.autofmt_xdate()
fig.tight_layout()
plt.show()

上面的代码输出这个图: Output graph

现在,x 轴上不显示周末日期,例如 2018-01-13。

关于python - 如何禁用 matplotlib 中的日期插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54277905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com