Matplotlib和Pandas对没有周末的时间序列的处理

如何解决Matplotlib和Pandas对没有周末的时间序列的处理

我在将Matplotlib行添加到Pandas图中时遇到了一些问题。我正在尝试使用斜率绘制一条直线,以确定起点和终点。但是结果图看起来根本不像一条直线。

我将情况简化为下面的MVCE。最初的部分是设置,以复制我拥有的复杂数据框的关键功能。

import pandas as pd
import matplotlib.pyplot as plt

LEN_SER = 23
dates = pd.date_range('2015-07-03',periods=LEN_SER,freq='B')
df = pd.DataFrame(range(1,LEN_SER+1),index=dates)
ts = df.iloc[:,0]

# The above is the setup of the MVCE to replicate the issue.

fig = plt.figure()
ax1 = plt.subplot2grid((1,1),(0,0))
ax1.plot([ts.index[5],ts.index[20]],[ts[5],ts[5] + (1.0 * (20 - 5))],'o-')
ts.plot(ax=ax1)
plt.show()

这给出了一个图表,该图表由于周末而具有波浪线。 Matplotlib正在影响熊猫如何绘制系列。如果我将ax1.plot()线取出,那么它将变成一条直线。

enter image description here

问题是:如何使用Matplotlib在熊猫图上绘制直线?换句话说,我希望绘图将轴标签视为类别,因此周末将被忽略。这样,我希望Matplotlib和Pandas都能给出一条直线。

解决方法

正如您正确观察到的那样,如果删除ax1.plot()行,则matplotlib会将您的日期视为类别,并且pandas图是一条不错的直线。但是,在命令中

ax1.plot([ts.index[5],ts.index[20]],[ts[5],ts[5] + (1.0 * (20 - 5))],'o-')

您要求matplotlib在两点之间进行插值,在插值过程中,matplotlib识别x轴上的日期。这就是为什么关于日期类别(每周5个)的直线熊猫图变成关于日期(每周7个)的波浪线的原因。这也是正确的,因为就日期而言,您的数据根本无法用直线表示。

您可以通过以下方式强制类别解释用字符串替换日期

df.index = df.reset_index().apply(lambda x: x['index'].strftime('%Y-%m-%d'),axis=1)

在定义ts之前。这导致了情节

enter image description here

现在,matplotlib图只是针对两个值的两个类别,并且matplotlib并没有意识到这两个类别都属于熊猫图的类别。 (更改两个图的顺序至少可以节省您的x轴。)将matplotlib图修改为

ax1.plot([5,20],'o-')

在类别5和20之间划一条线,最后给出关于类别x轴的两条直线。

enter image description here

完整代码:

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('seaborn') # (optional - style was set when I produced my graph)

LEN_SER = 23
dates = pd.date_range('2015-07-03',periods=LEN_SER,freq='B')
df = pd.DataFrame(range(1,LEN_SER+1),index=dates)

df.index = df.reset_index().apply(lambda x: \
    x['index'].strftime('%Y-%m-%d'),axis=1) # dates -> categories (string)
ts = df.iloc[:,0]

# The above is the setup of the MVCE to replicate the issue.

fig = plt.figure()
ax1 = plt.subplot2grid((1,1),(0,0))
ax1.plot([5,'o-') 
# x coordinates 'categories' 5 and 20
ts.plot(ax=ax1)
plt.show()
,

您已经回答了这个问题:“可能是由于周末”

替换: date = pd.date_range('2015-07-03',period = LEN_SER,freq ='B')

使用

dates = pd.date_range('2015-07-03',freq='D')

B-工作日频率 D-日历频率

并且您的线条变直了。

,

您是对的-这是由于周末。您可以通过斜率判断-连续五天的倾斜度(每天+1)比连续三天的倾斜度(总计+1)大。那么,您到底想绘制什么?如果要字面上绘制蓝线,可以像这样在两点之间插入点:

...
# ts.plot(ax=ax1)
ts.iloc[[5,20]].resample('1D').interpolate(how='mean').plot(ax=ax1)
plt.show()
,

为简单起见,我从2015-07- 04 开始。对您有用吗?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

LEN_SER = 21
dates = pd.date_range('2015-07-04',freq='B')
the_axes = []
# take the_axes like monday and friday for each week
for monday,friday in zip(dates[dates.weekday==0],dates[dates.weekday==4]):
  the_axes.append([monday.date(),friday.date()])
x = dates
y = range(1,LEN_SER+1)
n_Axes = len(the_axes)
fig,(axes) = plt.subplots(1,n_Axes,sharey=True,figsize=(15,8))

for i in range(n_Axes):
  ax = axes[i]
  ax.plot(x,y)
  ax.set_xlim(the_axes[i])
  fig.autofmt_xdate()
print(dates)
plt.show()

breaklines

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-